Struts2Result结果集类型的详细说明和示例

Struts2的Action处理用户请求结束后,返回一个普通字符串——逻辑视图名,必须在struts.xml文件中完成逻辑视图和物理视图资源的映射,才可以让系统转到实际的视图资源。

简单的说,结果是告诉struts2框架,当Action处理结果时,系统下一步做什么。当Action返回一个普通字符串时,系统下一步将做什么。

Struts2通过在struts.xml文件中使用<result…/>元素来配置结果。根据<result…/>元素所在位置的不同,struts2提供了两种结果:

(1)       局部结果:将<result…/>作为<action…/>元素的子元素配置。

(2)       全局结果:将<result…/>作为<global-result…/>元素的子元素配置。

一、              下面我们首先来介绍一下局部结果,局部结果是通过在<action../>元素中指定<result…/>元素来配置的,一个<action…/>元素可以有多个<result…/>元素。这表示一个Action可以对应多个结果。

最典型的<result…/>配置如下:

[html] view
plain
 copy

  1. <action name="login" class="cn.csdn.hr.action.LoginAction" method="checkLogin">
  2. <!-- 为success的逻辑视图配置Result,type属性指定结果类型 -->
  3. <result name="success" type="dispatcher">
  4. <!-- 指定该逻辑视图对应的实际视图资源 -->
  5. <param name="location">./login.jsp</param>
  6. </result>
  7. </action>

对于上面使用了<param../>子元素配置结果的形式,其中<param../>元素的name属性可以有如下两个值:

(1)   location:该参数指定了该逻辑视图对应的实际视图资源。

(2)   parse:该参数指定是否允许在实际视图名字中使用OGNL表达式,该参数默认值为true。如果设置该参数值为false,则不允许在实际视图名中使用表达式。通常无需修改该属性值。因为通常无需指定parse参数的值。

除此之外,struts2还允许省略指定结果类型,即可简写成如下:

[html] view
plain
 copy

  1. <action name="login" class="cn.csdn.hr.action.LoginAction" method="checkLogin">
  2. <result>./login.jsp</result>
  3. </action>

二、struts2支持的处理结果类型

归纳一下来说,Struts2内建支持结果类型如下:

(1)   chain结果类型:Action链式处理的结果类型。

(2)   chart结果类型:用于整合JFreeChart的结果类型。

(3)   dispatcher结果类型:用于FreeMarker整合的结果类型。

(4)   httpheader结果类型:用于控制特殊的HTTP行为的结果类型。

(5)   jasper结果类型:用于JasperReports整合的结果类型。

(6)   jsf结果类型:用于与JSF整合的结果类型。

(7)   redirect结果类型:用于直接跳转到其他URL的结果类型。

(8)   redirect-action结果类型:用于制直接跳转到其他Action的结果类型。

(9)   stream结果类型:用于向浏览器返回一个InputStream(一般用于文件下载)。

(10)  tiles结果类型:用于与Tiles整合的结果类型。

(11)  velocity结果类型:用于与Velicity整合的结果类型。

(12)  xslt结果类型:用于与XML/XSLT整合的结果类型。

(13)  plaintext结果类型:用于显示某个页面的原始代码的结果类型。

上面一共列出了14种类型,其中dispatcher结果类型是默认的类型,主要用于与JSP页面整合。

下面我将重点介绍dispatcher(默认值)、 redirect 、 redirectAction 、 plainText。常用的结果类型。

1、 plaintext结果类型

这个结果类型并不常用,因为它的作用太过局限:它主要用于显示实际视图资源的源代码。

以下是一个关于plaintext结果类型的小案例分析及其源代码以及显示效果:

对于如下简单的Action类:

[java] view
plain
 copy

  1. public class LoginAction implements Action{
  2. //用于封装请求参数的username属性
  3. private String username;
  4. //username属性的setter和getter方法
  5. public String getUsername() {
  6. return username;
  7. }
  8. public void setUsername(String username) {
  9. this.username = username;
  10. }
  11. //处理用户请求的excute方法
  12. public String execute() throws Exception {
  13. return SUCCESS;
  14. }
  15. }

上面的Action类并为真正处理用户请求,它只是简单地返回了一个success的逻辑视图。在struts.xml文件中配置该Action,如果采用如下配置片段:

[html] view
plain
 copy

  1. <?xml version="1.0" encoding="UTF-8" ?>
  2. <!DOCTYPE struts PUBLIC
  3. "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
  4. "http://struts.apache.org/dtds/struts-2.0.dtd">
  5. <struts>
  6. <!-- package 包的作用和java中的类包是非常类似的,它主要用于管理一组业务功能相关的action -->
  7. <package name="test" extends="struts-default" namespace="/">
  8. <!-- 配置一个Action -->
  9. <action name="login" class="cn.csdn.hr.action.LoginAction">
  10. <!-- 指定Result的类型为plaintext类型 -->
  11. <result type="plaintext">
  12. <!-- 指定实际的视图资源 -->
  13. <param name="location">./welcome.jsp</param>
  14. <!-- 指定使用特定的编码集来处理页面代码 -->
  15. <param name="charSet">utf-8</param>
  16. </result>
  17. </action>
  18. </package>
  19. </struts>

Jsp代码:

[html] view
plain
 copy

  1. <%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
  2. <%@ taglib uri="/struts-tags" prefix="s"%>
  3. <%
  4. String path = request.getContextPath();
  5. String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
  6. %>
  7. <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
  8. <html>
  9. <head>
  10. <base href="<%=basePath%>">
  11. </head>
  12. <body>
  13. <s:property value="username"/>
  14. </body>
  15. </html>

如果将result的type指定为plaintext,那么将显示如下的效果:

这是将type类型指定为plaintext,显示的是视图资源的源代码。如果不指定类型,那么就是默认的类型dispatcher ,其默认类型,我输入的用户名是redarmy,点击提交按钮:显示效果如图:

2、 redirect结果类型:

(1)redirect结果类型与dispatcher结果类型相对,dispatcher结果类型是将请求Forward(转发)到指定的JSP资源;而redirect结果类型,是将请求Redirect(重定向)到指定的JSP视图资源。

(2)dispatcher结果类型与redirect结果类型的差别主要就是转发和重定向的差别;重定向会丢失所有的请求参数、请求属性——当然也丢失了Action的处理结果。

(3)使用redirect结果类型的效果是,系统将调用HttpServletResponse的sendRedirect(String)方法来重定向指定视图资源,这种重定向的效果就是重新产生一个请求,因此所有的请求参数、请求属性、Action实例和Action中的封装的属性全部丢失。

对于上面的应用,如果将struts.xml文件修改成如下形式;

[html] view
plain
 copy

  1. <struts>
  2. <!-- package 包的作用和java中的类包是非常类似的,它主要用于管理一组业务功能相关的action -->
  3. <package name="csdn" extends="struts-default" namespace="/">
  4. <!-- 配置一个Action -->
  5. <action name="login" class="cn.csdn.hr.action.LoginAction">
  6. <!-- 指定Result的类型为redirect类型 -->
  7. <result type="redirect">./welcome.jsp</result>
  8. </action>
  9. </package>
  10. </struts>

上面的Result使用了redirect的结果类型,意思是:当Action处理用户请求结束后,系统将重新生成一个请求,直接转入welcome.jsp中。

效果图如下:

3、 redirect-action结果类型

这种结果类型与redirect类型非常相似,一样是重新生成一个全新的请求。

下面使用redirect-action结果类型的配置的实例:

[html] view
plain
 copy

  1. <struts>
  2. <!-- package 包的作用和java中的类包是非常类似的,它主要用于管理一组业务功能相关的action -->
  3. <package name="csdn" extends="struts-default" namespace="/">
  4. <!-- 配置一个Action -->
  5. <action name="login" class="cn.csdn.hr.action.LoginAction">
  6. <!-- 指定Result的类型为plaintext类型 -->
  7. <result type="redirect-action">
  8. <!-- 指定重定向的actionName -->
  9. <param name="actionName">aaa</param>
  10. <!-- 指定重定向的Action所在的命名空间 -->
  11. <param name="names">/secure</param>
  12. </result>
  13. </action>
  14. </package>
  15. <package name="csdn1" extends="struts-default" namespace="/">
  16. <!-- 配置一个Action -->
  17. <action name="aaa" class="cn.csdn.hr.action.ChongAction">
  18. <!-- 指定Result的类型为plaintext类型 -->
  19. <result>./aaa.jsp</result>
  20. <!--配置一个redirect-action结果类型的result,重定向同一个命名 空间的Action -->
  21. <result type="redirect-action" name="error">error</result>
  22. </action>
  23. <action name="error">
  24. <result>error.jsp</result>
  25. </action>
  26. </package>
  27. </struts>

使用redirect-action结果类型时,系统将重新生成一个新请求,只是该请求的URL不是一个具体的视图资源,而是一个Action,因此前一个Action处理结果,请求参数、请求属性都会丢失。

三、动态结果

动态结果的意思是指配置结果时,指定实际视图资源时使用了表达式语法,通过这种语法可以允许Action处理完用户请求后,动态转入实际的视图资源。

(1)   前面介绍Action配置时,可以通过在Action的name属性中使用通配符,在class或method属性中使用表达式。通过这种方式,我们可以根据请求来动态决定Action的处理类,以及动态决定处理方法。除此之外,我们也可以在配置<result../>元素时使用表达式语法,从而允许根据请求动态决定实际资源。

看下面的配置片段:

[html] view
plain
 copy

  1. <action name="login" class="cn.csdn.hr.action.LoginAction">
  2. <result name="input">./input.jsp</result>
  3. <result>./success.jsp</result>
  4. </action>

当Action处理用户请求结束后,配置了两个结果:处理结果为input字符串时,系统将转到input.jsp页面:当处理结果为success字符串时,系统将转入success.jsp页面——这个视图资源时动态生成的。

四、请求参数决定结果

配置<result../>元素时,不仅可以使用${0}表达式形式来指定视图资源,还可以使用${属性名}的方式来指定视图资源。

下面我们通过一个案例还进一步了解它的使用:

(1)      首先定义出处理该请求的Action,它仅仅提供了一个属性来封装请求参数,并提供了一个参数才封装处理后的提示。下面是该Action类的代码。

[java] view
plain
 copy

  1. import com.opensymphony.xwork2.Action;
  2. public class LoginAction implements Action{
  3. //封装请求参数的target属性
  4. private String target;
  5. //封装处理结果提示的tip属性
  6. private String tip;
  7. //target属性和tip属性对应的getter和setter方法
  8. public String getTarget() {
  9. return target;
  10. }
  11. public void setTarget(String target) {
  12. this.target = target;
  13. }
  14. public String getTip() {
  15. return tip;
  16. }
  17. public void setTip(String tip) {
  18. this.tip = tip;
  19. }
  20. //处理用户请求的excute方法
  21. public String execute() throws Exception {
  22. setTip("恭喜您!您已成功转向!");
  23. return SUCCESS;
  24. }
  25. }

第二步我们来在struts.xml文件中配置该Action,配置文件如下:

[html] view
plain
 copy

  1. <struts>
  2. <!-- package 包的作用和java中的类包是非常类似的,它主要用于管理一组业务功能相关的action -->
  3. <package name="csdn" extends="struts-default" namespace="/">
  4. <!-- 配置一个Action -->
  5. <action name="login" class="cn.csdn.hr.action.LoginAction">
  6. <result name="success">./${target}.jsp</result>
  7. </action>
  8. </package>
  9. </struts>

这个程序就会实现跳转。

五、全局结果

前面已经提到了,struts2的<result../>元素配置,也可以放在<global-results../>元素中配置,当在<global-results../>元素中配置<result../>元素时,该<result../>元素配置了一个全局结果,全局结果的作用范围是对所有的Action都有效。

struts.xml配置文件如下:

[html] view
plain
 copy

  1. <struts>
  2. <!-- package 包的作用和java中的类包是非常类似的,它主要用于管理一组业务功能相关的action -->
  3. <package name="csdn" extends="struts-default" namespace="/">
  4. <!-- 定义全局结果 -->
  5. <global-results>
  6. <!-- 下面定义的结果对所有的Action都有效 -->
  7. <result name="success">../${target}.jsp</result>
  8. </global-results>
  9. <!-- 配置处理用户请求的Action -->
  10. <action name="login" class="cn.csdn.hr.action.LoginAction"/>
  11. </package>
  12. </struts>

上面的配置片段配置了一个Action,但在该Action内没有配置任何的结果——但这不会影响系统的运转,因为提供了一个名为success的全局结果,而这个全局结果的作用范围对所有的Action都有效。

如果一个Action里包含了与全局结果里同名的结果,则Action里的局部Action会覆盖全局Action。也就是说,当Action处理用户请求结束后,会首先在本Action里的局部结果里搜索逻辑视图对应的结果。只有在Action里的局部结果里找不到逻辑视图对应的结果,才会到全局结果里搜索。

时间: 2024-08-30 11:33:53

Struts2Result结果集类型的详细说明和示例的相关文章

centos7部署MongoDB数据库复制集(超详细)

centos7部署MongoDB数据库复制集(超详细)重点:复制集概述:复制集实现原理:复制集的应用案例:一.概述:组成:Mongodb复制集(副本集replica set)由一组Mongod实例(进程)组成,包含一个Primary节点和多个Secondary节点,Mongodb Driver(客户端)的所有数据都写入Primary,Secondary通过oplog来同步Primary的数据,保证主节点和从节点数据的一致性,复制集在完成主从复制的基础上,通过心跳机制,一旦primary节点出现宕

redis3.0.2 分布式集群安装详细步骤

redis3.0.2 分布式集群安装详细步骤 --(centos5.8 X64系统) 版本历史 时间 版本 说明 编写者 2015-06-5 1.0 redis3.0.2 分布式集群安装详细步骤 csc 一: redis cluster介绍篇 1:redis cluster的现状 目前redis支持的cluster特性(已亲测): 1):节点自动发现 2):slave->master 选举,集群容错 3):Hot resharding:在线分片 4):进群管理:cluster xxx 5):基于

软件测试类型图解+详细说明

软件测试类型 一.根据项目流程阶段划分 二.从是否关系软件内部结构和具体实现的角度划分 三.功能性测试.性能测试 四.手工测试.自动化测试 软件测试类型图解+详细说明

Solr集群搭建详细教程(二)

注:欢迎大家转载,非商业用途请在醒目位置注明本文链接和作者名dijia478,商业用途请联系本人[email protected]. 之前步骤:Solr集群搭建详细教程(一) 三.solr集群搭建 注意,在搭建solr集群前,建议最好有一个solr服务是已经搭建好的,可以简化大量重复的配置操作. 单机solr服务搭建过程参看我的这篇文章: Solr服务在Linux上的搭建详细教程 这个单机solr服务在solr集群搭建第二步和第三步里需要,搭建好一个solr服务后,就可以进行集群搭建了. 第一步

2-11字典类型的详细方法

字典类型的详细方法 >>> #查找 ... >>> info = {'stu1101': 'TengLan Wu', 'stu1102': 'LongZe Luola', 'stu1103': 'Xiao Ze Maliya', ... 'stu1104': 'Alex'} >>> "stu1102" in info #标准用法 True >>> info.get('stu1102') #获取 'LongZe Lu

RHCS集群套件之用Luci/Ricci实现Web集群的详细配置

RHCS集群介绍请看http://11107124.blog.51cto.com/11097124/1884048 在RHCS集群中每个集群都必须有一个唯一的集群名称,至少有一个fence设备(实在不行可以使用手动fence_manual),且至少要有三个节点,两个节点必须有仲裁磁盘 准备环境 node1:192.168.139.2 node2:192.168.139.4 node4:192.168.139.8 VIP:192.168.139.10 在node1装luci创建集群,并进行集群管理

Hadoop集群搭建详细步骤(2.6.0)

本文记录在3台物理机上搭建Hadoop 2.6.0的详细步骤及碰到的问题解决.默认使用root账号操作,实际中建议使用专用的hadoop用户账号. 1. 环境 机器: 物理机3台,ip分别为192.168.1.130.192.168.1.132.192.168.1.134 操作系统: CentOS 6.6 Java: 1.7 Hadoop: 2.6.0 请确保JDK已安装,使用java -version确认. hosts配置 配置主机hosts文件: vim /etc/hosts 192.168

Redis 集群搭建详细指南

先有鸡还是先有蛋? 最近有朋友问了一个问题,说毕业后去大城市还是小城市?去大公司还是小公司?我的回答都是大城市!大公司!为什么这么说呢,你想一下,无论女孩男孩找朋友都喜欢找个子高胸大的.同样的道理嘛,「大」总有大的好.当然,如果你要有能力找一个胸大个子高就更完美了. Redis 集群简介 Redis 是一个开源的 key-value 存储系统,由于出众的性能,大部分互联网企业都用来做服务器端缓存.Redis 在3.0版本前只支持单实例模式,虽然支持主从模式.哨兵模式部署来解决单点故障,但是现在互

Input标签中Type的类型及详细用法

转载▼     Input表示Form表单中的一种输入对象,其又随Type类型的不同而分文本输入框,密码输入框,单选/复选框,提交/重置按钮等,下面一一介绍. 1,type=text 输入类型是text,这是我们见的最多也是使用最多的,比如登陆输入用户名,注册输入电话号码,电子邮件,家庭住址等等.当然这也是Input的默认类型. 参数name:同样是表示的该文本输入框名称. 参数size:输入框的长度大小. 参数maxlength:输入框中允许输入字符的最大数. 参数value:输入框中的默认值