3. Struts2 ognl & 值栈


ognl概述

  • ognl是一种表达式,类似一EL表达式 但功能更加强大
    1. 在Struts2 里面操作的是值栈数据
    2. 一般把ognl在Struts2 中 和 Struts2 的标签一起使用
  • ognl 不是 Struts2 的一部分,单独的项目 , 经常和Struts2 一起使用
    • 需要导入jar包,Struts2 提供了jar包

ognl入门案例

1. 计算字符串的长度

.length();
1. 引入标签库
<%taglib uri="/struts-tags" prefix="s" %>
2. 计算长度
<s:property value="'haha'.length()">
3.页面结果
4


值栈

栈:后进先出

值栈的定义

  1. 之前web阶段,实在servlet中操作,在页面上用EL表达式取出
  2. 在Struts2 里面值栈就是一种作用域,可以存取值.
    1. 在action里面把数据放到值栈里面,在页面中获取到值栈数据.
  3. servlet 和 action的区别
    1. servlet 默认在第一次访问时创建
    2. action 在每次访问时创建
  4. 值栈的位置
    1. 每次访问都创建一个action对象
    2. 每个action都会有一个值栈

获取值栈对象

  • 获取值栈有多种方式
    使用ActionContext类的方式
//获取ActionContext
ActionContext context = ActionContext.getContext();
//调用方法得到值栈对象
ValueStack stack = getValueStack();

2.值栈的内部结构

值栈分为两部分
第一部分:root,结构是List集合

  • 一般操纵都是root里面的数据 , root 继承了 ArrayList

第二部分:context,结构是Map集合

  • 存储的是对象的引用
  • key值固定 分别有




    request request对象引用
    session HttpSession对象引用
    application ServletContext对象引用
    parameters 传递相关的参数
    attr(attribute简写) 使用attr获取域对象的值

debug 标签

  • 访问action,执行action的方法有返回值,在jsp页面使用 debug 标签可以查看返回值

向值栈放数据

1. set方法 键值
//获取ActionContext
ActionContext context = ActionContext.getContext();
//调用方法得到值栈对象
ValueStack stack = getValueStack();
//放入数据
stack.set("uname","雷鸣");
2. push方法 字符串
//获取ActionContext
ActionContext context = ActionContext.getContext();
//调用方法得到值栈对象
ValueStack stack = getValueStack();
//放入数据
stack.push("abcd");
3. 成员属性 (最常用的)
    //创建成员变量
    private Users us;
    //创建成员变量的getter 和 setter 方法
    public Users getUs() {
        return us;
    }
    public void setUs(Users us) {
        this.us = us;
    }
    //在方法里写入数据
    public String execute (){
        us.setUname("雷鸣");
        us.setPassword("123");
        return "ok";

    }

4.从值栈里面取数据

  • 获取变量值
//获取变量值
<s:property value="uname">
  • 获取对象的值
//获取对象的值
<s:property value="us.uname">
<s:property value="us.password">
  • 获取List集合的值
//获取List集合的值
//第一种方式
<s:property value="list[0].uname">
<s:property value="list[0].password">
<s:property value="list[1].uname">
<s:property value="list[1].password">
...
//第二种方式  遍历
<s:iterator value="list">
    <s:property value="uname">
    <s:property value="password">
</s:iteratror>
//第三种方式
/**
 * 加入var声明后
 * 会把每次遍历的us对象放到context里面
 * 获取context里面的特点:需要写ognl表达式
 * 需要使用 # ;
 */
<s:iterator value="list" var="us">
    <s:property value="#us.uname">
    <s:property value="#us.password">
</s:iteratror>

5.EL表达式获取值栈数据

  1. EL表达式获取域对象的值
  2. 向域对象放入和取出值用 setAttribute 和 getAttribute
  3. 低层增强request对象里面的方法
    1. 首先从request 中取值,如果得到值,直接返回;
    2. 如果没有得到值,到值栈里把值取出来,并放入;域对象里面

获取域对象的值

  • #request是域对象
<!-- 获取context里面数据,写ognl时候,首先添加符号 #context的key名称.域对象名称 --> 
<s:property value= "#request.req"/>

表单标签 与 %

  • Struts2标签中的表单标签
    1. 在Struts2 标签里使用ognl表达式,如果直接在Struts2表单标签里使用ognl表达式则不会识别,只有添加%后才可以识别
  • 以前的写法
    <input type="text" name="name" value="uname">
  • Struts2 的写法
    %{#域对象.属性名}
    <s:textfield name="name" value="%{#request.uname}">

猜你喜欢

转载自blog.csdn.net/luke199257/article/details/80793276