1. Ognl 表达式
OGNL(Object-Graph Navigation Language),大概可以理解为:对象图形化导航语言。是一种可以方便地操作对象属性的开源表达式语言。
OGNL有如下特点:
1、支持对象方法调用
2、支持类静态的方法调用和值访问
3、支持赋值操作和表达式串联
4、访问OGNL上下文(OGNL context)和ActionContext;
5、操作集合对象。
<!--
s:set 定义一个变量,使用ognl表达式赋值,并放在某个作用域中
@var 变量名
@value 变量值,使用ognl表达式,字符串常量用‘’括起来,默认值value stack 栈顶的值
@scope 变量所放作用域 requset,session,application, page,action,默认值request、action
-->
<!-- 定义数字 -->
<s:set var="age" value="14" scope="action"></s:set>
<!-- 定义字符串常量 -->
<s:set var="str" value="'hello'" scope="request"></s:set>
<!-- 定义对象 -->
<s:set var="user" value="new com.puckasoft.vo.User('admin','123456')"
scope="session"></s:set>
<!-- 定义数组 -->
<s:set var="arr" value="{12,455,3,99,1008,876}"></s:set>
<s:set var="list" value="{'康熙','雍正','乾隆'}"></s:set>
<!-- 定义map -->
<s:set var="map" value="#{'apple':123,'banana':456,'orange':789}"></s:set>
<!-- 定义对象数组-->
<s:set var="users"
value="{
new com.puckasoft.vo.User('aa','11'),
new com.puckasoft.vo.User('bb','22'),
new com.puckasoft.vo.User('cc','33'),
new com.puckasoft.vo.User('dd','44'),
new com.puckasoft.vo.User('ee','55'),
new com.puckasoft.vo.User('ff','66'),
new com.puckasoft.vo.User('gg','77')
}">
</s:set>
ognl 访问静态变量:
访问静态方法struts.ognl.allowStaticMethodAccess=true
<s:property value="@java.lang.Integer@MAX_VALUE" />
<br />
ognl 访问静态方法:
<s:property value="@java.lang.Integer@valueOf('123')" />
<br />
ognl 访问Math类:
<s:property value="@@max(3,5)" />
<br />
ognl 访问方法:
<s:property value="#request.str.charAt(2)" />
<br />
ognl 访问page,request,session,application域中变量:
<s:property value="#request.str" />
<br />
ognl 访问栈上下文中变量:
<s:property value="#age" />
<br />
ognl 调用变量的普通:
<s:property value="#session.user.uname" />
或
<s:property value="#session.user['uname']" />
或
<s:property value="#session.user[\" uname\"]"/>
<br />
ognl 访问list:
<s:property value="#list" />
<br />
ognl 访问list中第2个元素:
<s:property value="#list[1]" />
<br />
ognl 访问list的大小:
<s:property value="#list.size()" />
或
<s:property value="#list.size" />
<br />
ognl 访问list中元素某个属性的集合:
<s:property value="#users.{uname}" />
<br />
投影 筛选出元素>100:
<s:property value="#arr.{?#this>100}" />
<br />
筛选出第一个元素>100:
<s:property value="#arr.{^#this>100}" />
<br />
筛选出最后一个元素>100:
<s:property value="#arr.{$#this>100}" />
<br />
ognl 访问map:
<s:property value="#map" />
<br />
map中的key集合:
<s:property value="#map.keys" />
<br />
map中的value集合:
<s:property value="#map.values" />
<br />
map中key=banana对应的value值:
<s:property value="#map.banana" />
或
<s:property value="#map['banana']" />
或
<s:property value="#map[\" banana\"]"/>
<br />
map的大小:
<s:property value="#map.size()" />
<br />
ognl 访问地址栏参数:
<s:property value="#parameters.a[0]" />
<br />
<s:debug></s:debug>
% # $ 总结
#符号有三种用途:
(1)、访问非根对象(struts中值栈为根对象)如OGNL上下文和Action上下文,#相当于ActionContext.getContext();
(2)、用于过滤和投影
(3)、构造Map
%符号的用途
在标签的属性值被理解为字符串类型时,告诉执行环境%{}里的是OGNL表达式。 类似javascript里面的eval()功能
$有两种用途
(1)、在国际化资源文件中,引用OGNL表达式。
(2)、在Struts 2配置文件中,引用OGNL表达式
2.Struts2 标签
<s:property>
<!--
s:property 输出变量的值
@value ognl表达式
@default 默认值
@escape 转义
-->
<s:property value="'<b>I am happy<b>'" escape="false" />
<br />
<s:property value="#e" default="abc" />
<br />
<s:debug></s:debug>
<s:include>
<s:if>
<s:include value="/01_ognl_set_property_debug.jsp"></s:include>
<s:if test="#age <18">儿童</s:if>
<s:elseif test="#age < 60">成年人</s:elseif>
<s:else>老人</s:else>
<s:iterator>
<s:include value="/01_ognl_set_property_debug.jsp"></s:include>
<s:if test="#list!=null && #list.size() >0">
<ul>
<s:iterator value="#list" var="name">
<li>
<s:property value="name" />
</li>
</s:iterator>
</ul>
</s:if>
<s:if test="#map!=null && #map.size()>0">
<ul>
<s:iterator value="#map" var="mapEntry">
<li>
<s:property value="#mapEntry.key" />
--
<s:property value="#mapEntry.value" />
</li>
</s:iterator>
</ul>
</s:if>
<table>
<tr>
<th>
序号
</th>
<th>
用户名
</th>
<th>
密码
</th>
</tr>
<s:if test="#users!=null&&#users.size()>0">
<s:iterator value="#users" var="user" status="i">
<tr
style='background-color: < s : if test = "#i.first" > red </ s : if >
< s : elseif test = "#i.last" > green </ s : elseif >
< s : elseif test = "#i.odd" > yellow </ s : elseif ><%-- 奇数行,行号从1开始算 --%>
< s : elseif test = "#i.even" > blue </ s : elseif ><%-- 偶数行,行号从1开始算 --%>'>
<td>
<s:property value="#i.index" />
<s:property value="#i.count" />
</td>
<td>
<s:property value="#user.uname" />
</td>
<td>
<s:property value="#user.pwd" />
</td>
</tr>
</s:iterator>
</s:if>
<s:else>
<tr>
<td colspan="2">
无记录!
</td>
</tr>
</s:else>
</table>
<s:url>
用户列表
<s:include value="/05_url.jsp"></s:include>
<div>
<s:iterator begin="1" end="10" var="i">
<s:url var="url" namespace="user" action="list" includeParams="get"
includeContext="true">
<s:param name="pn" value="i" />
</s:url>
<a href="${url}"/>${i}</a>
</s:iterator>
</div>
<s:form>
<s:form action="/reg" method="post" enctype="multipart-formdata">
<s:textfield name="uname" value="" label="用户名"></s:textfield>
<s:password name="pwd" value="" label="密码"></s:password>
<s:password name="pwd2" value="" label="确认密码"></s:password>
<s:textfield name="email" value="" label="电子邮局"></s:textfield>
<s:radio name="gender" value="" label="性别" list="#{'M':'男','F':'女'}"
listKey="key" listValue="value"></s:radio>
<s:checkboxlist name="favs" value="" label="爱好"
list="#{1:'购物',2:'看电影',3:'打游戏'}" listKey="key" listValue="value" />
<s:select name="loc" value="" label="地区"
list="#{1:'北京',2:'上海',3:'天津'}"></s:select>
<s:textarea name="introduce" value="" label="自我介绍"></s:textarea>
<s:checkbox name="agree" value="true" label="是否同意条款"></s:checkbox>
<s:file name="photo" label="个人形象"></s:file>
<s:hidden name="id" value="1"></s:hidden>
<s:reset value="重置"></s:reset>
<s:submit value="提交"></s:submit>
</s:form>
<s:date>
<s:date name="new java.util.Date()" format="yyyy-MM-dd hh:mm:ss"/><br/>
<sx:datetimepicker ></sx:datetimepicker>