OGNL表达式语言(#号的用法)
用法1:访问OGNL上下文和Action上下文,#相当ActionContext.getContext()
1、 如果访问其他Context中的对象,由于他们不是根对象,所以在访问时,需要添加#前缀
也可写为#request[‘userName’]或#session[‘userName’]或#appliction[‘userName’]
2 、OGNL会设定一个根对象(root对象),在Struts2中根对象就是ValueStack(值栈) 。如果要访问根对象(即ValueStack)中对象的属性,则可以省略#命名对象,直接访问该对象的属性即可
1 Action中代码: 2 ValueStack valueStack=ServletActionContext.getContext().getValueStack(); 3 valueStack.set("msg", "msg_xxx"); 4 Jsp页面: 5 valueStack:<s:property value="msg"/><br>
用法2:集合的投影(过滤)
1、集合的投影(只输出部分属性)
collectionName.{ expression }
1 <s:iterator value="#request.persons.{name}" var="person"> 2 <s:property value="#person"/><br> 3 </s:iterator>
2、集合的过滤
1) 集合的过滤有以下三种方式:
a.“?#”:过滤所有符合条件的集合,如:users.{?#this.age > 19};
b.“^#”:过滤第一个符合条件的元素,如:users.{^#this.age > 19};
c.“$#”:过滤最后一个符合条件的元素,如:users.{$#this.age > 19}
2) this 表示集合中的元素;
1 <s:iterator value="#request.persons.{?#this.age>24}" var="person"> 2 <s:property value="#person"/><br> 3 </s:iterator>
3、集合的投影和过滤
投影(过滤)操作返回的是一个集合,可以使用索引取得集合中指定的元素,如:users.{?#this.age > 19}[0]
1 <s:iterator value="#request.persons.{?#this.age>24}.{name}" var="person"> 2 <s:property value="#person"/><br> 3 </s:iterator>
用法3:构造Map,如#{‘foo1’:‘bar1’, ‘foo2’:‘bar2’}。
这种方式常用在给radio或select、checkbox等标签赋值上
1 jsp页面: 2 <s:radio list=“#{‘male’:‘男’,‘female’:‘女’}” name=“sex” label=“性别” /> 3 运行结果是 4 <input type="radio" name="sex" id="sexmale" value="male"/>男 5 <input type="radio" name="sex" id="sexfemale" value="female"/>女
1 Action中的代码: 2 Map map=new HashMap(); 3 map.put("male", "男"); 4 map.put("female", "女"); 5 ServletActionContext.getRequest().setAttribute("map", map); 6 jsp页面: 7 <s:radio list="#request.map" name="sex" label="性别" /> 8 运行结果是 9 <input type="radio" name="sex" id="sexfemale" value="female"/>女 10 <input type=“radio” name=“sex” id=“sexmale” value=“male”>男
OGNL表达式语言(%用法)
%”符号的用途是在标签的属性值被理解为字符串类型时,告诉执行环境%{}里的是OGNL表达式。
1 形式一: { }中ognl表达式 2 Action中的代码: 3 ServletActionContext.getRequest().setAttribute("username", "username_request"); 4 jsp页面: 5 <s:textfield name="name" label="%{#request.username} "/> 6 运行结果是 7 username_request : <input type="text" name="name" value="" id="name"/> 8 9 形式二: { }中值用 ’ ’引起来,这是不再是ogle表达式,而是普通的字符串 10 jsp页面: 11 <s:textfield name="name" label="%{'foo'}"/> 12 运行结果是 13 foo : <input type="text" name="name" value="" id="name"/>
OGNL表达式语言($用法)
“$”有两个主要的用途
* 用于在国际化资源文件中,引用OGNL表达式
* 在Struts 2配置文件中,引用OGNL表达式
1 在struts2配置文件中引用ognl表达式 ,引用request等作用域中的值 2 Action中的代码: 3 ServletActionContext.getRequest().setAttribute("msgxx", "msg_request"); 4 struts.xml文件中 5 <package name="ognl" namespace="/ognl" extends="struts-default" > 6 <action name="ognlAction_*" class="cn.itcast.ognl.OgnlAction" method="{1}"> 7 <result name="ognl">/ognl/ongl.jsp?msg=${#request.msgxx}</result> 8 </action> 9 </package> 10 jsp页面: 11 parameters Msg:<s:property value="#parameters.msg[0]"/> 12 运行结果是 13 msg_request
1 在struts2配置文件中引用ognl表达式 ,引用值栈的值 2 Action中的代码: 3 valueStack.set("msgxx", "msg_valueStack"); 4 struts.xml文件中 5 <package name="ognl" namespace="/ognl" extends="struts-default" > 6 <action name="ognlAction_*" class="cn.itcast.ognl.OgnlAction" method="{1}"> 7 <result name="ognl">/ognl/ongl.jsp?msg=${msgxx}</result> 8 </action> 9 </package> 10 jsp页面: 11 parameters Msg:<s:property value="#parameters.msg[0]"/> 12 运行结果是 13 msg_valueStack
OGNL标签
property标签
property标签用于输出指定值:
<s:property value=“#name" default="a default value" />
* default: 可选属性, 如果需要输出的属性值为null,则显示该属性指定的值
* escape:可选属性,指定是否格式化HTML代码。 escape=“false”时,hr作为html标签使用
* value: 可选属性,指定需要输出的属性值,如果没有指定该属性,则默认输出ValueStack栈顶的值。
1 <s:property value="#request.username"/>:输出栈顶的值 2 输出: username=username_valueStack, msgxx=msg_valueStack 3 4 <s:property value="#request.username111" default="default value"/> 5 <s:property value="%{'<hr> hr的使用'}" escape="false" /> 6 输出:<hr> hr的使用 7 注:escape=“false”时,hr作为html标签使用
set标签
set标签用于将某个值放入指定范围。
var:变量的名字,name,id和var表达的含义是一样的,name,id被var替代
scope:指定变量被放置的范围,该属性可以接受application、session、request、 page或action。如果没有设置该属性,则默认放置在action中。
value:赋给变量的值.如果没有设置该属性,则将ValueStack栈顶的值赋给变量。
1 <s:set value="#request.username" var="xxx“ scope=“request” /><br> 2 <s:property value=“#request.xxx" /><br> 3 4 5 <s:set value="#request.username" var="xxx" scope="page" /><br> 6 <s:property value="#attr.xxx" /><br> 7 8 <s:set value="#request.username" var="xxx" /><br> 9 <s:property value="xxx" /><br>
push标签
push:将对象放入栈顶,不能放入其他范围,当标签结束,会从栈顶删除。
value:要push到堆栈中的值 。
<s:push value="#request.username"> <s:property/> </s:push> <br> 测试删除: <s:property/>
action标签
Action:通过指定命名空间和action名称,该标签允许在jsp页面直接调用Action
name:action名字(不包括后缀,如.action)
namespace:action所在命名空间
executeResult:Action的result是否需要被执行,默认值是false不执行
1 <package name="ognl" namespace="/ognl" extends="struts-default" > 2 <action name="ognlAction_*" class="cn.itcast.ognl.OgnlAction" method="{1}"> 3 <result name="ognl">/ognl/ongl.jsp?msg=${msgxx}</result> 4 </action> 5 </package> 6 7 <s:action name="ognlAction_test" namespace="/ognl" executeResult="true" />
iterator标签
Iterator:标签用于对集合进行迭代,这里的集合包含List、Set和数组。
value:可选属性,指定被迭代的集合,如果没有设置该属性,则使用ValueStack栈顶的集合。
var: 可选属性,引用变量的名称.
status:可选属性,该属性指定迭代时的IteratorStatus实例。该实例包含如下几个方法:
int getCount(),返回当前迭代了几个元素。
int getIndex(),返回当前迭代元素的索引。
boolean isEven(),返回当前被迭代元素的索引是否是偶数
boolean isOdd(),返回当前被迭代元素的索引是否是奇数
boolean isFirst(),返回当前被迭代元素是否是第一个元素。
boolean isLast(),返回当前被迭代元素是否是最后一个元素。
<s:iterator value="%{#request.persons}" var="person"> <s:property value="#person"/><br> </s:iterator> <s:iterator value="%{#request.persons}" var="person"> <s:property value="#person.id"/>~<s:property value="#person.name"/>~<s:property value="#person.age"/> </s:iterator> <s:iterator value="%{#request.persons}" var="person" status="st"> 返回当前迭代了几个元素. <s:property value="#st.count"/><br> 返回当前迭代元素的索引.<s:property value="#st.index"/><br> 返回当前被迭代元素的索引是否是偶数.<s:property value="#st.even"/><br> 返回当前被迭代元素的索引是否是奇数.<s:property value="#st.odd"/><br> 返回当前被迭代元素是否是第一个元素.<s:property value="#st.first"/><br> 返回当前被迭代元素是否是最后一个元素.<s:property value="#st.last"/><br><br> </s:iterator> <table border="1"> <s:iterator value="%{#request.persons}" var="person" status="st"> <tr class="<s:property value="#st.even?'evenClass':'oddClass'"/>"> <td><s:property value="#person.id"/></td> <td><s:property value="#person.name"/></td> <td><s:property value="#person.age"/></td> </tr> </s:iterator> </table>
if/elseif/else标签
if/elseif/else 基本的流程控制.‘If’标签可单独使用也可以和‘Else If’标签和(或)一个多个‘Else’一起使用
1 <s:if test="#age==23"> 2 23 3 </s:if> 4 <s:elseif test="#age==21"> 5 21 6 </s:elseif> 7 <s:else> 8 都不等 9 </s:else>
url标签
url:该标签用于创建url,可以通过"param"标签提供request参数.
value:如果不提供就用当前action,使用value后缀必须加.action
action:用来生成url的action,如果没有则使用value
namespace :命名空间
var:引用变量的名称.
1 <s:url action="ognlTagAction_test" namespace="/ognl" var="myurl"> 2 <s:param name="name" value="%{'张老师'}"></s:param> 3 <s:param name="id" value="12"></s:param> 4 </s:url> 5 6 <a href='<s:property value="#myurl" />' >xxxx</a><br> 7 <a href='<s:property value="%{#myurl}" />' >xxxx</a><br> 8 9 使用value<br> 10 <s:url value="ognlTagAction_test.action" namespace="/ognl" var="myurl"> 11 <s:param name="id" value="12"></s:param> 12 <s:param name="cnname" value="%{'zhang'}"></s:param> 13 </s:url> 14 15 <a href='<s:property value="#myurl" />' >xxxx</a><br>
ognl操作集合
使用ognl操作list和数组
1 Action中: 2 List<Person> list = new ArrayList<Person>(); 3 for(int i=0;i<10;i++){ 4 Person p = new Person(); 5 p.setId(i); 6 p.setName("lucy"+i); 7 p.setAge(20+i); 8 list.add(p); 9 } 10 request.setAttribute("persons", list); 11 Jsp: 12 集合的长度:<s:property value="#request.persons.size"/><br>
使用ognl操作list和数组
ognl也可直接创建集合对象. 利用下拉列表框:
1 Jsp: 2 <s:iterator value="{1,2,3,4}"> 3 <s:property/> <br> 4 </s:iterator> 5 6 <s:iterator value="{'s1','s2','s3','s4'}" var="s"> 7 <s:property value="#s"/> <br> 8 </s:iterator>
使用ognl操作map
ognl用多种方式使用#号,每种是不同的.动态map对于动态单选按扭组很有用.
创建map与创建list语法很相似,不同的是map前需要加"#"号.
1 <s:iterator value="#{'key01':'value01','key02':'value02'}"> 2 <s:property/> <br> 3 </s:iterator> 4 5 <s:iterator value="#{'key01':'value01','key02':'value02'}"> 6 key=<s:property value="key"/> value=<s:property value="value"/> <br> 7 </s:iterator> 8 9 10 <s:iterator value="#{'key01':'value01','key02':'value02'}" var="map"> 11 key=<s:property value="#map.key"/> value=<s:property value="#map.value"/> <br> 12 </s:iterator>