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


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

  • 相关阅读:
    kernel list 实践
    rpm打包
    void out2() const{
    剑指offer python版 两个链表的第一个公共结点
    剑指offer python版 数组中的逆序对
    剑指offer python版 字符串中第一个只出现一次的字符
    剑指offer python版 丑数 (只含有2,3,5因子)
    剑指offer python版 最长不含重复字符的子字符
    剑指offer python版 礼物的最大价值
    剑指offer python版 数字序列中某一位的数字
  • 原文地址:https://www.cnblogs.com/jack1995/p/6973196.html
Copyright © 2020-2023  润新知