2012-02-02 45 views
0

首先,我在Google和SO上搜索有关该主题的小时,但没有发现任何帮助。 这可能是原因,我错了,或者我监督了解决方案。通过GWT进行XML文件上传和解析

我有一个使用GWT和Appengine的应用程序。 XML文件应该上传并由SAX解析器解析,并返回一个ArrayList,并将条目返回给页面。

对于本地测试,我删除了App的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); 


    } 
} 

的Servlet:

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, mybecks

+0

所以,你想要什么知道的是创造ArrayList?如何解析XML?如何从服务器发送ArrayList到入口点?或者你的代码出于某种原因不起作用? – jusio 2012-02-02 15:59:05

+0

好吧,我想知道我是如何激动地将xml文件上传到服务器并返回列表。如何解析这个文件我已经知道了。我将它添加到问题 – mybecks 2012-02-02 16:10:45

回答

2

从你的代码看起来你已经可以得到文件到服务器,并把它找回来。现在有趣的部分你实际上不能将数组列表从客户端发送到服务器。客户端是一个JavaScript,它不知道什么是数组列表。因此,服务器必须将响应放入某种格式,客户端必须将其解析为自己的ArrayList。最简单的方法是使用Json格式。

所以工作流程是:

  1. 客户端提交的文件。
  2. 服务器解析文件并生成JSON输出。
  3. 客户端解析使用JsonUtilsJavascript Overlay Types(或JSONObject如你所愿)JSON输出,并在此基础上
+0

因此,可以在入口点类中执行xml解析,因此我不需要解析文件两次? – mybecks 2012-02-02 16:47:12

+0

@mybecks是的,可以在入口点类中解析它。问题是,并不是所有的浏览器都支持读取本地文件,GWT默认没有绑定这个API。此外,有时在服务器端解析XML并通过JSON向客户端发送结果可能会更快(例如,对于XML解析,您可能需要某些客户端上不可用的信息,因此客户端必须以某种方式获取它,或者XML是非常复杂,你只需要从它的一些信息块) – jusio 2012-02-02 17:20:09

+0

感谢您的帮助它的作品像魅力:) – mybecks 2012-02-03 08:30:03