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”的视图。
strtus2中OGNL表达式语言及一些标签
最新推荐文章于 2024-08-24 21:56:58 发布