1、结果集的使用方式

struts结果集的使用分为三种,指定全局结果集、普通方式指定结果集合动态指定结果集。

1.1全局结果集

当许多action都有共同的结果时,如果每个package都存在一个相同结果,比如success,error,input,needslogin等等,如果每一项都要重新配置,就显得配置文件很繁琐,所以使用全局的结果集。一个包内的全局结果集可以通过包的继承而被其它包使用。这样做的好处是:通用的结果集不用多次配置,减少struts.xml的配置量。
第一种配置方式:包继承方式配置
配置有全局结果集的包
    <package name="main" namespace="/main" extends="struts-default"> <!-- 全局结果集 -->   <global-results><!-- 结果集类型为显示源代码的类型 -->    <result name="error">/WEB-INF/page/error.jsp</result>    </global-results>    </package>

需要使用全局结果集的包需要继承该包

    <package name="cn.test.action" namespace="/" extends="main" ><action name="global" class="cn.test.GlobalResult<span style="font-family: Arial, Helvetica, sans-serif;">"/></span></package>
第二种配置方式直接在该包中定义全局结果集:
   <package name="cn.test.action" namespace="/" extends="struts-default" ><global-results><!-- 结果集类型为显示源代码的类型 -->    <result name="error">/WEB-INF/page/error.jsp</result>    </global-results>  <action name="global" class="cn.test.GlobalResult" method="global"/></package>   

此时访问

package cn.test;public class GlobalResult{public String execute(){return "error";}}

此时访问http://localhost:8081/struts2/global就会跳转到全局结果集配置的结果页面

1.2动态结果集

当一次访问可能会根据不同的逻辑出现不同的结果页面时,会用到动态结果集
Action类
package cn.test;public class DynamicResult {private String result;public String execute(){if(result==null){result="dynamicresult";}return "success";}public String getResult() {return result;}public void setResult(String result) {this.result = result;}}

Jsp页面

<?xml version="1.0" encoding="UTF-8"?>
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ taglib uri="/struts-tags" prefix="s" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<title>OGNL表达式语言学习</title>
</head>
<body><a href="dynamic/dynamic?result=login">login</a></br>
<a href="dynamic/dynamic?result=main">main</a></br>
</body>
</html>

struts.xml

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC"-//Apache Software Foundation//DTD Struts Configuration 2.3//EN""http://struts.apache.org/dtds/struts-2.3.dtd"><struts><package name="main" namespace="/main" extends="struts-default"> <!-- 全局结果集 -->   <global-results><!-- 结果集类型为显示源代码的类型 -->    <result name="error">/WEB-INF/page/error.jsp</result>    </global-results>    </package><constant name="struts.enable.DynamicMethodInvocation" value="false"/> <!-- 开启开发者模式 --> <constant name="struts.devMode" value="true"/><!-- 开启修改struts.xml文件免启动 --><constant name="struts.configuration.xml.reload" value="true"></constant><!-- 开启OGNL静态方调用 --><constant name="struts.ognl.allowStaticMethodAccess" value="true"></constant>  <!-- 使用全局结果集 --><package name="cn.test.action.global" namespace="/global" extends="main" ><action name="global" class="cn.test.GlobalResult" method="global"/></package><!-- 使用动态结果集 --><package name="cn.test.action.dynamic" namespace="/dynamic" extends="main" ><action name="dynamic" class="cn.test.DynamicResult" ><result name="success">/WEB-INF/page/${result}.jsp</result></action></package>
</struts>

2、结果集的类型

在struts2框架中,当action处理完之后,就应该向用户返回结果信息,该任务被分为两部分:结果类型和结果本身。

结果类型提供了返回给用户信息类型的实现细节。结果类型通常在Struts2中就已预定义好了(如下),或者是由插件提供,开发人员也可以自定义结果类型。默认配置的结果类型是dispatcher,该结果类型使用JSP来向用户显示结果。
struts2jar包struts-default.xml中定义的11种结果集类型
        <result-types><result-type name="chain" class="com.opensymphony.xwork2.ActionChainResult"/><result-type name="dispatcher" class="org.apache.struts2.result.ServletDispatcherResult" default="true"/><result-type name="freemarker" class="org.apache.struts2.views.freemarker.FreemarkerResult"/><result-type name="httpheader" class="org.apache.struts2.result.HttpHeaderResult"/><result-type name="redirect" class="org.apache.struts2.result.ServletRedirectResult"/><result-type name="redirectAction" class="org.apache.struts2.result.ServletActionRedirectResult"/><result-type name="stream" class="org.apache.struts2.result.StreamResult"/><result-type name="velocity" class="org.apache.struts2.result.VelocityResult"/><result-type name="xslt" class="org.apache.struts2.views.xslt.XSLTResult"/><result-type name="plainText" class="org.apache.struts2.result.PlainTextResult" /><result-type name="postback" class="org.apache.struts2.result.PostbackResult" /></result-types>
其实常用的也就那么几种包括dispatcher、chain(可以理解为Action中的转发)、redirect、redirectAction、plainText和stream(下载文件的类型)。
struts.xml
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC"-//Apache Software Foundation//DTD Struts Configuration 2.3//EN""http://struts.apache.org/dtds/struts-2.3.dtd"><struts><constant name="struts.enable.DynamicMethodInvocation" value="false"/> <!-- 开启开发者模式 --> <constant name="struts.devMode" value="true"/><!-- 开启修改struts.xml文件免启动 --><constant name="struts.configuration.xml.reload" value="true"></constant><!-- 开启OGNL静态方调用 --><constant name="struts.ognl.allowStaticMethodAccess" value="true"></constant>  <package name="cn.test.action" namespace="/" extends="struts-default" ><action name="dispatcher" class="cn.test.TypeAction" method="success"><!-- 默认情况下:type="dispatcher" --><result name="success">/WEB-INF/page/main.jsp</result></action><action name="chain" class="cn.test.TypeAction" method="success"> <result type="chain" name="success">execute</result><result name="success">/WEB-INF/page/login.jsp</result></action><action name="redirect" class="cn.test.TypeAction" method="success"><!-- 类似于重定向到jsp,redirect还可以是重定向到Action了 --><result type="redirect" name="success">login</result></action><action name="redirectAction" class="cn.test.TypeAction" method="success"><!-- 类似于重定向到jsp,redirectAction只是重定向到Action了 --><result type="redirectAction" name="success">login</result></action><action name="login" class="cn.test.TypeAction" method="login"><result name="success">/WEB-INF/page/login.jsp</result></action><action name="execute" class="cn.test.TypeAction" method="execute"><result name="success">/WEB-INF/page/main.jsp</result></action><action name="fileDown" class="cn.test.FileDown" method="execute"><result type="stream" name="success"><!-- 指定被下载文件的入口输入流 --><param name="inputName">fileInputStream</param><!-- 指定被下载文件名 --><param name="contentDisposition">attachment;filename="${fileName}"</param><!-- 指定被下载文件的文件类型 --><param name="contentType">application/octet-stream</param><!-- 指定下载文件时的缓冲大小 --><param name="bufferSize">4096</param></result></action><action name="plaintext" class="cn.test.TypeAction" method="plaintext"><!-- 网页源代码 --><result type="plainText" name="plaintext">/WEB-INF/page/login.jsp</result></action><action name="dynamic" class="cn.test.DynamicResult" ><result name="success">/WEB-INF/page/${result}.jsp</result></action></package></struts>
Action类

package cn.test;import java.util.ArrayList;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;import javax.security.auth.message.callback.PrivateKeyCallback.Request;
import javax.servlet.ServletContext;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.jsp.PageContext;import ognl.OgnlContext;
import ognl.OgnlException;import org.apache.struts2.ServletActionContext;import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionSupport;
import com.opensymphony.xwork2.util.ValueStack;public class TypeAction extends ActionSupport {public String success(){System.out.println("方法为:"+"success");HttpServletRequest request = ServletActionContext.getRequest();request.setAttribute("key1", "测试dispatcher");request.setAttribute("key2", "测试cahin");request.setAttribute("key3", "测试redirect");request.setAttribute("key4", "测试redirectAction");System.err.println();return SUCCESS;}public String plaintext(){System.out.println("方法为:"+"plaintext");HttpServletRequest request = ServletActionContext.getRequest();request.setAttribute("key1", "测试dispatcher");request.setAttribute("key2", "测试cahin");request.setAttribute("key3", "测试redirect");request.setAttribute("key4", "测试redirectAction");System.err.println();return "plaintext";}public String execute() {System.out.println("方法为:"+"execute");HttpServletRequest request = ServletActionContext.getRequest();System.out.println(request.getAttribute("key1"));return SUCCESS;}public String login() {System.out.println("方法为:"+"login");HttpServletRequest request = ServletActionContext.getRequest();request.setAttribute("message","测试redirect");System.out.println(request.getAttribute("key3"));return SUCCESS;}}

关于chain的说明:

/**
* 说明
* 1)配置文件中result的type属性设置为chain, result标签内写传给的action的name属性值
* 2)action之间传递参数的实质是靠set和get方法,有没有对应的属性或属性名字叫什么其实没关系,一般情况下都是先写属性,再生成对应的set和get方法,这是标准的做法,但不一定要这样做, 要想把action1中的参数a传递给action2中的b,只需action1中提供getXX方法返回a的值,action2中提供setXX方法给b赋值即可
* 3)特别需要注意的一点是action1传给action2时除了拦截器chain起作用外,表单处理拦截器param也会起作用,而且param在chain之后起作用,故如果param和chain都给同一个参数赋值的话,param会覆盖chain的效果,例如表单提交了一个c, action1里对c进行了处理, 处理结果还是保留在c上,接下来你想把处理后的c传给action2处理,action2也用c来接收,这时候就会出现action2中的c的值是表单提交过来的值而不是action1传过来的值,给你一种参数没传递的错觉,其实是被覆盖了,一般我的做法是action1中提供getB方法返回c的值,action2中不要提供setC而是提供setB来给c赋值
**/

关于redirectAction和redirect的说明

/**
*说明
*当使用type=“redirectAction” 或type=“redirect”提交到一个action并且需要传递一个参数时。
*这里是有区别的:
*1)使用type=“redirectAction”时,结果就只能写Action的配置名,不能带有后缀:“.action”
*2)使用type=“redirect”时,结果应是action配置名+后缀名
*
**/

Struts2的结果集相关推荐

  1. java代码审计--之--常用框架了解

    框架 框架:软件的半成品,为解决问题而指定的一套约束,在提供功能基础上进行扩充. 框架中一些不能被封装的代码(变量),需要新建xml文件,在文件中添加变量内容. 类库:没有封装逻辑 MyBatis 环 ...

  2. oracle 11g安装教程完整版

    64位WIN7+oracle11g+plsql安装 上部转自Oracle 11g R2 for Win7旗舰版(64位)的安装步骤 1.下载Oracle 11g R2 for Windows的版本 下 ...

  3. Struts2中带参数的结果集

    1.在Struts2中带参数的结果集,即向结果集传参.struts2中有转发和重定向到某个视图,其中转发的过程在服务端完成,这个过程共享一个value stack(值栈),客户端并不知道页面跳转到了哪 ...

  4. Struts2中动态的指定返回的结果集

    1.在Struts2中,可以在struts.xml配置文件中动态的指定返回的结果集.用${属性名}的方式取得Action类中的属性,在服务端判断好相应的跳转路径,然后存到变量里,然后再在struts. ...

  5. Struts2中的全局结果集

    1.在Struts2中,当有多个Action使用同一个结果集时,则可以使用全局结果集(GlobalResult),这样就不用在每一个使用同一个结果集的action里面都添加一个result,可以减少代 ...

  6. java struts2 漏洞复现合集

    目录 一.S2-001复现 二.S2-005复现 三.S2-007复现 四.S2-008复现 五.S2-009复现 六.S2-012复现 七.S2-013复现 八.S2-015复现 九.S2-016复 ...

  7. struts2远程代码执行漏洞合集

    声明 好好学习,天天向上 S2-001 漏洞描述 因为用户提交表单数据并且验证失败时,后端会将用户之前提交的参数值使用 OGNL 表达式 %{value} 进行解析,然后重新填充到对应的表单数据中.例 ...

  8. Struts2漏洞分析与复现合集

    文章目录 一.基础知识 Struts2简介: 二.漏洞复现 1.S2-001(OGNL 循环解析导致的 RCE 漏洞) 漏洞原理: 影响版本: 环境搭建: poc: 漏洞利用: 2.S2-005(S2 ...

  9. Struts2漏洞复现合集

    1. Struts2简介 Struts2是一个基于MVC设计模式的Web应用框架,它本质上相当于一个servlet,在MVC设计模式中,Struts2作为控制器(Controller)来建立模型与视图 ...

最新文章

  1. iOS LaunchScreen和LaunchImage的转换启动图
  2. Android 截屏监听(截图分享功能实现)
  3. opengles 顶点数组 android,OpenGLES顶点属性、顶点数组和缓冲区对象
  4. 全国计算机等级考试题库二级C操作题100套(第53套)
  5. java restlet 教程_java – Restlet Protocol.FILE用法
  6. SREng日志全分析(一)
  7. 《红孩儿引擎内功心法修练与Cocos2d-x》之结点系统(场景,层,精灵)(精)
  8. 亲爱的程序猿们怎么找工作
  9. [2022 Google开发者大会] 机器学习-TensorFlow会议记录
  10. 工厂方法模式应用场景
  11. 世界观--哲学--抽象--虚无
  12. 解决Gradle‘s dependency cache may be corrupt (this sometimes occurs after a network connection timeout
  13. 【机器学习】iris莺尾花项目-机器学习的hello world
  14. Lidar Object detection
  15. 乐2的android版本,乐视2高通|MIUI10|安卓6.0|最终完美版|极速_最新最全的乐2高通版ROM刷机包下载、刷机...
  16. 百度地图Polyline画直线
  17. 手游测试员需要做什么?
  18. 清空input的type为file时的值
  19. 全连接神经网络、卷积神经网络
  20. GPS ublox配置过程

热门文章

  1. sprinngboot分库分表中间件
  2. 服务器端缓存企业微信,企业微信开发
  3. Unity协程实现场景中鼠标按住的物体跟随鼠标移动
  4. ABAQUS2022软件下载
  5. 天线学习笔记——交叉极化(Cross-Polarization)
  6. Layui 弹出层插件
  7. ccnp需要什么样的水平?
  8. 做网络营销必看干货:月薪3000与月薪30000文案区别
  9. java并发编程实战wwj----------------------第二阶段--------------01-02-03
  10. 判断当前是否是缅甸语