文档章节

三、struts值栈

swift_hua
 swift_hua
发布于 2017/07/23 23:54
字数 2449
阅读 9
收藏 1
点赞 0
评论 0

OGNL概述
1 之前web阶段,学习过EL表达式,EL表达式在jsp中获取域对象里面的值

2 OGNL是一种表达式,这个表达式功能更加强大,
(1)在struts2里面操作值栈数据
(2)一般把ognl在struts2操作:和struts2标签一起使用操作值栈

3 OGNL不是struts2的一部分,单独的项目,经常和struts2一起使用
(1)使用ognl时候首先导入jar包,struts2提供jar包

OGNL入门案例
1 使用ognl+struts2标签实现计算字符串长度

(1)在java代码中,调用字符串.length();

2 使用struts2标签
(1)使用jstl时候,导入jar包之外,在jsp页面中引入标签库
使用struts2标签时候,在jsp中引入标签库
 
(2)使用struts2标签实现操作

什么是值栈
1 之前在web阶段,在servlet里面进行操作,把数据放到域对象里面,在页面中使用el表达式获取到,域对象在一定范围内,存值和取值

2 在struts2里面提供本身一种存储机制,类似于域对象,是值栈,可以存值和取值
(1)在action里面把数据放到值栈里面,在页面中获取到值栈数据

3 servlet和action区别
(1)Servlet:默认在第一次访问时候创建,创建一次,单实例对象
(2)Action:访问时候创建,每次访问action时候,都会创建action对象,创建多次,多实例对象

4 值栈存储位置
(1)每次访问action时候,都会创建action对象,
(2)在每个action对象里面都会有一个值栈对象(只有一个)
 
获取值栈对象

1 获取值栈对象有多种方式
(1)常用方式:使用ActionContext类里面的方法得到值栈对象

2 每个action对象中只有一个值栈对象
 
 //true

值栈内部结构
1 值栈分为两部分:
第一部分 root,结构是list集合
(1)一般操作都是root里面数据

第二部分 context,结构map集合

2 struts2里面标签 s:debug,使用这个标签可以查看值栈结构和存储值
(1)访问action,执行action的方法有返回值,配置返回值到jsp页面中,在jsp页面中使用这个标签
 
点击超链接看到结构
 
(2)在action没有做任何操作,栈顶元素是 action引用
 
- action对象里面有值栈对象
- 值栈对象里面有action引用

 

向值栈放数据
1 向值栈放数据多种方式
第一种 获取值栈对象,调用值栈对象里面的 set 方法
 

第二种 获取值栈对象,调用值栈对象里面的  push方法
 

第三种 在action定义变量,生成变量的get方法


向值栈放对象
1 实现步骤
第一步 定义对象变量
第二步 生成变量的get方法
第三步 在执行的方法里面向对象中设置值

向值栈放list集合
第一步 定义list集合变量

第二步 生成变量的get方法

第三步 在执行的方法里面向list集合设置值
 

 

从值栈获取数据
1 使用struts2的标签+ognl表达式获取值栈数据
(1)<s:property value=”ognl表达式”/>

获取字符串
1 向值栈放字符串

2 在jsp使用struts2标签+ognl表达式获取

获取对象
1 向值栈放对象
 
2 在页面中获取值


获取list集合
第一种方式:

第二种方式:

第三种方式:

其他操作
1 使用set方法向值栈放数据,获取
 

2 使用push方法向值栈放数据,获取
 
(1)使用push方法设置值,没有名称,只有设置的值
(2)向值栈放数据,把向值栈放数据存到数组里面,数组名称 top,根据数组获取值

EL表达式获取值栈数据(为什么)
1 EL表达式获取域对象值

2 向域对象里面放值使用setAttribute方法,获取值使用getAttribute方法

3 底层增强request对象里面的方法getAttribute方法
(1)首先从request域获取值,如果获取到,直接返回
(2)如果从request域获取不到值,到值栈中把值获取出来,把值放到域对象里面

4 查看源代码
 

 

OGNL的#、%使用
#使用
1 使用#获取context里面数据

2 演示# 操作
(1)向request域放值
(2)在页面中使用ognl获取

%使用
1 在struts2标签中表单标签
(1)在struts2标签里面使用ognl表达式,如果直接在struts2表单标签里面使用ognl表达式不识别,只有%之后才会识别。

 

案例-列表功能改造(值栈)

 


附录源码:

ListDemoAction.java

package cn.itcast.entity;

public class User {

	private String username;
	private String password;
	private String address;
	public String getUsername() {
		return username;
	}
	public void setUsername(String username) {
		this.username = username;
	}
	public String getPassword() {
		return password;
	}
	public void setPassword(String password) {
		this.password = password;
	}
	public String getAddress() {
		return address;
	}
	public void setAddress(String address) {
		this.address = address;
	}
}


ObjectDemoAction.java

package cn.itcast.action;

import com.opensymphony.xwork2.ActionSupport;

import cn.itcast.entity.User;

public class ObjectDemoAction extends ActionSupport {

	//1 定义对象变量
	private User user = new User();
	//2 生成get方法
	public User getUser() {
		return user;
	}
	
	public String execute() throws Exception {
		//3 向值栈的user里面放数据
		user.setUsername("lucy");
		user.setPassword("123");
		user.setAddress("美国");
		
		return "success";
	}






}


UserAction.java

package cn.itcast.action;

import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionSupport;
import com.opensymphony.xwork2.util.ValueStack;

public class UserAction extends ActionSupport {

//	public UserAction() {
//		System.out.println("action创建了.............");
//	}

	@Override
	public String execute() throws Exception {
		// 1 获取ActionContext类的对象
		ActionContext context = ActionContext.getContext();
		//2 调用方法得到值栈对象
		ValueStack stack1 = context.getValueStack();
		
		ValueStack stack2 = context.getValueStack();
		
		System.out.println(stack1==stack2);
		return NONE;
	}
}


ValueStackDemoAction.java

package cn.itcast.action;

import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionSupport;
import com.opensymphony.xwork2.util.ValueStack;

public class ValueStackDemoAction extends ActionSupport {

	//1 定义变量
//	private String name;
//	//2 生成变量的get方法
//	public String getName() {
//		return name;
//	}
	
	@Override
	public String execute() throws Exception {
		
		//在执行的方法里面向变量设置值
//		name = "abcdefgh";
		//第一种方式 使用值栈对象里面的 set方法
		//1 获取值栈对象
		ActionContext context = ActionContext.getContext();
		ValueStack stack = context.getValueStack();
//		//2 调用方法set方法
		stack.set("itcast", "itcastitheima");
//		
//		//3 调用方法push方法
		stack.push("abcd");
		
		return "success";
	}



}

User.java

package cn.itcast.entity;

public class User {

	private String username;
	private String password;
	private String address;
	public String getUsername() {
		return username;
	}
	public void setUsername(String username) {
		this.username = username;
	}
	public String getPassword() {
		return password;
	}
	public void setPassword(String password) {
		this.password = password;
	}
	public String getAddress() {
		return address;
	}
	public void setAddress(String address) {
		this.address = address;
	}
}

ContextAction.java

package cn.itcast.valuestack;

import java.util.ArrayList;
import java.util.List;

import javax.servlet.http.HttpServletRequest;

import org.apache.struts2.ServletActionContext;

import com.opensymphony.xwork2.ActionSupport;

import cn.itcast.entity.User;

public class ContextAction extends ActionSupport {

	public String execute() throws Exception {
		
		HttpServletRequest request = ServletActionContext.getRequest();
		request.setAttribute("req", "reqValue");
		return "success";
	}
}


ValueStackAction.java

package cn.itcast.valuestack;

import java.util.ArrayList;
import java.util.List;

import com.opensymphony.xwork2.ActionSupport;

import cn.itcast.entity.User;

public class ValueStackAction extends ActionSupport {

//	private String username;
//	public String getUsername() {
//		return username;
//	}
	
//	private User user = new User();
//	public User getUser() {
//		return user;
//	}
	
	private List<User> list = new ArrayList<User>();
	public List<User> getList() {
		return list;
	}

	public String execute() throws Exception {
//		username = "itcast";
		
//		user.setUsername("mary");
//		user.setPassword("250");
//		user.setAddress("china");
		
		//3 向list中设置值
		User user1 = new User();
		user1.setUsername("小奥");
		user1.setPassword("123");
		user1.setAddress("美国");
		
		User user2 = new User();
		user2.setUsername("小王");
		user2.setPassword("250");
		user2.setAddress("越南");
		
		list.add(user1);
		list.add(user2);
		
		return "success";
	}
}

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="demo1" extends="struts-default" namespace="/">
		<action name="userAction" class="cn.itcast.action.UserAction"></action>
		<action name="valueStackDemo1" class="cn.itcast.action.ValueStackDemoAction">
			<result name="success">/valueStack.jsp</result>
		</action>
		<action name="ObjectDemo" class="cn.itcast.action.ObjectDemoAction">
			<result name="success">/valueStack.jsp</result>
		</action>
		<action name="listDemo" class="cn.itcast.action.ListDemoAction">
			<result name="success">/valueStack.jsp</result>
		</action>
		<action name="valueStack" class="cn.itcast.valuestack.ValueStackAction">
			<result name="success">/valueStack.jsp</result>
		</action>
		<action name="contextAction" class="cn.itcast.valuestack.ContextAction">
			<result name="success">/context.jsp</result>
		</action>
	</package>
</struts>



web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" id="WebApp_ID" version="2.5">
  <display-name>struts2_day01</display-name>
    <filter>
        <filter-name>struts2</filter-name>
        <filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>
    </filter>

    <filter-mapping>
        <filter-name>struts2</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>
  <welcome-file-list>
    <welcome-file>index.html</welcome-file>
    <welcome-file>index.htm</welcome-file>
    <welcome-file>index.jsp</welcome-file>
    <welcome-file>default.html</welcome-file>
    <welcome-file>default.htm</welcome-file>
    <welcome-file>default.jsp</welcome-file>
  </welcome-file-list>
</web-app>

context.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ taglib uri="/struts-tags" prefix="s"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
	<!-- 获取context里面数据,写ognl时候,首先添加符号  
		#context的key名称.域对象名称
	-->
	<%-- <s:property value="#request.req"/> --%>
	<%-- <input type="text" name="name" value="${req }"/> --%>
	<s:textfield name="username" value="%{#request.req}"></s:textfield>
</body>
</html>


ognl.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ taglib uri="/struts-tags" prefix="s"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
	<!-- 使用ognl+struts2标签实现计算字符串长度 
		value属性值:ognl表达式
	-->
	<s:property value="'haha'.length()"/>
</body>
</html>


valueStack.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>    
<%@ taglib uri="/struts-tags" prefix="s"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
	<!-- 使用struts2标签查看值栈结构 -->
	<s:debug></s:debug>
	
	<!-- 1 获取字符串值 -->
	<s:property value="username"/>
	
	<!-- 2 获取值栈对象的值 -->
	<br/>
	获取对象的值:
	<br/>
	<s:property value="user.username"/>
	<s:property value="user.password"/>
	<s:property value="user.address"/>
	
	<br/>
	获取list的值第一种方式:
	<br/>
	<!-- 3 获取值栈list集合数据 -->
	<!-- 第一种方式实现  -->
	<s:property value="list[0].username"/>
	<s:property value="list[0].password"/>
	<s:property value="list[0].address"/>
	<br/>
	<s:property value="list[1].username"/>
	<s:property value="list[1].password"/>
	<s:property value="list[1].address"/>
	
	<br/>
	获取list的值第二种方式:
	<br/>
	<!-- 使用struts2标签 类似jstl的foreach标签
		s:iterator:遍历值栈的list集合
	 -->
	 <s:iterator value="list">
	 	<!-- 遍历list得到list里面每个user对象 -->
	 	<s:property value="username"/>
	 	<s:property value="password"/>
	 	<s:property value="address"/>
	 	<br/>
	 </s:iterator>
	 
	  <br/>
	 <br/>
	获取list的值第三种方式:
	<br/>
	<s:iterator value="list" var="user">
		<!-- 
			遍历值栈list集合,得到每个user对象
			机制: 把每次遍历出来的user对象放到 context里面
			获取context里面数据特点:写ognl表达式,
			使用特殊符号 #
		 -->
		<s:property value="#user.username"/>
		<s:property value="#user.password"/>
		<s:property value="#user.address"/>
		<br/>
	</s:iterator>
	
	<br/>
	<!-- 使用foreach标签+el表达式获取值栈list集合数据 -->
	<c:forEach items="${list }" var="user">
		${user.username }
		${user.password }
		${user.address }
		<br/>
	</c:forEach>
	
	<br/>
	<br/>
	<!-- 获取set方法设置的值  根据名称获取值-->
	<%-- <s:property value="itcast"/> --%>
	
	<br/>
	<!-- 获取push方法设置的值 -->
	<%-- <s:property value="[0].top"/> --%>
</body>
</html>

 

© 著作权归作者所有

共有 人打赏支持
swift_hua
粉丝 0
博文 33
码字总数 20868
作品 0
成都
程序员
ST2-045 For POC

转载请注明: 转载自Legend‘s BLog 本文链接地址: ST2-045 For POC 利用方法: 漏洞说明: Apache Struts 2被曝存在远程命令执行漏洞,漏洞编号S2-045,CVE编号CVE-2017-5638,在使用基于J...

apachecn_飞龙 ⋅ 2017/03/18 ⋅ 0

MyEclipse 2017 整合SSH三大框架 到登录功能的实现(附源码)

本来以为学完Java EE之后用个三大框架没什么难度,结果昨天搭环境就搞了一晚上,还是靠室友找了半天才找出错误在哪,为了避免重复踩坑,而且目前网上用myeclipse2017做环境的教程还是蛮少的,...

xp731574722 ⋅ 03/02 ⋅ 0

企业未修复Apache Struts 2漏洞致Web服务器被批量入侵

  0×1 概述   腾讯御见威胁情报中心监控发现,近期有大批企业网站的Web服务器遭到入侵并被植入挖矿木马。   安全人员分析发现被攻击网站服务器多存在Apache Struts 2 Jakarta Multipa...

FreeBuf ⋅ 04/29 ⋅ 0

[Struts]Token 使用及原理

Struts Token 使用 1,先在一个Action中,调用saveToken(HttpServletRequest request)方法。然后转向带有表单的JSP页面。 2,在JSP页面提交表单给一个Action,再这个Action中进行是否为重复提...

thinkyoung ⋅ 2014/12/17 ⋅ 0

Java 模板引擎 Beetl 2.8.0 发布,增加根对象支持

Java 模板引擎 Beetl 2.8.0 发布了,改进内容包括: #348 beetl 默认配置DefaultTemplateEngine #347 增加根对象支持 #346 允许设置全局 ClassLoader #345 支持struts2.5, 由于struts升级不...

闲大赋 ⋅ 04/23 ⋅ 0

SSH (Struts2+Spring3.0+Hibernate3)框架(一) 理论

  典型的J2EE三层结构,分为表现层、中间层(业务逻辑层)和数据服务层。三层体系将业务规则、数据访问及合法性校验等工作放在中间层处理。客户端不直接与数据库交互,而是通过组件与中间层...

thinkyoung ⋅ 2014/12/17 ⋅ 0

开源产业不断发展,软件安全问题亟需得到关注

近日 Sonatype 发布了“2018年开源安全与风险分析”报告,该报告显示开源应用有大幅增长,在检测的应用中有96%包含开源组件,同时包含漏洞的软件数量也在不断增加。随着开源产业不断发展,目...

雨田桑 ⋅ 05/18 ⋅ 0

Java面试题之Struts2

1.简单的介绍一下Struts2 struts2框架框架是一个按照MVC设计模式设计的WEB层框架,是在Struts1和WebWork的技术基础上进行了合并的全新的框架 ,其全新的Struts2的体系结构,与Struts1的体系结...

年轻诠释我们的梦想_705b ⋅ 06/11 ⋅ 0

org.hibernate.ObjectNotFoundException: No row with the given identifier exists产生的原因和解决方法

解决方法:改成单项关联,或者把不对应的数据改对! 产生此问题的原因: 有两张表,table1如用户表user,和table2角色表role.产生此问题的原因就是table1里做了关联<one-to-one>或者<many-to-on...

冯莉莉莉莉 ⋅ 05/25 ⋅ 0

闲谈“如何优化SSH框架的项目”

使用struts框架的好处之一就是所有action类继承一个基类,将访问控制在基类中处理.2.所有的action类都继承自baseaction,一个资源对应一个action类. 1.实现一个继承自struts的action的baseact...

thinkyoung ⋅ 2014/12/30 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

vue使用mockjs

在使用vue开发的时候,一直疑惑与mockjs怎么用,开了mockjs的开发文档,还是一脸蒙蔽,无从下手!mockjs在前后端分离开发上进行模拟数据,是不可避掉的一环。在网上看了一些博文还有查阅了其...

JamesView ⋅ 27分钟前 ⋅ 0

解决问题的思路

1.相对来说,程序逻辑解决问题的思路应该更加趋向于通过逻辑结构来解决问题,而不是通过更小的类级别和方法级别的改进 2.类级别和方法级别的改进需要的技术能力更高一点

th778899 ⋅ 33分钟前 ⋅ 0

HTTP请求状态及jQuery AJAX请求异常处理

上一周调优一个项目的Js部分,其中一个严重的问题就是在页面初始化数据时,没有对异常进行处理, 导致Loading一直在等待中,无提示无处理。在用户体验上很不好,即使网络条件无法保证,在出错...

临江仙卜算子 ⋅ 34分钟前 ⋅ 0

error code 1874. innodb is in read only mode--报错解决

参考网页 https://zhidao.baidu.com/question/746894876932022292.html https://blog.csdn.net/shushugood/article/details/80226767 问题背景 创建了一个数据库然后想删除,因为自己本机性能......

karma123 ⋅ 35分钟前 ⋅ 0

JVM系列:jinfo命令详解

jinfo全称Java Configuration Info,主要作用是实时查看和调整JVM配置参数。 一.查看JVM参数 用法:jinfo -flag <name> PID 示例: # jinfo -flag MaxMetaspaceSize 11180 # -XX:MaxMetaspac......

Jacktanger ⋅ 39分钟前 ⋅ 0

exportfs命令、NFS客户端问题、FTP介绍、使用vsftpd搭建ftp

1. exportfs命令 一般情况下重启服务器上nfs服务时,需把客户端上的挂载先卸载掉,以免进程后面杀不掉。当客户端服务器很多时,操作起来就比较麻烦。此时可以使用exportfs命令重新加载下。 ...

laoba ⋅ 49分钟前 ⋅ 0

基于Python的信用评分卡模型分析

信用风险计量体系包括主体评级模型和债项评级两部分。主体评级和债项评级均有一系列评级模型组成,其中主体评级模型可用“四张卡”来表示,分别是A卡、B卡、C卡和F卡;债项评级模型通常按照主...

火力全開 ⋅ 50分钟前 ⋅ 0

执行make命令时报错g++: Command not found

执行make命令时报错g++: Command not found 2016年10月24日 12:31:29 阅读数:4366 朋友安装node时遇到的问题 报错截图: 其实很简单只需要安装一下 yum -y install gcc automake autoconf l...

rootliu ⋅ 50分钟前 ⋅ 0

Loongnix(龙芯)系统,优盘安装指南

U盘安装分为两种方式:"usb disk" 及 "usb cd"。其中usb cd是将usb disk做为usb光驱使用。 usb disk安装步骤: 需要准备一个大小超过3.5G的U盘,格式化ext3格式 下载安装光盘镜像xxx.iso,将...

gugudu ⋅ 53分钟前 ⋅ 0

HTML5中meta属性的使用详解

meta属性在HTML中占据了很重要的位置。如:针对搜索引擎的SEO,文档的字符编码,设置刷新缓存等。虽然一些网页可能没有使用meta,但是作为正规军,我们还是有必要了解一些meta的属性,并且能...

guorongjin ⋅ 57分钟前 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部