2012-02-02 2 views
0

Прежде всего, я ищу часы в Google и SO по этой теме, и я ничего не нашел. Это может быть причиной того, что я ошибаюсь, или я контролировал решение.Загрузка и анализ XML-файлов с помощью GWT

У меня было приложение, которое использует GWT и Appengine. Файл XML должен быть загружен и проанализирован SAX-Parser и возвращает ArrayList с данными, возвращаемыми на страницу.

Для локального тестирования я удалил часть приложения Appengine. Итак, у меня была установка GWT, commons-io & общедоступная информация.

До сих пор я создал свою точку входа и сервлет для обработки загрузки файла. Можно вернуть строковое представление файла XML. Но я хочу извлечь информацию из файла XML с помощью синтаксического анализа и отобразить его в своем FlexTable. Поэтому я хочу создать ArrayList с моими элементами XML-файла и вернуть его в мой класс entrypoint.

Entrypoint:

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> 

Я попытался с помощью LIBS как gwtupload, upload4gwt, но они не решают свои проблемы и плохо документированы.

Так что я точно хочу знать, как я загружаю xml-файл и возвращаю List как callback. Разбор файла через SAX я уже знаю.

BR, mybecks

+0

Так что же вы хотите знать? Как разбирать XML? Как отправить ArrayList с сервера на точку входа? Или ваш код не работает по какой-то причине? – jusio

+0

Хорошо, я хочу знать, как я excatly загружаю xml-файл на сервер и возвращаю список. Как разбор этого файла я уже знаю. Я добавил его к вопросам – mybecks

ответ

2

Из кода, кажется, что вы уже можете получить файл на сервер и получить его обратно. Теперь забавная часть, которую вы фактически не можете отправить список массивов с сервера на клиент. Клиент - это javascript, он не знает, что такое arraylist. Таким образом, сервер должен будет отложить ответ в каком-то формате, и клиент должен будет проанализировать его в своем собственном ArrayList. Самый простой способ - использовать формат Json.

Так Последовательность действий:

  1. Клиент подает файл.
  2. Сервер анализирует файл и производит выход JSON.
  3. Клиент разбор вывода JSON с помощью JsonUtils и Javascript Overlay Types (или JSONObject, как вы хотите) и создание ArrayList на его основе
+0

Итак, можно выполнить синтаксический анализ xml в классе entrypoint, поэтому мне не нужно дважды анализировать файл? – mybecks

+0

@mybecks Да, можно разобрать его в классе точки входа. Проблема в том, что не все браузеры поддерживают чтение локальных файлов, и GWT по умолчанию не имеет привязки для этого api.Также иногда анализ XML на стороне сервера и передача результатов клиенту через JSON могут быть более быстрыми (например, для синтаксического анализа XML вам может понадобиться некоторая информация, которая недоступна на клиенте, поэтому клиент должен будет получить ее как-то или XML очень сложный, и вам нужно всего лишь куски информации от него) – jusio

+0

спасибо за вашу помощь, он работает как шарм :) – mybecks

Смежные вопросы