一、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