GNL是Object-Graph Navigation Language的縮寫,它是一種功能強大的表達式語言(Expression Language,簡稱爲EL),經過它簡單一致的表達式語法,能夠存取對象的任意屬性,調用對象的方法,遍歷整個對象的結構圖,實現字段類型轉化等功能。它使用相同的表達式去存取對象的屬性。
html
Struts 2默認的表達式語言是OGNL,緣由是它相對其它表達式語言具備下面幾大優點:java
支持對象方法調用,如xxx.doSomeSpecial();正則表達式
支持類靜態的方法調用和值訪問,表達式的格式爲@[類全名(包括包路徑)]@[方法名 | 值名],例如:@java.lang.String@format('foo %s', 'bar')或@tutorial.MyConstant@APP_NAME;apache
支持賦值操做和表達式串聯,如price=100, discount=0.8, calculatePrice(),這個表達式會返回80;jsp
訪問OGNL上下文(OGNL context)和ActionContext;ide
操做集合對象。
this
1.OGNL訪問堆棧spa
2.OGNL訪問靜態方法,屬性.net
3.OGNL訪問普通類的構造方法debug
4.OGNL訪問List,MAP
5.OGNL中的投影,也就是過濾
公用的index.jsp初始傳值頁面
<body> //獲取上下文路徑<br /> String contextPath = request.getContextPath();<br /> 訪問屬性<br /> <a href="<%=contextPath %>/ognl/ognl.action?userName=credo&passWord=lion">ognl</a> </body>
struts.xml文件:
<!-- 注意這個規則,取的時候從根目錄取,就是 "/文件夾/文件名" --> <include file="/org/credo/ognl/ognl.xml" /> <!-- 下面是設定開發模式,設定爲true,方便修改action name後的熱部署 --> <constant name="struts.devMode" value="true" /> <!-- 容許訪問靜態方法,默認爲false --> <constant name="struts.ognl.allowStaticMethodAccess" value="true" />
ognl.xml:
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN" "http://struts.apache.org/dtds/struts-2.0.dtd"> <struts> <package name="ognl" extends="struts-default" namespace="/ognl"> <action name="ognl" class="org.credo.ognl.OgnlAction"> <result>/ognl/ognl.jsp</result> </action> </package> </struts>
ognl.jsp頁面:
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%> <%@ taglib uri="/struts-tags" prefix="s" %> <% String contextPath = request.getContextPath(); %> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <body> OGNL表達式是值s:property 中value中的表達式<br> 訪問值棧中的action的普通值:<s:property value="userName" /><br> 訪問值棧中的普通屬性(get,set方法):user.age--><s:property value="user.age"/> <br> user['age']---> <s:property value="user['age']"/> <br> user[\"age\"]---><s:property value="user[\"age\"]"/><br> 只有進行從其餘頁面傳參,才能夠.或者user在action中new.可是,不new,model user,必需要有默認的構造方法(參數爲空的)<br> <s:debug /><br> </body> </html>
action:
package org.credo.ognl; import com.opensymphony.xwork2.ActionSupport; public class OgnlAction extends ActionSupport{ /** * Ognl */ private static final long serialVersionUID = 1L; private String userName; private String passWord; private User user=new User(19); //private User user public OgnlAction(){ //構造方法 } public String execute(){ System.out.println("userName:"+userName); return SUCCESS; } //get and set
靜態類:
package org.credo.action.ognl; public class S { public static String STR = "STATIC STRING"; public static String s() { return "static method"; } }
頁面代碼:
訪問靜態都方法屬性,OGNL都是按@類名@方法名() @類名@屬性名 訪問靜態方法:<s:property value="@org.credo.action.ognl.S@s()"/> 訪問靜態屬性:<s:property value="@org.credo.action.ognl.S@STR"/> 訪問Math類的靜態方法:<s:property value="@@max(2,3)" />
<s:property value="new org.credo.action.ognl.User(9)"/>
頁面代碼:
<hr /> <li>訪問List:<s:property value="users"/></li> <li>訪問List中某個元素:<s:property value="users[1]"/></li> <!-- 下面是把每一個users裏的age取出,組成一個集合,大括號在OGNL裏能夠表明一個集合 --> <li>訪問List中元素某個屬性的集合:<s:property value="users.{age}"/></li> <!-- 第0個位置上的age.第一種不要用,須要用users[0].age --> <li>訪問List中元素某個屬性的集合中的特定值:<s:property value="users.{age}[0]"/> | <s:property value="users[0].age"/></li> <li>訪問Set:<s:property value="dogs"/></li> <!-- 不能夠取下標值 --> <li>訪問Set中某個元素:<s:property value="dogs[1]"/></li> <li>訪問Map:<s:property value="dogMap"/></li> <!-- 經過key獲取map的某個元素,用第一種最好 --> <li>訪問Map中某個元素:<s:property value="dogMap.dog101"/> | <s:property value="dogMap['dog101']"/> | <s:property value="dogMap[\"dog101\"]"/></li> <li>訪問Map中全部的key:<s:property value="dogMap.keys"/></li> <li>訪問Map中全部的value:<s:property value="dogMap.values"/></li> <li>訪問容器的大小:前爲map後爲list<s:property value="dogMap.size()"/> | <s:property value="users.size"/> </li> <hr />
後臺代碼:
import java.util.ArrayList; import java.util.HashMap; import java.util.HashSet; import java.util.List; import java.util.Map; import java.util.Set; import com.opensymphony.xwork2.ActionSupport; public class OgnlAction extends ActionSupport { private Cat cat; private Map<String, Dog> dogMap = new HashMap<String, Dog>(); private Set<Dog> dogs = new HashSet<Dog>(); private String password; private User user; private String username; private List<User> users = new ArrayList<User>(); public OgnlAction() { users.add(new User(1)); users.add(new User(2)); users.add(new User(3)); dogs.add(new Dog("dog1")); dogs.add(new Dog("dog2")); dogs.add(new Dog("dog3")); dogMap.put("dog100", new Dog("dog100")); dogMap.put("dog101", new Dog("dog101")); dogMap.put("dog102", new Dog("dog102")); } public String execute() { return SUCCESS; } public Cat getCat() { return cat; } public Map<String, Dog> getDogMap() { return dogMap; } public Set<Dog> getDogs() { return dogs; } public String getPassword() { return password; } public User getUser() { return user; } public String getUsername() { return username; } public List<User> getUsers() { return users; } public String m() { return "hello"; } public void setCat(Cat cat) { this.cat = cat; } public void setDogMap(Map<String, Dog> dogMap) { this.dogMap = dogMap; } public void setDogs(Set<Dog> dogs) { this.dogs = dogs; } public void setPassword(String password) { this.password = password; } public void setUser(User user) { this.user = user; } public void setUsername(String username) { this.username = username; } public void setUsers(List<User> users) { this.users = users; } }
dog.java
package org.credo.action.ognl; public class Dog { private String name; public Dog() { } public Dog(String name) { super(); this.name = name; } public String getName() { return name; } public void setName(String name) { this.name = name; } //重寫了toString方法 @Override public String toString() { return "dog: " + name; } }
結果如圖:
<!-- 正則表達式中,?表明過濾條件,^表明開始,$表明結束 --> <!-- 拿出age=1的users --> <li>投影(過濾):<s:property value="users.{?#this.age==1}[0]"/></li> <!-- 拿出age大於一的開頭的age --> <li>投影:<s:property value="users.{^#this.age>1}.{age}"/></li> <!-- 拿出age大於一的結尾的age --> <li>投影:<s:property value="users.{$#this.age>1}.{age}"/></li> <!-- 判斷age大於一的結尾是否存在,用來判斷這個集合裏是否有東西. --> <li>投影:<s:property value="users.{$#this.age>1}.{age} == null"/></li> <hr /> <!-- 用中括號訪問元素,訪問的是OGNL裏從上到下,某一個成員變量,會按順序找, --> <!-- 有可能有2個action在裏面的時候,如一個action跳到另外一個action,這個時候, --> <!-- 用[0]訪問,從上到下找,直到找到有值的. --> <li>[]:<s:property value="[0].username"/></li>
首先請下載Struts2的詳細標籤解釋的API文檔,CHM格式,裏面信息很是全面.是我見過的struts2最好的中文文檔之一.
http://download.csdn.net/detail/lioncredo/4183249
這裏列舉一些經常使用的tag進行復習.