解决Struts2与SWFupload上传冲突问题

相信大家使用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多附件上传插件。
解决Struts2与SWFupload上传冲突问题_第1张图片


 stuts2-core-2.1.6.jar 为文中提及的已修改完毕的jar文件,可以直接使用。

 upload.rar 中有7个文件,java文件放在你自己的web工程的源文件目录下, js文件夹和jsp文件放在WEB-INF下自己的文件夹中即可。

 

ps:其中的 上传附件的java文件和jsp上传的源码来自网上一位大虾,可惜我这里忘了保存他的blog地址了,代码注释里的他的网址访问不了,所以只能很抱歉的“盗用”一下的他的代码,希望他不要上火 :)

你可能感兴趣的:(jsp,框架,Web,正则表达式,struts)