文档章节

三、struts值栈

swift_hua
 swift_hua
发布于 2017/07/23 23:54
字数 2449
阅读 10
收藏 1

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
成都
程序员
私信 提问
day37_Spring学习笔记_05_CRM_01

一、CRM 客户关系管理系统 CRM : custom releation manager 客户关系管理系统,用于维护客户和公司之间关系。 我们要做的是:学校 和 大家 之间关系。 完成功能: 员工管理: 1、登录(登录拦...

黑泽明军
08/15
0
0
Java:struts2之struts.xml 配置详解整理........ing

<!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN" "http://struts.apache.org/dtds/struts-2.0.dtd" > <struts> <!-- include节点是struts2中组......

刘纪君
2014/03/14
0
0
struts2.0中struts.xml配置文件详解

<!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN" "http://struts.apache.org/dtds/struts-2.0.dtd" > <struts> <!-- include节点是struts2中组......

crazyinsomnia
2010/03/25
0
0
关于Apache Struts2 S2-057远程代码执行漏洞分析

  前言   Apache Struts框架是一个基于 Java Servlets,JavaBeans, 和 JavaServer Pages (JSP)的Web应用框架的开源项目,Struts基于Model-View-Controller (MVC)的设计模式,可以用来构件...

FreeBuf
08/28
0
0
el表达式跟ognl表达式的区别

1.区别 用法区别:OGNL是通常要结合Struts 2的标志一起使用,如<s:property value="#xx" /> struts页面中不能单独使用,el可以单独使用 ${sessionScope.username} 页面取值区别: 用于按req...

姚君
2014/04/18
0
0

没有更多内容

加载失败,请刷新页面

加载更多

ConcurrentHashMap 高并发性的实现机制

ConcurrentHashMap 的结构分析 为了更好的理解 ConcurrentHashMap 高并发的具体实现,让我们先探索它的结构模型。 ConcurrentHashMap 类中包含两个静态内部类 HashEntry 和 Segment。HashEnt...

TonyStarkSir
今天
3
0
大数据教程(7.4)HDFS的java客户端API(流处理方式)

博主上一篇博客分享了namenode和datanode的工作原理,本章节将继前面的HDFS的java客户端简单API后深度讲述HDFS流处理API。 场景:博主前面的文章介绍过HDFS上存的大文件会成不同的块存储在不...

em_aaron
昨天
2
0
聊聊storm的window trigger

序 本文主要研究一下storm的window trigger WindowTridentProcessor.prepare storm-core-1.2.2-sources.jar!/org/apache/storm/trident/windowing/WindowTridentProcessor.java public v......

go4it
昨天
6
0
CentOS 生产环境配置

初始配置 对于一般配置来说,不需要安装 epel-release 仓库,本文主要在于希望跟随 RHEL 的配置流程,紧跟红帽公司对于服务器的配置说明。 # yum update 安装 centos-release-scl # yum ins...

clin003
昨天
9
0
GPON网络故障处理手册

导读 为了方便广大网络工作者工作需要,特搜集以下GPON网络处理流程供大家学习参考。开始—初步定为故障—检查光纤状况—检查ONU状态--检查设备运行状态—检查设备数据配置—检查上层设备状态...

问题终结者
昨天
10
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部