Result 的常见类型:
dispatcher
相当于 JSP 中的 标签,在服务器端执行跳转。
redirect
很显然的相当于 response.sendRedirect(String url);。
chain
这个与 dispatcher 相似,不过 chain 只能跳转到另一个 action ,而 dispatcher 只能跳转到其他 JSP、Html 页面。
redirectAction
见名知义,不解释。
全局 Result:
定义全局 Result 的好处是,我们可以在任意 action 之要返回相同的字符串,如 haha,都可以定位到全局 Result ,而不需要一一指明。
1: <global-results> 2: <result name="haha">/Test_add_success.jsp result> 3: global-results> .csharpcode, .csharpcode pre { font-size: small; color: black; font-family: consolas, "Courier New", courier, monospace; background-color: #ffffff; /*white-space: pre;*/ } .csharpcode pre { margin: 0em; } .csharpcode .rem { color: #008000; } .csharpcode .kwrd { color: #0000ff; } .csharpcode .str { color: #006080; } .csharpcode .op { color: #0000c0; } .csharpcode .preproc { color: #cc6633; } .csharpcode .asp { background-color: #ffff00; } .csharpcode .html { color: #800000; } .csharpcode .attr { color: #ff0000; } .csharpcode .alt { background-color: #f4f4f4; width: 100%; margin: 0em; } .csharpcode .lnum { color: #606060; }注意,全局 Result 必须定义在一个包里,即一个 package 标签下。假设我们刚才定义的全局 action 是在名为 wawa 的包里。
定义的全局 Result 默认仅作用于当前 package ,如果想在其他包中使用这个全局 Result ,就得让其他的包继承定义了全局 Result 的包:
1: <package name="default" namespace="/" extends="wawa"> .csharpcode, .csharpcode pre { font-size: small; color: black; font-family: consolas, "Courier New", courier, monospace; background-color: #ffffff; /*white-space: pre;*/ } .csharpcode pre { margin: 0em; } .csharpcode .rem { color: #008000; } .csharpcode .kwrd { color: #0000ff; } .csharpcode .str { color: #006080; } .csharpcode .op { color: #0000c0; } .csharpcode .preproc { color: #cc6633; } .csharpcode .asp { background-color: #ffff00; } .csharpcode .html { color: #800000; } .csharpcode .attr { color: #ff0000; } .csharpcode .alt { background-color: #f4f4f4; width: 100%; margin: 0em; } .csharpcode .lnum { color: #606060; }
动态结果集:
我们还可以在 Action 中指定 Result 标签的值:
1: package com.cdp.struts2; 2: 3: import com.opensymphony.xwork2.ActionSupport; 4: 5: public class TestAction extends ActionSupport { 6: 7: private String param = ""; 8: private String dynamicResult; 9: 10: //Getters and Setters Omitted Here... 11: 12: public String execute() { 13: if (param.equals("1")) { 14: dynamicResult = "/Test_add_success.jsp"; 15: } else { 16: dynamicResult = "/Test_add_error.jsp"; 17: } 18: return SUCCESS; 19: } 20: 21: } .csharpcode, .csharpcode pre { font-size: small; color: black; font-family: consolas, "Courier New", courier, monospace; background-color: #ffffff; /*white-space: pre;*/ } .csharpcode pre { margin: 0em; } .csharpcode .rem { color: #008000; } .csharpcode .kwrd { color: #0000ff; } .csharpcode .str { color: #006080; } .csharpcode .op { color: #0000c0; } .csharpcode .preproc { color: #cc6633; } .csharpcode .asp { background-color: #ffff00; } .csharpcode .html { color: #800000; } .csharpcode .attr { color: #ff0000; } .csharpcode .alt { background-color: #f4f4f4; width: 100%; margin: 0em; } .csharpcode .lnum { color: #606060; }然后 dynamicResult 就会被当做参数进值栈信息,我们在 struts.xml 中访问值栈信息就可以得到正确的访问页面了:
1: <action name="dynamic" class="com.cdp.struts2.TestAction"> 2: <result>${dynamicResult} result> 3: action> .csharpcode, .csharpcode pre { font-size: small; color: black; font-family: consolas, "Courier New", courier, monospace; background-color: #ffffff; /*white-space: pre;*/ } .csharpcode pre { margin: 0em; } .csharpcode .rem { color: #008000; } .csharpcode .kwrd { color: #0000ff; } .csharpcode .str { color: #006080; } .csharpcode .op { color: #0000c0; } .csharpcode .preproc { color: #cc6633; } .csharpcode .asp { background-color: #ffff00; } .csharpcode .html { color: #800000; } .csharpcode .attr { color: #ff0000; } .csharpcode .alt { background-color: #f4f4f4; width: 100%; margin: 0em; } .csharpcode .lnum { color: #606060; }因为我们可以通过 ${} 在 struts.xml 中去值栈里面的参数,所以我们可以利用这一特性,向 result 指定的页面传入参数,在 struts.xml 中这一配置:
1: <action name="param" class="com.cdp.struts2.TestAction"> 2: <result type="redirect">Test_add_success.jsp?param=${param} result> 3: action> .csharpcode, .csharpcode pre { font-size: small; color: black; font-family: consolas, "Courier New", courier, monospace; background-color: #ffffff; /*white-space: pre;*/ } .csharpcode pre { margin: 0em; } .csharpcode .rem { color: #008000; } .csharpcode .kwrd { color: #0000ff; } .csharpcode .str { color: #006080; } .csharpcode .op { color: #0000c0; } .csharpcode .preproc { color: #cc6633; } .csharpcode .asp { background-color: #ffff00; } .csharpcode .html { color: #800000; } .csharpcode .attr { color: #ff0000; } .csharpcode .alt { background-color: #f4f4f4; width: 100%; margin: 0em; } .csharpcode .lnum { color: #606060; }然后在 Test_add_success 里面调用熟悉的 request.getParameter() 方法实现参数的取值。还可以通过 取值。
当然,我们也可以利用动态结果集设定 dynamicResult 的值来实现这一过程。
只有在 redirect 的时候需要传递参数,dispatcher 是默认共用一个 request 的,也就是不用手工实现传递参数。