向值栈中存放数据与从值栈中读取数据

Posted 一条路上的咸鱼

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了向值栈中存放数据与从值栈中读取数据相关的知识,希望对你有一定的参考价值。

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

以上是关于向值栈中存放数据与从值栈中读取数据的主要内容,如果未能解决你的问题,请参考以下文章

Struts2-从值栈中获取数据-EL表达式从值栈获取

struts学习

向值栈获取List集合

从值栈获取对象

struts2入门之OGNL

struts框架值栈问题七之EL表达式也会获取到值栈中的数据