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



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属性返回的集合

你可能感兴趣的:(struts)