Прежде всего, я ищу часы в 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