Struts2 的 Result

    技术2026-06-14  12

    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 的,也就是不用手工实现传递参数。
    最新回复(0)