一、OGNL概述

1.之前web阶段,学习过EL表达式,用于在jsp页面中获取域对象里面的值

2.OGNL是一种表达式,功能更加强大

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

(2)一般把ognl在struts2中使用,和struts标签一起使用来操作值栈

3.OGNL不是struts2的一部分

(1)使用ognl首先导入jar包,struts2已经提供了

二、OGNL入门案例

1.使用ognl+struts2标签实现计算字符串长度

2.使用struts2标签

(1)使用jstl时,除导入jar包之外,还需在jsp页面中引入标签库;使用struts2标签同样需要

<%@ taglib uri="/struts-tags" prefix="s"%>
<body><!-- 使用ognl+struts2标签实现计算字符串长度 value属性值:ognl表达式--><s:property value="'hello'.length()"/>
</body>

三、什么是值栈

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

2.struts2提供一种存储机制,类似于域对象,用于存值和取值,是值栈

(1)在action中把数据放到值栈中,在web页面中通过值栈取值

3.servlet和action区别:

(1)servlet默认在第一次访问时创建,只创建一次。单实例对象

(2)action访问时创建,每次访问时都会创建一个action对象,创建多次。多实例对象

4.值栈存储位置

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

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

public class UserAction extends ActionSupport {@Overridepublic String execute() throws Exception {//1.获取ActionContext对象ActionContext context = ActionContext.getContext();//2.调用方法得到值栈对象ValueStack stack1 = context.getValueStack();ValueStack stack2 = context.getValueStack();System.out.println(stack1 == stack2);return NONE;}
}

输出结果为:true 证明只有一个值栈对象

四、获取值栈对象

1.使用ActionContext类里面的方法获取值栈对象

public class UserAction extends ActionSupport {@Overridepublic String execute() throws Exception {//1.获取ActionContext对象ActionContext context = ActionContext.getContext();//2.调用方法得到值栈对象ValueStack stack1 = context.getValueStack();return NONE;}
}

五、值栈内部结构

1.值栈分为两部分,一般操作root部分

第一部分 root,list集合

第二部分 context,map集合

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

(1)访问action,返回到一个jsp页面,在页面中使用这个标签

(2)跳转到页面后会看到一个[debug]超链接形式,点击这个链接,就能看到值栈中的内容

上面部分为root,下面部分为context。

action对象中又值栈对象,值栈的root部分存的是action对象的引用

六、向值栈中放数据

1.向值栈中放数据有多种方式

第一种 获取值栈对象,调用该对象的set方法。放完后,值栈中多了一个HashMap

第二种 获取值栈对象,调用该对象的push方法。放完后,值栈多了一个String

public class ValueStackDemoAction extends ActionSupport {@Overridepublic String execute() throws Exception {//第一种 使用值栈对象的set方法//1.获取值栈对象ActionContext context = ActionContext.getContext();ValueStack stack = context.getValueStack();//2.调用set方法//第二种 使用值栈对象的push方法stack.push("abc");stack.set("username", "LeBron");return SUCCESS;}
}

第三种 在action中定义变量,生成变量的get方法。放完后,在action中多了一个name

public class ValueStackDemoAction extends ActionSupport {private String name;public String getName() {return name;}@Overridepublic String execute() throws Exception {name = "abcdefg";return SUCCESS;}
}

2.向值栈放对象

(1)定义对象变量

(2)生成变量的get方法

(3)在execute方法中给对象变量设置值

public class ValueStackDemoAction2 extends ActionSupport {private User user;public User getUser() {return user;}@Overridepublic String execute() throws Exception {user = new User("Doinb","12321","新疆");return SUCCESS;}
}

在值栈的Action部分多了一个user对象

3.向值栈中方list集合

(1)定义一个list集合变量

(2)生成该变量的get方法

(3)在execute方法中 给list集合变量设置值

七、从值栈中取数据

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

<s:property value="ognl表达式" />

1.获取字符串值

(1)向值栈中放字符串

public class ValueStackAction extends ActionSupport {private String username;public String getUsername() {return username;}@Overridepublic String execute() throws Exception {username = "GDX";return SUCCESS;}
}

(2)通过struts2标签+ognl表达式取值

<body><s:property value="username"/>
</body>

2.获取对象

(1)向值栈中放对象

public class ValueStackAction extends ActionSupport {private User user = new User();public User getUser() {return user;}@Overridepublic String execute() throws Exception {user.setUsername("金咕咕");user.setAddress("FPX");user.setPassword("5117");return SUCCESS;}
}

(2)struts2标签+ognl表达式获取

<body><!-- 使用s:debug标签 --><s:debug></s:debug><br/><!-- 获取对象 --><s:property value="user.username"/><s:property value="user.password"/><s:property value="user.address"/>
</body>

3.获取list集合

(1)第一种方式

public class ValueStackAction extends ActionSupport {private List<User> list = new ArrayList<User>();public List<User> getList() {return list;}@Overridepublic String execute() throws Exception {User user = new User();user.setUsername("金咕咕");user.setAddress("FPX");user.setPassword("5117");User user1 = new User();user1.setUsername("厂子");user1.setAddress("EDG");user1.setPassword("111222");list.add(user);list.add(user1);return SUCCESS;}
}
<body><!-- 使用s:debug标签 --><s:debug></s:debug><br/><!-- 获取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"/>
</body>

(2)第二种方式

<body><!-- 第二种 --><s:iterator value="list"><s:property value="username"/><s:property value="password"/><s:property value="address"/></s:iterator>
</body>

(3)第三种方式

<body><!-- 第三种 --><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"/></s:iterator>
</body>

4.使用set方法向值栈中放数据如何获取

public class ValueStackAction2 extends ActionSupport {@Overridepublic String execute() throws Exception {ActionContext context = ActionContext.getContext();ValueStack stack = context.getValueStack();stack.set("mid", "doinb");return SUCCESS;}
}
<body><!-- 获取set方法设置的值 --><s:property value="mid"/>
</body>

5.使用push方法向值栈中放数据如何获取

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

(2)向值栈中放数据时,会把这些数据放到一个名为top的数组中

public class ValueStackAction2 extends ActionSupport {@Overridepublic String execute() throws Exception {ActionContext context = ActionContext.getContext();ValueStack stack = context.getValueStack();stack.push("kexi");return SUCCESS;}
}
<body><!-- 获取push方法设置的值 --><s:property value="[0].top"/>
</body>

6.为什么EL表达式能够获取值栈数据?

jar包中导入jstl.jar和standard.jar,jsp页面

<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<body><c:forEach items="${list }" var="user">${user.username }${user.password }${user.address }</c:forEach><br/>
</body>

八、OGNL中#的使用

1.使用#获取context里面数据

<body><!-- 第三种 --><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"/></s:iterator>
</body>

2.使用context中内容的情况

(1)向request域中放值

public class ContextAction extends ActionSupport{@Overridepublic String execute() throws Exception {HttpServletRequest request = ServletActionContext.getRequest();request.setAttribute("mid", "doinb");return SUCCESS;}
}

(2)在页面用ognl获取

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

九、OGNL中%的使用

1.在struts2标签里使用ognl表达式不能识别,需要加上%

<s:textfield name="username" value="%{#request.mid}"></s:textfield>

Struts2学习笔记——第三天相关推荐

  1. struts2学习笔记(三) Action(上)

    Action是什么 应用程序可以完成的每一个操作都可以称之为动作.例如,显示一个登录表单是一个动作,将用户信息保存起来也是一个动作. 动作类其实就是普通的java类,他们可以有属性和方法,但是需要遵循 ...

  2. 【web开发学习笔记】Structs2 Result学习笔记(三)带參数的结果集

    Result学习笔记(三)带參数的结果集 第一部分:代码 //前端 <head> <meta http-equiv="Content-Type" content= ...

  3. 菜鸟Vue学习笔记(三)

    菜鸟Vue学习笔记(三) 本周使用了Vue来操作表单,接下来说下Vue中双向绑定表单元素的用法. Vue中双向绑定是使用的v-model,所谓的双向绑定即改变变量的值,表单元素的值也会改变,同样的,改 ...

  4. Java NIO 学习笔记(三)----Selector

    目录: Java NIO 学习笔记(一)----概述,Channel/Buffer Java NIO 学习笔记(二)----聚集和分散,通道到通道 Java NIO 学习笔记(三)----Select ...

  5. UFLDL深度学习笔记 (三)无监督特征学习

    UFLDL深度学习笔记 (三)无监督特征学习 1. 主题思路 "UFLDL 无监督特征学习"本节全称为自我学习与无监督特征学习,和前一节softmax回归很类似,所以本篇笔记会比较 ...

  6. ASP.NET Core 2 学习笔记(三)中间件

    原文:ASP.NET Core 2 学习笔记(三)中间件 之前ASP.NET中使用的HTTP Modules及HTTP Handlers,在ASP.NET Core中已不复存在,取而代之的是Middl ...

  7. OpenCV学习笔记(三十六)——Kalman滤波做运动目标跟踪 OpenCV学习笔记(三十七)——实用函数、系统函数、宏core OpenCV学习笔记(三十八)——显示当前FPS OpenC

    OpenCV学习笔记(三十六)--Kalman滤波做运动目标跟踪 kalman滤波大家都很熟悉,其基本思想就是先不考虑输入信号和观测噪声的影响,得到状态变量和输出信号的估计值,再用输出信号的估计误差加 ...

  8. OpenCV学习笔记(三十一)——让demo在他人电脑跑起来 OpenCV学习笔记(三十二)——制作静态库的demo,没有dll也能hold住 OpenCV学习笔记(三十三)——用haar特征训练自己

    OpenCV学习笔记(三十一)--让demo在他人电脑跑起来 这一节的内容感觉比较土鳖.这从来就是一个老生常谈的问题.学MFC的时候就知道这个事情了,那时候记得老师强调多次,如果写的demo想在人家那 ...

  9. Windows x64内核学习笔记(三)—— SMEP SMAP

    Windows x64内核学习笔记(三)-- SMEP & SMAP SMEP & SMAP 实验:构造IDT后门 第一步:编译以下代码 第二步:构造IDT后门 第三步:运行程序 第四 ...

最新文章

  1. Linux之vim中翻页的命令
  2. AOI检测基本原理与设备构成
  3. N!的尾部连续0的个数
  4. JPA的entityManager的find方法与getReference方法的区别
  5. 基于各种基础数据结构的SPFA和各种优化
  6. matlab能输入铁心参数,基于MATLAB的电力机车110伏直流稳压电源仿真研究
  7. 十二、HTML5新增标签特性详解(audio、video、input)
  8. MongoDB安装启动教程
  9. 面试基础(1)——面向对象/get,post的区别
  10. 猎洞高手轻松变身Gsuite 超级管理员接管他人的 Gsuite 账户
  11. andorid使能ftrace失败
  12. 校园虚拟服务器设备配置规划,校园高性能虚拟化服务器平台建设规划.doc
  13. 如何科学预估开发时间
  14. 图画日记怎么画_图画日记
  15. 算法杂谈 How are you? I‘m fine Thank you ,and you?
  16. 年轻人如何提高职场视野
  17. Apache Log4j 2.0-rc1 发布
  18. 判断ip地址是否在同一网段
  19. Java网络编程,一对一聊天
  20. 爬取哔哩哔哩综合排行榜信息及视频弹幕内容

热门文章

  1. Echarts横坐标鼠标点击事件
  2. “此站点的连接不安全问题”解决办法
  3. Python练习笔记 - - 彩色宝石项链
  4. java的字符串分割
  5. 下载迅雷,绑定了好多软件,让人困扰
  6. 电子商务金融危机中逆市扩张
  7. Windows“彻底解决”蓝屏死机问题:变成黑屏死机
  8. Flask学习与项目实战3:简单入手模板及高阶使用
  9. 【Introductory Biology】Lecture 5 - Carbohydrates and Glycoproteins 碳水化合物和糖蛋白
  10. 品牌自播成为企业破解流量密码的利器