今天直接链接到jsp就报这个错,但经过action再到jsp就没了。
网上看看基本有两种原因:
一:
这种问题的引起往往是你在action中使用了addActionError这样的方法在汇报actionerror,而你在调用addActionError方法时传入了null值,这时候机会导致这样的问题发生,所以如果发生这样的情况请检查你的代码,看看是否因为某种问题导致给addActionError方法传入了null值,找到了解决这个问题就可以了。
二:
struts2中的标签漏了必要的属性。例如:
用struts2中的checkBoxList标签时没有给标签加name属性,加上name属性后,问题消失。
我的原因:
三:
<s:form>标签中的namespace属性!
先说一个action配置文件里的namespace,看下例
<package name="user" namespace="/user" extends="struts-default">
<action name="logon" class="cn.net.cipe.ots.user.actions.UserAction" method="logon">
<result name="success">/JSP/main.jsp</result>
<result name="input">/JSP/login.jsp</result>
<result name="error">/JSP/login.jsp</result>
</action>
</package>
那么如果在jsp里这样三种写法:
第一种
<form action="logon.action" >
.....
</form>
第二种
<form action="/user/logon.action" >
.....
</form>
第三种
<s:form action="logon.action" namespace="/user" >
.....
</s:form>
第一种写法可以通过测试,原因是FilterDispatcher会去package的根目录及下面的子目录去搜logon这个action
第二种写法是正规写法,可以通过测试,因为FilterDispatcher把form的跳转分解为logon.action和nanespace=/user,然后在package下直接命中namespace为"/user"的那个包。
第三种写法,很不幸,不能通过测试,原因是s:form这个标签居然不会在生成html页面时候把namespace的值给加到form 的action属性里面去。。。。。
那么与第三种情况正相反,如果你用s:url的话,一定要写namespace,见下例:
<s:url href="/user/logon.action"/>这种写法极容易出错,原因是不写namespace的话,产生html代码时候很混乱
<s:url href="logon.action" namespace="/user"/>正确写法!
不知道<s:form>标签不支持namespcce的写法是否是一个bug,stusts2的版本是2.1.8.1