Struts2学习笔记——第三天
一、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学习笔记——第三天相关推荐
- struts2学习笔记(三) Action(上)
Action是什么 应用程序可以完成的每一个操作都可以称之为动作.例如,显示一个登录表单是一个动作,将用户信息保存起来也是一个动作. 动作类其实就是普通的java类,他们可以有属性和方法,但是需要遵循 ...
- 【web开发学习笔记】Structs2 Result学习笔记(三)带參数的结果集
Result学习笔记(三)带參数的结果集 第一部分:代码 //前端 <head> <meta http-equiv="Content-Type" content= ...
- 菜鸟Vue学习笔记(三)
菜鸟Vue学习笔记(三) 本周使用了Vue来操作表单,接下来说下Vue中双向绑定表单元素的用法. Vue中双向绑定是使用的v-model,所谓的双向绑定即改变变量的值,表单元素的值也会改变,同样的,改 ...
- Java NIO 学习笔记(三)----Selector
目录: Java NIO 学习笔记(一)----概述,Channel/Buffer Java NIO 学习笔记(二)----聚集和分散,通道到通道 Java NIO 学习笔记(三)----Select ...
- UFLDL深度学习笔记 (三)无监督特征学习
UFLDL深度学习笔记 (三)无监督特征学习 1. 主题思路 "UFLDL 无监督特征学习"本节全称为自我学习与无监督特征学习,和前一节softmax回归很类似,所以本篇笔记会比较 ...
- ASP.NET Core 2 学习笔记(三)中间件
原文:ASP.NET Core 2 学习笔记(三)中间件 之前ASP.NET中使用的HTTP Modules及HTTP Handlers,在ASP.NET Core中已不复存在,取而代之的是Middl ...
- OpenCV学习笔记(三十六)——Kalman滤波做运动目标跟踪 OpenCV学习笔记(三十七)——实用函数、系统函数、宏core OpenCV学习笔记(三十八)——显示当前FPS OpenC
OpenCV学习笔记(三十六)--Kalman滤波做运动目标跟踪 kalman滤波大家都很熟悉,其基本思想就是先不考虑输入信号和观测噪声的影响,得到状态变量和输出信号的估计值,再用输出信号的估计误差加 ...
- OpenCV学习笔记(三十一)——让demo在他人电脑跑起来 OpenCV学习笔记(三十二)——制作静态库的demo,没有dll也能hold住 OpenCV学习笔记(三十三)——用haar特征训练自己
OpenCV学习笔记(三十一)--让demo在他人电脑跑起来 这一节的内容感觉比较土鳖.这从来就是一个老生常谈的问题.学MFC的时候就知道这个事情了,那时候记得老师强调多次,如果写的demo想在人家那 ...
- Windows x64内核学习笔记(三)—— SMEP SMAP
Windows x64内核学习笔记(三)-- SMEP & SMAP SMEP & SMAP 实验:构造IDT后门 第一步:编译以下代码 第二步:构造IDT后门 第三步:运行程序 第四 ...
最新文章
- Linux之vim中翻页的命令
- AOI检测基本原理与设备构成
- N!的尾部连续0的个数
- JPA的entityManager的find方法与getReference方法的区别
- 基于各种基础数据结构的SPFA和各种优化
- matlab能输入铁心参数,基于MATLAB的电力机车110伏直流稳压电源仿真研究
- 十二、HTML5新增标签特性详解(audio、video、input)
- MongoDB安装启动教程
- 面试基础(1)——面向对象/get,post的区别
- 猎洞高手轻松变身Gsuite 超级管理员接管他人的 Gsuite 账户
- andorid使能ftrace失败
- 校园虚拟服务器设备配置规划,校园高性能虚拟化服务器平台建设规划.doc
- 如何科学预估开发时间
- 图画日记怎么画_图画日记
- 算法杂谈 How are you? I‘m fine Thank you ,and you?
- 年轻人如何提高职场视野
- Apache Log4j 2.0-rc1 发布
- 判断ip地址是否在同一网段
- Java网络编程,一对一聊天
- 爬取哔哩哔哩综合排行榜信息及视频弹幕内容