Struts2的结果集
1、结果集的使用方式
struts结果集的使用分为三种,指定全局结果集、普通方式指定结果集合动态指定结果集。
1.1全局结果集
<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动态结果集
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处理完之后,就应该向用户返回结果信息,该任务被分为两部分:结果类型和结果本身。
<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>
<?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>
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的结果集相关推荐
- java代码审计--之--常用框架了解
框架 框架:软件的半成品,为解决问题而指定的一套约束,在提供功能基础上进行扩充. 框架中一些不能被封装的代码(变量),需要新建xml文件,在文件中添加变量内容. 类库:没有封装逻辑 MyBatis 环 ...
- oracle 11g安装教程完整版
64位WIN7+oracle11g+plsql安装 上部转自Oracle 11g R2 for Win7旗舰版(64位)的安装步骤 1.下载Oracle 11g R2 for Windows的版本 下 ...
- Struts2中带参数的结果集
1.在Struts2中带参数的结果集,即向结果集传参.struts2中有转发和重定向到某个视图,其中转发的过程在服务端完成,这个过程共享一个value stack(值栈),客户端并不知道页面跳转到了哪 ...
- Struts2中动态的指定返回的结果集
1.在Struts2中,可以在struts.xml配置文件中动态的指定返回的结果集.用${属性名}的方式取得Action类中的属性,在服务端判断好相应的跳转路径,然后存到变量里,然后再在struts. ...
- Struts2中的全局结果集
1.在Struts2中,当有多个Action使用同一个结果集时,则可以使用全局结果集(GlobalResult),这样就不用在每一个使用同一个结果集的action里面都添加一个result,可以减少代 ...
- java struts2 漏洞复现合集
目录 一.S2-001复现 二.S2-005复现 三.S2-007复现 四.S2-008复现 五.S2-009复现 六.S2-012复现 七.S2-013复现 八.S2-015复现 九.S2-016复 ...
- struts2远程代码执行漏洞合集
声明 好好学习,天天向上 S2-001 漏洞描述 因为用户提交表单数据并且验证失败时,后端会将用户之前提交的参数值使用 OGNL 表达式 %{value} 进行解析,然后重新填充到对应的表单数据中.例 ...
- Struts2漏洞分析与复现合集
文章目录 一.基础知识 Struts2简介: 二.漏洞复现 1.S2-001(OGNL 循环解析导致的 RCE 漏洞) 漏洞原理: 影响版本: 环境搭建: poc: 漏洞利用: 2.S2-005(S2 ...
- Struts2漏洞复现合集
1. Struts2简介 Struts2是一个基于MVC设计模式的Web应用框架,它本质上相当于一个servlet,在MVC设计模式中,Struts2作为控制器(Controller)来建立模型与视图 ...
最新文章
- iOS LaunchScreen和LaunchImage的转换启动图
- Android 截屏监听(截图分享功能实现)
- opengles 顶点数组 android,OpenGLES顶点属性、顶点数组和缓冲区对象
- 全国计算机等级考试题库二级C操作题100套(第53套)
- java restlet 教程_java – Restlet Protocol.FILE用法
- SREng日志全分析(一)
- 《红孩儿引擎内功心法修练与Cocos2d-x》之结点系统(场景,层,精灵)(精)
- 亲爱的程序猿们怎么找工作
- [2022 Google开发者大会] 机器学习-TensorFlow会议记录
- 工厂方法模式应用场景
- 世界观--哲学--抽象--虚无
- 解决Gradle‘s dependency cache may be corrupt (this sometimes occurs after a network connection timeout
- 【机器学习】iris莺尾花项目-机器学习的hello world
- Lidar Object detection
- 乐2的android版本,乐视2高通|MIUI10|安卓6.0|最终完美版|极速_最新最全的乐2高通版ROM刷机包下载、刷机...
- 百度地图Polyline画直线
- 手游测试员需要做什么?
- 清空input的type为file时的值
- 全连接神经网络、卷积神经网络
- GPS ublox配置过程