`
junziyiyan
  • 浏览: 10016 次
  • 性别: Icon_minigender_1
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论

解决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多附件上传插件。


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

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

 

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

  • 大小: 158.6 KB
3
2
分享到:
评论
3 楼 sdylag 2012-04-06  
没说的了,一个字“服”。。。
感谢分享。
2 楼 ning5566 2012-01-13  
1楼神人啊,一下解决了 佩服直至!
1 楼 masuz 2010-10-31  
还有一个办法,不用去改源代码,只要修改struts.xml的配置参数,如:
<constant name="struts.action.excludePattern" value="/servlet/.*,/fck/.*" />
其中的value值是正则表达式,可以写多个,只要匹配表达式的URL访问都不会被struts2进行Filter了。

相关推荐

    struts2+swfupload上传

    Struts2和SwfUpload是两个在Web开发中用于文件上传的工具,它们结合使用可以提供一种具有用户体验优化的文件上传功能,特别是包含了进度条显示,使得用户能够清晰地了解文件上传的状态。以下是对这两个技术及其结合...

    ext struts2 swfupload 跨域文件上传

    "ext struts2 swfupload 跨域文件上传"这个主题涉及到三个关键技术和概念:EXTJS(Ext JS)、Struts2以及SwfUpload,它们共同解决了Web应用中的跨域文件上传问题。 EXTJS是一种强大的JavaScript库,用于构建富...

    Struts2+SWFUpload上传文件并显示进度条

    在Struts2应用中集成SWFUpload,可以解决上传文件时无进度反馈的问题,提高用户交互性。 集成步骤如下: 1. **添加依赖**:首先,需要将SWFUpload的SWF文件和JavaScript库引入到项目中。这通常涉及到在HTML页面中...

    swfupload java 上传进度条 上传时间 速度 struts2 开源

    SwfUpload 是一个开源的JavaScript库,用于在Web应用程序中实现文件上传功能,它与Java后端技术如Struts2框架结合使用,可以提供高级的文件上传体验。在这个项目中,SwfUpload 被用来展示文件上传的进度、速度以及...

    java+struts+swfupload文件上传下载

    2. **创建Struts Action**:在Struts框架中创建一个Action类,用于接收SwfUpload上传的文件。这个Action需要继承自Struts的抽象类,并覆盖上传方法。 3. **处理上传请求**:在Action的上传方法中,使用Java的IO流...

    struts2+swfupload实现大文件多文件上传

    将SwfUpload与Struts2结合,需要在Struts2的Action中处理文件上传的逻辑。这通常包括以下几个步骤: 1. **配置Struts2**:在struts.xml文件中配置Action,指定处理文件上传的方法。 2. **创建Action**:在Action类...

    三、struts2+swfUpload简单例子

    这个"三、struts2+swfUpload简单例子"很可能是关于如何集成这两个技术来创建一个高效的文件上传功能的教程。 在集成Struts2和SwfUpload的过程中,有几个关键知识点是必不可少的: 1. **Struts2框架**:Struts2提供...

    Struts+swfupload实现文件上传功能

    Struts和SwfUpload是两种在Web开发中用于构建强大功能的应用工具,它们结合使用可以实现高效的文件上传功能。在本文中,我们将深入探讨这两个组件以及如何将它们整合以实现文件上传。 首先,Struts是一个基于MVC...

    swfupload与struts2整合文件上传/完整Java实例

    将SwfUpload与Struts2整合,可以创建高效、友好的文件上传界面。接下来,我们将详细探讨这个主题。 首先,SwfUpload的工作原理。它利用了Adobe Flash Player插件,隐藏了复杂的文件选择和上传过程,提供了一种直观...

    JAVA+Struts2+swfupload文件上传下载

    本项目基于JAVA、Struts2框架以及swfupload插件,提供了一个完整的文件上传下载解决方案。以下是对这个项目的详细解读: 首先,**JAVA**作为后端编程语言,以其跨平台性和丰富的库资源被广泛应用于Web开发。在这里...

    四、struts2+swfUpload例子二

    在这个"四、struts2+swfUpload例子二"中,我们将深入探讨如何将这两者结合,以实现高效的文件上传功能。 首先,为了集成Struts2和SwfUpload,我们需要在项目中引入相应的依赖库。对于Struts2,这通常包括struts2-...

    SWFUpload+Struts2文件上传,支持多文件上传和进度显示

    SWFUpload上传组件的一个完整的例子,后台由Struts2完成,有上传进度显示,可以多文件上传,如果你想使用SWFUpload组件但还不知道怎样使用,可以下载下来运行一下试试,看一下源码就知道了。

    swfuplaod+struts2实现多文件上传

    下面将详细介绍如何利用SWFUpload与Struts2来实现多文件上传。 **一、SWFUpload组件介绍** SWFUpload 是一个JavaScript库,它利用Flash技术提供了一个高级的文件上传体验。它的主要特性包括: 1. **多文件选择**...

    SWFUpload上传

    /swfupload/src/action/FileUploadAction.java --struts上传 /swfupload/src/struts.xml --struts配置文件 /swfupload/WebRoot/swfupload --上传组件 /swfupload/WebRoot/index.jsp --单文件上传 /swfupload/...

    swfupload+struts2多文件上传的例子

    本教程将详细讲解如何利用SWFUpload与Struts2框架来实现多文件上传的示例。 首先,让我们了解SWFUpload。SWFUpload是一款开源的Flash上传组件,它允许用户在不离开当前页面的情况下上传多个文件。通过在浏览器上...

    swfupload+Struts2多文件上传,有进度条,很漂亮的效果

    使用struts2整合swfupload,实现包含进度条的文件上传模块 SWFUpload的主要特点 * 可以同时上传多个文件; * 类似AJAX的无刷新上传; * 可以显示上传进度; * 良好的浏览器兼容性; * 兼容其他JavaScript库 (例如:...

    swfupload 多文件上传 使用框架struts2

    总之,SwfUpload结合Struts2框架能提供一个高效且用户友好的多文件上传解决方案。开发者需要熟悉这两个工具的特性和接口,才能有效地集成并实现功能。在实践中,不断调整和优化,可以打造出满足各种业务需求的文件...

    Struts2 经典flash上传文件

    在本案例中,我们将探讨如何使用Struts2与Flash技术相结合实现文件的上传,并且展示上传进度条,提高用户体验。 1. **Struts2文件上传基础** - Struts2提供了一个名为`CommonsFileUploadInterceptor`的拦截器,它...

    SWFupload_struts_1.rar_struts1 swfuplo_swfupload_swfupload stru

    SWFUpload与Struts 1的结合可以提供更友好的用户界面和更高效的文件上传体验。 在Struts 1框架中,通常需要编写Action类来处理用户的请求。集成SWFUpload时,我们需要创建一个专门处理文件上传的Action,这个Action...

Global site tag (gtag.js) - Google Analytics