大大毛 的笔记

  DDM's Note

哪怕没有办法一定有说法,
就算没有鸽子一定有乌鸦,
固执无罪 梦想有价,
让他们惊讶.

posts - 14, comments - 23, trackbacks - 0, articles - 58
   :: 首页 ::  :: 联系 ::  :: 管理

Struts中action之间控制权转移的问题

Posted on 2006-07-24 17:26 大大毛 阅读(322) 评论(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
      如果技术上达不到,暂时取取巧还是可以的,随着技术的深入,解决问题的方法也会越来越中规中矩


只有注册用户登录后才能发表评论。


网站导航:
 

i am ddm