OGNL表达式语言:
相对EL表达式,它提供了平时我们需要的一些功能,如:
? 支持对象的方法调用 ,如 xxx.sayHello();
? 支持类静态方法调用和值的访问,表达式的格式为@[类全名]@[方法名|值名],例如:@java.lang.String@format(‘foo %s’,’bar’)
? 操作集合对象。
Ognl有一个上下文(Context)的概念,其实就是一个Map结构,它实现了java.utils.Map接口,Struts2中的上下文的实现为ActionContext。
结构图:
当Struts2接受一个请求时,会迅速创建ActionContext,ValueStack,action。然后把action放进ValueStack,所以action的实例变量可以被OGNL访问。
访问上下文中的对象需要使用#符号标注命名空间,如#application、#session
另外OGNL会设定一个根对象(root对象),在Struts2中根对象是ValueStack。 如果访问根对象中的对象的属性,则可以省略#命名空间。
在Struts2中根对象ValueStack的实现类是OgnlValueStack,该对象理是我们想像的只存放单个值,而是存放一组对象。OgnlValueStack类里个List类型的root变量,用来存放一组对象。
在root变量中处于第一位的对象叫栈顶对象。通常在OGNL表达式中直接通过名字即可访问root变量中的属性。搜索顺序从栈顶开始,依次往下寻找。
Struts2中,OGNL表达式需要配合Struts标签才可以使用。如:<s:property value=”name”/>
访问其它Context中的对象。
? application对象:用于访问ServletContext,如:#application.userName或者#application[‘userName],相当于调用ServletContext.getAttribute(“userName”);
? session对象:用来访问HttpSession,如:#session.userName或者#session[‘userName’]相当于调用session.getAttribute(“username”)。
? request对象:用来访问HttpServletRequest属性(attribute)的Map,如:#request.userName或者# request[‘userName’]相当于调用request.getAttribute(“username”)。
? parameters对象:用来访问Http请求参数,如:#parameters.userName或者#parameters [‘userName’]相当于调用request.getParameter (“username”)。
? attr对象:用于按page->request->session->application顺序访问其属性。
采用OGNL表达式创建List/Map集合对象
生成List对象
<s:set name=”list” value={‘zhang san’,’li si’,’wang wu’}/>
<s:iterator values=”#list”>
<s:property/><br/>
</s:iterator>
[注:iterator标签在抚今迭代集合时,会把当前迭代对象的对象放在值栈的栈顶]
Scope:指定变量范围(application,session,request,page,action)。默认放置在OGNL Context中。
Value:变量的值,默认值:ValueStack栈顶的值。
生成Map对象:
<s:set name=”foobar” value=”#{‘foo1’:’bar1’,’foo2’:’bar2’}”/>
<s:iterator value=”#foobar”>
<s:property value=”key”/>=<s:property value=”value”/>
</s:iterator>
property标签:
property标签用于输出指定值:
<s:set name=”name” value=”kk”/>
<s:property name=”#name”/>
default:可选属性,如果要输出的属性的值为null,则显示该指定的值。
escape:可选属性,指定是否格式化HTML代码。
value:可选属性,需要输出的属性值,默认输出ValueStack栈顶的值。
id:可选属性,标识。
采用OGNL表达式判断对象是否存在于集合中
in表达式:
<s:if test=”’foo’ in {‘foo’,’bar’}”>
存在
</s:if>
<s:else>
不存在
</s:else>
not in 表达式:
<s:if test=”’foo’ not in {‘foo’,’bar’}”>
不存在
</s:if>
<s:else>
存在
</s:else>
OGNL表达式的投影功能:
?:获得所有符合逻辑的元素。
^ :获得符合逻辑的第一个元素。
$ :获得符合逻辑的最后一个元素。
如:
<s:iterator value=”books.{?#this.price>35}”>
<s:property value=”title”/>
<s:property value=”price”/>
</s:iterator>
其中 .{} 用于取出books的子集。
Iterator标签:
<s:set name=”list” value={‘zhang san’,’li si’,’wang wu’}/>
<s:iterator values=”#list” status=”st”>
<font color=<s:if test=”#st.odd”>red</s:if><s:else>blue</s:else>>
<s:property/><br/>
</s:iterator>
属性:id,name,value,status.
Suatus:中的方法:
int getcount(),返回当前迭代的几个元素。
int getIndex(),返回当前迭代元素的索引。
boolean isEven(),返回当前迭代元素是否是偶数。
boolean isOdd(),返回当前迭代元素是否是奇数。
boolean isFirst(),返回当前迭代元素是否是第一个元素。
boolean isLast(),返回当前迭代元素是否是第最后一个元素。
if/elseif/else标签:
<s:set name=”age” value=”21”/>
<s:if test=”#age==23”>
23
</s:if>
<s:elseif test=”#age==21”>
21
</s:else>
<s:else>
都不是
</s:else>
url标签:
<s:url action=”helloworld” namespace=”test” >
<s:param name=”persionId” value=”18”/>
</s:url>
生成的路径如下:
/test/ helloworld.action?personid=18
[注:当value值作为客串处理时,使用“%”来计算OGNL表达式的值]
<s:set name=”myurl” value=”http://www.apache.org” />
<s:url value=”#myurl”/>
<s:url value=”%{#myurl}”/>
输出结果:
#myurl
http://www.apache.org
表单标签checkboxlist:
List方式:
<s:checkboxlist name=”list” list=”{‘java’,’.Net’,’Php’}” value=”{‘java’ ,’.Net’}”/>
生成的代码:
<input type=”checkbox” name=”list” value=”Java” id=”list-1” checked=”checked”/>
<label for=”list-1”>Java</label>
<input type=”checkbox” name=”list” value=”.Net” id=”list-2” checked=”checked”/>
<label for=”list-1”>.Net</label>
<input type=”checkbox” name=”list” value=”Php” id=”list-3” />
<label for=”list-1”>Php</label>
Map方式:
<s:checkboxlist name=”map” list=”{‘1’:‘java’, ‘2’:’.Net’, ‘3’:’Php’}” listKey=”key” listValue=”value” value=”{1,2}”/>
其中listKey生成value属性,listValue生成label属性
<input type=”checkbox” name=”map” value=”1” checked=”checked”/>
<label >Java</label>
token标签防止表单重复提交
1. 在表单中加入<s:token/>标签。
<s:form action=”helloworld” method=”post”/>
<s:textfield name=”person.name”/>
<s:token/>
</s:form>
2. Struts2中的配置文件
<action name=”helloworld” class=”…” method=”execute”>
<interceptor-ref name=”defaultStacke/>
<interceptor-ref name=”token”/>
<result name=”invalid.token”>/WEB-INF/page/message.jsp</result>
<result>WEB-INF/page/result.jsp>
</action>
当“token”拦截器在会话的token与请求的token不一致时,将直接返回名为“invalid.token”的视图。
分享到:
相关推荐
struts2 中 OGNL表达式的使用struts2 中 OGNL表达式的使用
以下是一些关于Struts2中OGNL表达式的关键知识点: 1. **基础语法**:OGNL表达式的格式通常为`object.property`或`object[index]`,用于访问对象的属性或数组/集合的元素。例如,`user.name`将获取名为`user`的对象...
本篇文章将详细探讨Struts2中的OGNL表达式语言以及标签库。 **OGNL(对象图导航语言)** OGNL是一种强大的表达式语言,它允许开发者通过简洁的语法来访问和操作对象的属性。在Struts2框架中,OGNL扮演着至关重要的...
本文将深入探讨Struts2中的OGNL表达式,ActionContext以及valuesStack。 首先,OGNL表达式是Struts2中不可或缺的一部分,它允许开发者以一种声明式的方式访问和修改对象的属性。比如,`myBean.getMyProperty()`这样...
这个“struts2-OGNL表达式测试”可能是一个测试项目或代码示例,旨在演示如何在Struts2应用中使用OGNL表达式。 OGNL是Struts2的核心组件之一,它允许开发者通过简单的字符串表达式来获取或设置对象的属性。这使得视...
3. 结果类型配置:在Struts2的配置文件中,结果类型可以通过OGNL表达式动态决定,例如,`resultType="#attr.resultType"`。 4. JSP标签库:Struts2提供了丰富的JSP标签库,这些标签内部也大量使用了OGNL来获取和显示...
- 在Struts2的Action类中,可以使用OGNL表达式来动态地处理请求参数,如`String name = (String)params.get("user.name");` - 在JSP页面上,使用OGNL标签显示和处理数据,如`管理员界面</s:if>`。 通过理解并熟练...
本文将深入探讨如何在Struts2中有效地使用OGNL表达式。 首先,OGNL是Struts2的核心组成部分,它允许开发者在Action类和JSP页面之间灵活地传递和访问数据。在Action类中,你可以设置属性,然后在JSP页面上通过OGNL...
在Struts2框架中,OGNL表达式被广泛应用于视图层,比如在JSP页面中用来获取数据。OGNL表达式的语法简洁明了,例如: - **直接调用方法**:`xxx.sayHello()`。 - **访问静态方法和常量**:`@java.lang.String@format...
- Struts2提供了一些内置的状态变量,这些变量可以直接在OGNL表达式中使用。 - 示例代码: ```xml ()"/> ``` 6. **Lambda表达式** - Lambda表达式提供了一种简洁的方式来定义简单的函数或方法。 - 示例代码...
在提供的压缩包文件"Struts2_1900_OGNL"中,可能包含了一些关于Struts2 OGNL表达式使用和安全性的示例代码、教程文档或是漏洞分析。通过研究这些内容,你可以更深入地理解和掌握Struts2框架中OGNL表达式的运用,以及...
Struts2 OGNL表达式是Java Web开发中一个重要的概念,它是一种强大的对象图形导航语言(Object-Graph Navigation Language)。在Struts2框架中,OGNL被广泛用于视图层,作为数据绑定的主要手段,使得开发者能够方便...
Struts2是一个流行的Java Web...通过深入学习OGNL表达式原理,开发者能够更好地利用Struts2框架,提高Web应用的开发效率和可维护性。对于那些希望在Struts2开发中更进一步的人来说,熟悉和掌握OGNL是必不可少的技能。
Struts 2默认的表达式语言是OGNL,原因是它相对其它表达式语言具有下面几大优势: 1、 支持对象方法调用,如xxx.doSomeSpecial(); 2、支持类静态的方法调用和值访问,表达式的格式为@[类全名(包括包路径)]@...
在Struts2中,OGNL表达式的使用大大提升了代码的可读性和维护性。 首先,`#`字符在OGNL中扮演着关键角色。它主要用于访问OGNL上下文和Action上下文。`#`前缀可以用来获取`ActionContext`,这包含了四个重要的域:...
在Struts2中,OGNL表达式通常与Struts标签结合使用,如`s:property`标签,用于显示对象的属性值。例如,`<s:property value="name"/>`将显示栈顶对象的"name"属性值。栈顶对象是指在ValueStack(值栈)中位于最顶层...
OGNL表达式通常结合Struts2的标签一起使用,比如使用 `<s:property value="expression"/>` 来展示数据。在使用过程中,需要注意#、%和$这三个符号的正确使用: - **#**:通常用于表示OGNL表达式,在Struts2中作为...
Struts2的值栈(Value Stack)是一个重要的概念,它用于存储Action中的数据,并且在JSP页面中通过OGNL表达式访问。值栈采用栈的形式组织数据,因此可以按照先进后出的原则对数据进行存取。在ActionContext中可以获取...
### Struts2的类型转换与OGNL表达式语言 #### 一、Struts2的类型...综上所述,Struts2框架中的类型转换和OGNL表达式语言都是极为重要的特性。正确理解和运用这些特性,可以帮助开发者构建更加健壮和灵活的应用程序。
struts2 OGNL表达式使用 OGNL(Object-Graph Navigation Language)是对象图导航语言,允许开发者在Struts2应用程序中访问和操作对象及其属性。下面是OGNL表达式的使用方法: 访问基本属性 1. 访问值栈中action的...