1. 程式人生 > >ValueStack的操作1(存資料和取資料)

ValueStack的操作1(存資料和取資料)

下面的資料存入的值值棧的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方法之後,才能在頁面上看到對用的屬性的值(雖然看不到,但是還是能夠取出來這個值的)