用struts2.1.6作图片上传

最近项目里要用到上传图片功能,本来这是很简单的功能,不消半天就能搞定,可是我却捣鼓了两天,全因为下边的错误:
ERROR [Engine] StandardWrapperValve[default]: Servlet.service() for servlet default threw exception
java.lang.IllegalStateException
......


在网上查原因,有人说是因为struts2.1.6版本包的问题,其中写文件要用到输入输出流,而struts跳转的return也是通过输出流写的,一前一后,会发生冲突;又有一种说法是说struts2.1.6版本的过滤器和servlet有冲突,导致程序中获取不到页面提交的file对象。

一般都会在web.xml里这样配置struts的过滤规则:

<!-- 定义Struts2的FilterDispathcer过滤器 -->
    <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>


这样配置会将所有类型的请求都拦截,包括servlet。

经多方求证,今天找到解决方法,通过servlet来解决,当然web.xml配置文件里的struts的过滤规则也要改一下:

<!-- 定义Struts2的FilterDispathcer过滤器 -->
    <filter>
        <filter-name>struts2</filter-name>
        <filter-class>org.apache.struts2.dispatcher.FilterDispatcher</filter-class>
    </filter>

<!-- 定义struts2过滤规则:过滤后缀为.action和.jsp的请求 -->

    <filter-mapping>
       <filter-name>struts2</filter-name>
       <url-pattern>*.action</url-pattern>
    </filter-mapping>
    <filter-mapping>
       <filter-name>struts2</filter-name>
       <url-pattern>*.jsp</url-pattern>
    </filter-mapping>


这样我们的servlet就可以访问了,我是这样配置的:

<!-- 我的文件上传servlet类 -->

  <servlet>
    <servlet-name>imgUpload</servlet-name>
    <servlet-class>cn.com.ServletUpload</servlet-class>
  </servlet>
  <servlet-mapping>
    <servlet-name>imgUpload</servlet-name>
    <url-pattern>/imgUpload</url-pattern>
  </servlet-mapping>


这样,只要在页面中修改form的action为"/imgUpload"就可以了。
至于servlet内部如何写,就依个人喜好了,我个人是用了jspSmartUpload工具操作的。

希望可以对遇到像我的问题一样的朋友有一定的帮助!

你可能感兴趣的:(apache,Web,jsp,struts,servlet)