Загрузка и анализ XML-файла через GWT - PullRequest
0 голосов
/ 02 февраля 2012

Прежде всего, я ищу часы в Google и ТАК по этой теме, и ничего полезного не нашел. Это может быть причиной того, что я нахожусь на неправильном пути, или я следил за решением.

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

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

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

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>

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

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

BR, mybecks

1 Ответ

2 голосов
/ 02 февраля 2012

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

Итак, рабочий процесс:

  1. Клиент отправляет файл.
  2. Сервер анализирует файл и выдает вывод JSON.
  3. Клиент анализирует вывод JSON, используя JsonUtils и Типы наложения Javascript (или JSONObject по вашему желанию)и создает ArrayList на его основе
...