`
bit1129
  • 浏览: 1068123 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

【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 in action(struts2实战)

    - Struts2拥有丰富的插件库,如Struts2-dojo-plugin、Struts2-convention-plugin等,可以方便地集成第三方库。 7. **国际化与本地化**: - Struts2提供对多语言的支持,通过资源包(Properties文件)实现内容的...

    Struts2 in action

    当用户通过浏览器发送请求时,Struts2会将请求转发给相应的Action处理。 - **执行流程**: - 用户发起HTTP请求。 - 请求被Struts2的前端控制器(FilterDispatcher)拦截。 - FilterDispatcher根据配置找到对应的...

    Struts 2实战 Struts 2 in action 的中文版

    根据提供的信息,我们可以推断出这是一本关于Struts 2框架的书籍——《Struts 2实战 Struts 2 in action 的中文版》。本书主要介绍了Struts 2框架的相关概念、工作原理以及实际应用案例等内容。接下来,我们将根据...

    Struts2接口文档

    Struts2的核心组件包括Action、Result、Interceptor(拦截器)等,这些组件通过特定的接口进行交互。Action接口定义了处理用户请求的方法,如execute(),开发者通常会自定义Action类来实现业务逻辑。Result接口则...

    Struts2实战(Struts2 In Action中文版)

    1. **Struts2基础**:介绍Struts2的基本概念,包括配置文件、Action类、结果类型和视图解析。 2. **OGNL表达式语言**:Struts2使用OGNL(Object-Graph Navigation Language)进行数据绑定和表达式操作,学习如何...

    Struts2 in action中文版+配套源代码

    "Struts2InAction.war"可能包含了书中的所有示例代码,覆盖了各种主题,包括Action、拦截器、结果类型、OGNL表达式、表单验证、国际化等。通过阅读和运行这些代码,开发者可以更直观地了解Struts2的运作方式和实际...

    留言板留言板struts2留言板struts2

    Struts2内置了多种结果类型,如dispatcher(重定向或转发到一个JSP页面)、stream(下载文件)等,也可以自定义结果类型。 5. **OGNL(Object-Graph Navigation Language)**:Struts2使用OGNL作为默认表达式语言,...

    Struts2视频教程

    #### 三、Struts2高级特性 - **OGNL表达式语言**:Object-Graph Navigation Language (OGNL) 是一种强大的表达式语言,用于访问Java对象的属性和方法。Struts2内置了对OGNL的支持,可以方便地在JSP页面中使用OGNL...

    struts2 Result类型

    Struts2 Result类型是Struts2框架中一个关键的概念,它是动作执行完成后跳转到下一个页面或处理逻辑的核心机制。Result类型定义了如何处理动作执行的结果,使得开发者能够灵活地控制应用程序的流程。 首先,我们...

    struts1和struts2的区别

    - **Struts2**: Struts2中的Action更像是工厂模式下的产品,每个Action实例都是线程安全的。Struts2提供了ActionSupport基类来简化Action的实现。Action本身可以是任何实现了特定接口的Java对象,甚至是普通的POJO。...

    struts2简单实例(类型转换)

    在这个"struts2简单实例(类型转换)"中,我们将探讨Struts2如何处理不同类型的数据转换,以及如何创建一个简单的演示应用。 首先,让我们理解什么是类型转换。在Web应用程序中,用户通过表单提交的数据通常是字符...

    struts2jar包

    在项目中使用Struts2时,我们需要配置struts2的主配置文件(struts.xml),定义Action、结果类型、拦截器栈等。Action是业务逻辑的入口点,Result表示一个操作完成后转向的页面或结果。拦截器是Struts2的一大特色,...

    struts 2 转发.rar

    Struts2允许动态地确定转发的目标,通过在Action类的方法上使用`@Result`注解或在结果类型中设置属性。例如: ```java @Action("myAction") public String execute() { // 业务逻辑... return "success"; // ...

    struts2 ,struts2 demo

    Struts2支持多种结果类型,如dispatcher(转发到JSP)、stream(下载文件)、redirect(重定向)。结果配置可以根据Action执行的结果(success、error等)决定跳转到哪个视图。 在提供的“struts2 demo”压缩包中,...

    struts2小程序 struts2代码

    2. **配置文件**:Struts2使用XML配置文件(struts.xml或struts.properties)来定义Action、结果类型、拦截器等。这些配置是理解程序工作流程的关键。 3. **Interceptor拦截器**:拦截器允许在Action执行前后插入...

    Struts2漏洞检查工具Struts2.2019.V2.3

    1. OGNL(Object-Graph Navigation Language)表达式注入:这是Struts2最著名的漏洞类型,由于框架在处理用户输入时没有进行充分的过滤和验证,攻击者可以通过构造恶意的OGNL表达式来执行任意代码,从而导致远程代码...

    Struts2框架及注释和用法

    Struts2支持多种结果类型,如dispatcher(默认,转发到JSP),redirect(重定向到URL),freemarker(使用FreeMarker模板引擎渲染)等。 **9. 国际化和主题** Struts2支持多语言环境,通过资源文件(如message....

    Struts2 Struts2 超好的Struts2 pdf 文档

    4. **结果类型(Result Types)**:Struts2支持多种结果类型,如`dispatcher`(默认,将结果转发到JSP页面)、`stream`(用于文件下载)、`redirect`(重定向URL)等,可以根据不同的需求选择合适的结果类型。...

Global site tag (gtag.js) - Google Analytics