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>
分享到:
相关推荐
带括号的表达式 子表达式(Subexpressions)链 构造集合(Collection) 列表(Lists) 数组 映射表(Maps) 对集合的投影(Project) 在集合中查询 查找第一个匹配项 查找最后一个匹配项 调用构造方法 调用静态方法...
- **赋值和取值**:使用`setValue`和`getValue`方法来设置和获取属性值。 #### 六、强制对象到类型的转换 - **Boolean类型**:将对象转换为布尔类型。 - **Number类型**:将对象转换为数值类型。 - **Integer类型*...
### OGNL语言指南知识...OGNL作为一种强大的表达式语言,在Java开发领域有着广泛的应用,特别是在诸如Struts2这样的框架中扮演着重要角色。掌握OGNL不仅可以提高开发效率,还能让开发者更加灵活地处理复杂的对象关系。
3. **Ognl表达式** (`%{}`): OGNL是Object-Graph Navigation Language的缩写,是Struts2框架中的强大表达式语言。如`<s:property value="%{username}"/>`,它可以访问深层嵌套的对象属性。 4. **使用`#`符号**: 如`...
Struts 是一个开源的 MVC...综上所述,Struts 标签和 OGNL 提供了一种高效的方式来处理 JSP 页面中的数据展示和控制流。结合 jQuery 和 AJAX,可以构建出功能丰富的动态 Web 应用程序,实现实时的数据验证和用户交互。
- **用途**:主要用于将文本属性解析为OGNL表达式,适用于原本是OGNL表达式的场景。 - **注意事项**:对于已经是OGNL表达式的属性不起作用。 - **示例**: ```xml ``` 这里`%{username}`会被解析为OGNL表达式,...
- `Ognl.getValue("#num", ctx, root)` 从上下文对象ctx中获取键为"num"的值并打印,使用"#"前缀表明从Context中取值。 4. **编程题解析** - 重构NETCTOSS资费列表显示,实现分页功能,使用Struts2的标签和OGNL。...
如果请求参数与Action属性不匹配,也可以使用OGNL(Object-Graph Navigation Language)表达式直接从值栈中获取参数,如`#parameters.name[0]`。 3. **ActionMapping和ActionForm** 在早期的Struts1中,...
基本语法和 OGNL 实用类是 OGNL 语言的基础知识,包括取值计算、设值计算、常量、静态方法和属性等概念。List、Array 和 Map 是 OGNL 中的三种基本数据结构,用于存储和操作数据。集合操作是 OGNL 中的一种重要功能...
- `value`:指定OGNL表达式,如果未指定,则默认为“top”,即取值栈最顶端的对象。 - `default`:当按照`value`属性指定的OGNL表达式求值后返回空值时,可使用`default`属性指定默认输出的内容。 - `escape`:...
- **ActionContext和OgnlStackValue**:`ActionContext`和`OgnlStackValue`是Xwork中用于管理ValueStack和OGNL交互的重要概念。 ##### 实用Interceptor Xwork提供了多种内置的拦截器,这些拦截器可以帮助开发者...
- `$`: 在国际化资源文件和 Struts2 配置文件中引用 OGNL 表达式。 **与 EL 的区别**: - **用法**: OGNL 通常与 Struts2 标签一起使用,不能单独在 Struts 页面中使用;而 EL 可以直接在 JSP 页面中使用。 - **取值...
- **var**:变量名,在OGNL表达式中可以使用这个变量名来引用对象。 - **scope**:变量的作用域,可以是application、session、request、page或action,默认为action。 - **value**:赋给变量的值,可以是常量或OGNL...
在Struts2中,可以在JSP页面中直接使用OGNL表达式来访问模型对象中的属性。 #### 示例代码解析 ```jsp ${UserSession.fullName} ``` 这段代码将在JSP页面上显示`UserSession`对象的`fullName`属性的值。这是Struts2...
- 使用`#`前缀取值,表示访问内置对象,如`#session`、`#request`等,这在JSP页面中获取HttpSession或HttpServletRequest中的属性时非常有用。 5. **Struts2传递数据**: - **值栈(ValueStack)**:Struts2的...
4. **OGNL的使用**:在JSP文件中观察OGNL表达式的应用,如何从值栈取值并显示。 5. **拦截器的应用**:如果项目中包含拦截器,尝试理解它们的工作原理,以及如何自定义拦截器。 通过实践这个WebWork实例,初学者...
相比于JSP 2.0的EL(Expression Language),OGNL提供了更多的功能,如类型转换、方法调用、集合操作等,常用于Struts2框架中,实现视图层的数据绑定。 7. Struts2标签: Struts2提供了丰富的标签库,分为通用标签...
在MyEclipse中,开发者可以接触到多种技术,包括JDBC、WebWork、Struts、AOP、OGNL以及轻量级框架等。以下是这些知识点的详细说明: 1. **JDBC (Java Database Connectivity)**: JDBC 是Java API,允许Java程序与...
3. **OGNL(Object-Graph Navigation Language)表达式**:Struts2使用OGNL作为默认的表达式语言,它允许在Action和视图之间传递数据,如取值、赋值、方法调用等。OGNL的强大在于其灵活性,可以方便地处理复杂的数据...
如果要动态取值时,就可以用“[ ]”来做,而“.”无法做到动态取值。例如:${sessionScope.user[data]}中data是一个变量。 C、变量 EL存取变量数据的方法很简单,例如:${username}。它的意思是取出某一范围中名称...