OGNL與值棧
一、OGNL入門
1、什麽是OGNL
OGNL的全稱是對象圖導航語言(Object-Graph Navigation Language),它是一種功能強大的開源表達式語言。使用這種表達式語言,可以通過使用某種表達式語言,來存取Java對象的任意屬性,調用Java的方法,同時能夠自動實現必要的數據類型轉換,
2、OGNL的作用
Struts2默認的表達式語言就是ognl表達式語言,該語句具有以下的特點
-
-
- 支持對象方法的調用。例如:objectName.methodName().
- 支持靜態方法調用和值訪問,表達式的格式為@[類全名]@[方法名 | 值名] 例如:@[email protected]
-
3、OGNL表達式的要素
(1)表達式
表達式是整個OGNL表達式的核心,OGNL會根據表達式中的對象去取值。
(2)根元素(root)
root元素可以理解為OGNL表達式要操作的對象
(3)context
context對象中保存了對象的引用的map集合
4、OGNL表達式實例
使用OGNL表達式獲取字符串的長度
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <%--要使用struts2標簽,必須要引入struts2標簽庫 --%> <%@ 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=UTF-8"> <title>Insert title here</title> </head> <body> <%-- 1、ognl表達式必須要在struts2標簽中使用 2、在ognl表達式中可以直接調用Java的方法 3、value的值就是ognl表達式 --%> <s:property value="‘hello ongl‘.length()"/> </body> </html>
二、struts2的值棧
1、什麽是值棧
值棧(ValueStack)是Struts的一個接口,ognlValueStack是該接口的一個實現類,客戶端發起一個action請求時會創建一個action實例同時也會創建一個值棧實例,該值棧貫穿整個Action的生命周期,struts2使用ognl將請求action的參數封裝為對象存儲到值棧中去,並通過ognl表達式去讀取值棧中對象屬性的值
2、Struts2 與值棧
在struts2裏面提供本身一種存儲機制,類似於域對象,是值棧,可以存值和取值。
(1)在action裏面把數據放到值棧裏面,在頁面中獲取到值棧數據
3、Action與Servlet的不同點
(1)Servlet:默認在第一次訪問時候創建,創建一次,單實例對象
(2)Action:訪問時候創建,每次訪問action時候,都會創建action對象,創建多次,多實例對象
4、值棧的存儲位置
(1)值棧存儲在Action對象中,
(2)在每個action對象裏面都會有一個值棧對象(只有一個)
5、值棧的內部結構
可以使用struts2的<debug>標簽來查看值棧的內部結構
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <%@ 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=UTF-8"> <title>Insert title here</title> </head> <body> <s:debug></s:debug> </body> </html>
通過該標簽查看到的結構如下圖:
說明:在圖中可以看到該值棧中有兩塊數據,一個是root,一個是context。
(1)在我們的使用中一般都是操作root,操作context比較少。
(2)root的內部結構是list結合,context內部的結構是map集合。
(3)context中主要存儲的是一些對象的引用。
OGNL與值棧