向值棧中存放數據與從值棧中讀取數據


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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM