八、Struts2之OGNL
2012-02-06 12:31
148 查看
一、OGNL概述
OGNL:Object Graph Naigation Language(对象图导航语言);前面我们学过EL也是表达式语言,而Struts2将OGNL作为默认的表达式语言;二、OGNL结构
OGNL的上下文是ActionContext,而OGNL的结构为:valuestack是OGNL上下文的根元素,此元素只是一个根对象,指向一个队列,队列的第一个元素叫做栈顶;
request表示HttpServletRequest的request对象;
session表示HttpSession的session对象;
application表示ServletContext对象;
parameters表示request.getParameter("...");
attr表示从page-->request-->session-->application搜寻对应的属性;
三、OGNL表达式
OGNL一般都需要和标签结合使用,最常用的就是<s:property value="OGNL表达式"/>1.访问valuestack
如果要访问valuestack对象中的属性,则可以直接写出属性访问,比如:Person类包含name、age属性,Student类包含name、score属性,如果在valuestack的列表中包含如下元素:
则通过 name 可以直接访问p1对象的name属性的值,即xiazdong;
如果是 score 则访问s1对象的score属性的值,即90;
在JSP中,如果想要访问valuestack的属性,则可以直接通过EL表达式:${}进行访问,因为struts2 将EL表达式进一步封装,如果${}时,当原来EL表达式返回null时,就访问valuestack;
结论:通过直接写出属性访问valuestack对应列表对象属性的搜索顺序是:从栈顶开始搜索,先搜索到的结果优先;
2.访问其他对象
访问除了valuestack的其他对象时,则需要以“#对象”进行访问;比如request.setAttribute("name","xiazdong");
则可以通过#request.name或#request['name']访问;
注意:
#对象['key']和#对象.key的应用场景:#对象.key在key存在特殊字符时不能用,只能用#对象['key'];
3.创建并访问List
创建List:{'elem1','elem2','elem3'};下面先介绍<s:if>、<s:set>、<s:iterator>、<s:property>标签;
(1)
<s:if test="判断条件">
语句
</if>
(2)<s:set var="obj" value="{'a','b','c'}"/>
没有设定scope属性,表示将{'a','b','c'}赋值给obj,并将obj对象访问ActionContext中,即如下图:
因此如果要访问obj,则通过#obj访问;
(3)
<s:iterator value="#obj">
//显示当前迭代元素;
</iterator>
iterator把当前迭代的元素放到valuestack栈顶;
(4)<s:property/>指定value值就不说了,如果没有指定value,表示显示valuestack栈顶的值;
应用1:迭代输出Action类中的List
因为lists放在valuestack中,因此只需要直接写属性名就可以访问;<s:iterator value="lists"> <s:property/> </s:iterator>
应用2:迭代输出JSP中创建的List
因为ls放在OGNLContext中,因此必须通过“#对象”访问;<s:set var="ls" value="{'a','b','c'}"></s:set> <s:iterator value="#ls"> <s:property/> </s:iterator>
子集
目的:取出某个集合的子集格式:lists.{条件}
在条件中的第一个字母:
(1)?:取出满足条件的全部元素;
(2)^:取出满足条件的第一个元素;
(3)$:取出满足条件的最后一个元素;
#this 表示当前迭代的元素;
lists.{?条件}表示满足条件的全部元素;
lists.{^条件}表示满足条件的第一个元素;
lists.{$条件}表示满足条件的最后一个元素;
比如:
List<String>lists;
则lists.{?#this.equals('a')}返回lists集合中等于a的子集;在这里#this表示队列的元素;
四、创建并访问Map
创建Map:#{'key1':'value1','key2':'value2'};应用1:迭代输出Action类中的Map
<s:iterator value="maps"> <s:property value="key"/>=<s:property value="value"/> </s:iterator>
应用2:迭代输出JSP创建的Map
<s:set var="mm" value="#{'a':'aa','b':'bb','c':'cc'}"></s:set> <s:iterator value="#mm"> <s:property value="key"/>=<s:property value="value"/> </s:iterator>
五、调用静态函数
前提:在struts.xml中配置常量:<constant name="struts.ognl.allowStaticMethodAccess" value="true" />格式:@类名@函数名(参数); 注意:类名必须是包括包名;
比如:@java.lang.String@format('a%s','b');
六、综合代码实例
index.jsp<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%@taglib prefix="s" uri="/struts-tags" %>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>My JSP 'index.jsp' starting page</title>
<meta http-equiv="pragma" content="no-cache">
<meta http-equiv="cache-control" content="no-cache">
<meta http-equiv="expires" content="0">
</head>
<body>
<%
request.setAttribute("age", 12);
pageContext.setAttribute("info", "page");
request.setAttribute("info", "page");
session.setAttribute("info", "page");
application.setAttribute("info", "page");
%>
name属性值:${name}<br />
<s:property value="name"/><br />
访问request属性值:<s:property value="#request.age"/><br />
访问attr的属性:<s:property value="#attr.info"/><br/>
<hr/>
迭代输出lists;
<s:iterator value="lists">
<s:property/>
</s:iterator>
<br/>
迭代输出在JSP中创建的list:
<s:set var="ls" value="{'a','b','c'}"></s:set>
<s:iterator value="#ls">
<s:property/>
</s:iterator>
<br/>
输出Action中的map:
<s:iterator value="maps"> <s:property value="key"/>=<s:property value="value"/> </s:iterator><br/>
输出JSP创建的map:
<s:set var="mm" value="#{'a':'aa','b':'bb','c':'cc'}"></s:set>
<s:iterator value="#mm">
<s:property value="key"/>=<s:property value="value"/>
</s:iterator>
<br/>
静态方法:<s:property value="@java.lang.String@format('a,%s','b')"/><br/>
子集:
<s:iterator value="lists.{?#this.equals('e1')}">
<s:property/>
</s:iterator>
</body>
</html>
OGNL01Action.java
package org.ognl.action; import java.util.ArrayList; import java.util.LinkedHashMap; import java.util.List; import java.util.Map; import com.opensymphony.xwork2.ActionSupport; public class OGNL01Action extends ActionSupport { private String name; private List<String> lists; private Map<String,String> maps; public String getName() { return name; } public void setName(String name) { this.name = name; } public String execute()throws Exception{ name="xiazdong"; lists = new ArrayList<String>(); lists.add("e1"); lists.add("e2"); lists.add("e3"); maps = new LinkedHashMap<String,String>(); maps.put("key1" ,"value1"); maps.put("key2" ,"value2"); maps.put("key3" ,"value3"); return SUCCESS; } public List<String> getLists() { return lists; } public void setLists(List<String> lists) { this.lists = lists; } public Map<String, String> getMaps() { return maps; } public void setMaps(Map<String, String> maps) { this.maps = maps; } }
相关文章推荐
- OGNL表达式struts2标签“%,#,$”
- struts2的OGNL表达式
- S7.1_Struts2_OGNL OGNL对象导航图范例&OGNL方法调用范例还有集合访问的范例
- S7.2_Struts2_OGNL OGNL表达式的投影和选择技术范例,OGNL表达式#和$符号的使用范例,以及值栈
- Struts2的OGNL表达式——1
- Struts2之OGNL
- struts2中的ognl详解
- [Struts2] Struts中OGNL
- Struts2中的OGNL详解
- struts2中的OGNL
- Struts2值栈和OGNL
- struts2 页面标签或ognl表达式取值--未完待续
- struts2复杂参数传值OGNL
- Struts2深入学习----OGNL表达式原理
- struts2基础学习五之OGNL表达式
- struts2 Ognl关键概念
- Struts2的OGNL标签详解
- Struts2中的OGNL表达式
- struts2 ognl 访问静态属性
- Struts2总结---OGNL表达式的基本语法和用法 (8)