关于struts2中No result defined for action这个异常的解决思路
昨天晚上俺想到有一个功能没做,就想做一下!由于这个功能以前做过,很快就写出来了,于是就部署,debug tomcat!但是在测试的时候,却总是报No result defined for action异常,检查了一个小时,而且把以前写的代码夜拿出来对照,还是没有发现错误原因,只能放弃!今天早上起床就开始上Google搜这个,虽然网 上很多这样的错误,但是看了好多都没能解决这个问题,所以就按照网上的帖子先加了一个result中name为input的结果:
,还在error.jsp中加了一个
代 码,由于对struts2掌握的也不太好,从debug的stacktrace中也没看出什么,所以只能继续上Google搜,然后再在自己的代码中修修 补补,发现按要执行的manage/store/storeType_online(使用了通配符)中在StoreAction中的online方法竟然 没只能,而是执行的该类的另一个方法
由于没有传递storeid这个参数,就报了错误,所以俺把上述方法注释掉了,这个时候再做测试,进入了error.jsp页面,从堆栈中没看出啥问题。又到网上以“struts2 方法没执行”搜,在
http://blog.csdn.net/gavin812428144/archive/2010/03/27/5422220.aspx页面中看到了如下文字
,才知道INPUT的结果是没有通过验证的返回结果(基础没掌握好,就是浪费时间)。所以怀疑是form提交的数据没有通过struts2默认的验证,只能再上Google搜,找到了这个页面
http://blog.csdn.net/yby0260/archive/2010/08/18/5822312.aspx:
,于是就将<s:fielderror/>加到error.jsp 页面上,这才看到错误信息,原来是storelist.jsp中的一个隐藏input
的值验证无效,所以看了一下以前的代码发现没有value="${currentPage}"属性,所以去掉该属性后,再测试,正常。终于解决了,不容易......
总结一下:遇到No result defined for action的问题的时候,首先看是不是validate的问题,在action中,设置断点,看执行了没有(注意,要使用debug,tomcat必须 以debug方式启动,建议在开发的时候都是以debug方式启动),再加一个INPUT的返回结果看看,在相应的页面中输出验证信息。如果不是 validate的问题,再看页面元素中有重命名时,但后台action类的对应的接收此同名参数的是变量而没有写成数组,也可能是路径的问 题......
- <result name="input">/WEB-INF/page/error/error.jsp</result>
- <s:debug></s:debug>
- public String getStoreDetail() {
- store = storeService.find(storeid);
- return "storedetail";
- }
- 今天提交表单时发现action中的execute()方法没有执行,但是validate()却执行了,而且并没有报任何错,执行完之后,就直接退出了,程序并没有进入execute()。
- 几经调试,发现validate()返回的resultCode为INPUT,说明并没有通过验证。究竟是什么原因导致验证不通过呢?!郁闷了半天,最后突然想起,我所提交的表单中有个type="file"的input,即我是准备上传文件的,然而我忘了将form的enctype属性改成"multipart/form-data"。貌似找到了问题,赶紧重试,结果果然如预料的,正是这个问题导致了表单提交失败,execute()未被执行。
- 如果大家遇到类似问题,不妨看看你的form的enctype,希望此次经历对大家有用。
- 当 我们在使用struts2自带的验证框架来验证表单字段时,需要在页面上显示错误提示信息,一般我们是在页面上添 加<s:fielderror/>标签。而<s:fielderror/>会解析 成<ul><li><span>error message</span>< /li></ul>的形式,这样一来错误信息的显示就只能显示在验证字段的上方或者下面,而我们需要的往往是将错误信息显示在验证字段 的右边。
- <input type="hidden" name="currentPage" value="${currentPage}"/>
总结一下:遇到No result defined for action的问题的时候,首先看是不是validate的问题,在action中,设置断点,看执行了没有(注意,要使用debug,tomcat必须 以debug方式启动,建议在开发的时候都是以debug方式启动),再加一个INPUT的返回结果看看,在相应的页面中输出验证信息。如果不是 validate的问题,再看页面元素中有重命名时,但后台action类的对应的接收此同名参数的是变量而没有写成数组,也可能是路径的问 题......
我出现这个错误,仔细检查发现是form表单的一个input的name属性和action中的对应属性不一致,大小写问题导致的。
例子2:
我这个错事validate的问题,验证没通过,所以action自动return “input”,然后我没有定义<result name="input"></result>的页面,所以报404