ValueStack的操作1(存資料和取資料)
阿新 • • 發佈:2019-02-12
下面的資料存入的值值棧的root區域
值棧物件的獲取:
public class ValueStackDemo01 extends ActionSupport {
@Override
public String execute() throws Exception {
// 方式一: 通過ActionContext獲取值棧
ValueStack valueStack1 = ActionContext.getContext().getValueStack();
// 方式二: 通過request物件獲取值棧
ValueStack valueStack2 = (ValueStack) ServletActionContext.getRequest().getAttribute("STRUTS_VALUESTACK_KEY" );
System.out.println(valueStack1 == valueStack2); // true
return SUCCESS;
}
}
一個Action例項就有一個ValueStack物件,所以上面兩種方式獲取的值棧物件都是同一個物件
值棧物件的操作(向值棧中存入資料):
第一種方式:在Action中提供屬性的get方法的方式:
不需要獲取ValueStack物件,:m預設的情況下,會將Action物件壓入值棧(也就是誰Action預設就在值棧裡面),既然Action都在值棧裡了,那麼Action的屬性肯定也都在值棧中.
所以就是利用了這一個特點,直接往值棧中存值
import com.opensymphony.xwork2.ActionSupport;
/**
* 操作ValueStack
* @author 湯小萌
*
*/
public class ValueStackDemo2 extends ActionSupport {
private User user;
public User getUser() {
return user;
}
@Override
public String execute() throws Exception {
// 想ValueStack中存值
user = new User("張三", "123");
return SUCCESS;
}
}
*Action的配置:
<action name="ValueStackDemo2" class="cn.itcast.demo01.ValueStackDemo2">
<result>/demo1/success.jsp</result>
</action>
*頁面程式碼:
<%@ 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>
<h1>檢視值棧的內部 </h1>
<s:debug></s:debug>
</body>
</html>
*頁面訪問的效果:
*分析:
actionErrors,errors,fieldErrors,errorMessages,container...這些都是Action繼承
ActionSuport而得到的屬性,
這些屬性由於都提供了get方法,所以也跟著Action一起存入了值棧中.所以裡面也會有存入的User物件.
記住:預設Action是會被壓入值棧的,所以Action的屬性也是會被存入值棧的.
*如何獲取值棧中的值:
<!-- 獲取值棧中的資料,一定要使用Ognl -->
<!-- 方式一的獲取:利用Action在值棧中的特性: -->
<s:property value="user.name"/>
<s:property value="user.password"/>
*很多人不太喜歡用這種方式,原因是如果Action中存入太多的資料,會導致Action太亂了.需要在Action裡面寫好多物件跟方法
第二種方式:使用ValueStack中本省的一些方法的方式:(用得人更多)
/**
* 操作值棧:方式二:呼叫值棧中的方法實現的
* @author 湯小萌
*
*/
public class ValueStackDemo3 extends ActionSupport {
@Override
public String execute() throws Exception {
// 向值棧中儲存資料
ValueStack valueStack = ActionContext.getContext().getValueStack();
// 一般會使用值棧中的兩個方法:
// push(Object obj) [一般用來儲存物件] -- set(String ket, Object obj) [一般用來儲存集合]
User user = new User("李四","456");
// 只要是手動呼叫的方法就是壓棧 會出現在棧的最頂端
valueStack.push(user); // 將User物件存入值棧中 [棧頂]
return SUCCESS;
}
}
*頁面進行debug的結果:
將User物件壓入棧頂了,
*頁面取值(直接通過屬名)
<!-- 方式二的獲取:通過屬性名 -->
<s:property value="name"/>
<s:property value="password"/>
如果有多個User物件的話,取值的時候只會去取棧頂位置的User物件
如果繼續往ValusStack中存資料呢?這時使用ste方法:[就是在上面的程式碼的基礎上加上一行程式碼:]
public class ValueStackDemo3 extends ActionSupport {
@Override
public String execute() throws Exception {
// 向值棧中儲存資料
ValueStack valueStack = ActionContext.getContext().getValueStack();
// 一般會使用值棧中的兩個方法:
// push(Object obj) [一般用來儲存物件] -- set(String ket, Object obj) [一般用來儲存集合]
User user = new User("李四","456");
// 只要是手動呼叫的方法就是壓棧 會出現在棧的最頂端
valueStack.push(user); // 將User物件存入值棧中 [棧頂]
// 繼續往棧頂存入資料
valueStack.set("name", "王五"); // 建立了一個Map集合,然後將Map集合壓入到棧中
return SUCCESS;
}
}
這時也是有一個name放在棧頂,跟User物件的屬性重名了.
*看一些頁面值棧的結構:
此時在棧頂的就是一個Map集合了,但是Map集合中的具體的資料你是看不到的.因為沒有get和set方法,
只有響應的屬性提供了get方法之後,才能在頁面上看到對用的屬性的值(雖然看不到,但是還是能夠取出來這個值的)