【问题标题】:XML File Upload and Parsing via GWT通过 GWT 上传和解析 XML 文件
【发布时间】:2012-02-25 06:07:00
【问题描述】:

首先,我在 google 和 SO 上搜索有关该主题的时间,但没有发现任何帮助。 这可能是我走错路的原因,或者我监督了解决方案。

我有一个使用 GWT 和 Appengine 的应用程序。一个 XML 文件应该被上传并由 SAX-Parser 解析,并返回一个 ArrayList 以及返回到页面的条目。

为了进行本地测试,我删除了应用程序的 Appengine 部分。 所以我有一个 GWT、commons-io 和 commons-fileupload 的设置。

到目前为止,我创建了我的入口点和一个用于处理文件上传的 Servlet。可以返回 XML 文件的字符串表示形式。但我想通过解析从 XML 文件中提取信息并将其显示在我的 FlexTable 中。所以我想用我的 XML 文件元素创建一个 ArrayList 并将它返回给我的入口点类。

入口点:

public class XMLParser implements EntryPoint {

    private static final String UPLOAD_ACTION_URL = GWT.getModuleBaseURL() + "upload";

    @SuppressWarnings("unused")
    private Logger logger = Logger.getLogger("XMLParserLogger");

     private VerticalPanel mainPanel = new VerticalPanel();
     private FlexTable articleFlexTable = new FlexTable();
     private FileUpload fileUpload = new FileUpload();
     private FormPanel form = new FormPanel();


    /**
     * This is the entry point method.
     */
    public void onModuleLoad() {


        fileUpload.setName("uploadFormElement");

        form.setAction(UPLOAD_ACTION_URL);
        form.setEncoding(FormPanel.ENCODING_MULTIPART);
        form.setMethod(FormPanel.METHOD_POST);
        form.add(fileUpload);


        //Table for Articles
        articleFlexTable.setText(0, 0, "ID");
        articleFlexTable.setText(0, 1, "Amount");
        articleFlexTable.setText(0, 2, "Start Amount");
        articleFlexTable.setText(0, 3, "PCT");
        articleFlexTable.setText(0, 4, "Price");
        articleFlexTable.setText(0, 5, "Stock Value");

        mainPanel.add(form);
        mainPanel.add(new Button("Submit", new ClickHandler() {
            public void onClick(ClickEvent event) {
                    form.submit();
                }
            }));
        mainPanel.add(articleFlexTable);

                     form.addSubmitCompleteHandler(new FormPanel.SubmitCompleteHandler() {
                         public void onSubmitComplete(SubmitCompleteEvent event) {

                             String xml = event.getResults();
                             logger.info(xml);
                             Window.alert(xml);
                         }
                     });

        RootPanel.get("parser").add(mainPanel);


    }
}

小服务程序:

public class FileUploadServlet extends HttpServlet {

    private static final long serialVersionUID = -5897221701350776117L;
    private static final Logger log = Logger.getLogger(FileUploadServlet.class
            .getName());

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp)
            throws ServletException, IOException {
        super.doGet(req, resp);
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp)
            throws ServletException, IOException {

        // process only multipart requests
        if (ServletFileUpload.isMultipartContent(req)) {

            ServletInputStream sis = req.getInputStream();

            BufferedReader bufferedReader = new BufferedReader(
                    new InputStreamReader(sis));
            StringBuilder stringBuilder = new StringBuilder();
            String line = null;

            while ((line = bufferedReader.readLine()) != null) {
                stringBuilder.append(line);
            }

            bufferedReader.close();

            String xml = stringBuilder.toString();

            log.info(xml);
            resp.setContentType("text/html");
            resp.setStatus(HttpServletResponse.SC_CREATED);
            resp.getWriter().print(xml);
            resp.flushBuffer();

        } else {
            resp.sendError(HttpServletResponse.SC_UNSUPPORTED_MEDIA_TYPE,
                    "Request contents type is not supported by the servlet.");
        }
    }

web.xml:

 <!-- Servlets -->
   <context-param>
    <!-- max size of the upload request -->
    <param-name>maxSize</param-name>
    <param-value>3145728</param-value>
  </context-param>

  <servlet>
    <servlet-name>uploadServlet</servlet-name>
<servlet-class>net.mybecks.gwt.server.FileUploadServlet</servlet-class>
  </servlet>

  <servlet-mapping>
    <servlet-name>uploadServlet</servlet-name>
    <url-pattern>/xmlparser/upload</url-pattern>
  </servlet-mapping>

我尝试使用 gwtupload、upload4gwt 等库,但它们不能解决我的问题,也没有很好的文档记录。

所以我很想知道如何上传一个 xml 文件并返回一个 List 作为回调。通过 SAX 解析文件我已经知道了。

BR, 我的贝克

【问题讨论】:

  • 那么您到底想知道什么?如何解析 XML?如何将 ArrayList 从服务器发送到入口点?或者您的代码由于某种原因无法正常工作?
  • 好的,我想知道如何将 xml 文件上传到服务器并返回一个列表。我已经知道如何解析这个文件了。我将它添加到问题中

标签: xml google-app-engine gwt file-upload saxparser


【解决方案1】:

从您的代码看来,您已经可以将文件获取到服务器并将其取回。现在有趣的部分是您实际上无法将数组列表从服务器发送到客户端。客户端是一个javascript,它不知道什么是arraylist。所以服务器必须把响应转换成某种格式,客户端必须把它解析成自己的ArrayList。最简单的方法是使用 Json 格式。

所以工作流程是:

  1. 客户端提交文件。
  2. 服务器正在解析文件,并生成 JSON 输出。
  3. 客户端正在使用 JsonUtils 解析 JSON 输出,并且 Javascript Overlay Types(或JSONObject,如你所愿)并基于它创建ArrayList

【讨论】:

  • 那么在entrypoint类中进行xml解析是可以的,所以我不需要解析两次文件?
  • @mybecks 是的,可以在入口点类中解析它。问题是,并非所有浏览器都支持读取本地文件,并且 GWT 默认情况下没有对此 api 的绑定。有时在服务器端解析 XML 而不是通过 JSON 向客户端发送结果可能更快(例如,对于 XML 解析,您可能需要一些客户端上不可用的信息,因此客户端必须以某种方式获取它,否则 XML 是非常复杂,您只需要从中获取一些信息)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-12-16
  • 1970-01-01
  • 1970-01-01
  • 2016-03-18
  • 2013-05-28
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多