一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|JAVA教程|ASP教程|

服務器之家 - 編程語言 - JAVA教程 - 在Java的Struts框架中ONGL表達式的基礎使用入門

在Java的Struts框架中ONGL表達式的基礎使用入門

2020-03-03 20:01浮云中的毛驢 JAVA教程

這篇文章主要介紹了深入解析在Java的Struts框架中ONGL表達式的基礎使用入門,Struts框架是Java的SSH三大web開發框架之一,需要的朋友可以參考下

首先了解下OGNL的概念:
OGNL是Object-Graph Navigation Language的縮寫,全稱為對象圖導航語言,是一種功能強大的表達式語言,它通過簡單一致的語法,可以任意存取對象的屬性或者調用對象的方法,能夠遍歷整個對象的結構圖,實現對象屬性類型的轉換等功能。

此外,還得先需弄懂OGNL的一些知識:
1.OGNL表達式的計算是圍繞OGNL上下文進行的。
OGNL上下文實際上就是一個Map對象,由ognl.OgnlContext類表示。它里面可以存放很多個JavaBean對象。它有一個上下文根對象。
上下文中的根對象可以直接使用名來訪問或直接使用它的屬性名訪問它的屬性值。否則要加前綴“#key”。

2.Struts2的標簽庫都是使用OGNL表達式來訪問ActionContext中的對象數據的。如:<s:propertyvalue="xxx"/>。

3.Struts2將ActionContext設置為OGNL上下文,并將值棧作為OGNL的根對象放置到ActionContext中。

4.值棧(ValueStack) :
可以在值棧中放入、刪除、查詢對象。訪問值棧中的對象不用“#”。
Struts2總是把當前Action實例放置在棧頂。所以在OGNL中引用Action中的屬性也可以省略“#”。

5.調用ActionContext的put(key,value)放入的數據,需要使用#訪問。


OGNL中重要的3個符號:#、%、$:
#、%和$符號在OGNL表達式中經常出現,而這三種符號也是開發者不容易掌握和理解的部分,需要時間的積累才漸漸弄清楚……
1.#符號
#符號的用途一般有三種。

訪問非根對象屬性,例如#session.msg表達式,由于Struts 2中值棧被視為根對象,所以訪問其他非根對象時,需要加#前綴。實際上,#相當于ActionContext. getContext();#session.msg表達式相當于ActionContext.getContext().getSession(). getAttribute("msg") 。

用于過濾和投影(projecting)集合,如persons.{?#this.age>25},persons.{?#this.name=='pla1'}.{age}[0]。

用來構造Map,例如示例中的#{'foo1':'bar1', 'foo2':'bar2'}。

2.%符號
%符號的用途是在標志的屬性為字符串類型時,計算OGNL表達式的值,這個類似js中的eval,很暴力。
3.$符號
$符號主要有兩個方面的用途。

在國際化資源文件中,引用OGNL表達式,例如國際化資源文件中的代碼:reg.agerange=國際化資源信息:年齡必須在${min}同${max}之間。

在Struts 2框架的配置文件中引用OGNL表達式,例如:

?
1
2
3
4
5
6
7
8
9
<validators> 
  <field name="intb"> 
      <field-validator type="int"> 
      <param name="min">10</param> 
      <param name="max">100</param> 
      <message>BAction-test校驗:數字必須為${min}為${max}之間!</message> 
    </field-validator> 
  </field> 
</validators>

 

示例:第一個OGNL程序

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
public class OGNL1
{
  public static void main(String[] args)
  {
    /* 創建一個Person對象 */
    Person person = new Person();
    person.setName("zhangsan");
     
    try
    {
      /* 從person對象中獲取name屬性的值 */
      Object value = Ognl.getValue("name", person);
 
      System.out.println(value);
    }
    catch (OgnlException e)
    {
      e.printStackTrace();
    }
  }
}
 
class Person
{
  private String name;
 
  public String getName()
  {
    return name;
  }
 
  public void setName(String name)
  {
    this.name = name;
  }
}

控制臺輸出:

?
1
zhangsan

可以看到我們正確的取得了person對象的name屬性值,該getValue聲明如下:

?
1
2
3
4
5
6
7
8
9
public static <T> T getValue(String expression,Object root)throws OgnlException
 
Convenience method that combines calls to parseExpression and getValue. 
 
Parameters:
expression - the OGNL expression to be parsed
root - the root object for the OGNL expression 
Returns:
the result of evaluating the expression

OGNL會根據表達式從根對象(root)中提取值。

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 出差被灌醉绝伦的上司日本 | 第一次做m被调教经历 | 亚洲高清一区二区三区久久 | 亚洲福利天堂 | 国产日韩欧美在线一区二区三区 | 鬼畜重口高h合集长短篇 | 亚洲高清在线天堂精品 | 柔术一级毛片 | 日韩在线免费看 | 亚洲精品久久中文字幕 | 国产亚洲精aa在线观看香蕉 | 九九精品视频在线观看 | α级毛片 | 香蕉精品国产高清自在自线 | 9420高清完整版在线观看国语 | 国产亚洲一欧美一区二区三区 | 国产在线成人精品 | 久久中文字幕综合不卡一二区 | 日本十大顶级绝伦推理片 | 爱情岛论坛自拍永久入口 | 四色6677最新永久网站 | 久久久WWW免费人成精品 | 日本激情网 | 青青青久在线视频免费观看 | 日本中出视频 | 91国在线观看 | 欧美疯狂做爰xx | 国产一级片在线 | 无码人妻少妇色欲AV一区二区 | 日韩大片免费观看 | 美女脱了内裤打开腿让你桶爽 | 5g影院天天5g天天爽大陆 | 国产成人激烈叫床视频 | 日本中文字幕一区二区有码在线 | 四虎成人免费视频 | 欧美日韩一区二区三区在线观看 | 精品操| 日韩欧一级毛片在线播无遮挡 | 美女扒开腿让男生捅 | 欧美在线视频免费播放 | 色人阁导航 |