JavaWeb框架_Struts2_(四)----->表達式語言OGNL

来源:http://www.cnblogs.com/Mairr/archive/2017/12/02/7954051.html
-Advertisement-
Play Games

1. 表達式語言OGNL OGNL簡介 OGNL基本語法 常量 操作符 OGNL表達式 OGNL基礎 OGNL上下文 OGNL值棧 OGNL的訪問 常量 操作符 OGNL表達式 OGNL上下文 OGNL值棧 OGNL的訪問 2. 具體內容 2.1 OGNL簡介 OGNL(Object-Graph N ...


1. 表達式語言OGNL

 

  • OGNL簡介
  • OGNL基本語法
    • 常量
    • 操作符
    • OGNL表達式
  • OGNL基礎
    • OGNL上下文
    • OGNL值棧
    • OGNL的訪問

 

2. 具體內容

 

2.1 OGNL簡介

 

  OGNL(Object-Graph Navigation Language)對象圖導航語言的縮寫,OGNL是一種表達式語言(Expression Language, EL)。可以存取對象的任意屬性,調用對象的方法,遍歷整個對象的結構圖,實現欄位類型轉化等功能。

  OGNL是一種對java對象的getter和setter屬性的表示和綁定語言。通常,OGNL使用簡單一致的表達式語法去存取對象的屬性。

 

2.2 OGNL基本語法

 

2.2.1 常量

 

  • 字元串常量:以單引號或雙引號括起來的字元串。支持轉義字元"\";
  • 字元常量:以單引號括起來的字元,例如'C';
  • 數值常量:java中的int、long、float和double;
  • 布爾常量:true和false;
  • null常量。

  JSP頁面中輸出常量的示例代碼如下:

<%@ taglib prefix="s" uri="/struts-tags" %>            <!--加入Struts2的標簽庫-->


  <s:property value = "'you said,\"Hello World\".'"/><br>
  <s:property value = "true"/><br>
  <s:property value = "null"/><br>
  <s:property value = "12.3f"/>

 

2.2.2 操作符

 

  OGNL的逗號支持所有的Java操作符(+、-、*、/、++、--、!=、==、=等)與java類似還提供了一些特有的操作符號。下麵介紹OGNL的一些特有的操作符號。

 

1. 逗號(,)或序列操作符

  逗號被用來分隔兩個或者多個獨立的表達式,整個表達式的值是最後一個表達式的值;例如:

  team1.person.name, team2.teamname;

  整個表達式的值是第二個表達式的值。

 

2. 大括弧操作符{};

  大括弧操作符用於創建表(數組)。使用大括弧將元素括起來,元素之間使用逗號分隔開。例如:

  {"mayun","liyanhong","mahuateng"}[1];

  此表達式創建了一個帶有三個元素的列表,並且訪問其中第二個元素,在JSP頁面中輸出第二個元素值的代碼如下:

 <s:property value="{'mayun','liyanhong','mahuateng'}[1]"/>

 

3. in和not in的操作符

  in和not in用來判斷一個值是否屬於一個集合中。例如:

  teamname in {'team1','team2'};

  此表達式判斷teamname是否在數組{'team1','team2'}中,在返回true,不在返回false。

 

2.2.3 OGNL表達式

 

  使用OGNL表達式可以訪問屬性、方法、靜態屬性和方法、構造方法、數組以及集合等。

 

1. 訪問屬性

  OGNL訪問屬性示例代碼如下:

<!--訪問屬性-->
<s:property value = "uname"/>

<!--訪問對象屬性(get和set)--> <s:property value = "user.age"/> <s:property value = "employee.manager.uname"/>

 

2. 訪問方法

  OGNL訪問方法示例代碼如下:

<!--訪問對象的方法-->
<s:property value = "employee.eat()"/>
<!--訪問action的方法-->
<s:property value = "add()"/>

 

3. 訪問靜態屬性和方法

  OGNL支持調用類中的靜態方法和靜態欄位,可以使用如下語法格式:@class@method(args);@class@field;其中,class必須給出完整的類名,如@java.lang.String@valueOf(5)。如果省略class,則預設使用類java.lang.Math。示例代碼如下:

<!--訪問靜態方法-->
<s:property value = "@com.my.ognl.StaticSample@ma()"/>
<!--訪問靜態屬性-->
<s:property value = "@com.my.ognl.StaticSample@STR"/>
<!--訪問Math的靜態方法-->
<s:property value = "@@max(4,7)"/>

  需要註意的是,在配置文件(Struts.xml)中,添加如下常量(夾在<struts>標簽中,<package>標簽上方),OGNL才能訪問靜態屬性和方法:

<constant name = "Struts.ognl.allowStaticMethodAccess" value = "true"/>

  如下圖所示:

 

4. 訪問構造方法

  OGNL訪問構造方法的示例代碼如下:

<!--訪問構造方法-->
<s:property value = "new com.my.org.User(44)"/>

 

5. 訪問集合和數值

  可以使用OGNL語言直接生成集合元素(如List對象或Map對象);利用下式代碼可以直接生成一個List對象:

  {e1,e2,e3};

  可以使用如下代碼直接生成一個Map對象:

  # {key1:value1 , key2:value2 , key3:value3};

  Map集合對象,使用key-value格式定義,每個key-value元素使用冒號標識,多個元素之間採用逗號隔開。對於集合類型OGNL可以使用in和not in兩個元素符號,判斷元素是否在指定的集合內。

  需要註意的是,OGNL能夠引用集合的一些特殊的屬性,這些屬性不是JavaBeans模式,如size。當表達式引用這些屬性時, OGNL 會調用相應的方法,這就是偽屬性。

  OGNL中特殊的集合偽書性如下表所示:

集合類型 偽屬性 OGNL表達式 Java代碼
List,Set,Map size;isEmpty list.size;set.isEmpty list.size();set.isEmpty
List,Set iterator list.iterator;set.iterator list.iterator();set.iterator()
Map keys,values map.keys;map.values map.keySet();map.values()
Iterator next,hasNext it.next;it.hasNext it.next();it.hasNext()

 

6. 投影

  OGNL中提供了一種簡單的方式在一個集合中對每一個元素調用相同的方法,或抽取相同的屬性,並將結果保存為一個新的集合,稱為投影。

  假設employees是一個包含了employee對象的列表,那麼:

 # employees.{name}    // 表示返回所有雇員的名字的列表

  在投影期間,使用 # this變數來引用迭代中的當前元素。例如:

  Object.{#this instanceof String? #this: #this.toString()}

 

7. 選擇

  OGNL提供了一種簡單的方式來使用表達式從集合中選擇某些元素,並將結果保存到新的集合中,稱為選擇。其中選擇表達式中的關於選擇的特殊字元說明如下:

  • ?:選取匹配邏輯的所有元素;
  • ^:選取匹配選擇邏輯的第一個元素;
  • $:選取匹配的最後一個元素;

  示例代碼如下:

  <!--將返回薪水大於3000雇員的列表-->
  # employees.{?#this.salary > 3000}
<!--將返回第一個薪水大於3000的雇員--> # employees.{^#this.salary > 3000}
<!--將返回最後一個薪水大於3000的雇員--> # employees.{$#this.salary > 3000}

 

8. OGNL表達式符號

  在Struts2 OGNL中的#和%符號用法說明如下:

(1) #符號

  • 訪問非根對象屬性,如 #session.msg表達式,# 相當於ActionContext.getContext();
  • 用於選擇和投影集合,如person.{?#this.age>30};
  • 用來構造Map集合,如 #{0:男,1:女}

(2) %符號

  %符號的用途是,在標誌的屬性為字元串類型時,計算OGNL表達式的值。例如,下麵的代碼所示:

  <s:set name = "foobar" value="# {'foo1':'bar','foo2':'bar2'}"/>
  <s:url value="%{#foobar['fool']}"/>

 

2.3 OGNL基礎

 

2.3.1 OGNL上下文

 

  OGNL的計算都是圍繞上下文進行的,OGNL上下文實際上就是一個Map對象,由ognl.OgnlContext類(實現了java. util. Map介面)來表示。

  Struts2將OGNLContext設置為ActionContext,即在Struts2中OGNL上下文(Context)的實現為ActionContext。Struts2將ValueStack(值棧)作為OGNL的根對象。

  當Struts2接受一個請求時,會迅速創建ActionContext(上下文),ValueStack(值棧),action。然後把action存進ValueStack,所以action的實例變數可以被OGNL訪問。在Struts2中,OGNL表達式需要配合Struts2標簽才可以使用,如下所示:

 <s:property value = "uname"/>

 

2.3.2 值棧

 

  值棧作為OGNL的根對象(root對象),類似於正常的棧,符合”後進先出“的特點,可以在值棧中放入、刪除、查詢對象,值棧是Struts2的核心。

  如果要訪問根對象(即ValueStack)中的對象的屬性,則可以省略 # 命名空間,直接訪問該對象的屬性既可。如下,讀取棧中的數據。

  <!--按照後進先出的方式,讀取棧中元素-->
  <s:property value="#root[0].loginname"/>
  <s:property value="#root[1].loginname"/>
  <s:property value="#root[2].loginname"/>

 

2.3.3 OGNL的訪問

 

  由於ValueStack是Struts2中的OGNL的根對象。如果用戶需要訪問值棧中的對象,在JSP頁面可以通過輸入如下表達式語言(EL)訪問ValueStack中對象的屬性:

  <!--獲得值棧中某個對象的foo屬性-->
  $ {foo}
  
  <!--也可以通過Struts標簽訪問ValueStack中的對象-->
  <s:property value="foo"/>

  如果訪問其他Context中的對象,由於它們不是根對象,所以在訪問時,需要添加 # 首碼。具體如下:

  1. application對象:用於訪問ServletContext,如 # application.userName 或者 # application['userName'],相當於調用了ServletContext 的 getAttribute("username");
  2. session對象:用來訪問HttpSession,如 # session.userName 或者 # session['userName'],相當於調用了session .getAttribute('userName');
  3. request對象:用來訪問HttpServletRequest屬性的Map,如 # request.userName 或者 # request['userName'],相當於調用request.getAttribute("userName");
  4. parameters對象:用來訪問HTTP的請求參數,如 # parameters.userName 或者 # parameters['userName'],相當於調用 requst.getParameter("userName")。

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • Mojo: Maven plain Old Java Object 1、插件命名規則:maven-<yourplugin>-plugin是Maven的保留欄位,不允許使用,我們可以用<myplugin>-maven-plugin來命名自己開發的插件。 2、自定義插件代碼,註意pom文件的packag ...
  • java學習資料,僅供學習交流,自行取用↓ 鏈接:https://pan.baidu.com/s/1dF1wCST 密碼:i75g ...
  • 創建原型模板 1、在空目錄運行archetype:generate上面的命令,待下載完必要的jar包後,首先需要輸入內置的原型編號; 2、輸入任意編號後,繼續下載必要jar包,之後要求分別輸入groupId,artifactId,version,package,並確認 3、瀏覽Maven工程 4、內 ...
  • 在php官方文檔里有這麼一段: 代碼輸出結果如下: I am bar.I am bar.. 結果輸出了: I am bar.I am bar.you yyy. 確認 $foo->$baz[2] 即為 $foo->baz, 同理 $foo->$baz[1] 即 $foo->bar, 那麼第八行這裡 $ ...
  • 首先要說的是django與其他的框架不同,django是一個封裝的及其完善的框架,我們使用django也不會像之前寫學生系統那樣,django操作資料庫使用自帶的ORM來進行操作,Torando與Flask的資料庫使用就很自由(當然也可以使用我們之前的SQL helper),並且Flask的模板都不 ...
  • 操作系統 : CentOS7.3.1611_x64 go語言版本:1.8.3 linux/amd64 db2版本: db2_v101_linuxx64_expc 問題描述 怎麼使用go語言在CentOS環境下操作db2資料庫? 解決方案 go語言操作資料庫相關信息可以參考如下鏈接: https:// ...
  • 1、使用final關鍵詞修飾一個變數時,是引用不能變,還是引用的變數不能變? 使用final關鍵字修飾一個變數時,是指引用變數不能變,引用變數所指向的對象中的內容還是可以改變的。例如,對於如下語句:final StringBuffer a=new StringBuffer("immutable"); ...
  • 自定義模塊 模塊由什麼組成 npm 如何發佈自己的模塊 常見的命令: require 引入模塊 exports 輸出模塊 (想對外輸出東西時,必須加上exports) module.exports 批量輸出模塊 require 1.有‘./’ 從當前目錄中招 2.沒有‘./’ 先從系統模塊找,再從n ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...