1. 程式人生 > >OGNL與值棧

OGNL與值棧

屬性 odin t對象 tac 結構 lang 引用 format 標簽庫

一、OGNL入門

1、什麽是OGNL

  OGNL的全稱是對象圖導航語言(Object-Graph Navigation Language),它是一種功能強大的開源表達式語言。使用這種表達式語言,可以通過使用某種表達式語言,來存取Java對象的任意屬性,調用Java的方法,同時能夠自動實現必要的數據類型轉換,

2、OGNL的作用

  Struts2默認的表達式語言就是ognl表達式語言,該語句具有以下的特點

      • 支持對象方法的調用。例如:objectName.methodName().
      • 支持靜態方法調用和值訪問,表達式的格式為@[類全名]@[方法名 | 值名] 例如:@[email protected]
/* */(‘foo %s‘,‘bar‘)。
  • 支持賦值操作和表達式串聯。
  • 訪問OGNL上下文對象(OGNL Context)和ActionContext
  • 操作集合對象。
  • 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與值棧