Struts2中chain或者是重定向的传值方法

2009年04月15日 星期三 23:36

在做一个bbs时,在本页回帖,同时在本页显示数据,这时候我走了两个action,一个是插入操作,一个是查询操作,但是需要传递当前帖子的id,这时候就要传值,于是搜了下,得到了如下的方法:(其实根本不需要重定向,如果把插入和查询写在一起完全可以解决问题,有时候遇到麻烦是因为设计的不好)

<result name="success" type="redirect">list.action?id=${id}</result>

在action中定义id的get/set方法,同名

还有其他几种方法,我用时结果没问题,但是控制台报错,不知道为什么

Chain Result:
这个result调用另外的一个action,连接自己的拦截器栈和result。

* actionName (默认) - 被调用的action的名字
* namespace - 被调用的action的名称空间. 如果名称空间为空,这默认为当前名称空间
* method - 用于指定目标action的另一个方法被调用. 如果空,默认为excute方法

Redirect Action Result:
这个Result使用ActionMapperFactory提供的ActionMapper来重定位浏览器的URL来调用指定的action和(可选的)namespace. 这个Result比ServletRedirectResult要好.因为你不需要把URL编码成xwork.xml中配置的ActionMapper提供的模式. 这就是说你可以在任意点上改变URL模式而不会影响你的应用程序. 因此强烈推荐使用这个Result而不是标准的redirect result来解决重定位到某个action的情况.

* ActionName (默认) - 重定位到的action名
* namespace - action的名称空间. 如果为null,则为当前名称空间
*

Redirect Result

调用{@link HttpServletResponse#sendRedirect(String) sendRedirect}方法来转到指定的位置. HTTP响应被告知使浏览器直接跳转到指定的位置(产生客户端的一个新请求). 这样做的结果会使刚刚执行的action(包括action实例,action中的错误消息等)丢失, 不再可用. 这是因为action是建立在单线程模型基础上的. 传递数据的唯一方式就是通过Session或者可以为Ognl表达式的web参数(url?name=value)

* location (默认) - action执行后跳转的地址.
* parse - 默认为true. 如果设置为false, location参数不会被当作Ognl表达式解析.



常有这样的梦:不知何来一本似乎是无字天书,而其中的字句却是慢慢地、渐显可辨。同时现实中的自己完全能察觉这是一个梦,极怕即刻醒来,想多记取那些天外之语。但总不能如愿,醒来时还留有某些字句痕迹,再过后就全然忘却。仿佛进入的是一个太虚幻境。

1. 动态 Action:<action ../> 元素的一个前所未有的特性是,name 属性可以用通配符,class 和 method 属性中可以用 name 中的匹配参数,{0}/{1} 的形式。举两个例子说明:
    ① <action name="*Action" class="com.unmi.LoginRegistAction" method="{1}">
         URL 是 registAction.action 时,会执行 LoginRegistAction 类实例的 regist() 方法
    ② <action name="*_*" class="actions.{1}Action" method="{2}">
         URL 是 Book_save.action 时,会执行 actions.BookAction 类实例的 save() 方法
   说明:{1},{2}是用来匹配 name 属性中的 *,这和正则表达式一样的,{0} 表示的完整的 name 属性值。这也是托 Struts2 的每请求产生新的 Action 的实例才能这么用的,试想一下,Struts1 是没法针对通配符来预先加载好所有的 Action 实例的。
    可由此定义一个能用的 Action,<result> 里也能用参数。
    <action name="*">
        <result>/{1}.jsp</result>
    </action>

2. 关于在 <action .../> 中使用通配符时的校验文件命名规则。校验文件的搜索规则是:
    ① <ActionClassName>-<ActionAliasName>-validation.xml              <ActionAliasName> 为 name 属性值
    ② <ActionClassName>-validation.xml
    同时有这两个文件时,后面的规则能与前面的规则叠加或覆盖,例如 ① 中有name域的校验,② 中有password域的校验,这两个文件同时存在 <ActionClassName>所在路径时,会同时校验name和password域。
    例如对于 <action name="*Action" class="com.unmi.LoginRegistAction" method="{1}">
    URL 是 registAction.action 时,会搜索校验文件 LoginRegistAction-registAction-validation.xml 和 LoginRegistAction-validation.xml。

3. 使用通配符就会涉及到 URL 与哪个 Action 匹配的问题。例如匹配有name为 "*"、"*Action"、"LoginAction" 的 <action .../>,如果 URL 与某个 Action 的 name 完全相同(如 LoginAction.action),否则按顺序来匹配,而不是按匹配度来对应。如 abcAction.action 会匹配到 "*",而不是 "*Action"。

4. 可配置默认的 Action,URL 匹配不到对应的 Action 时就用它,用 <default-action-ref ../> 配置在 <package .../> 中。

5. Struts2 支持两种 <result ../>,配置在 <action .../> 中的局部 result,配置在 <global-results .../> 中的全局 result。<result .../> 默认的 name 属性是 "success";默认的 type 属性是 "dispatcher",即使 JSP 类型。

6. <result .../> type="plaintext" 的 <result .../> 会显示页面的源文件,如果其中有中文一般会产生乱码,这时候可设置它的 charSet 属性为 "GBK",用 <param .../> 标记。

7. <result .../> 的 dispatcher 和 redirect 类型的区别就是一个是转发(带请求参数、属性、址址栏不变)和重定向(丢失请求参数、属性、重新产生请求,所以地址栏会变)。

8. redirect-action 类型是重定(不是转发)向到一个 Action 上,那么要为 <result .../> 指定两个参数 actionName 和 namespace。简写为 <result name="..." rediect-action">actionName</result>。这种类型相当于在 Struts1 中的   <forward name="..." redirect="true">/anotherAction.do</forward> 写法。当然在 Struts2 中也可以用 redirect 类型写成相同的形式。

9. 动态结果资源有两种,根据 <action .../> 的 name 属性的模式匹配后的参数和请求参数决定结果。
    ① <action name="crud_*" class="com.unmi.CrudAction" method="{1}">
            <result>/{1}.jsp</result>
         </action>
     URL 为 crud_delete.action 处理成功后会转到 delete.jsp 页。
    ② <action name="..." class="com.unmi.ShowAction">
            <result>/show${user.type}</result>
        </action>
       要在 ShowAction 的设置了属性 ${user.type}。例如 ${user.type} 设置为 "admin",就会转到 showadmin.jsp 页。

10. Struts2 的 <result .../>、<global-result .../> 意义与效果完全对应于 Struts1 的 <forward .../>、<global-forward .../> 。

猜你喜欢

转载自hehaibo.iteye.com/blog/1104807