Posted on 2006-07-24 17:26
大大毛 阅读(321)
评论(0) 编辑 收藏 所属分类:
Struts
起因:
在学习那个addressbook例程中遇到这个问题的,当时我改变了例程的流程, 不让menu.jsp直接使用<a link>来跳,而是配合JS提交action到menuAction,而对于那个display和displayAll两个模块,我当时也想改改,因为按书上的例程,是要把"生成SQL并压入到session中"分放到两处进行处理的,这样的感觉很不爽,如果需要发生什么变化的话,需要到多个地方去对应着更改,因此我的作法是在menuAction 中压入一个displayAll = 0 or 1,再forward,这样在 searchAction 中 sql = "select * from address"; if(displayAll == 1) { ...;sql += where;}.
当时遇到了麻烦,我将displayall配成 "search.do" ;运行结果有些让人意外,searchAction并没有得到控制权,而是跳到了它的input页面 search.jsp.现在问题已经解决,下面就详细说明一下原因及解决方法:
问题的分析:
之所以从menuAction --> searchAction时会跳到search.jsp页面,是因为在转移到 searchAction 时产生了 检验错误, Struts根据Action的配置参数,转向到Action.input所指定的JSP文件,从而出现上面的一幕.
解决方法:
方法1:
步骤一: 查看Action的属性,可以看到有一个 "validate"属性,是个boolean属性,缺省为true,它表明Action是否需要调用ActionForm.validate();将其设为false;或者去掉ActionForm中的校验.
步骤二: 既然去掉了视图层的校验,那就有必要在控制器中实现这个输入值校验的功能了.
方法2(取巧的办法):
利用一个比较特殊的东东,记得我在 笔记02 中提到过的那个<html:cancel />标签,现在就转转弯,用它了,来个
request.setAttribute(Globals.CANCEL_KEY,
""
);
只要给它一个对象,Struts控制器就会认为是按下了Cancel,这样的话也可以绕过ActionForm中的validate(),而且从正常的Input JSP页面提交的话,ActionForm.validate()方法还是可以产生作用的.
后记:
Myeclipse里面配置Action时能够设置的属性并不多,也不包含这个validate属性,需要自己手工处理struts-config.xml
如果技术上达不到,暂时取取巧还是可以的,随着技术的深入,解决问题的方法也会越来越中规中矩