向值栈中存放数据与从值栈中读取数据
一、set方法方式
1、使用set方法存数据
public class GetValueStackAction extends ActionSupport{ //使用值栈的get方法往值栈中存数据 public String execute(){ //1获取ActionContext对象 ActionContext ctx = ActionContext.getContext(); //2、获取ValueStack对象 ValueStack vs =ctx.getValueStack(); /** * 3、使用get方法存数据 * set方法的第一个值:保存的数据的名字,在页面中取数据时使用该名字来取数据 * set方法的第二个值:要在页面中展示的值 */ vs.set("name", "张三"); return SUCCESS; } }
2、在页面取set方法存的数据
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <%--要使用struts2标签,必须要引入struts2标签库 --%> <%@ 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> <%-- 1、ognl表达式必须要在struts2标签中使用 2、在ognl表达式中可以直接调用Java的方法 3、value的值就是ognl表达式,就是在set方法中保存数据时的第一个参数的值 --%> name:<s:property value="name"/> </body> </html>
二、push方法方式
1、使用push方法存数据
public class PushValueStackAction extends ActionSupport{ //使用值栈的push方法往值栈中存数据 public String execute(){ //1获取ActionContext对象 ActionContext ctx = ActionContext.getContext(); //2、获取ValueStack对象 ValueStack vs =ctx.getValueStack(); /** * 3、使用push方法存数据 * set方法的值:保存的数据. */ vs.push("张三"); return SUCCESS; } }
2、在页面取push方法存的数据
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <%--要使用struts2标签,必须要引入struts2标签库 --%> <%@ 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> <%-- 1、ognl表达式必须要在struts2标签中使用 2、在ognl表达式中可以直接调用Java的方法 3、value的值就是ognl表达式. 4、push存的数据在值栈中是以数组的方式来存放的 5、数组的名字是固定的。就是top 6、在Java中数组的第一个值是top[0],但是在ognl表达式中为[0].top --%> name:<s:property value="[0].top"/> </body> </html>
三、第三种方式(重点)
1、存取字符串
(1)往值栈存字符串
public class StringValueStackAction extends ActionSupport{ //存放字符串数据 //1、创建一个字符串对象 private String name; //2、创建该对象的getter方法 public String getName() { return name; } public String execute(){ //3、对字符串对象赋值 name = "mary"; return SUCCESS; } }
(2)从值栈中读取字符串
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <%--要使用struts2标签,必须要引入struts2标签库 --%> <%@ 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> <%-- 1、ognl表达式必须要在struts2标签中使用 2、在ognl表达式中可以直接调用Java的方法 3、value的值就是ognl表达式.是Action中字符串对象的名字 --%> name:<s:property value="name"/> </body> </html>
2、存取对象
(1)往值栈存对象
创建实体类
public class User { private String username; private String address; private String tel ; public String getUsername() { return username; } public void setUsername(String username) { this.username = username; } public String getAddress() { return address; } public void setAddress(String address) { this.address = address; } public String getTel() { return tel; } public void setTel(String tel) { this.tel = tel; } }
往对象中保存数据
public class ObjectValueStackAction extends ActionSupport{ //保存对象到值栈中 //1、创建实体对象,可以直接实例化,也可以在action方法中实例化 private User user; //2、生成getter方法 public User getUser() { return user; } public String execute(){ //3、实例化对象,如果已经实例化,则跳过这步 user = new User(); //4、给对象的属性设置值 user.setUsername("jack"); user.setAddress("中国"); user.setTel("13456"); return SUCCESS; } }
(2)从值栈中读取对象
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <%--要使用struts2标签,必须要引入struts2标签库 --%> <%@ 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> <%-- 1、ognl表达式必须要在struts2标签中使用 2、在ognl表达式中可以直接调用Java的方法 3、value的值就是ognl表达式. 4、表达式的值为:对象实例名称.对象属性名称 --%> name:<s:property value="user.username"/><br/> address:<s:property value="user.address"/><br/> tel:<s:property value="user.tel"/> </body> </html>
3、存取list结合
(1)往值栈存list集合
public class ListValueStackAction extends ActionSupport { //往值栈中存放list集合数据 //1、声明一个list对象,里面的泛型为对象 private List<User> list; //2、生成getter方法 public List<User> getList() { return list; } public String execute(){ //3、创建对象,并设置属性值 User user1 = new User(); user1.setUsername("jack"); user1.setAddress("中国"); user1.setTel("13456"); User user2 = new User(); user2.setUsername("Mary"); user2.setAddress("美国"); user2.setTel("789520"); //4、实例化list集合;将对象加入到list中 list = new ArrayList<User>(); list.add(user1); list.add(user2); return SUCCESS; } }
(2)从值栈中读取list集合(四种方式)
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <%--要使用struts2标签,必须要引入struts2标签库 --%> <%@ taglib uri="/struts-tags" prefix="s"%> <%--要使用jstl标签,必须要引入jstl标签库 --%> <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %> <!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> <%-- 1、ognl表达式必须要在struts2标签中使用 2、在ognl表达式中可以直接调用Java的方法 3、value的值就是ognl表达式. --%> <%-- 第一种读取方式 value的值:list[0]表示集合中的第一个对象 表达式:Action中的集合名称[第几个对象].对象的属性名称 缺点:要知道集合中对象的个数,如果个数太多,则代码太长 --%> 第一种方式读取数据:<br/> name:<s:property value="list[0].username"/><br/> address:<s:property value="list[0].address"/><br/> tel:<s:property value="list[0].tel"/><br/><br/> name:<s:property value="list[1].username"/><br/> address:<s:property value="list[1].address"/><br/> tel:<s:property value="list[1].tel"/><br/><br/> <%-- 第二种读取方式 该方式使用struts2的<s:iterator>标签来读取 <iterator>标签中value的值:Action中的集合名称 <property>标签中value的值:对象的属性名称 --%> 第二种方式读取数据:<br/> <s:iterator value="list"> name:<s:property value="username"/><br/> address:<s:property value="address"/><br/> tel:<s:property value="tel"/><br/><br/> </s:iterator> <%-- 第三种读取方式 该方式使用struts2的<s:iterator>标签来读取 <iterator>标签中value的值:Action中的集合名称 <iterator>标签中var的值:相当于遍历时的每一个对象的名称 <property>标签中value的值:#var属性的值.对象属性的值 机制:遍历list集合。得到list集合中的每一个对象,将对象以map的方式保存到context中 key就是var属性的值,值是每一个对象的引用。 在ognl表达式中要访问context中的数据时,要在表达式前面加上# --%> 第三种方式读取数据:<br/> <s:iterator value="list" var="user"> name:<s:property value="#user.username"/><br/> address:<s:property value="#user.address"/><br/> tel:<s:property value="#user.tel"/><br/><br/> </s:iterator> <%-- 第四种读取方式 该方式使用jstl的<c:foreach>标签来读取 <c:forEach>标签中value的值:Action中的集合名称 <c:forEach>标签中var的值:相当于遍历时的每一个对象的名称 el表达式能取到值栈数据的原因:struts2底层增强了request的setAttribute方法, 在增强中,首先去域对象中取值,如果在域对象中没有取到值,就去值栈中取值,将从值栈 中取到的值保存到域对象中返回。 缺点:需要先去域对象中取值,没有才去值栈中取值,取到后又要保存到域对象中返回,所有效率不高 一般不使用此方法 --%> 第四种方式读取数据:<br/> <c:forEach items="${list}" var="user"> name:${user.username} <br/> address:${user.address }<br/> tel:${user.tel}<br/><br/> </c:forEach> </body> </html>
四、OGNL中$、%、#的使用
1、#的使用
#用来获取context中的数据
<%-- 第三种读取方式 该方式使用struts2的<s:iterator>标签来读取 <iterator>标签中value的值:Action中的集合名称 <iterator>标签中var的值:相当于遍历时的每一个对象的名称 <property>标签中value的值:#var属性的值.对象属性的值 机制:遍历list集合。得到list集合中的每一个对象,将对象以map的方式保存到context中 key就是var属性的值,值是每一个对象的引用。 在ognl表达式中要访问context中的数据时,要在表达式前面加上# --%> 第三种方式读取数据:<br/> <s:iterator value="list" var="user"> name:<s:property value="#user.username"/><br/> address:<s:property value="#user.address"/><br/> tel:<s:property value="#user.tel"/><br/><br/> </s:iterator>
2、%的使用
在struts2的表单标签中ognl表达式要以%开始
<s:textfield name="username" value="%{#request.req}"></s:textfield>
3、$的使用
在配置文件中是ognl表达式时,需要使用$。
项目源代码:struts2_03.zip