Struts2 异常错误总结
一、后台不断出现 “警告: Could not find property [struts.valueStack] ”
解决:没有log4j-xxx.jar,下载一个,把它放到lib下面
二、java.lang.NoClassDefFoundError: org/apache/struts2/dojo/views/jsp/ui/HeadTag
解决办法:原因缺少了dojo的JAR包,引入即可:struts2-dojo-plugin-2.1.2.jar
(The "head" tag renders required javaScript code to configure Dojo and is required in order to use any of the tags included in the Dojo plugin.--------------------If you are planning to nest tags from the Dojo plugin, make sure you set parseContent="false", otherwise each request made by the inner tags will be performed twice. )
三、Unable to load configuration. - bean - jar:file:/F:/Struts2/struts2/WebROOt/WEB-INF/lib/struts2-core- 2.1.2.jar!/struts-default.xml:46:178
Caused by: Unable to load bean: type:org.apache.struts2.dispatcher.multipart.MultiPartRequest class:org.apache.struts2.dispatcher.multipart.JakartaMultiPartRequest - bean - jar:file:/F:/Struts2/struts2/WebROOt/WEB- INF/lib/struts2-core-2.1.2.jar!/struts-default.xml:46:178
Caused by: java.lang.NoClassDefFoundError: org/apache/commons/fileupload/RequestContext
解决办法:缺少JAR包,引入commons-fileupload-1.2.1.jar,commons-io-1.3.2.jar即可
四、No tag "datetimepicker" defined in tag library imported with prefix "s"
原因版本问题:缺少struts-dojo-plugin JAR包,以及Html的,<HEAD></HEAD>中没有使用<s:head/>标签
If you're using Struts 2.1.x you're probably missing the> struts-dojo-plugin. Micha&eUML;l's reference below applies to struts 2.1.xonly. In the lasts versions (since 2.0.9 I guess), all Ajax are in dojo> plugin.
> > So you need to include <%@ taglib uri="/struts-dojo-tags" prefix="sx"%>
> > and <sx:head/>
> >( Temp1:
<sx:datetimepicker name="picker" />
Temp2:
<sx:datetimepicker type="time" name="picker" /><br/>
Temp3:
<sx:datetimepicker value="%{'2008-06-08'}" name="picker" />
Temp4:
<sx:datetimepicker value="date" name="picker" />)
> > and call :<sx:datetimepicker .../>
五、使用TILES框架
If you use the Tiles 2 plugin, check your tiles.xml file(s) to ensure they contain a DOCTYPE.
<!DOCTYPE tiles-definitions PUBLIC "-//Apache Software Foundation//DTD Tiles Configuration 2.0//EN""http://tiles.apache.org/dtds/tiles-config_2_0.dtd">
<tiles-definitions>
六、struts2中不支持EL表达式 Convert EL expressions to OGNL
struts2.1 tags do not allow evaluation of jsp EL within their attributes.
Instead, struts2 tags evaluate attribute values as OGNL. Allowing both
expression languages within the same attribute opens major security
vulnerabilities.
七、文件上传过程中取不到文件名和文件类型,即都取到NULL
原因:如果页面中file的name=“a”则我们ACTION中设置String aContentType,String aFileName;(此两个其实无所谓,关键是SET方法)
setA(File file)(){}; setAContentType(String s){};setAFileName(String name){} 即格式如下:setXContentType() setXFileName().X代表你给FILE取的NAME名字 必须和它相同,固定格式
八、严重: Unable to parse request
org.apache.commons.fileupload.FileUploadBase$SizeLimitExceededException: the request was rejected because its size (8523356) exceeds the configured maximum (2097152)
at org.apache.commons.fileupload.FileUploadBase$FileItemIteratorImpl.<init>(FileUploadBase.java:914)2008-5-27 17:46:51 com.opensymphony.xwork2.util.logging.commons.CommonsLogger warn
警告: Could not find property [struts.valueStack]
2008-5-27 17:46:51 com.opensymphony.xwork2.util.logging.commons.CommonsLogger error
严重: the request was rejected because its size (8523356) exceeds the configured maximum (2097152)
2008-5-27 17:46:51 com.opensymphony.xwork2.util.logging.commons.CommonsLogger warn
警告: Could not find property [org.apache.catalina.jsp_file]
原因:上传文件大小超过预定大小,可以在struts.properties配置文件中设置struts.multipart.maxSize=XXX(XXX为文件大小)
九、配置了文件类型限制后,当传错误类型可以拦截不让用户上传该文件,可是跳转的页面却没有跳转到input配置的错误页面,而是返回到了success正确页面。
严重: Content-Type not allowed: filedata "upload__5b01657_11a329d4dcf__8000_00000000.tmp" text/plain
《我的打印输出DEBUG语句内容:File:null FlieName:null type:null》即拦截类型成功了
java.lang.NullPointerException
at java.io.FileInputStream.<init>(FileInputStream.java:103)
at com.study.web.util.FileUploadUtil.uploadFile(FileUploadUtil.java:36)
at com.study.web.action.UploadFileAction.execute(UploadFileAction.java:58)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)。。。
2008-5-29 10:59:07 com.opensymphony.xwork2.util.logging.commons.CommonsLogger warn
警告: Could not find property [org.apache.catalina.jsp_file]
2008-5-29 10:59:07 com.opensymphony.xwork2.util.logging.commons.CommonsLogger warn
警告: Could not find property [struts]
2008-5-29 10:59:07 com.opensymphony.xwork2.util.logging.commons.CommonsLogger info
信息: Removing file filedata \tmp\upload__5b01657_11a329d4dcf__8000_00000000.tmp
原因及解决办法:在该文件上传Action中只配置了FileUploadInterceptor后缺少配置了defaultStack拦截器.
在ACTION中配置玩defaultStack拦截器后改错误消失。
十、struts.properties中全局配置文件大小,再使用默认FileUploadInterceptor拦截器时候能实现拦截的功能但是后台出现异常。
严重: Unable to parse request org.apache.commons.fileupload.FileUploadBase$SizeLimitExceededException: the request was rejected because its size (380) exceeds the configured maximum (10)
at org.apache.commons.fileupload.FileUploadBase$FileItemIteratorImpl.<init>(FileUploadBase.java:914)
原因:未知。将全局配置中的限制大小去掉,再重新在ACTION中覆盖配置FileUploadInterceptor拦截器设置大小和文件类型限制,可消除异常。
十一、多文件上传中,其中一个传被限制的文件如限制aplication/msword(即.doc)文件,允许传文本文件。然而当夹杂在一起传的时候,后台能截获类型错误不可传信息,但是实际却还是上传成功。
严重: Content-Type not allowed: filedata "upload_4d958287_11a33e76ab9__8000_00000007.tmp" application/msword
file is :\tmp\upload_4d958287_11a33e76ab9__8000_00000006.tmp fileName:project.txt fileType:text/plain
file is :\tmp\upload_4d958287_11a33e76ab9__8000_00000007.tmp fileName:application base.doc fileType:application/msword
file is :\tmp\upload_4d958287_11a33e76ab9__8000_00000008.tmp fileName:zhongqi-bug.txt fileType:text/plain
原因:忘记了继承ActionSupport类。继承后异常消失。
十二、文件上传异常,不能创建File文件
Cannot create type class java.io.File from value C:\Documents and Settings\admin\桌面\OrderReporterServiceImp.java - [unknown location]
原因:忘记了在form表单里将enctype设置成文件上传格式:enctype="multipart/form-data"
十三、当使用限制文件类型和大小的时候抛出空指针异常
java.lang.NullPointerException
demo.struts2.action.ValidatFileUploadAction.execute(ValidatFileUploadAction.java:71)
sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
原因:在ACTION中配置了fileUpload拦截器后忘记了配置默认拦截器:defautlStack。注意当ACTION中配置自己的拦截器后需要显示配置默认
拦截器defaultStack
十四、在国际化时候抛空指针异常:
16:31:12,812 ERROR [jsp]:253 - Servlet.service() for servlet jsp threw exception java.lang.NullPointerException at java.text.MessageFormat.applyPattern(MessageFormat.java:414)
at java.text.MessageFormat.<init>(MessageFormat.java:350) at com.opensymphony.xwork2.DefaultTextProvider.getText(DefaultTextProvider.java:70)
原因:忘记了在struts.xml中配置国际化常量,或者在struts.properties中配置全局国际化常量 struts.custom.i18n.resources=globeMessage
Unable to load configuration. - result - file:/D:/java/apache-Tomcat-5.5.20/webapps/mysts/WEB-INF/classes/test.xml:10:26
Caused by: No result type specified for result named 'error', perhaps the parent package does not specify the result type? - result - file:/D:/java/apache-Tomcat-5.5.20/webapps/mysts/WEB-INF/classes/test.xml:10:26
at com.opensymphony.xwork2.config.providers.XmlConfigurationProvider.buildResults(XmlConfigurationProvider.java:609)
原因:忘记了继承包struts-default
2.如果配置命名空间,一定要以"/"开始,例如:namespace="/test"
3.每个模块struts action配置文件中都可以配置全局result,global-result 经测试不会冲突,STRTUS会智能寻找该Action请求的模块struts ACTION配置包
十七、jsp中的<s:optiontransferselect />标签已正常显示使用
<s:optiontransferselect tOOltip="用户权限" label="设置权限"
name="mhPopedom.leftList_1"
leftTitle="用户未授权限"
list="leftList_1"
listKey="popeId"
listValue="popeName"
headerKey="headerKey"
multiple="true"
emptyOption="false"
allowUpDownOnLeft="false"
CSSStyle="width:200px;height:300px;"
CSSClass="input2"
addToLeftLabel="向左移动"
addToRightLabel="向右移动"
addAllToLeftLabel="全部左移"
selectAllLabel="全部选择"
addAllToRightLabel="全部右移"
doubleName="rightPopedom"
rightTitle="用户已授权限"
doubleList="rightList_1"
doubleListKey="popeId"
doubleListValue="popeName"
doubleHeaderKey="doubleHeaderKey"
doubleMultiple="true"
doubleEmptyOption="false"
allowUpDownOnRight="false"
doubleCSSClass="input2"
doubleCSSStyle="width:200px;height:300px;">
</s:optiontransferselect>
但不论怎样在action中都不能获得rightPopedom的值,报空指针异常。
解决办法:
后台action里面添加属性(setXXX和getXXX方法):
private String[] leftList;
private String[] rightList;
在前台页面上,当提交表单时,onclick事件调用下面的js:
<script type="text/javascript">
function myself(){
var right=document.forms[0].rightList;
for(i=1; i <right.length; i++)
right[i].selected = true;
}
</script>
提交后,就能在后台得到rightList里面的值了。
如果没有这段Js代码,后台是得不到值的,这是struts2 <s:optiontransferselect/>本身的bug.
第二种解决办法:
在form中使用<s:submit/>也能够取到值
十八、“strutsUtils 未定义”错误
struts2.1.6
s:optiontransferselect
没有加载 struts2 js
已加 <s:head />
源文件生产:
<script src="/xxxx/struts/utils.js" type="text/javascript"></script>
原因:
web.xml中
struts没拦截js文件,需加如:
<filter-mapping>
<filter-name>struts2</filter-name>
<url-pattern>*.js</url-pattern>
</filter-mapping>
或者
<filter-mapping>
<filter-name>struts2</filter-name>
<url-pattern>/struts/*</url-pattern>
</filter-mapping>
提醒一下:把所有路径都过滤的不会出现这个情况,一些视频和书籍教程,默认是<url-pattern>/**</url-pattern>,已经把所有的路径全部都过滤了,看到别人的没有问题,但到真正自己开发时,问题错漏百出,呜呜……
转自:http://www.diyjava.com/kyjs/ShowArticle.asp?ArticleID=6275&Page=2