Struts2学习(八)【OGNL表达式与Struts框架结合之原理】
来源:互联网 发布:rxjs 多个网络请求 编辑:程序博客网 时间:2024/05/22 05:29
一、结合图示
二、结合说明
OGNL表达式想要运行,需要一个OGNLContext。Struts2准备了一个OGNLContext,叫做 ValueStack(值栈)。根据我们知道了解的,OGNL由三个部分组成:表达式、Root、context,然而表达式是我们查询的时候使用的,由此我们可以知道,ValueStack由两部分组成。
ValueStack的两部分是:一部分是Root,放置的是一个栈。另外一部分context,是将ActionContext放入。
首先我们看到 ValueStack,这里面它使用的其实是它的实现类OgnlValueStack
public class OgnlValueStack implements Serializable, ValueStack, ClearableValueStack, MemberAccessValueStack { ....... protected CompoundRoot root; protected transient Map<String, Object> context; ......}
可以看到,ValueStack 准备的 root 的类型是CompounRoot。 看到CompounRoot
/** * A Stack that is implemented using a List. * * @author plightbo * @version $Revision$ */public class CompoundRoot extends CopyOnWriteArrayList<Object> { private static final long serialVersionUID = 8563229069192473995L; public CompoundRoot() { } public CompoundRoot(List<?> list) { super(list); } public CompoundRoot cutStack(int index) { return new CompoundRoot(subList(index, size())); } public Object peek() { return get(0); } /** * 出栈 */ public Object pop() { return remove(0); } /** * 入栈 */ public void push(Object o) { add(0, o); }}
CopyOnWriteArrayList相当于线程安全的 ArrayList。所以这里面栈其实是使用CopyOnWriteArrayList来实现的。入栈就是在集合的第0个位置中添加对象,出栈就是移除第0个位置的对象,这样便实现了栈的功能(先进先出)。这样我们查找我们需要的值的时候,就会从栈顶查找,找不到就会向下查找,找到就停止。
三、查看值栈中的内容
既然现在已经知道Struts2会给我们提供一个值栈,那么就来看看值栈中的内容吧。
3.1 StackDemoAction
package com.qwm.struts2_3.b_stack;import com.opensymphony.xwork2.ActionSupport;/** * @author: wiming * @date: 2017-09-20 15:15:28 星期三 * @decription: * 查看值栈中的值 */public class StackDemoAction extends ActionSupport{ @Override public String execute() throws Exception { System.out.println("--查看值栈--"); return SUCCESS; }}
3.2 struts.xml 配置文件
<?xml version="1.0" encoding="UTF-8" ?><!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.5//EN" "http://struts.apache.org/dtds/struts-2.5.dtd"><struts> <package name="stack" namespace="/" extends="struts-default"> <action name="stackdemoAction" class="com.qwm.struts2_3.b_stack.StackDemoAction"> <result name="success">message.jsp</result> </action> </package></struts>
3.3 message.jsp
<%-- Created by IntelliJ IDEA. User: qiwenming Date: 2017/9/20 Time: 15:19 To change this template use File | Settings | File Templates.--%>'<%--导入struts提供的标签库--%><%@ taglib prefix="s" uri="/struts-tags" %><%@ page contentType="text/html;charset=UTF-8" language="java" %><html><head> <title>值栈信息查看</title></head><body><!-- 调试标签 --><s:debug></s:debug></body></html>
3.4 Root部分
默认情况下,栈中放置当前访问的Action对象
3.4 Context部分
Context部分其实就是ActionContext
request
response
ServletContext
requestScope
sessionScope
applicationScope
params
attrs
…
阅读全文
0 0
- Struts2学习(八)【OGNL表达式与Struts框架结合之原理】
- SSH与SSM学习之Struts208——OGNL表达式与Struts框架结合之原理
- Struts2学习(九)【OGNL表达式与Struts框架结合参数接收】
- SSH与SSM学习之Struts209——OGNL表达式与Struts框架结合参数接收
- Struts2学习——(六)值栈与OGNL表达式[结合struts标签]
- Struts2框架学习之OGNL表达式
- Struts2框架学习之四:OGNL表达式
- Struts2学习之OGNL表达式原理(转载学习)
- 框架学习之struts2-03标签、OGNL表达式
- 【SSH】Struts2学习(三)OGNL、OGNL与Struts2结合
- Struts2深入学习----OGNL表达式原理
- Struts2深入学习----OGNL表达式原理
- Struts2深入学习----OGNL表达式原理
- Struts2深入学习:OGNL表达式原理
- Struts2深入学习:OGNL表达式原理
- Struts2深入学习----OGNL表达式原理
- Struts2深入学习----OGNL表达式原理
- Struts2深入学习----OGNL表达式原理
- Struts2学习(七)【OGNL基本语法】
- 使用eclipse用java调用scilab的问题
- SVN设置自动锁定(图)
- R5F100FE的UART
- Task Parallel.For、Parallel.ForEach、Parallel.Invoke
- Struts2学习(八)【OGNL表达式与Struts框架结合之原理】
- 基于基因组数据的癌症亚型发现聚类研究
- mybatis 中#和$的区别
- KF算法学习(二):例程验证
- Struts2学习(九)【OGNL表达式与Struts框架结合参数接收】
- 【爬虫学习6】爬虫自动获取并使用代理ip
- PullToRefresh使用详解(二)---重写BaseAdapter实现复杂XML下拉刷新
- Object.keys()
- TCP粘包/拆包--利用FixedLengthFrameDecoder解决TCP粘包问题