4.Struts2-OGNL

/*ognl 是 strut2 特有的表达式,使用 ognl,struts2 就无需将对象手动放值进request等范围,页面(从值栈中)直接传值*/

  

OGNL

 1 <?xml version="1.0" encoding="GB18030" ?>
 2 <%@ page language="java" contentType="text/html; charset=GB18030"
 3     pageEncoding="GB18030"%>
 4 <%@ taglib uri="/struts-tags" prefix="s" %>
 5 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
 6 <html xmlns="http://www.w3.org/1999/xhtml">
 7 <head>
 8 <meta http-equiv="Content-Type" content="text/html; charset=GB18030" />
 9 <title>OGNL表达式语言学习</title>
10 </head>
11 <body>
12     <ol>
13         <li>访问值栈中的action的普通属性: username = <s:property value="username"/> </li>
14         <li>访问值栈中对象的普通属性(get set方法):<s:property value="user.age"/> | <s:property value="user['age']"/> | <s:property value="user[\"age\"]"/> | wrong: <%--<s:property value="user[age]"/>--%></li>
15         <li>访问值栈中对象的普通属性(get set方法): <s:property value="cat.dog.name"/></li>
16         <li>访问值栈中对象的普通方法:<s:property value="password.length()"/></li>
17         <li>访问值栈中对象的普通方法:<s:property value="cat.miaomiao()" /></li>
18         <li>访问值栈中action的普通方法:<s:property value="m()" /></li>
19         <hr />
20         <li>访问静态方法:<s:property value="@com.bjsxt.struts2.ognl.action.S@str()"/></li>
21         <li>访问静态属性:<s:property value="@com.bjsxt.struts2.ognl.action.S@STR"/></li>
22         <li>访问Math类的静态方法:<s:property value="@@max(2,3)" /></li>
23         <hr />
24         <li>访问普通类的构造方法:<s:property value="new com.bjsxt.struts2.ognl.action.User(8)"/></li>
25         <hr />
26         <li>访问List:<s:property value="users"/></li>
27         <li>访问List中某个元素:<s:property value="users[1]"/></li>
28         <li>访问List中元素某个属性的集合:<s:property value="users.{age}"/></li>
29         <li>访问List中元素某个属性的集合中的特定值:<s:property value="users.{age}[0]"/> | <s:property value="users[0].age"/></li>
30         <li>访问Set:<s:property value="dogs"/></li>
31         <li>访问Set中某个元素:<s:property value="dogs[1]"/></li>
32         <li>访问Map:<s:property value="dogMaps"/></li>
33         <li>访问Map中某个元素:<s:property value="dogMaps.dogMap1"/> | <s:property value="dogMaps['dogMap1']"/> | <s:property value="dogMaps[\"dogMap1\"]"/></li>
34         <li>访问Map中所有的key:<s:property value="dogMaps.keys"/></li>
35         <li>访问Map中所有的value:<s:property value="dogMaps.values"/></li>
36         <li>访问容器的大小:<s:property value="dogMaps.size()"/> | <s:property value="users.size"/> </li>
37         <hr />
38         <li>投影(过滤):<s:property value="users.{?#this.age==1}[0]"/></li>
39         <li>投影:<s:property value="users.{^#this.age>1}.{age}"/></li>
40         <li>投影:<s:property value="users.{$#this.age>1}.{age}"/></li>
41         <li>投影:<s:property value="users.{$#this.age>1}.{age} == null"/></li>
42         <hr />
43         <li>[]:<s:property value="[0].username"/></li>
44     </ol>
45     
46     <s:debug></s:debug>
47 </body>
48 </html>

 

 


注:

  1.因为Set是无序的,访问Set中某个元素,是没有意义的,所以是无法通过下标来取出Set中某个元素

  2.访问静态方法,在Struts2.1中 需要在struts.xml中加上 <constant name="struts.ognl.allowStaticMethodAccess" value="true"></constant>

  3.访问值栈中对象的属性和方法,需要new出这个对象,需要一个无参的构造方法,(如果该类没有构造方法,系统默认有一个构造方法)

  4.投影只有 '?#' '^#' '$#' 这三种写法, '^#'表示取集合中第一个元素 '$#'表示取集合中最后一个元素users.{?#this.age==1}[0]

  举例分析:users是一个List集合,上式表示:遍历users这个List集合,取出user.age==1 的user 因为可能有多个user满足条件,

  所以是一个集合的形式 最后[0] 表示取出满足条件的user集合中的第一个

  users.{^#this.age>1}.{age}取出满足age>1 的所有user,这是一个集合,所以取 age属性

  也是用集合的方式,选择集合中第一个user,得到一个age集合

  5.[] 表示取出 值栈 中的Object,[0] 表示 取出 值栈中的所有的Object(从第一个开始)

  [1] 表示取出第二个Object [0].username 表示从上往下依次验证值栈中的Object是否有username这个key 如果有,取出这个key对应的value
  另外:如果action之间存在转发(type="chain") 因为这属于一次访问(request)

  所以,两个action都会被当做Object 压在 值栈中

posted @ 2017-08-17 10:55  白日梦想家12138  阅读(136)  评论(0编辑  收藏  举报