【发布时间】: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