package org.apache.struts2.dispatcher;
import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.util.ValueStack;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletRequestWrapper;
public class StrutsRequestWrapper extends HttpServletRequestWrapper
{
public StrutsRequestWrapper(HttpServletRequest req)
{
super(req);
}
public Object getAttribute(String s)
{
if ((s != null) && (s.startsWith("javax.servlet")))
{
return super.getAttribute(s);
}
ActionContext ctx = ActionContext.getContext();
Object attribute = super.getAttribute(s);
if ((ctx != null) &&
(attribute == null)) {
boolean alreadyIn = false;
Boolean b = (Boolean)ctx.get("__requestWrapper.getAttribute");
if (b != null) {
alreadyIn = b.booleanValue();
}
if ((!alreadyIn) && (s.indexOf("#") == -1)) {
try
{
ctx.put("__requestWrapper.getAttribute", Boolean.TRUE);
ValueStack stack = ctx.getValueStack();
if (stack != null)
attribute = stack.findValue(s);
}
finally {
ctx.put("__requestWrapper.getAttribute", Boolean.FALSE);
}
}
}
return attribute;
}
}
这是struts2中StrutsRequestWrapper的源码
从 ((!alreadyIn) && (s.indexOf("#") == -1)
可以看出 如果ognl表达式中没有加"#" 如果在 parameter,request,session,application,attr 中没有找到对应的“属性”则会继续到ValueStack(root)中找。相反如果加了"#"则不会在ValueStack寻找。
比如:${#requestScope.name} 如果在request中没找到name则停止寻找,直接返回。
${requestScope.name} 如果在request中没找到name则会继续在ValueStatck中继续寻找。
补充:
OGNL是一个对象,属性的查询语言。在OGNL中有一个类型是Map的Context(称为上下文),在这个上下文中有一个跟元素(root),对跟元素的属性的访问可以直接使用属性名字,但是对于其他非跟元素的访问必须加上特殊符号#。
在Struts2中 上下文为ActionContext,根元素位Value Stack(值堆栈,值堆栈代表了一族对象而不是一个对象,其中Action类的实
例也属于值堆栈的一个)。ActionContext中的内容如下图:
|
|--application
|
|--session
context map---|
|--value stack(root)
|
|--request
|
|--parameters
|
|--attr (searches page, request, session, then application scopes)
|
因为Action实例被放在Value Stack中,而Value Stack又是根元素(root)中的一个,所以对Action中的属性的访问可以不使用标记#,而对其他的访问都必须使用#标记。
在JSP2.1中#被用作了JSP EL(表达式语言)的特殊记好,所以对OGNL的使用可能导致问题,
一个简单的方法是禁用JSP2.1的EL特性,这需要修改web.xml文 件:
<jsp-config>
<jsp-property-group>
<url-pattern>*.jsp</url-pattern>
<el-ignored>true</el-ignored>
</jsp-property-group>
</jsp-config>
分享到:
相关推荐
OGNL中的#、%和$符号用法说明
NULL 博文链接:https://hezhou-0521.iteye.com/blog/777463
OGNL表达式中的#、%和$.txt12312313213212312332212132
是关于OGNL语言的中文资料,要的请下载
带括号的表达式 子表达式(Subexpressions)链 构造集合(Collection) 列表(Lists) 数组 映射表(Maps) 对集合的投影(Project) 在集合中查询 查找第一个匹配项 查找最后一个匹配项 调用构造方法 调用静态方法...
OGNL百度百科OGNL百度百科OGNL百度百科OGNL百度百科OGNL百度百科OGNL百度百科
ognl表达式 ognl表达式 ognl表达式 ognl表达式
OGNL中文参考,很有参考价值,对学习struts ognl帮助比较大
本案例提供ognl使用详解,测试通过,只需解压放入自己WEB项目中,执行struts_ognl包内java文件即可(未提供jia包,若需要可以联系留言发至邮箱),若测试不好可以联系本人提供指导. Struts 2默认的表达式语言是OGNL...
开发工具 ognl-3.1.12开发工具 ognl-3.1.12开发工具 ognl-3.1.12开发工具 ognl-3.1.12开发工具 ognl-3.1.12开发工具 ognl-3.1.12开发工具 ognl-3.1.12开发工具 ognl-3.1.12开发工具 ognl-3.1.12开发工具 ognl-3.1.12...
基于WebWork核心的MVC开发与实践(ognl这一章)
camel-ognl-1.6.4.jar, camel-ognl-2.8.1.jar, com.springsource.org.ognl-2.6.9.jar, com.springsource.org.ognl-sources-2.6.9.jar, ognl-2.5.1.jar, ognl-2.6.11.jar, ognl-2.6.3.jar, ognl-2.6.5.jar, ognl-...
赠送jar包:ognl-3.2.21.jar; 赠送原API文档:ognl-3.2.21-javadoc.jar; 赠送源代码:ognl-3.2.21-sources.jar; ...人性化翻译,文档中的代码和结构保持不变,注释和说明精准翻译,请放心使用。
本资源适合刚接触Struts和Ognl的小伙伴交流学习,欢迎吐槽。
ognl源码 ognl源码 ognl源码 ognl源码 ognl源码
学习OGNL在Struts2中工作原理学习OGNL在Struts2中工作原理学习OGNL在Struts2中工作原理学习OGNL在Struts2中工作原理
ognl.jar ognl.jar
struts2 中 OGNL表达式的使用struts2 中 OGNL表达式的使用
OGNL 最初是为了能够使用对象的属性名来建立 UI 组件 (component) 和 控制器 (controllers) 之间的联系,简单来说就是:视图 与 控制器 之间数据的联系。后来为了应付更加复杂的数据关系,Drew Davidson 发明了一个...
struts2 OGNL的主要用法 基本覆盖全部