zoukankan      html  css  js  c++  java
  • ognl_值栈操作

    OGNL概述

      1 OGNL是一种表达式,这个表达式功能更加强大,

        (1)在struts2里面操作值栈数据

        (2)一般把ognl在struts2操作:和struts2标签一起使用操作值栈

      2 OGNL不是struts2的一部分,单独的项目,经常和struts2一起使用

        (1)使用ognl时候首先导入jar包,struts2提供jar包

    OGNL入门案例

      1 使用ognl+struts2标签实现计算字符串长度:支持方法调用

        (1)在java代码中,调用字符串.length();

      2 使用struts2标签

        (1)使用jstl时候,导入jar包之外,在jsp页面中引入标签库

        使用struts2标签时候,在jsp中引入标签库

    <%@ taglib uri="/struts-tags" prefix="s"%>

        (2)使用struts2标签实现操作

        <!-- 使用ognl+struts2标签实现计算字符串长度 
            value属性值:ognl表达式
        -->
        <s:property value="'haha'.length()"/>

    什么是值栈

      1 之前在web阶段,在servlet里面进行操作,把数据放到域对象里面,在页面中使用el表达式获取到,域对象在一定范围内,存值和取值

      2 在struts2里面提供本身一种存储机制,类似于域对象,是值栈,可以存值和取值

        (1)在action里面把数据放到值栈里面,在页面中获取到值栈数据

      3 servlet和action区别

        (1)Servlet:默认在第一次访问时候创建,创建一次,单实例对象

        (2)Action:访问时候创建,每次访问action时候,都会创建action对象,创建多次,多实例对象

      4 值栈存储位置

        (1)每次访问action时候,都会创建action对象,

        (2)在每个action对象里面都会有一个值栈对象(只有一个)

    获取值栈对象

      1 获取值栈对象有多种方式

        (1)常用方式:使用ActionContext类里面的方法得到值栈对象

            // 1 获取ActionContext类的对象
            ActionContext context = ActionContext.getContext();
            //2 调用方法得到值栈对象
            ValueStack stack1 = context.getValueStack();

    值栈内部结构

      1 值栈分为两部分:

        第一部分 root,结构是list集合

          (1)一般操作都是root里面数据

          

        第二部分 context,结构map集合

            

      2 struts2里面标签 s:debug,使用这个标签可以查看值栈结构和存储值

        (1)访问action,执行action的方法有返回值,配置返回值到jsp页面中,在jsp页面中使用这个标签

        <!-- 使用struts2标签查看值栈结构 -->
        <s:debug></s:debug>

        点击超链接看到结构

          

        (2)在action没有做任何操作,栈顶元素是 action引用

        - action对象里面有值栈对象

        - 值栈对象里面有action引用

    向值栈放数据

      1 向值栈放数据多种方式

        第一种 获取值栈对象,调用值栈对象里面的 set 方法

        第二种 获取值栈对象,调用值栈对象里面的  push方法

        第三种 在action定义变量,生成变量的get方法(推荐使用)

    public class ValueStackDemo2 extends ActionSupport {
    
        //第三种方式
        private String test;//必须初始化
        public String getTest() {
            return test;
        }
    
        public String execute() throws Exception {
            
            ActionContext context = ActionContext.getContext();
            ValueStack stack = context.getValueStack();
    
            test = "haha";
            //第一种方式
            stack.set("username", "dsd");
            //第二种方式
            stack.push("dawdq");
            
            return "ok";
        }
    }

     

    向值栈放对象

      1 实现步骤

        第一步 定义对象变量

        第二步 生成变量的get方法

        第三步 在执行的方法里面向对象中设置值

        private User user;
        public User getUser() {
            return user;
        }
        public String execute() throws Exception {
            
            user = new User();
            user.setUsername("Aming");
            user.setPassword("213");
            user.setAddress("dsadsa");
            
            return "ok";
        }

        

    向值栈放list集合

      第一步 定义list集合变量

      第二步 生成变量的get方法

      第三步 在执行的方法里面向list集合设置值

        // 1 定义list变量
        private List<User> list = new ArrayList<User>();
        // 2 get方法
        public List<User> getList() {
            return list;
        }
        
        public String execute() throws Exception {
            //3 向list中设置值
            User user1 = new User();
            user1.setUsername("小奥");
            user1.setPassword("123");
            user1.setAddress("美国");
            
            User user2 = new User();
            user2.setUsername("小王");
            user2.setPassword("250");
            user2.setAddress("越南");
            
            list.add(user1);
            list.add(user2);
            
            return "success";
        }

     

    从值栈获取数据

      1 使用struts2的标签+ognl表达式获取值栈数据

        (1)<s:property value=”ognl表达式”/>

      获取字符串

        1 向值栈放字符串

        private String test;//必须初始化
        public String getTest() {
            return test;
        }
        public String execute() throws Exception {
            test = "haha";        
            return "ok";
        }

        2 在jsp使用struts2标签+ognl表达式获取

        <s:property value="test"/>

      获取对象

        1 向值栈放对象

        private User user;
        public User getUser() {
            return user;
        }
        public String execute() throws Exception {
            
            user = new User();
            user.setUsername("Aming");
            user.setPassword("213");
            user.setAddress("dsadsa");
            
            return "ok";
        }

        2 在页面中获取值

        <s:property value="user.username"/>
        <s:property value="user.password"/>
        <s:property value="user.address"/>

      获取list集合

        第一种方式

        <br/>
        获取list的值第一种方式:
        <br/>
        <!-- 3 获取值栈list集合数据 -->
        <!-- 第一种方式实现  -->
        <s:property value="list[0].username"/>
        <s:property value="list[0].password"/>
        <s:property value="list[0].address"/>
        <br/>
        <s:property value="list[1].username"/>
        <s:property value="list[1].password"/>
        <s:property value="list[1].address"/>
        
        <br/>

        第二种方式:

        <br/>
        获取list值的第二种方式:
        <br/>
        <s:iterator value="list">
            <s:property value="username"/>
            <s:property value="password"/>
            <s:property value="address"/>
            <br/>
        </s:iterator>

        第三种方式:(推荐使用)

         <br/>
        获取list的值第三种方式:
        <br/>
        <s:iterator value="list" var="user">
            <!-- 
                遍历值栈list集合,得到每个user对象
                机制: 把每次遍历出来的user对象放到 context里面
                获取context里面数据特点:写ognl表达式,
                使用特殊符号 #
             -->
            <s:property value="#user.username"/>
            <s:property value="#user.password"/>
            <s:property value="#user.address"/>
            <br/>
        </s:iterator>

      其他操作

        使用push方法向值栈放数据,获取

        (1)使用push方法设置值,没有名称,只有设置的值

        (2)向值栈放数据,把向值栈放数据存到数组里面,数组名称 top,根据数组获取值

        <!-- 获取push方法设置的值 -->
        <s:property value="[0].top"/>

    OGNL的#、%使用

      #使用

        1 使用#获取context里面数据

        <s:iterator value="list" var="user">
            <s:property value="#user.username"/>
            <s:property value="#user.password"/>
            <s:property value="#user.address"/>
            <br/>
        </s:iterator>

        2 演示# 操作

          (1)向request域放值

        public String execute() throws Exception {
            HttpServletRequest request = ServletActionContext.getRequest();
            request.setAttribute("req", "ddsa");
            return "ok";
        }

          (2)在页面中使用ognl获取

        <s:property value="#request.req"/>

      %使用

        1 在struts2标签中表单标签

          (1)在struts2标签里面使用ognl表达式,如果直接在struts2表单标签里面使用ognl表达式不识别,只有%之后才会识别。

        <s:textfield name="username" value="%{#request.req}"></s:textfield>
  • 相关阅读:
    php 函数strpos()
    uploadfy api中文文档
    thinkphp + 美图秀秀api 实现图片裁切上传,带数据库
    mysql 操作用户权限
    window.location 小结)
    turn.js 图书翻页效果
    thinkphp 内置标签volist 控制换行
    js 数据类型转换
    quartz 2.2.1
    Mysql测试链接
  • 原文地址:https://www.cnblogs.com/kpsmile/p/10100012.html
Copyright © 2011-2022 走看看