本文基于struts2.1.8.1,xwork2.1.6
1.EL
EL(Expression Language)源于jsp页面标签jstl,后来被jsp2.0直接支持,因此可以在jsp页面中直接使用EL表达式。其使用语法为${expr},如${username},表达式expr中变量的获取,默认使用PageContext.findAttribute(String)方法,也就是从pageContext隐藏对象中查找,pageContext隐藏对象包含以下隐藏对象:request,response,session,servletContext.查找范围顺序是page, request,session, and application,找不到则返回null。指定对象查找则使用${implictObject.foo}语法,其中implictObject代表任意隐藏对象,除pageContext之外,还包含:param,paramValues,header,headerValues,cookie,initParam以及pageScope,requestScope,sessionScope,applicationScope等。
注意:自定义变量如果和隐藏对象同名,${implicitObject}将返回隐藏对象,而不是自定义对象的值。
2.OGNL in Struts2
struts2使用ActionContext作为OGNL的上下文,也就是ActionContext.context,其默认的root上下文是一个OGNL的值栈(OgnlValueStack),用于存放action的实例,其访问不需要标记,同时存放了其它的对象,如request,parameters,session,application,attr等,访问需要#标记并指明对象名称,如#session.username.由于ActionContext存放到ThreadLocal中,所以是线程安全的。在同一个请求经过不同的action转发(forward)处理的过程中,这些action实例都会压进root这个值栈中,最后的在最上面,查找变量值也是从上面开始顺序往下。
ActionContext是由org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter进行初始化的,在doFilter中调用prepare.createActionContext(request, response);追踪下去,核心代码在org.apache.struts2.dispatcher.ng.PrepareOperations中:
public ActionContext createActionContext(HttpServletRequest request, HttpServletResponse response) {
ActionContext ctx;
Integer counter = 1;
Integer oldCounter = (Integer) request.getAttribute(CLEANUP_RECURSION_COUNTER);
if (oldCounter != null) {
counter = oldCounter + 1;
}
ActionContext oldContext = ActionContext.getContext();
if (oldContext != null) {
// detected existing context, so we are probably in a forward
ctx = new ActionContext(new HashMap<String, Object>(oldContext.getContextMap()));
} else {
ValueStack stack = dispatcher.getContainer().getInstance(ValueStackFactory.class).createValueStack();
stack.getContext().putAll(dispatcher.createContextMap(request, response, null, servletContext));
ctx = new ActionContext(stack.getContext());
}
request.setAttribute(CLEANUP_RECURSION_COUNTER, counter);
ActionContext.setContext(ctx);
return ctx;
}
3.JSP中的使用
JSP2.0可以直接使用EL表达式,方便变量的获取。使用struts2的标签,可以取到ActionContext中的对象,如action中的成员变量,非root中的变量使用标记方式。
另外,struts2标签中,非字符类型(如boolean,int型)的属性取值,需要使用%{expr}的方式。在JSP中也可以使用EL表达式获取Action中的成员属性,原因是struts2对request进行了封装(org.apache.struts2.dispatcher.StrutsRequestWrapper),重写了request.getAttribute()方法,查找范围扩大到了ActionContext的root中,核心代码如下:
public Object getAttribute(String s) {
if (s != null && s.startsWith("javax.servlet")) {
// don't bother with the standard javax.servlet attributes, we can short-circuit this
// see WW-953 and the forums post linked in that issue for more info
return super.getAttribute(s);
}
ActionContext ctx = ActionContext.getContext();
Object attribute = super.getAttribute(s);
if (ctx != null) {
if (attribute == null) {
boolean alreadyIn = false;
Boolean b = (Boolean) ctx.get("__requestWrapper.getAttribute");
if (b != null) {
alreadyIn = b.booleanValue();
}
// note: we don't let # come through or else a request for
// #attr.foo or #request.foo could cause an endless loop
if (!alreadyIn && s.indexOf("#") == -1) {
try {
// If not found, then try the ValueStack
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中,OGNL还可以与ActionContext结合,使得我们能够访问Servlet上下文中的参数、session、request等信息。例如,`#parameters['username']`可以获取请求参数中的用户名,`#session['user']`可以访问session...
在Struts2中,EL常用于简单的视图层展示,而OGNL则在Action和拦截器等更深层的逻辑处理中使用。根据实际项目需求和性能考虑,合理选择使用这两种语言。 6. **总结** OGNL和EL都是为了简化数据绑定和表达式处理,...
### Struts2中OGNL的概念及原理说明 #### 一、OGNL表达式的基本用法与特点 **OGNL**,即**Object Graphic Navigation Language**(对象图导航语言),是Struts2框架中用于处理对象及其属性的强大工具之一。通过...
在Struts2中,OGNL表达式通常与Struts标签结合使用,如`s:property`标签,用于显示对象的属性值。例如,`<s:property value="name"/>`将显示栈顶对象的"name"属性值。栈顶对象是指在ValueStack(值栈)中位于最顶层...
在Struts2中,OGNL被用于处理各种对象,包括值栈(Value Stack)、请求、会话、应用范围的属性等。它能够对这些对象进行查询、操作和修改。OGNL表达式的格式通常包括对对象、属性和方法的引用。例如,可以使用OGNL...
在Struts2中,OGNL(Object-Graph Navigation Language)扮演着核心角色,它是一种强大的表达式语言,用于在Action类和JSP页面之间交换数据。下面我们将深入探讨OGNL的基本概念、特性以及在Struts2中的应用。 1. ...
### Struts2中的OGNL详解 #### 一、OGNL简介 OGNL(Object-Graph Navigation Language)是一种强大的表达式语言,它属于一种Expression Language(EL),主要用于在Java环境中访问对象属性。OGNL的设计思想非常独特...
在Struts2中,OGNL的核心组件之一是`ValueStack`,它充当了OGNL表达式的数据源。`ValueStack`是一个存储数据的栈结构,包含了所有的模型对象以及请求、会话和应用范围的数据。开发者可以通过EL表达式直接访问`...
在 Struts2 中,OGNL 需要与 ValueStack 进行交互,以方便在 JSP 页面中直接通过 EL 方式访问 ValueStack 中的对象。ValueStack 是一个保存所有请求数据的对象栈,它包含了一个或多个根对象。 例如: - `${foo}` ...
- **$**:在JSP页面中表示EL表达式的开头,但在Struts2中通常不直接使用,而是通过#符号配合使用。 #### 五、示例代码详解 为了更好地理解OGNL表达式的使用,我们来看一个具体的示例。假设我们在开发一个简单的Web...
Struts2是一个强大的MVC框架,它基于Model-View-...总的来说,掌握Struts2的核心知识点,如MVC模式、初始化过程、执行流程、标签使用、拦截器机制以及国际化等,将有助于理解其工作原理,提高在实际开发中的应用水平。
Struts2中的Action并不直接依赖Servlet API。相反,Struts2通过一系列的拦截器和ActionContext来封装这些细节,这意味着Action可以不知道自己运行在一个Web环境中,从而提高了代码的可移植性和可测试性。 #### 四、...
在Struts2中,OGNL主要用作默认的表示层语言,它使得在Action、值栈和视图之间的数据交换变得简单。以下是一些OGNL的功能: - **表达式解析**:如`user.name`,可以方便地访问对象的属性。 - **方法调用**:允许...
1. **Action类**:Action类是业务逻辑处理的核心,它是Struts2中的控制器。开发者需要创建一个继承自`com.opensymphony.xwork2.ActionSupport`或其子类的Java类,并在这个类中定义执行业务逻辑的方法。方法名通常与...
在Struts2中,OGNL作为默认的表达式语言,因为它提供了许多其他语言不具备的功能,例如对对象方法的直接调用、静态方法和属性的访问、赋值操作以及对集合的便捷操作。 1. **对象方法调用**:OGNL允许直接通过表达式...
2. **ognl.jar**:Object-Graph Navigation Language(OGNL)是Struts 2中用于表达式语言(EL)的库,它用于在视图层与模型层之间进行数据绑定和表达式计算。OGNL允许在JSP页面中直接访问Action中的属性,实现数据的...
Ognl有一个上下文(Context)的概念,其实就是一个Map结构,它实现了java.utils.Map接口,Struts2中的上下文的实现为ActionContext。 结构图: 当Struts2接受一个请求时,会迅速创建ActionContext,ValueStack,...