- 浏览: 1524649 次
- 性别:
- 来自: 厦门
文章分类
- 全部博客 (516)
- Java (49)
- Java/Struts 2.0 (25)
- Java/Spring、Spring MVC (11)
- Java/Quartz (3)
- Java/Lucene (6)
- Java/Hibernate (19)
- Java/openJPA (7)
- Java/DWR (7)
- Java/Security、Spring Security/OAuth2 (6)
- Java/Threading (9)
- Java/XML (22)
- java/design pattern (4)
- Android (2)
- JavaScript (46)
- jquery (3)
- DB/MySQL (23)
- DB/Oracle (16)
- PHP (25)
- CSS (20)
- Linux (38)
- C/C++、DLL、Makefile、VC++ (31)
- 正则 (9)
- Eclipse (4)
- 安全、网络等概念 (25)
- 集群 (7)
- 网页 (5)
- 视频\音频 (1)
- HTML (6)
- 计算机数学/算法 (3)
- Virtualbox (1)
- LDAP (2)
- 数据挖掘 (6)
- 工具破解 (1)
- 其他 (13)
- Mail (1)
- 药材 (3)
- 游戏 (2)
- hadoop (13)
- 压力测试 (3)
- 设计模式 (3)
- java/Swing (2)
- 缓存/Memcache (0)
- 缓存/Redis (1)
- OSGI (2)
- OSGI/Gemini (0)
- 文档写作 (0)
- java/Servlet (3)
- MQ/RabbitMQ (2)
- MQ/RocketMQ (0)
- MQ/Kafka (1)
- maven (0)
- SYS/linux (1)
- cache/redis (1)
- DB/Mongodb (2)
- nginx (1)
- postman (1)
- 操作系统/ubuntu (1)
- golang (1)
- dubbo (1)
- 技术管理岗位 (0)
- mybatis-plus (0)
最新评论
-
pgx89112:
大神,请赐我一份这个示例的项目代码吧,万分感谢,1530259 ...
spring的rabbitmq配置 -
string2020:
不使用增强器 怎么弄?
OpenJPA的增强器 -
孟江波:
学习了,楼主,能否提供一份源代码啊,学习一下,十分感谢!!!4 ...
spring的rabbitmq配置 -
eachgray:
...
spring-data-redis配置事务 -
qljoeli:
学习了,楼主,能否提供一份源代码啊,学习一下,十分感谢!!!1 ...
spring的rabbitmq配置
转自:http://blog.sina.com.cn/s/blog_5c0522dd0100luqx.html
Ognl.setValue(String expr, Object obj, Object value) 与 Ognl.getValue(String expr, Object obj)执行规则:
上面两个函数都不支持以“#”开头的ognl表达式。
以Ognl.getValue(“a.b.myFunction()”, obj)为例,执行规则如下:
1. 如果obj实现map接口:obj.get("a")
2. 如果obj不实现map接口:obj.getA()/isA()
返回的对象又根据上面的规则来执行get("b")或getB()/isB(),接着返回的对象执行myFunction()函数。
对应的,Ognl.setValue(“a.b.myFunction().d”, obj, value)的执行规则开始时与上面一样,到最后一步时:
1. 如果当前对象实现map接口则执行 put("d",value)
2. 如果当前对象不实现map接口则执行 setD(value)
正规的代码一个类不应该既有getA()方法又有isA()方法,所以我就没测试若这两个方法都有会执行哪个了。
Ognl.getValue(String expr, Map map, Object obj)执行规则:
如果expr以“#”开头,执行Ognl.getValue(expr.substring(1), map),否则执行Ognl.getValue(expr, obj)。
关于异常:
1.如果在执行函数之前没有获得对象,譬如说obj.getA()返回的是null,null再执行getB()/isB()就会产生空指针异常。
2.如果得到的对象没有下一个要执行的函数,譬如说obj.getA()返回一个对象,但这个对象没有getB()/isB()函数,也产生异常。
Ognl把上面两种异常都进行了封装,转抛出它定义的Ognl异常。
——————————————————————————————————————————————————
获得当前ActionContext:
ActionContext ctx = ActionContext.getContext();
ActionContext里面包含了一个Map结构,称为context。
获得ValueStack:
ValueStack stack = ActionContext.getContext().getValueStack();
ValueStack里面包含了一个List结构,称为root。
获得Root:
CompoundRoot root = ActionContext.getContext().getValueStack().getRoot();
CompoundRoot的数据结构是一个List,作为一个栈来使用。
获得Context:
Map<String,Object> context = ActionContext.getContext().getContextMap();
Map<String,Object> context = ActionContext.getContext().getValueStack().getContext();
——————————————————————————————————————————————————
根据ognl取出对象:
Object obj = stack.findValue(String expr);
expr是指定对象的ongl表达式。找不到返回null,不抛异常。
根据ognl设置对象:
stack.setValue(String expr, Object value);
expr是被设置对象的ongl表达式。找不到等于什么都没干,不抛异常。
value是设置为该对象。
Root操作:
Object obj = stack.pop(); 取出Root栈顶对象并把它从Root移除。
Object obj = stack.peek(); 取出Root栈顶对象不把它从Root移除。
stack.push(Object o); 把对象o放入Root栈顶。
Context操作:
actionctx.put(String key, Object value); 把一个对象放入Context里。
key是放入Context时对象的key,value是放入Context的对象。
——————————————————————————————————————————————————
ValueStack的findValue(String expr)与setValue(String expr, Object value)的查找顺序:
如果ognl以#开始,只从context查找,否则从root的栈顶对象开始往下查找,找到后不会继续往下查找,如果root找遍后也没有,再到context里查找。
函数的执行规则与上面的Ognl.setValue/Ognl.getValue一样,根据当前对象的类型来判断执行get("a")/put("a",value)还是getA()/SetA(value)。
估计ValueStack的findValue()与setValue()函数就是上面Ognl的setValue,getValue等相关函数的封装。
——————————————————————————————————————————————————
struts2标签doTag()猜想
根据struts2标签的功能和上面说明,很容易猜想到struts2标签doTag()里面的结构,下面列出几个(只是我的猜想,没确认过源代码):
<s:property /> 输出root栈顶对象
{
ValueStack stack = ActionContext.getContext().getValueStack();
Object obj = stack.peek();
通过pageContext获得response的输出流对象out;
out.print(obj);
}
<s:property value="name" />
{
ValueStack stack = ActionContext.getContext().getValueStack();
Object obj = stack.findValue("name");
通过pageContext获得response的输出流对象out;
out.print(obj);
}
<s:property value="#msg.time" />
{
ValueStack stack = ActionContext.getContext().getValueStack();
Object obj = stack.findValue("#msg.time");
通过pageContext获得response的输出流对象out;
out.print(obj);
}
<s:set name="firstEmp" value="empList[0]" /> 往context放入对象:
{
ActionContext ctx = ActionContext.getContext();
ValueStack stack = ActionContext.getContext().getValueStack();
Object obj = stack.findValue("empList[0]");
ctx.put("firstEmp", obj);
}
<s:push value="empList[0]"> 往root栈顶放入对象
......
</s:push> push标签结束就把对象从root栈顶取出恢复原状
{
ValueStack stack = ActionContext.getContext().getValueStack();
Object obj = stack.findValue("empList[0]");
stack.push(obj);
......
stack.pop();
}
发表评论
-
Struts2 (Json) + jQuery 组合的简单用法
2011-03-01 23:02 10311、将struts2的json插件加入web工程的lib,js ... -
Struts2中$,#,%的区别
2011-03-01 22:57 1378转自:http://hi.baidu.com/di ... -
<s:generator>
2011-02-27 21:54 1420<s:generator val="%{'aa ... -
<s:merge>
2011-02-27 21:45 888<s:set var="americanCar ... -
<s:append>
2011-02-27 21:44 1246<s:set var="list1" ... -
<s:iterator>
2011-02-27 21:01 1389属性名称 必填项 默认值 ... -
<s:bean>
2011-02-27 18:32 950public class DegreeConverter { ... -
<s:param>
2011-02-27 18:21 3601param标签用来把一个参数传递给包含着它的那个标签。 不管 ... -
updownselect
2011-02-27 16:24 1398<s:updownselect name="c ... -
combobox
2011-02-27 16:08 958<s:combobox name="combo ... -
checkboxlist
2011-02-27 12:15 891ddd public class LoginAction ... -
select optgroup
2011-02-27 11:58 717代码片段: public class LoginAction ... -
select标签
2011-02-23 21:17 1019import com.opensymphony.xwork2. ... -
radio标签
2011-02-23 21:13 1009import java.util.SortedMap; ... -
list、listkey、listValue属性
2011-02-22 21:07 7251list、listKey、listValue属性对 ... -
struts2.0的ognl表达式研究
2011-01-09 21:02 1036OGNL —— 完美的催化剂 为了解决数据从V ... -
关于Struts2.0 标签中采用%{} 的处理原理
2011-01-09 20:57 1591项目中采用struts2.0时,常常使用计算表单式的处理源码 ... -
struts2 tags
2010-01-08 13:22 12261.<s:property> propert ... -
Struts2和Freemarker整合应用批量静态页面的生成
2009-11-07 23:19 3855利用Struts2生成静态页面其实很灵活,很强大,尤其是利用S ... -
导致"ERROR - Could not find action or result"的可能原因。
2009-10-08 10:51 2161在某些情况Struts 2.x的一些错误消息提示让人看得琢磨不 ...
相关推荐
而在控制器层,Action类的属性可以通过ActionContext的ValueStack与HTTP请求参数进行绑定,或者在Action的执行过程中,使用OGNL进行数据的读写和计算。 总的来说,ActionContext是Struts2框架处理请求上下文的核心...
ValueStack是Struts2框架中的核心组件之一,它是ActionContext和ActionInvocation之间的一个数据传递层,负责在Action与视图之间传递和管理数据。ValueStack的作用在于简化模型-视图-控制器(MVC)架构中的数据交互...
ActionContext提供了在Action、Servlet、ValueStack以及其他的Struts2组件之间传递数据的桥梁。在这个“JavaEE ActionContext存取数据示例”中,我们将深入探讨ActionContext的使用方法及其与OGNL(Object-Graph ...
ValueStack是Struts2框架的核心组件之一,它是一个存储ActionContext中的值的对象栈。ValueStack的主要功能是处理视图和模型之间的数据传递。在Struts2中,Action类的属性可以直接映射到JSP页面上的标签,这是因为...
2. **ActionContext**:与ValueStack密切相关的是ActionContext,它包含了当前请求的上下文信息,包括ValueStack、Session、Request和Application等数据。 3. **动作方法与结果转发**:Action类中定义的方法通常对应...
Struts2提供了多种机制来实现这一目标,其中最为常用的是通过`ActionContext`与`ValueStack`来完成值的传递。 #### 1. `ValueStack`与`ActionContext`的基本作用 - **`ValueStack`**:每当一个新的请求被处理时,...
在Struts2中,OGNL与ActionContext和ValueStack紧密集成。ActionContext是一个上下文对象,它包含了当前请求的所有环境信息,包括请求参数、session、应用上下文等。在OGNL表达式中,ActionContext作为Context,提供...
关于ValueStack的描述: 1、 ValueStack其实就是一个放置Java对象的堆栈而已,唯一特别的是可以使用EL来获得值堆栈中对象属性的数据,并可以为值堆栈的对象属性赋值。 2、 EL,全称Express Language,即表达式...
值栈(ValueStack)与ActionContext之间的关系和区别是: - 相同点:两者都在一次HTTP请求的生命周期内存在,即它们的生命周期与一次请求的生命周期相同。 - 不同点:值栈采用栈的结构,用于存储Action实例和其他...
深入讲解Struts中的ognl和valueStack
Struts 2 框架作为Java Web开发中的明星框架,其数据传递模型的设计尤为关键,它不仅优化了传统的Servlet架构,还引入了一系列创新机制,如ValueStack和ActionContext,使得数据的处理更加灵活和高效。 **1.1 ...
`#`前缀可以用来获取`ActionContext`,这包含了四个重要的域:parameters、request、session和application。`#parameters`提供了当前HTTP请求的所有参数,`#request`、`#session`和`#application`则分别对应...
例如,研究`ActionSupport`类如何与ActionContext交互,或者查看`ValueStack`如何管理栈中的对象。此外,开发工具如IDE的调试功能,可以帮助我们跟踪代码执行流程,直观地看到数据在不同范围间的传递过程。 总结来...
除了`ActionContext`之外,`ValueStack`也是一个重要的工具类,它与`ActionContext`一起创建,并同样存储在`ContextMap`中。通过`ActionContext.getValueStack()`方法可以获取`ValueStack`对象。 1. **ValueStack的...
1. **通过ActionContext**: `ValueStack valueStack = ActionContext.getContext().getValueStack();` 2. **通过ServletActionContext**: `ValueStack valueStack = ServletActionContext.getValueStack...
总结来说,Struts2的传值方式包括Action属性、ValueStack和Ognl以及ActionContext与请求/Session域的使用。选择合适的方式取决于业务需求和代码的可维护性。了解并熟练掌握这些方法,对于提高Struts2应用的开发效率...
- 第一种:通过ActionContext对象获取,`ValueStack valueStack1 = ActionContext.getContext().getValueStack();` - 第二种:通过ServletActionContext对象结合HttpServletRequest获取,`ValueStack valueStack2 ...
这一过程主要由两个关键部分完成:ActionContext和ValueStack。 ActionContext是Struts2框架的核心上下文对象,它存储了有关当前请求的所有信息,包括请求参数、session、application等数据。在每次请求处理时,...
ActionContext与ValueStack** ActionContext是存储请求上下文信息的容器,包括Action、Session、Request、Response等。ValueStack是ActionContext中的一个核心概念,它是一个对象栈,用于存放Action实例和其他需要...