欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

解决Struts2与SWFupload上传冲突问题 JSP正则表达式Web框架Struts 

程序员文章站 2024-03-13 22:03:52
...

相信大家使用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上传冲突问题
            
    
    
        JSP正则表达式Web框架Struts 


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

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

 

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

  • 解决Struts2与SWFupload上传冲突问题
            
    
    
        JSP正则表达式Web框架Struts 
  • 大小: 158.6 KB