应项目要求,需要异步上传文件进行业务处理且展示结果,之前曾用过DWR、JQuery等开源Ajax框架,发现并没有相关的技术支持。在网上搜索一些资料、结合自己的摸索发现有几个关键点:
1、提交form时,其目标为当前页面隐藏的iframe。
form标签的格式:
<form name="form1" action="异步请求地址" method="post" target="_iframeId" enctype="multipart/form-data" >
iframe标签格式:
<iframe src="./" name="_iframeId" id="_iframeId" style="display:none" ></iframe>
2、后台处理上传的文件流。
(1)以java为例,可以采用jspSmartUpload、Commons-fileupload等。在项目中应用了Webwork2框架,可以配置Webwork的fileUpload Interceptor,然后在Action里将从上下文获取到的request转换成MultiPartRequestWrapper类型,即可获得上传的文件列表。
(2)对于文件的处理,针对不同类型的文件,有很多开源包。比如:
Apache POI------用于处理Excel,WORD等Microsoft Format的文档
PDFBox------用于处理PDF文档
Commons-Digester------非常优秀的处理XML文档的项目
HTML Parser------用户解析html信息等
3、展示业务处理结果
需要不用刷新页面,以显示处理结果,可以采用javaScript来完成。
具体为在后台业务处理完成后,可通过上下文获取页面应答输出流对象,输出javaScript脚本来执行一些展示数据的动作。因为输出内容是在页面的iframe标签里,所以如果要调用页面上iframe之外的对象必须用前缀parent.来标识。
示意代码如下:
HttpServletResponse res = context.getResponse();
res.setContentType("text/html; charset=GBK");
PrintWriter out = res.getWriter();
try {
out.print("<script>parent.callback('The result info.');</script>");
} finally {
out.close();
}