Struts2知识点小结(三)--值栈与ognl表达式
1.问题一 : 什么是值栈 ValueStack
回顾web阶段 数据交互问题?
客户端提交数据 到 服务器端 request接受数据+BeanUtils实体封装
服务器端数据 在页面上显示 在服务器端将数据存储到request域中 页面中通过el+jstl完成数据展示
struts2阶段,数据交互问题?
客户端提交数据 到 服务器端 属性驱动和模型驱动
服务器端数据 在页面上显示 在服务器端将数据存储到值栈中 在页面中通过ognl+struts2标签数据展示
request域 等于 值栈
el表达式 等于 ognl表达式
jstl标签 等于 struts2标签
值栈是什么?
值栈是服务器与客户端进行数据交互的数据中心,用于存储数据
在服务器将数据存储到值栈中 在页面中从值栈取出数据进行展示
值栈ValueStack是Struts2提供接口规范,于此同时也提供了该接口的实现OgnlValueStack
值栈的生命周期?
Action ActionContext ValueStack
1 1 1
Action:多例的
创建:每次访问都会创建一个新的的Action
销毁:响应结束该Action销毁
2.问题二 : 值栈的内部结构
获得值栈对象
ActionContext context = ActionContext.getContext();
VAlueStack valueStack = context.getValueStack();
值栈的内部结构:
Root栈:ArrayList
context栈:map


3.问题三 : 值栈对象何时创建?ValueStack 和 ActionContext是什么关系
源码分析:
--->StrutsPrepareAndExecuteFilter
--->public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain)
--->prepare.createActionContext(request, response);
--->ValueStack stack = createValueStack();
ActionContext内部维护值栈的引用
4.问题四 : 如何获得值栈对象ValueStack
第一种方式:
ActionContext context = ActionContext.getContext();
VAlueStack valueStack = context.getValueStack();
第二种方式:
通过request域对象 request.getAttribute("struts.valueStack");
源码:
--->StrutsPrepareAndExecuteFilter
--->public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain)
--->execute.executeAction(request, response, mapping);
--->dispatcher.serviceAction(request, response, mapping);
--->request.setAttribute(ServletActionContext.STRUTS_VALUESTACK_KEY, proxy.getInvocation().getStack());
public static final String STRUTS_VALUESTACK_KEY = "struts.valueStack"
5.问题五 : 如何手动向值栈保存数据
5.1 向Root栈存储数据
//获得值栈对象
ValueStack valueStack = ActionContext.getContext().getValueStack();
//获得内部的Root栈
CompoundRoot root = valueStack.getRoot();
//存数据
root.add("itcast"); //存储到尾部
root.add(0, "itheima"); //存储到头部(栈顶)
//CompoundRoot的存取数据的API
root.push("xxx"); //压栈 add(0, o);
root.peek(); //获得栈顶的值 return get(0);
root.pop(); //弹栈 return remove(0);
5.2 向context栈存储数据
//获得值栈对象
ValueStack valueStack = ActionContext.getContext().getValueStack();
//获得context栈
Map<String, Object> map = valueStack.getContext();
map.put("xxx", "XXX");
map.get("xxx");
5.3 valueStack对象维护着向值栈存取数据的API
valueStack.push();
valueStack.set();
valueStack.findValue();
6.问题六 : struts2框架会将哪些数据自动保存到值栈中
引入struts2的标签<s:debug/> 该标签可以在页面中直观看到值栈的内部数据
6.1 struts2框架会自动将哪些数据存储到Root栈
将当前访问的Action对象自动压栈
作用:Action的get方法的属性值 可以通过ognl表达式方便获取
将当前模型对象自动压到栈顶
作用:模型对象压到栈顶 通过ognl表达式方便取出模型对象的属性值
6.2 struts2框架会自动将哪些数据存储到context栈
request对象
response对象
各种域数据
请求参数
... ...
维护本次请求的所有相关数据
7.问题七 : 如何取值栈的数据 (Ognl+struts2标签)
7.1 取出普通数据
注意:什么符号都不加 代表从Root栈取值
<s:property value="ognl表达式"/>
<h1>取出普通数据name</h1>
<s:property value="name"/>
<h1>取出user中的name</h1>
<s:property value="user.name"/>
注意:#代表直接从context栈取值
<s:property value="#ognl表达式"/>
7.2 遍历集合数据
<!--
会将集合中的每一个元素对象 依次临时存储到栈顶
-->
<%-- <s:iterator value="userList">
<s:property value="name"/>==<s:property value="age"/><br/>
</s:iterator> --%>
<!--
var: 变量名称 临时使用var指定的字符串作为key在context栈存储一份
-->
<s:iterator value="userList" var="user">
<s:property value="#user.name"/>==<s:property value="#user.age"/><br/>
</s:iterator>
8.问题八 : 为什么 EL也能访问值栈中的数据 (面试)
原因:StrutsRequestWrapper
${} 底层调用getAttribute方法
源码:
request = prepare.wrapRequest(request);
request = dispatcher.wrapRequest(request);
//BufferedReader reader = new BufferedReader(new FileReader());
StrutsRequestWrapper request = new StrutsRequestWrapper(request);
增强的是getAttribute方法:
public Object getAttribute(String key) {
//调用原来的request的方法
Object attribute = super.getAttribute(key); //从request域中获得值
if (attribute == null) {
attribute = stack.findValue(key);
}
return attribute;
}
Struts2知识点小结(三)--值栈与ognl表达式的更多相关文章
- Struts2基础学习(七)—值栈和OGNL
目录: 一.值栈 二.OGNL表达式 一.值栈(ValueStack) 1.定义 ValueStack贯穿整个Acton的生命周期,每个Action类的对象实例都拥有一个ValueStack ...
- Struts2学习记录-Value Stack(值栈)和OGNL表达式
仅仅是学习记录.把我知道的都说出来 一.值栈的作用 记录处理当前请求的action的数据. 二,小样例 有两个action:Action1和Action2 Action1有两个属性:name和pass ...
- 关于Struts2中的值栈与OGNL表达式
1.1.1 OGNL概述: Object Graphic Navigation Language(对象图导航语言)的缩写 * EL :OGNL比EL功能强大很多倍. 它是一个开源项目. ...
- struts2的总体回想(ACTION、拦截器、值栈、OGNL表达式、ModelDriven方案等)
ValueStack:struts2的一个存放数据的数据结构(核心) ValueStack大致能够理解为:由Map和对象栈组成 ValueStack作用范围:一个请求,用它来取代request的作用域 ...
- 走进Struts2(五)— 值栈和OGNL
值栈 1.值栈是什么? 简单说:就是相应每个请求对象的轻量级的内存数据中心. Struts2引入值栈最大的优点就是:在大多数情况下,用户根本无须关心值栈,无论它在哪里,不用管它里面有什么,仅仅须要去获 ...
- 初学者易上手的SSH-struts2 04值栈与ognl表达式
什么是值栈?struts2里面本身提供的一种存储机制,类似于域对象,值栈,可以存值和取值.,特点:先进后出.如果将它当做一个容器的话,而这个容器有两个元素,那么最上面的元素叫做栈顶元素,也就是所说的压 ...
- Struts2的值栈和OGNL牛逼啊
Struts2的值栈和OGNL牛逼啊 一 值栈简介: 值栈是对应每个请求对象的一套内存数据的封装,Struts2会给每个请求创建一个新的值栈,值栈能够线程安全的为每个请求提供公共的数据存取服务. 二 ...
- 学习Struts--Chap05:值栈和OGNL
1.值栈的介绍 1.1 值栈的介绍: 值栈是对应每一个请求对象的数据存储中心,struts2会给每一个请求对象创建一个值栈,我们大多数情况下不需要考虑值栈在哪里,里面有什么,只需要去获取自己需要的数据 ...
- Struts2知识点小结汇总
Struts2部分 1. JavaEE软件三层结构和MVC的区别? JavaEE软件三层机构是由sun公司提供JavaEE开发规范的:Web层(表现层).业务逻辑层.数据持久层.[其中WEB层会使用前 ...
随机推荐
- ionic2 目录
首先 ionic2 暂时找不到中文文档.本人英语又很渣.无奈之下只能依赖于百度翻译.完全是已自己理解的方式运作 ,可能里面会有一些偏差之类的 不过我都测试过代码是可以跑通的 只不过讲解的部分可能... ...
- SpringSecurity 3.2入门(10)自定义权限控制认证及授权的过程
上一章的代码实现还存在一些问题,如角色表.权限表的用处没有体现出来,但是已经能完成URL拦截功能,后面将会继续完善认证及授权的过程. 认证及授权的过程如下: 1.容器启动,MyInvocationSe ...
- 通过js操作样式(评分)
<style> td{ font-size:50px; color:yellow; cursor:pointer; } </style> <script type=&qu ...
- mpvue自定义化后台富文本样式
最近公司写小程序开始换框架了,之前用wepy,现在用mpvue. mpvue是基于vue的写法来开发微信小程序.虽然不完全和vue一样,但是大致和vue一样,所以基本开发上是上手很快的. 现在项目进程 ...
- 有关table布局时tr 属性display:block显示布局错乱
display:block display:block是可以把非块级元素强制转换为块级元素显示,如内嵌元素span,原来不支持设置宽高,宽度是由内容撑开的; display:table-row tab ...
- Linux服务器性能评估与优化(一)
网络内容总结(感谢原创) 1.前言简介 一.影响Linux服务器性能的因素 1. 操作系统级 性能调优是找出系统瓶颈并消除这些瓶颈的过程. 很多系统管理员认为性能调优仅仅是调整一下 ...
- IS Decisions如何帮助企业提高安全标准
PCI DSS标准有什么要求? 简单地说,PCI DSS要求最高级别的网络安全性.这一标准如今广泛应用于需要存储.管理.传输客户(或持卡人)个人数据的行业和领域. 施行严格的访问监控措施 为了保证关键 ...
- 【Gradle】 Gradle 综合
Gradle User Guide:http://www.gradle.org/docs/current/userguide/userguide.html 针对它的中文翻译:http://ask.an ...
- C#多线程和异步(二)——Task和async/await详解(转载)
一.什么是异步 同步和异步主要用于修饰方法.当一个方法被调用时,调用者需要等待该方法执行完毕并返回才能继续执行,我们称这个方法是同步方法:当一个方法被调用时立即返回,并获取一个线程执行该方法内部的业务 ...
- Struts1.x 中处理乱码及通过标签显示数据
1.通过filter解决乱码问题 网页的请求到达之前,先要经过filter的处理: 提取数据出现乱码:request.setCharacterEncoding("UTF-8"); ...