Struts 2 第19part OGNL 表達式的初步使用

2013年2月19日 天氣晴

Struts 2 第19part OGNL 表達式的初步使用

新的一part,OGNL表達式的學習,這裏只是爲了說明什麼是OGNL表達式,OGNL用在什麼位置,怎麼使用這些問題?

那麼,OGNL的全稱是什麼?

Object Graph Navigation Language  對象圖導航語言

OGNL表達式的基本單位是"導航鏈",一般導航鏈由如下幾個部分組成:

  1. 屬性名稱(property)
  2. 方法調用(method invoke)
  3. 數組元素

所有的OGNL表達式都基於當前對象的上下文來完成求值運算,鏈的前面部分的結果將作爲後面求值的上下文。

關於OGNL可不是一個能簡單介紹完的東西,但使用起來確實是比較爽的。

具體怎麼用,下面例子,看完之後就能知道一二了。

實例:/Struts2_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.friend.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.wwj.struts2.ognl.S@s()"/></li> 
  21.         <li>訪問靜態屬性:<s:property value="@com.wwj.struts2.ognl.S@STR"/></li> 
  22.         <li>訪問Math類的靜態方法:<s:property value="@@max(2,3)" /></li> 
  23.         <hr/> 
  24.         <li>訪問普通類的構造方法:<s:property value="new com.wwj.struts2.ognl.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>訪問Map:<s:property value="dogMap"/></li> 
  32.         <li>訪問Map中某個元素:<s:property value="dogMap.dog101"/> | <s:property value="dogMap['dog101']"/> | <s:property value="dogMap[\"dog101\"]"/></li> 
  33.         <li>訪問Map中所有的key:<s:property value="dogMap.keys"/></li> 
  34.         <li>訪問Map中所有的value:<s:property value="dogMap.values"/></li> 
  35.         <li>訪問容器的大小:<s:property value="dogMap.size()"/> | <s:property value="users.size"/> </li> 
  36.         <hr/> 
  37.         <li>投影(過濾):<s:property value="users.{?#this.age==1}[0]"/></li> 
  38.         <li>投影:<s:property value="users.{^#this.age>1}.{age}"/></li> 
  39.         <li>投影:<s:property value="users.{$#this.age>1}.{age}"/></li> 
  40.         <li>投影:<s:property value="users.{$#this.age>1}.{age} == null"/></li> 
  41.         <hr /> 
  42.         <li>[]:<s:property value="[0].username"/></li> 
  43.     </ol> 
  44.       
  45.     <s:debug></s:debug> 
  46. </body> 
  47. </html> 

再來看看項目結構:

 

 

整個項目執行流程:從index.jsp開始->struts.xml->Action類->struts.xml->ognl.jsp

index.jsp

  1. <body> 
  2.     訪問屬性  
  3.     <a href="<%=contextPath %>/ognl.action?username=u&password=p">ognl</a> 
  4. </body> 

struts.xml

  1. <?xml version="1.0" encoding="UTF-8" ?> 
  2. <!DOCTYPE struts PUBLIC  
  3.     "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"  
  4.     "http://struts.apache.org/dtds/struts-2.0.dtd"> 
  5.  
  6. <struts> 
  7.  
  8.     <constant name="struts.enable.DynamicMethodInvocation" value="false" /> 
  9.     <constant name="struts.devMode" value="true" /> 
  10.     <!-- 允許訪問靜態方法 --> 
  11.     <constant name="struts.ognl.allowStaticMethodAccess" value="true"></constant> 
  12.     <include file="/com/wwj/struts2/ognl/ognl.xml"/> 
  13.       
  14.  
  15.  
  16. </struts> 

包含進來的ognl.xml配置文件

  1. <?xml version="1.0" encoding="UTF-8" ?> 
  2. <!DOCTYPE struts PUBLIC  
  3.         "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"  
  4.         "http://struts.apache.org/dtds/struts-2.0.dtd"> 
  5. <struts> 
  6.     <package name="ognl" extends="struts-default"> 
  7.         <action name="ognl" class="com.wwj.struts2.ognl.OgnlAction"> 
  8.             <result>/ognl.jsp</result> 
  9.         </action> 
  10.     </package> 
  11. </struts> 

OgnlAction.java

  1. package com.wwj.struts2.ognl;  
  2.  
  3. import java.util.ArrayList;  
  4. import java.util.HashMap;  
  5. import java.util.HashSet;  
  6. import java.util.List;  
  7. import java.util.Map;  
  8. import java.util.Set;  
  9.  
  10. import com.opensymphony.xwork2.ActionSupport;  
  11.  
  12. public class OgnlAction extends ActionSupport {  
  13.       
  14.     //1.普通屬性  
  15.     private String username;  
  16.     private String password;  
  17.       
  18.       
  19.     //2.對象  
  20.     private User user;  
  21.       
  22.       
  23.       
  24.     //3.對象  
  25.     private Cat cat;  
  26.       
  27.       
  28.     private List<User> users = new ArrayList<User>();  
  29.     private Set<Dog> dogs = new HashSet<Dog>();  
  30.     private Map<String, Dog> dogMap = new HashMap<String, Dog>();  
  31.       
  32.     public OgnlAction() {  
  33.         users.add(new User(1));  
  34.         users.add(new User(2));  
  35.         users.add(new User(3));  
  36.  
  37.         dogs.add(new Dog("dog1"));  
  38.         dogs.add(new Dog("dog2"));  
  39.         dogs.add(new Dog("dog3"));  
  40.           
  41.         dogMap.put("dog100"new Dog("dog100"));  
  42.         dogMap.put("dog101"new Dog("dog101"));  
  43.         dogMap.put("dog102"new Dog("dog102"));  
  44.     }  
  45.  
  46.     public String getUsername() {  
  47.         return username;  
  48.     }  
  49.  
  50.     public void setUsername(String username) {  
  51.         this.username = username;  
  52.     }  
  53.  
  54.     public String getPassword() {  
  55.         return password;  
  56.     }  
  57.  
  58.     public void setPassword(String password) {  
  59.         this.password = password;  
  60.     }  
  61.       
  62.     public User getUser() {  
  63.         return user;  
  64.     }  
  65.  
  66.     public void setUser(User user) {  
  67.         this.user = user;  
  68.     }  
  69.       
  70.       
  71.  
  72.     public Cat getCat() {  
  73.         return cat;  
  74.     }  
  75.  
  76.     public void setCat(Cat cat) {  
  77.         this.cat = cat;  
  78.     }  
  79.       
  80.     //action的普通方法  
  81.     public String m() {  
  82.         return "hello";  
  83.     }  
  84.  
  85.       
  86.     public List<User> getUsers() {  
  87.         return users;  
  88.     }  
  89.  
  90.     public void setUsers(List<User> users) {  
  91.         this.users = users;  
  92.     }  
  93.  
  94.     public Set<Dog> getDogs() {  
  95.         return dogs;  
  96.     }  
  97.  
  98.     public void setDogs(Set<Dog> dogs) {  
  99.         this.dogs = dogs;  
  100.     }  
  101.  
  102.     public Map<String, Dog> getDogMap() {  
  103.         return dogMap;  
  104.     }  
  105.  
  106.     public void setDogMap(Map<String, Dog> dogMap) {  
  107.         this.dogMap = dogMap;  
  108.     }  
  109.  
  110.     public Map<String, Dog> getDogmap() {  
  111.         return dogMap;  
  112.     }  
  113.  
  114.     public void setDogmap(Map<String, Dog> dogmap) {  
  115.         this.dogMap = dogmap;  
  116.     }  
  117.  
  118.     @Override 
  119.     public String execute() throws Exception {  
  120.         // TODO Auto-generated method stub  
  121.         return SUCCESS;  
  122.     }  
  123.       
  124.       
  125. }  

User.java

  1. package com.wwj.struts2.ognl;  
  2.  
  3. public class User {  
  4.     private int age = 8;  
  5.  
  6.       
  7.     //必須要有這個默認構造方法  
  8.     public User() {  
  9.         super();  
  10.     }  
  11.  
  12.     public User(int age) {  
  13.         super();  
  14.         this.age = age;  
  15.     }  
  16.  
  17.     public int getAge() {  
  18.         return age;  
  19.     }  
  20.  
  21.     public void setAge(int age) {  
  22.         this.age = age;  
  23.     }  
  24.  
  25.     @Override 
  26.     public String toString() {  
  27.         // TODO Auto-generated method stub  
  28.         return "user" + age;  
  29.     }  
  30.       
  31.       
  32.       
  33.       
  34. }  

 

Cat.java

  1. package com.wwj.struts2.ognl;  
  2.  
  3.  
  4. public class Cat {  
  5.     private Dog friend;  
  6.  
  7.     public Dog getFriend() {  
  8.         return friend;  
  9.     }  
  10.  
  11.     public void setFriend(Dog friend) {  
  12.         this.friend = friend;  
  13.     }  
  14.       
  15.     public String miaomiao() {  
  16.         return "miaomiao";  
  17.     }  
  18.       
  19. }  

Dog.java

  1. package com.wwj.struts2.ognl;  
  2.  
  3. public class Dog {  
  4.     private String name;  
  5.  
  6.     public Dog() {  
  7.         super();  
  8.     }  
  9.       
  10.     public Dog(String name) {  
  11.         super();  
  12.         this.name = name;  
  13.     }  
  14.  
  15.     public String getName() {  
  16.         return name;  
  17.     }  
  18.  
  19.     public void setName(String name) {  
  20.         this.name = name;  
  21.     }  
  22.  
  23.     @Override 
  24.     public String toString() {  
  25.         return "Dog [name=" + name + "]";  
  26.     }  
  27.       
  28.       
  29. }  

 

S.java

  1. package com.wwj.struts2.ognl;  
  2.  
  3. public class S {  
  4.     public static String STR = "STATIC STRING";  
  5.       
  6.     public static String s() {  
  7.         return "static method";  
  8.     }  
  9. }  

 

 

整個項目的代碼貼放完畢,關於OGNL這一part的學習,就這麼多。不多說了。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章