OGNL基本使用
OGNL基本使用
基本介紹
OGNL是Object-Graph Navigation Language(對象圖導航語言)的縮寫,它是一種功能強大的表達式語言,通過簡單一致的表達式語法,可以存取對象的任何屬性,調用對象的方法,遍歷整個對象的結構圖,實現字段類型轉化等功能、它使用相同的表達式去存取對象的屬性。
Struts2框架使用OGNL作為默認的表達式語言
- OGNL是一種比EL強大很多倍的語言,支持對象方法調用,支持靜態方法和字段訪問,支持賦值操作等等。
- xwork提供了OGNL表達式。
- 其jar包為ognl-x.x.x.jar。
OGNL的要素
OGNL有三大要素,分別是表達式、根對象、Context對象。
表達式
表達式是整個OGNL的核心,OGNL會根據表達式去對象中取值。所有OGNL操作都是針對表達式解析后進行的。它表明了此次 OGNL 操作要做什么。表達式就是一個帶有語法含義的字符串,這個字符串規定了操作的類型和操作的內容。OGNL支持大量的表達式語法,不僅支持這種"鏈式"對象訪問路徑,還支持在表達式中進行簡單的計算。
要想使用OGNL表達式來輸出數據,需要借助struts2的標簽實現。
根對象(Root)
?????Root對象可以理解為OGNL的操作對象,表達式規定了"做什么",而Root對象則規定了"對誰操作"。OGNL稱為對象圖導航語 言,所謂對象圖,即以任意一個對象為根,通過OGNL可以訪問與這個對象關聯的其它對象。
Context對象
實際上OGNL的取值還需要一個上下文環境。設置了Root對象,OGNL可以對Root對象進行取值或寫值等操作,Root對象所在環境就是OGNL的上下文環境(Context)。上下文環境規定了OGNL的操作在哪里進行。上下文環境Context是一個Map類型的對象,在表達式中訪問Context中的對象,需要使用"# "號加上對象名稱,即#"對象名稱"的形式。
思維導圖
在Action中使用OGNL
// 訪問對象的方法@Testpublic void run1() throws OgnlException{OgnlContext context = new OgnlContext();// 獲取對象的方法Object obj = Ognl.getValue("'helloworld'.length()", context, context.getRoot());System.out.println(obj);}// 獲取OGNL上下文件的對象@Testpublic void run3() throws OgnlException{OgnlContext context = new OgnlContext();context.put("name", "美美");// 獲取對象的方法Object obj = Ognl.getValue("#name", context, context.getRoot());System.out.println(obj);}// 從root棧獲取值@Testpublic void demo3() throws OgnlException{OgnlContext context = new OgnlContext();Customer c = new Customer();c.setCust_name("haha");context.setRoot(c);String name = (String) Ognl.getValue("cust_name", context, context.getRoot());System.out.println(name);}
在頁面中使用OGNL
Struts2引入了OGNL表達式,主要是在JSP頁面中獲取值棧中的值。
使用步驟
- 需要先引入Struts2的標簽庫
-
- <%@ taglib prefix="s" uri="/struts-tags" %>
- 使用Struts2提供的標簽庫中的標簽
-
- <s:property value="OGNL表達式"/>
案例
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ taglib uri="/struts-tags" prefix="s" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>OGNL表達式的最基本使用</title>
</head>
<body>
<%--1、輸出一個字符串到瀏覽器上。需要借助于struts2的標簽來輸出<s:property value="" />它的作用就是把value屬性的取值所對應的內容輸出到瀏覽器上value屬性取值是一個OGNL表達式--%>01.<s:property value="OGNLExpression"/>
<hr/>
<%--2、使用s:property標簽把OGNLExpression輸出到瀏覽器上把一個OGNL表達式強制看成是一個普通字符串:簡單寫法:用引號擴起來。到底使用單引號還是雙引號是由外層引號決定的。標準寫法:用%{''}或%{""}把表達式括起來,強制轉成字符串。
--%>02.<s:property value='%{"OGNLExpression4"}'/>
<hr/>
<%--3、獲取OGNLExpression字符串的長度。需要使用s:property標簽OGNL表達式非常的靈活,他可以支持普通方法的調用。--%>03.<s:property value="'OGNLExpression'.length()"/>
<hr/>
<%--4、OGNL表達式支持訪問靜態成員:靜態變量:書寫要求: @包名.包名..類名@屬性名稱靜態方法:書寫要求: @包名.包名..類名@方法名稱Struts2框架默認是不支持訪問靜態方法的。要想支持訪問,需要開啟。開啟的方式就是在配置文件中配置。在struts.xml中配置<!-- 開啟OGNL的靜態方法訪問 --><constant name="struts.ognl.allowStaticMethodAccess" value="true"></constant>
--%>04.<s:property value="@java.lang.Integer@MAX_VALUE"/><br/>05.<s:property value="@java.lang.Math@random()"/>
<hr/>
<%--5、OGNL表達式可以操作集合:List/Map --%>使用原始的表單輸出一組性別的單選按鈕:<br/>性別:<input type="radio" name="gender" value="男"/>男<input type="radio" name="gender" value="女"/>女<br/>使用struts2的表單標簽輸出一組性別單選按鈕<br/><%--s:radio標簽的list屬性取值是一個OGNL表達式。{}就相當于創建了一個集合:List gender = new ArrayList();{'男','女'}就相當于gender.add("男");gender.add("女");當服務器運行時,會把list的取值遍歷生成<input type="radio"/>--%><s:radio list="{'男','女'}" name="gender" label="性別"></s:radio><hr/>使用原始的表單輸出一組性別的單選按鈕:<br/>性別:<input type="radio" name="gender" value="male"/>男<input type="radio" name="gender" value="female"/>女<br/>使用struts2的表單標簽輸出一組性別單選按鈕<br/><%--#{'male':'男','female':'女'}就相當于創建了一個Map注意:使用OGNL創建map,必須是#{key:value,key:value}--%><s:radio list="#{'male':'男','female':'女'}" name="gender" label="性別"></s:radio>
</body>
</html>
總結
- 上一篇: Function!(计蒜客 - 4238
- 下一篇: #4604. The kth maxim