解决Struts2与SWFupload上传冲突问题 JSP正则表达式Web框架Struts
相信大家使用SWFupload(应该是 smartupload 和 flash结合的一个 上传插件)时,会发现配合Struts2框架使用的时候会失去作用,前一阵子在开发我自己的一个小网站时候也被这个问题困扰死了:( ,上网查了N多资料,最后发现问题的症结在于Struts2的filter比较闹听,Y的给所有的url源给封装了一次,如下:在web.xml文件中
<filter>
<filter-name>struts2</filter-name>
<filter-class>
org.apache.struts2.dispatcher.FilterDispatcher
</filter-class>
</filter>
<filter-mapping>
<filter-name>struts2</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
当时想了个办法就是 修改 /* 为 /*.action, 但是这样搞的话会让struts2框架用得像鸡肋,很大程度上引起麻烦,后来仔细考虑了一下,决定修改struts2 的源文件,以达到我想要的目的。
从网上下来的struts2-core-2.1.6.jar的源码分析了一下,发现 org.apache.struts2.dispatcher.Dispatcher 类中的
public HttpServletRequest wrapRequest(HttpServletRequest request, ServletContext servletContext) throws IOException {
// don't wrap more than once
if (request instanceof StrutsRequestWrapper) {
return request;
}
String content_type = request.getContentType();
if (content_type != null && content_type.indexOf("multipart/form-data") != -1) {
MultiPartRequest multi = getContainer().getInstance(MultiPartRequest.class); request = new MultiPartRequestWrapper(multi, request, getSaveDir(servletContext));
} else {
request = new StrutsRequestWrapper(request);
}
return request;
}
大家看到红色的部分,当页面包含附件的时候,struts2会把request给封装成MultiPartRequestWrapper,就是因为这个原因导致的 SWFupload 不好使,所以修改Dispatcher 类:
public HttpServletRequest wrapRequest(HttpServletRequest request, ServletContext servletContext) throws IOException {
// don't wrap more than once
if (request instanceof StrutsRequestWrapper) {
return request;
}
String content_type = request.getContentType();
if (content_type != null && content_type.indexOf("multipart/form-data") != -1) {
// MultiPartRequest multi = getContainer().getInstance(MultiPartRequest.class);
// request = new MultiPartRequestWrapper(multi, request, getSaveDir(servletContext));
String requestURL = request.getRequestURI();
// System.out.println("### The request url is [" + request.getRequestURI() + "]");
if(requestURL != null && requestURL.indexOf("/uploadFileSubmit.jsp") != -1) {
return request;
} else {
MultiPartRequest multi = getContainer().getInstance(MultiPartRequest.class);
request = new MultiPartRequestWrapper(multi, request, getSaveDir(servletContext));
}
} else {
request = new StrutsRequestWrapper(request);
}
return request;
}
这样再配合着 SWFupload 用就可以了,这里/uploadFileSubmit.jsp可以随便改成你想要的url的结尾都行,不过这样你需要自己修改 struts2的源码,如果想要省懒,当然可以用附件中的.jar包,但是记住你的上传url必须是以uploadFileSubmit.jsp 结尾才行。
附件说明:
upload.jsp 为上传参考图,用过的同志肯定知道这个是什么东东,还是挺好用的一个java多附件上传插件。
stuts2-core-2.1.6.jar 为文中提及的已修改完毕的jar文件,可以直接使用。
upload.rar 中有7个文件,java文件放在你自己的web工程的源文件目录下, js文件夹和jsp文件放在WEB-INF下自己的文件夹中即可。
ps:其中的 上传附件的java文件和jsp上传的源码来自网上一位大虾,可惜我这里忘了保存他的blog地址了,代码注释里的他的网址访问不了,所以只能很抱歉的“盗用”一下的他的代码,希望他不要上火 :)