Struts2的OGNL和JSTL一样,都是一种表达式语言。今天我就系统的将OGNL表达式语言总结一下。
OGNL全拼指得是“Object-GraphNavigation Language”.OGNL表达式语言看起来很简单,可是用途却很强大。OGNL表达式用来取存贮在值栈(ValueStatck)和ActionContext中的值(注意值栈是Struts2的根对象,并且值栈是隶属于ActionContext的)。取存在值栈中的值时可以直接去取。当去取存贮在ActionContext中的值则需要以“#objectName”的形式取值。而在此本人特别需要说明的是action中的变量是在值栈中的,因此你只需要直接去取值就可以了。
首先建一个action文件OgnlAction.java,在这个action文件中分别建了String类型的数组,一个List对象,一个Map对象,一个User类实例,一个返回类型为String的方法。通过这些对象,让我们分别用OGNL表达式语言访问他们,代码如下所示:
packagecom.iman.action;
importjava.util.ArrayList;
importjava.util.HashMap;
importjava.util.List;
importjava.util.Map;
importcom.iman.model.User;
importcom.opensymphony.xwork2.ActionSupport;
public classOgnlAction extends ActionSupport {
private String[] accessString;
private List<String> list;
private Map<Integer,String> map;
private User user;
public String accessObject(){
user=new User();
user.setUsername("Jack");
user.setSex("man");
return "user";
}
public String accessMethod(){
return "好好学习,天天进步!";
}
public String accessString(){
accessString=newString[]{"张三","李四","王五"};
return "string";
}
public String accessList(){
list=newArrayList<String>();
list.add("杨过");
list.add("郭靖");
list.add("乔峰");
return "list";
}
public String accessMap(){
map=new HashMap<Integer,String>();
map.put(new Integer(1),"天龙八部");
map.put(new Integer(2),"神雕侠侣");
map.put(new Integer(3),"射雕英雄传");
return "map";
}
@Override
public String execute() throwsException {
// TODO Auto-generated methodstub
return SUCCESS;
}
public String[] getAccessString() {
return accessString;
}
public void setAccessString(String[]accessString) {
this.accessString =accessString;
}
public List<String> getList() {
return list;
}
public void setList(List<String>list) {
this.list = list;
}
public Map<Integer, String>getMap() {
return map;
}
public void setMap(Map<Integer,String> map) {
this.map = map;
}
public User getUser() {
return user;
}
public void setUser(User user) {
this.user = user;
}
}首先用OGNL表达式直接访问Action中类的属性,用<s:property/>直接输出,页面如下所示:
<%@ page language="java"contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib prefix="s"uri="/struts-tags" %>
<!DOCTYPE html PUBLIC "-//W3C//DTDHTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type"content="text/html; charset=UTF-8">
<title>取对象</title>
</head>
<body>
姓名:<s:property value="user.username"/><br>
性别:<s:property value="user.sex"/>
</body>
</html>对于action中类的对象,如果想访问它的属性则只需要用“对象.属性”的形式就可以了。
打开服务器,在地址栏输入http://localhost:8000/Struts2Tutorial/accessObject,页面如下所示:

下面来用OGNL表达式语言直接访问action中的方法,jsp页面如下所示:
<%@ page language="java"contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib prefix="s"uri="/struts-tags" %>
<!DOCTYPE html PUBLIC "-//W3C//DTDHTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type"content="text/html; charset=UTF-8">
<title>访问方法</title>
</head>
<body>
毛主席教育我们:<s:property value="accessMethod()"/>
</body>
</html>在地址栏输入http://localhost:8000/Struts2Tutorial/accessMethod,页面如下所示:

可以看出accessMethod()是accessMethod中的一个方法,可以直接调用。
下面来看看用OGNL表达式语言访问数组的情况,jsp页面如下所示:
<%@ page language="java"contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib prefix="s"uri="/struts-tags" %>
<!DOCTYPE html PUBLIC "-//W3C//DTDHTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type"content="text/html; charset=UTF-8">
<title>数组</title>
</head>
<body>
姓名:<s:property value="accessString"/><br>
人数:<s:property value="accessString.length"/><br>
取第一个人姓名:<s:property value="accessString[0]"/><br>
值栈第一个数组:<s:property value="[0].accessString"/><br>
使用top关键字:<s:property value="top.accessString"/>
</body>
</html>我们说过了Action上下文中的对象位于值栈中,所以可以直接访问。而“accessString[0]”则迭代输出数组的第一个元素。“[0].accessString”则表示输出栈顶的第一个元素。因为我们的这个元素位于栈顶,所以可以以“[0]”的方式访问,如果处于第二位的时候则是用“[1]”的方式取值,依次类推。我们也可以用“top”的关键字直接访问栈顶的元素。
打开服务器并部署项目,在地址栏输入:http://localhost:8000/Struts2Tutorial/accessString,页面如下所示:

下面用OGNL表达式访问List集合,jsp页面如下所示:
<%@ page language="java"contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib prefix="s"uri="/struts-tags" %>
<!DOCTYPE html PUBLIC "-//W3C//DTDHTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type"content="text/html; charset=UTF-8">
<title> list集合</title>
</head>
<body>
姓名:<s:property value="list"/><br>
人数:<s:property value="list.size"/><br>
取第一个人姓名:<s:property value="list[0]"/><br>
值栈第一个集合:<s:property value="[0].list"/><br>
使用top关键字:<s:property value="top.list"/>
</body>
</html>在地址栏输入:http://localhost:8000/Struts2Tutorial/accessList,页面如下所示:

可以看出集合与数组没有什么区别。
下面来看看用OGNL表达式语言访问Map对象的情况,jsp页面如下所示:
<%@ page language="java"contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib prefix="s"uri="/struts-tags" %>
<!DOCTYPE html PUBLIC "-//W3C//DTDHTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type"content="text/html; charset=UTF-8">
<title>取Map对象</title>
</head>
<body>
小说列表:<s:property value="map"/><br>
小说数量:<s:property value="map.size"/><br>
取第一本小说:<s:property value="map[1]"/><br>
值栈第一个数组:<s:property value="[0].accessString"/><br>
使用top关键字:<s:property value="top.accessString"/>
</body>
</html>在地址栏输入:http://localhost:8000/Struts2Tutorial/accessMap ,页面如下所示:

由于Map是以“key-value”的形式存在的,所以输出也是以“key-value”的形式输出的。
当想输出某一个值时则是以“对象[key]”的形式输出的。当我试图以能像数组、list那样用[0],top从值栈取值时,发现并不能这样取值。
好了,就研究这么多了,估计也差不多了,其实更多的我想是分清是从值栈取值还是从ActionContext中取值,这个分清了也就没什么问题了。
最后附上struts.xml配置文件中的内容:
<action name="accessString" class="com.iman.action.OgnlAction" method="accessString">
<result name="string">/ognl/accessString.jsp</result>
</action>
<action name="accessList" class="com.iman.action.OgnlAction" method="accessList">
<result name="list">/ognl/accessList.jsp</result>
</action>
<action name="accessMethod" class="com.iman.action.OgnlAction">
<result name="success">/ognl/accessMethod.jsp</result>
</action>
<action name="accessObject" class="com.iman.action.OgnlAction" method="accessObject">
<result name="user">/ognl/accessObject.jsp</result>
</action>
<action name="accessMap" class="com.iman.action.OgnlAction"method="accessMap">
<result name="map">/ognl/accessMap.jsp</result>
</action>
这是本人学习的结果,欢迎转载,欢迎交流,但转载务必给出本文章的链接地址:http://blog.csdn.net/youqishini/article/details/7075582,谢谢~