Struts2框架学习之三:result返回结果

前言

Struts 2中的Result是作为返回结果的,时当一个action处理完之后返回字符串的结果码。框架可以根据这个返回的字符串,映射到指定的页面。result元素可以分为两部分:一是结果映射,一部分是返回结果类型。

结果映射

result有两个属性可以配置:name属性和type属性。其中的name属性主要用来指定资源的逻辑名称,实际名称在标签内部指定。type属性就是result的返回类型。要注意的是,这两个属性都不是必须的,当我们没有配置这两个属性的时候,实际上框架为我们指定了默认值,其中name属性的默认值是success,type属性的默认值是dispatcher(转发)。正因为框架为我们设定了默认值才可以不用配置。

我们之前的配置都是使用result直接配置,实际上result标签还有一个子标签param,该标签可以为result指定实际资源的位置,其有有一个必需的属性name,实际上就是之前文章中result的配置的资源。比如下面的配置:

<action name="login" class="action.LoginAction">
            <result>
                <!-- param的location用于指示资源的位置,标签的内容是参数的值 -->
                <param name="location">/success.jsp</param>
            </result>
            <result name="error">/error.jsp</result>
        </action>

这里指示资源的实际位置使用param标签,但是如果result的type属性是dispatcher的时候,上面的param标签是可以直接省略的,这也是前面没有写param标签也没有报错的原因。

结果类型

结果类型中常用的有四种:dispatcher、redirect、redirectAction和chain。其中dispatcher已经说过相当转发,redirect相当于重定向,redirecAction也是重定向,只不过使用该结果类型的时候,一般是重定向到某个action,最后一种主要用于action的链式处理。其他的还有plainText(用于显示页面的原始内容,比如Servlet或者jsp的源代码)、xslt等。

第1种:dispatcher

dispatcher也是框架默认的结果类型,其实现类是org.apache.struts2.dispatcher.ServletDispatcherResult,该类中有两个属性:location和parse。它们也可以在struts.xml文件中直接配置:

<result type="dispatcher">
                <!-- param的location用于指示资源的位置,标签的内容是参数的值 -->
                <param name="location">/success.jsp</param>
                <param name="parse">true</param>
            </result>

其中的location参数用于指定资源的实际位置,该参数也是框架默认添加的;parse参数是一个布尔变量,当为true的时候,表示将解析location参数中的OGNL表达式(后面还会介绍)。框架中parse参数的默认值也是true。

第2种:redirect

当使用该结果类型的时候,框架后台会使用response对象的sendRedirect方法进行重定向,重定向与转发还是不同的,具体体现在以下几个方面:

  1. 重定向会发生两次请求,转发只会发生一次请求
  2. 重定向的时候,浏览器的地址栏会发生变化,而转发地址栏是无变化的
  3. 重定向的实质是服务器告诉浏览器去另外的地方寻找资源,所以地址栏会发生变化,而转发是在服务器内部发生的,所以地址栏不会发生变化
  4. 由于重定向是两次请求,所以第二次请求会话保存的信息是无效的,而转发的时候,会话仍然有效,因为仍然是原来的请求。

如果需要在重定向的时候把原来的有关信息发送到重定向后的页面中,则需要使用OGNL表达式${username}(比如在登录成功后重定向到欢迎页面,在欢迎页面就可以使用OGNL表达式把用户名传递过去),比如下面的配置:

<!-- 登录Action -->
        <action name="login" class="action.LoginAction">
            <result type="redirect">/success.jsp?user.username=${user.username}</result>
            <result name="error">/error.jsp</result>
        </action>

在登录成功之后重定向到success.jsp页面的时候,可以观察到浏览器的地址栏把用户名作为参数传递到success.jsp页面。

第3种:redirectAction

此种结果类型与redirect一样,底层都是调用Response对象的sendRedirect方法进行重定向的,这两者的区别是redirect结果类型一般是针对视图的,而redirectAction则是重定向到某个action,所以如果在action处理之后还要交给另一个action继续处理,那么使用redirecAction结果类型。

redirecAction结果类型有两个参数:actionName(指定需要重定向的action)和namespace(指定action所在的命名空间,如果没有指定该参数,框架会从默认的namespace中去寻找)。比如下面的配置:

<!-- HelloWorld演示程序 -->
        <action name="hello" class="example.HelloWorld">
            <!-- 重定向到/user命名空间下的UserAction -->
            <result type="redirectAction">
                <!-- 指定需要重定向的action的name属性 -->
                <param name="actionName">userAction</param>
                <!-- 指定重定向的action所在的namespace -->
                <param name="namespace">/user</param>
            </result>
        </action>

        <!-- 登录Action -->
        <action name="login" class="action.LoginAction">
            <result type="redirect">/success.jsp?user.username=${user.username}</result>
            <!-- 重定向到同一namespace下的name属性为error的action -->
            <result type="redirectAction">
                <!-- 同一namespace下的action不需要指定namespace参数 -->
                <param name="actionName">error</param>
            </result>
        </action>

        <action name="error">
            <result>/error.jsp</result>
        </action>

全局结果

全局结果的的主要作用是,在有多个action都需要返回到某个页面的时候,就可以全局结果。比如在电商网站购物的时候,查看订单,添加商品到购物车都需要先登录,那么就可以把登录作为一个全局结果。全局结果是在包中定义的,这样该包下的所有action都可以共享该全局结果了。

配置全局结果的方式与在action中直接配置result不太一样,全局结果是在global-results标签中定义的。比如下面的配置:

<!-- 全局结果配置 -->
        <global-results>
            <result name="error">/error.jsp</result>
            <result name="login" type="redirectAction">login!login</result>
        </global-results>
时间: 2024-08-07 06:46:39

Struts2框架学习之三:result返回结果的相关文章

Struts2框架学习之六:理解并使用拦截器

前言 拦截器是Struts2框架的核心功能,理解并使用拦截器有助于更灵活使用Struts2.拦截器与Servlet中的过滤器有些类似却又不尽相同.因为在Struts2中拦截器更像一个可插拔的组件,围绕Action和Result进行,可以在方法调用之前.之后使用.通过Struts2的工作流程(后面还会看到一个请求在Struts2中详细的执行流程)可以发现调用一个Action之前之后有许多的拦截器,这些拦截器都通过后才执行具体的action.对于每一个拦截器来说,可以直接返回,从而终止余下的拦截器.

Struts2框架学习之一:Hello World程序

前言 Struts2框架Apache基金组织下的一个开源框架,基于MVC模式设计的Web应用开发框架.Struts 2是一个用于开发Java EE网络应用程序的开源Web应用框架,它利用并扩展了Java Servlet API,鼓励开发者采用MVC架构.目前struts2的最高版本是2.5(测试版). 快速入门 1.下载和安装 可以从官网直接下载最新的struts开发包,官网有多个版本,使用的时候下载full版本即可.下载之后,只需要进行解压就可以使用了 2.Hello World程序 以下是建

Struts2框架学习之五:通用标签详解

前言 Struts2框架为我们提供了很多标签,这些标签总体上可以分为两类:通用标签和UI标签.而较常使用的又是通用标签,所以文章的内容也是围绕通用标签展开的.通用标签分为两类:数据标签和控制标签.数据标签用于访问值栈中数据,控制标签用于控制呈现页面时数据执行流程.如果需要使用Struts 2框架的标签库,需要在页面的首部引入以下代码:<%@ taglib uri="/struts-tags" prefix="s"%>下面将分别对这两种标签进行说明. 数据

Struts2框架学习之七:避免表单重复提交

前言 防止表单重复提交在web开发中是一个经常遇到的问题,一般来避免重复提交有两种方式:客户端JavaScript代码实现和服务端代码实现.这里主要介绍服务端的实现方式.在服务端实现表单重复提交的基本原理是:通过创建一个Session对象,并产生一个令牌值,将这个令牌值作为隐藏域随表单一起发送给客户端,同时在Session中保存令牌值.在用户提交表单的时候判断提交参数的令牌值与Session中的是否相等,如果相等则清除,不再使用这个令牌值,,然后执行后续的处理:如果两者不相等,表示已经提交过表单

Struts2框架学习之二:action详解

前言 在struts 2中,action是其核心功能,使用struts 2框架,主要的开发都是围绕action进行的,我们编写的action通常需要实现com.opensymphony.xwork2.Action接口,需要实现的方法是execute方法,但是在实际的开发中,编写的action也可以不必实现action接口,而是直接创建一个普通Java类,并添加execute方法就可以public String execute(){return "success";}.还有一种方式是集成

Struts2框架学习之四:OGNL表达式

前言 OGNL表达式的全称是Object Graph Navigation Language,就是对象导航图语言.使用OGNL表达式可以使用简单的语法设置以及读取Java对象的值,还包括调用对象的方法,实现类型转换等功能.而且,OGNL表达式的强大还不止于此.我们知道在JSP中已经内置了表达式语言,那么使用OGNL表达式的优势是什么呢?主要是语法变得更简单以及功能的更强大.这两点会在后面的内容加以体现. 对象的操作 使用OGNL表达式实现对象的操作,包括以下几个方面: 1.访问JavaBean属

Hibernate框架学习之三:深入映射文件的配置

前言 这里主要是对XML版的Hibernate框架的开发进行说明,Annotation版会在另外的文章中在说明.由于Hibernate是一个全方位的ORM框架,那么要实现从Object到Record的完全过渡,实现的桥梁就是这里要讲的映射文件了.映射文件的内容繁多,主要是以开发中会使用到的为主进行说明.大体说来,映射文件主要是对class的映射,还包括属性,属性有分为主键.普通属性与集合属性,甚至还有复合类型等.每种属性都需要进行不同的配置,官方文档看得有点累,所以这里一并做一个总结. 映射文件

详解Java的Struts2框架的结构及其数据转移方式_java

Struts2的结构 1.为什么要使用框架? (1)框架自动完成了很多琐屑的任务 对于Struts2来说,它帮助我们方便地完成了数据类型转换.数据验证.国际化等等 Web开发中常见的任务.还有Spring中大量使用的Template模式,都是在让我们的开发 过程更加自动化.智能化.使用框架就是避免重新发明轮子,重新复制这些模板代码. 框架让我们将精力更多地放在更高级别的问题上,而不是常见工作流和基础任务上. (2)使用框架就是优雅地继承了框架背后的架构 框架背后的架构通常定义了一系列的工作流程,

Struts2重新学习之自定义拦截器(判断用户是否是登录状态)

拦截器 一:1:概念:Interceptor拦截器类似于我们学习过的过滤器,是可以再action执行前后执行的代码.是web开发时,常用的技术.比如,权限控制,日志记录. 2:多个拦截器Interceptor连在一起组成了Interceptor栈.拦截器是AOP面向切面编程的一种实现,具有热插拔的效应. 3:Struts2拦截器,每个拦截器类只有一个对象实例,即采用了单利模式.所有引用这个拦截器的action都共享着一拦截器类的实例.   拦截器和过滤器的区别 1:拦截器和过滤器的概念非常类似