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,谢谢~