OGNL(Object Graph Navigation Language)對象圖導航語言,以下為演示代碼。
OgnlAction.java
package com.bebig.struts2.ognl;
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 String username;
private String password;
private User user;
private Cat cat;
private List<User> users = new ArrayList<User>();
private Set<Dog> dogs = new HashSet<Dog>();
private Map<String,Dog> dogMap = new HashMap<String,Dog>();

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("dog200", new Dog("dog200"));
dogMap.put("dog300", new Dog("dog300"));
}
@Override
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 "m method";
}

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;
}
}
package com.bebig.struts2.ognl;

public class User
{
private int age = 8;
public User()
{
}
public User(int age)
{
super();
this.age = age;
}

public void setAge(int age)
{
this.age = age;
}

public int getAge()
{
return age;
}
@Override
public String toString()
{
return "user's age is "+age;
}
}
package com.bebig.struts2.ognl;

public class Cat
{
private Dog friend;

public void setFriend(Dog friend)
{
this.friend = friend;
}

public Dog getFriend()
{
return friend;
}

public String sayHi()
{
return "miaomiao";
}
}
package com.bebig.struts2.ognl;

public class Dog
{
private String name;

public Dog()
{
}

public Dog(String name)
{
this.name = name;
}

public void setName(String name)
{
this.name = name;
}

public String getName()
{
return name;
}
@Override
public String toString()
{
return "Dog's name is " + name;
}
}
package com.bebig.struts2.ognl;
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 OgnlAction2 extends ActionSupport
{
private String username;
private String password;
private User user;
private Cat cat;
private List<User> users = new ArrayList<User>();
private Set<Dog> dogs = new HashSet<Dog>();
private Map<String,Dog> dogMap = new HashMap<String,Dog>();

public OgnlAction2()
{
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("dog200", new Dog("dog200"));
dogMap.put("dog300", new Dog("dog300"));
}
@Override
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 "m method";
}

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;
}
}
package com.bebig.struts2.ognl;

public class test
{
public static String STR = "This is a static field.";

public static String s()
{
return "This is a static method.";
}
}
<?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>
<!-- 允許訪問靜態方法,Struts2.2.1默認為false,改變值后,需要重新布署或者重啟服務才能生效 -->
<constant name="struts.ognl.allowStaticMethodAccess" value="true" />
<package name="ognl" namespace="/ognl" extends="struts-default">
<action name="ognl" class="com.bebig.struts2.ognl.OgnlAction">
<result>/ognl.jsp</result>
</action>
<action name="ognl2" class="com.bebig.struts2.ognl.OgnlAction2">
<result type="chain">ognl</result>
</action>
</package>
</struts>
<?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>
<constant name="struts.devMode" value="true" />
<include file="/com/bebig/struts2/ognl/ognl.xml"></include>
</struts>
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
version="2.5">
<filter>
<filter-name>struts2</filter-name>
<filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>struts2</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<welcome-file-list>
<welcome-file>index.html</welcome-file>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>
</web-app>index.jsp

<%
@ page language="java" contentType="text/html; charset=GB18030"
pageEncoding="GB18030"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=GB18030">
<title>Insert title here</title>
<%
String path = request.getContextPath();
String basePath = request.getScheme() + "://"
+ request.getServerName() + ":" + request.getServerPort()
+ path + "/";
%>
<base href="<%=basePath%>" />
</head>
<body>
<ol>
<li><a href="ognl/ognl?username=Don&password=123&cat.friend.name=oudy&user.age=27">訪問OGNL(只有一個Action)</a></li>
<li><a href="ognl/ognl2?username=Don&password=123&cat.friend.name=oudy&user.age=27">訪問OGNL2(存在多個Action)</a></li>
</ol>
</body>
</html>
<%
@ page language="java" contentType="text/html; charset=GB18030"
pageEncoding="GB18030"%>
<%
@taglib uri="/struts-tags" prefix="s"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=GB18030">
<title>OGNL</title>
</head>
<body>
<ol>
<li>訪問值棧中的action的普通屬性: <s:property value="username" /> | <s:property
value="password" />
</li>
<li>
訪問值棧中對象的普通屬性(get set方法):<s:property value="user.age"/>
</li>
<li>
訪問值棧中對象的普通屬性(get set方法):
<s:property value="cat.friend.name" />
</li>
<li>訪問值棧中對象的普通方法:<s:property value="password.length()" /></li>
<li>訪問值棧中對象的普通方法:<s:property value="cat.sayHi()"/></li>
<li>訪問值棧中action的普通方法:<s:property value="m()"/></li>
<hr />
<li>訪問靜態方法:<s:property value="@com.bebig.struts2.ognl.test@s()"/></li>
<li>訪問靜態屬性:<s:property value="@com.bebig.struts2.ognl.test@STR"/></li>
<li>訪問Math類的方法:<s:property value="@@max(2,3)"/></li>
<hr />
<li>訪問普通類的構造方法:<s:property value="new com.bebig.struts2.ognl.User(8)"/></li>
<hr>
<li>訪問List:<s:property value="users"/></li>
<li>訪問List中某個元素:<s:property value="users[2]"/></li>
<li>訪問List中元素某個屬性的集合:<s:property value="users.{age}"/></li>
<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>
<li>訪問Map中某個元素:<s:property value="dogMap.dog100"/> | <s:property value="dogMap['dog100']"/> | <s:property value="dogMap[\"dog100\"]"/> </li>
<li>訪問Map中所有的Key:<s:property value="dogMap.keys"/></li>
<li>訪問Map中所有的Value:<s:property value="dogMap.values"/></li>
<li>訪問容器的大小:<s:property value="dogMap.size()"/> | <s:property value="users.size" /> </li>
<hr>
<li>投影(過濾):<s:property value="users.{?#this.age==1}.{age}[0]"/></li>
<li>投影:<s:property value="users.{^#this.age>1}.{age}"/></li>
<li>投影:<s:property value="users.{$#this.age>1}.{age}"/></li>
<li>投影:<s:property value="users.{$#this.age>1}.{age}==null"/></li>
<hr>
<li>[]:<s:property value="[0].users"/></li>
</ol>
<s:debug></s:debug>
</body>
</html>
