【Struts2三】Struts2 Action转发类型

 在【Struts2一】 Struts Hello World http://bit1129.iteye.com/blog/2109365中配置了一个简单的Action,配置如下

 

<!DOCTYPE struts PUBLIC  
        "-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"  
        "http://struts.apache.org/dtds/struts-2.3.dtd">  
<struts>  
    <package name="/simple" namespace="/simple" extends="struts-default">  
        <action name="helloworld" class="com.tom.actions.HelloWorldAction" method="executeAction">  
            <result name="success">/htmls/user.jsp</result>  
        </action>  
    </package>  
</struts>

 

result转发的四个常用类型

action配置项的子元素result包含两个属性,name和type,name属性值匹配action处理的结果,type则表示action结果的跳转类型,包含四个基本值:

 

1. dispatcher 表示forward,即请求跳转,当不指定type属性时,默认值就是dispatcher。request从当前action跳转到另一个视图(可以是jsp,action或者velocity等)时保持不变,跳转对用户是透明的

 

2. type=redirect,重定向

   2.1 重定向表示重新发起一个请求,用户可以看到浏览器URL发生变化,因为是两个不同的请求,因此,当前action所对应的request,与之后的request是完全独立的,后面的request不能共享当前action对应 的request的设置的属性值

   2.2 Struts2支持当前的action传递一些参数给给后面的视图,例如

<result type="redirect">/pages/abc.jsp?userId=${user.id}</result>

它表示,转发到/pages/abc.jsp时,可以带一个请求参数userId,参数值是${user.id},它表示从当前action的user对象中取出id属性,action有getUser()方法,user对象有getId()方法,这是ognl表达式

3.type=redirectAction,重定向到某个Action
      3.1 跳转到同包内的Action,使用如下配置
<result type="redirectAction">helloworld</result>
   它表示跳转到当前action所在包(package)下的namespace为helloworld的action
 

    3.2 其它包下面的Action,使用如下配置

 

<result type="redirectAction">
      <param name="actionName">otherAction</param>
      <param name="namespace">otherNamespace</param>
</result>
 

4.plainText 纯文本内容

    plainText表示要跳转的view以纯文本的方式返回内容,使用如下配置,当访问当前action时,返回的是abc.jsp的原始内容,而不是把abc.jsp解析成html代码的内

 

<result type="plainText">
      <param name="location">abc.jsp</param>
      <param name="charSet">UTF-8</param>  <!--表示以UTF-8的编码读取abc.jsp,而不是使用系统默认的字符编码-->
</result>
 

例子

1. /htmls/user.jsp
<!DOCTYPE html>
<html>
<head lang="en">
    <meta charset="UTF-8">
    <title></title>
</head>
<body>
<!--message定义在Action中,可以直接使用${message}-->
<!--message定义在URL的请求参数中,则使用${param.message}-->
    Hello, ${message} 
</body>
</html>
 
2. HelloWorldAction.java
package com.tom.actions;

public class HelloWorldAction {
    private String message;

    public String getMessage() {
        return message;
    }

    public void setMessage(String message) {
        this.message = message;
    }

    public String executeAction() {
        setMessage("Welcome to the Struts2 world");
        return  "success";
    }
}
 
3. struts.xml
<!DOCTYPE struts PUBLIC
        "-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
        "http://struts.apache.org/dtds/struts-2.3.dtd">
<struts>

    <package name="resultType" namespace="/resultType" extends="struts-default">
        <action name="plainText" class="com.tom.actions.HelloWorldAction" method="executeAction">
            <result name="success" type="plainText">/htmls/user.jsp</result>
            <!--浏览器看到的响应结果是user.jsp原始内容包括<html>等标签-->
        </action>
        <action name="dispatcher" class="com.tom.actions.HelloWorldAction" method="executeAction">
            <result name="success" type="dispatcher">/htmls/user.jsp</result>
            <!--因为是跳转,request不变,所以user.jsp中${message}应该被替换掉-->
        </action>
        <action name="redirect1" class="com.tom.actions.HelloWorldAction" method="executeAction">
            <result name="success" type="redirect">/htmls/user.jsp</result>
            <!---浏览器地址兰完整显示了user.jsp的请求地址http://localhost:8688/web/htmls/user.jsp-->
            <!--${message}显示为空字符串,也就是说,如果直接请求jsp,如果jsp中JSTL没有匹配值,则显示为空-->
        </action>
        <action name="redirect2" class="com.tom.actions.HelloWorldAction" method="executeAction">
            <result name="success" type="redirect">/htmls/user.jsp?message=${message}</result>
            <!--user.jsp使用${param.message}这个JSTL表达式来接收参数-->
        </action>
        <action name="redirectAction1" class="com.tom.actions.HelloWorldAction" method="executeAction">
            <!--HelloWorldAction转发到dispatcher这个action-->
            <!--dispatcher这个action因为是forward到/htmls/user.jsp,因此,user.jsp能够获得dispatcher action的请求数据-->
            <!--浏览器看到的最终URL是dispatcher这个action的URL-->
            <result name="success" type="redirectAction">dispatcher</result>
        </action>
        <action name="redirectAction2" class="com.tom.actions.HelloWorldAction" method="executeAction">
            <result name="success" type="redirectAction">
                <param name="actionName">otherAction</param>
                <param name="namespace">otherNamespace</param>
            </result>
        </action>
    </package>
    <package name="other" namespace="/resultType/otherNamespace" extends="struts-default">
        <!--redirectAction2要跳转到这里来,那么这个action的namespace必须以是redirectAction2所在namespace为前缀-->
        <action name="otherAction">
            <!--使用ActionSupport来返回user.jsp,因为ActionSupport没有定义message,所有user.jsp中的message显示为空-->
            <result>/htmls/user.jsp</result>
        </action>
    </package>

</struts>

 

全局(package范围的)result

对于一个项目来说,有些result的配置是统一的,而不是局限于某个包中,比如<result name="error">error.jsp>/result>,这个result应该是整个项目通用,Struts提供了一个global result的设置,

 

        <global-results>
            <result name="error">error.jsp</result>
            <result name="exception">exception.jsp</result>
        </global-results>
        <global-exception-mappings>
            <exception-mapping exception="java.lang.Throwable" result="exception">
            </exception-mapping>
        </global-exception-mappings>
 

 

遗憾的是globlal-results和global-exception-mappings,只能定义在package级别,即它们只能定义为package的子元素,定义成package的子元素后,那么同一个struts.xml其他package下的action就不能使用这些项目级别的result配置,解决办法,是定义一个抽象基本包,在这个base包中防止这些项目级别的全局配置,那么让各个包继承自这个包即可

 

1. struts.xml配置

 

 

<!DOCTYPE struts PUBLIC
        "-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
        "http://struts.apache.org/dtds/struts-2.3.dtd">
<struts>

    <package name="base" namespace="" extends="struts-default" abstract="true">
        <global-results>
            <result name="error">/htmls/error.jsp</result>
            <result name="exception">/htmls/exception.jsp</result>
        </global-results>
        <global-exception-mappings>
            <exception-mapping exception="java.lang.Throwable" result="exception">
            </exception-mapping>
        </global-exception-mappings>
    </package>

    <package name="resultType" namespace="/resultType" extends="base">

        <action name="error" class="com.tom.actions.HelloWorldAction" method="errorCall">
            <!--不需要指定<result type="error"></result>来响应HelloWorldAction的error,由全局的result配置响应-->
        </action>
        <action name="exception" class="com.tom.actions.HelloWorldAction" method="exceptionCall">
            <!--不需要指定<result type="exception"></result>来响应HelloWorldAction的exception,由全局的result配置响应-->
        </action>
    </package>
</struts>
 

 

2. HelloWorldAction.java代码

 

package com.tom.actions;

public class HelloWorldAction {
    private String message;

    public String getMessage() {
        return message;
    }

    public void setMessage(String message) {
        this.message = message;
    }

    public String executeAction() {
        setMessage("Welcome to the Struts2 world");
        return  "success";
    }

    public String errorCall() {
        return "error";
    }
    public String exceptionCall() {
        throw new NullPointerException("This is a NPE");
    }
}

 

3.

 

你可能感兴趣的:(struts2)