您的位置:首页 > 编程语言 > Java开发

struts2 学习笔记四---ongl表达式

2012-09-09 10:43 246 查看
OGNL表达式

<s:debug>标签可以在jsp页面中查看CompoundRoot和OGNL Context map中的信息。

如果不经过struts2的过滤器拦截就直接访问jsp页面,那么其中使用的<s:debug>,<s:text>,
<s:property value="%{getText()}">等struts2标签都会报告TagUtil.getStack方

法抛出的异常。

1 访问值栈中的action的普通属性: <s:property value="属性名"/>

2 访问值栈中对象的普通属性(get set方法):

<s:property value="对像名.age"/> | <s:property value="user['age']"/> | <s:property value="user[\"age\"]"/>

3

CompoundRoot(根对像) ActionContext.getContext().getValueStack();

ValueStack 查找顺序是从栈顶开始

ValueStack被存储在了request作用域中,可以通过request.getAttribute(…)的方式获得。

push和pop方法对堆栈进行压栈和弹栈。

set方法用于在栈顶的Map对象中设置一个条目,如果栈顶不是一个Map对象,则创建一个Map对象并将其压入栈顶。实验结果:set方法不能设置栈顶的普通JavaBean对象的属性。

OGNL Context内部初始填充的几个重要的key

parameters?一个map对象 取出的值是一个数组,默认为第一个

request ?一个map对象

session ?一个map对象

application ?一个map对象

attr ?一个map对象

返回的都是ognl context map

boolean b = ActionContext.getContext().getContextMap() == ActionContext.getContext().getValueStack().getContext();

System.out.println(b);//结果为true

ActionContext提供了各种针对ValueStack关联的Context的便利操作方法,包括直接返回该Context对象内部存储的各个Map集合对象的便利方法:

put()方法和get()方法就是往该Context Map对象中添加数据和取数据。

getApplication()得到application域中的所有attribute的map对象;

getSession()得到代表session域中的所有attribute的map对象;

getParameters()得到代表所有请求参数的map对象;

getLocale()得到当前用户的Locale信息,是综合了session中保存的Locale与浏览器请求消息中的Locale的结果。

ServletActionContext类继承了ActionContext类,它额外再提供了一些方便的方法,主要是直接返回Servlet有关的API

ValueStack提供了如下一些方法管理其内部的堆栈和关联的Context:

setValue为ognl表达式寻址到的对象设置属性值。 如果想修改指定位置的值,setValue("[0].属性名","值")

findValue方法使用OGNL表达式获取结果。也可以当作ognl context map中的属性直接去找

findString方法对findValue方法获取的结果调用转换器转成字符串,如果该对象的类型没有相关转换器,则调用toString方法,并返回结果字符串。一个特殊之处:如果不用#前缀访

问OGNL Context Map中的对象,则该对象必须是String类型。

property标签

用于输出某个OGNL表达式的值,并进行HTML和XML实体转换,可以认为其内部使用的是ValueStack对象的findString()方法。

如果没有设置value属性,则输出ValueStack栈顶的对象,等效于输出“top”这个特殊的OGNL表达式,”top”表示栈顶的对象。

如果采用不加#前缀的方式输出Context中的某个对象,这个对象必须是String类型,以此可以说明该标签内部调用的是ValueStack.findString()方法。

格式:<s:property value=””default=”” escape=”true|false”/>

如果value中的内容为object,则Struts2都会把它解析成ognl表达式

如果里面需要表示为字符串,则需要将内容用单引号括起来

1、 利用ognl表达式取值(例如:取值堆栈中的username值)

<s:property value="username"/>

2、 取值为字符串

需要将内容用单引号括起来

<s:property value="’username’"/>

3、 设置默认值-default

如果一个对象值取不到,则可以使用default设置一个默认值。

<s:property value="admin" default=”管理员”/>

4、 设定HTML-escape

是否设置返回值为HTML原代码样式

true:解析返回值的html代码 false:原封不动返回值

<s:property value="'<hr/>'" escape="false"/>

<s:push>标签用于将OGNL表达式的值压入栈顶。 注意<s:debug>标签要位于<s:push>标签对之间

<s:push value="#mydate"></s:push>

<s:bean>标签用于实例化一个JavaBean对象,并将其压入栈顶。

<s:bean name="java.lang.String" var="sss"><s:debug></s:debug></s:bean>

定义bean,并使用param来设定新的属性值,如果设置了var属性,还会将实例化的对象存储进ValueStack关联的Context Map中。

<s:bean name="com.bjsxt.struts2.tags.Dog" var="myDog" >

<s:param name="name" value="'pp'"></s:param>

</s:bean>

拿出值:因为在actionContext中,所以使用#

<s:property value="#myDog.name"/>

当<s:bean>不指定var时,则对象相关属性会在值栈中。如果需要访问,则只能在<s:bean>标签内访问。

当<s:bean>标签结束后,则值栈就不存在这个对象了。

<s:bean name="com.bjsxt.struts2.tags.Dog" >

<s:param name="name" value="'pp'"></s:param>

<s:property value="name"/>

</s:bean>

<s:set>标签用于将某个值存入指定范围域中,通常用于将一个复杂的ognl表达式用一个简单的变量来进行引用。

注: var 用于设定变量名

value 变量值(可以是ognl表达式),也可以是字符串

scope 就是的作用范围 request session page application action(默认)

<s:if/elseif/else>等标签用于判断test属性中指定的ognl表达式的结果是否为true,为真则执行标签体中的内容。

行变色

<style type="text/css">

.odd{background-color: #c3f3c3}

.even{background-color: #f3c3f3}

</style>

<table border="1" bordercolor="red">

<s:iterator value="#request" status="myStatus">

<tr class="<s:property value="#myStatus.odd?'odd':'even'"/>">

<td><s:property value="key"/></td>

<td><s:property value="value"/></td>

</tr>

</s:iterator>

</table>

ognl 的语法细节 %{}

1 ognl内部默认的两个key #root #context

2 引用属性可以用”#parameter.id[0]”或”#parameter[‘id’][0]”访问

3 session.attribute[“foo”]等效于session.getAttribute(“foo”)方法。

4 链式表达式 <s:property value="114H.intValue().(#this<112?#this*2:#this/2)"/>

5 静态方法和静态属性的访问调用

要支持静态方法调用,要使用一个常量开关:struts.ognl.allowStaticMethodAccess

<!-- 允许访问静态方法 -->struts.xml中

<constant name="struts.ognl.allowStaticMethodAccess" value="true"></constant>

<s:property value="@java.lang.Integer@parseInt('a',16)+5"/>

集合对象与操作

1 {}用于创建List集合对象,其中的各个元素之间用逗号分隔。

<s:set value=“{1,3,5,7}” var=“list”/>

2 #{}用于创建Map集合对象,其中的各个元素之间用逗号分隔,元素的key和value之间采用冒号分隔

<s:set value=“#{‘lhm’:96,’zxx’:93,’xpc’:97}”

<s:set value=“#@java.util.LinkedHashMap@{‘lhm’:96,’zxx’:93,’xpc’:97}”

3 in与not in操作符用于判断某个值是否位于某个集合中

<s:iterator value="#{1:'java',2:'c',3:'xml'}">

<input type="checkbox" value="<s:property value='key'/>" <s:property value='key in {2,3} ?"checked":""'/> >

<s:property value="value"/>

</s:iterator>

4 集合伪属性:size/isEmpty/iterator/keys/values/next/hasNext

集合的投影与过滤

投影就是拿着集合中的每个元素去进行运算,各个元素运算的结果组成一个新集合,新集合中的元素个数与原始集合中的元素个数相同。

<s:property value=“persons.{name}”/>

<s:property value=“{5,3,2}.{#this*2}”/>

过滤就是拿着集合中的每个元素去进行布尔运算,运算的结果为true,则将该元素保存到新集合中去。

?:获得所有符合逻辑的元素。

<s:property value=“{5,3,2}.{? #this }”/>

^:获得符合逻辑的第一个元素。

<s:property value=“{5,3,2}.{^ #this>3 }”/>

$:获得符合逻辑的最后一个元素。

<s:property value=“{5,3,2}.{$ #this>2 }”/>

类型转换

转换成boolean类型

整数0转换为false

值为0的字符转化为false

null对象转化为false

投影和选择操作符(e1.{e2} and e1.{?e2})前面的内容会被转换成集合

数字会被转换成从0开始到比该数字小1的所有数字的集合。

Map会被转化成其values属性返回的集合
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: