(ZT) 用struts2.1.6作图片上传 (From http://rancedxk.javaeye.com/blog/497148)
用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工具操作的。
希望可以对遇到像我的问题一样的朋友有一定的帮助!
我的异常网推荐解决方案:Servlet.service() for servlet default threw exception,http://www.myexception.cn/eclipse/181756.html