Struts2中的OGNL详解.docx

上传人:b****6 文档编号:4336257 上传时间:2022-11-29 格式:DOCX 页数:18 大小:23.87KB
下载 相关 举报
Struts2中的OGNL详解.docx_第1页
第1页 / 共18页
Struts2中的OGNL详解.docx_第2页
第2页 / 共18页
Struts2中的OGNL详解.docx_第3页
第3页 / 共18页
Struts2中的OGNL详解.docx_第4页
第4页 / 共18页
Struts2中的OGNL详解.docx_第5页
第5页 / 共18页
点击查看更多>>
下载资源
资源描述

Struts2中的OGNL详解.docx

《Struts2中的OGNL详解.docx》由会员分享,可在线阅读,更多相关《Struts2中的OGNL详解.docx(18页珍藏版)》请在冰豆网上搜索。

Struts2中的OGNL详解.docx

Struts2中的OGNL详解

Struts2中的OGNL详解

首先了解下OGNL的概念:

OGNL是Object-GraphNavigationLanguage的缩写,全称为对象图导航语言,是一种功能强大的表达式语言,它通过简单一致的语法,可以任意存取对象的属性或者调用对象的方法,能够遍历整个对象的结构图,实现对象属性类型的转换等功能。

此外,还得先需弄懂OGNL的一些知识:

 1.OGNL表达式的计算是围绕OGNL上下文进行的。

OGNL上下文实际上就是一个Map对象,由ognl.OgnlContext类表示。

它里面可以存放很多个JavaBean对象。

它有一个上下文根对象。

上下文中的根对象可以直接使用名来访问或直接使用它的属性名访问它的属性值。

否则要加前缀“#key”。

2.Struts2的标签库都是使用OGNL表达式来访问ActionContext中的对象数据的。

如:

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表达式,由于Struts2中值栈被视为根对象,所以访问其他非根对象时,需要加#前缀。

实际上,#相当于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}之间。

—   在Struts2框架的配置文件中引用OGNL表达式,例如:

 

1.    

2.        

3.                

4.            10    

5.            100    

6.            BAction-test校验:

数字必须为${min}为${max}之间!

    

7.            

8.        

9.   

 

下面通过代码对OGNL有更深的了解:

action类OgnlAction.java:

1.package com.tjcyjd.test.action;  

2.  

3.import java.util.Date;  

4.import java.util.LinkedList;  

5.import java.util.List;  

6.  

7.import javax.servlet.http.HttpServletRequest;  

8.  

9.import org.apache.struts2.ServletActionContext;  

10.import org.apache.struts2.convention.annotation.Action;  

11.import org.apache.struts2.convention.annotation.Namespace;  

12.import org.apache.struts2.convention.annotation.ParentPackage;  

13.import org.apache.struts2.convention.annotation.Result;  

14.import org.apache.struts2.convention.annotation.Results;  

15.import org.springframework.stereotype.Controller;  

16.  

17.import com.opensymphony.xwork2.ActionContext;  

18.import com.opensymphony.xwork2.ActionSupport;  

19.  

20.@Controller  

21.@Namespace("/test")  

22.@ParentPackage("struts-default")  

23.@Results( { @Result(name = "success", location = "/other_test/showognl.jsp"),  

24.        @Result(name = "fail", location = "/bbs/admin_login.jsp"),  

25.        @Result(name = "input", location = "/bbs/admin_login.jsp") })  

26.public class OgnlAction extends ActionSupport {  

27.    private static final long serialVersionUID = -1494290883433357310L;  

28.    private List persons;  

29.  

30.    @Action("ognlTest")  

31.    public String ognlTest() throws Exception {  

32.        // 获得ActionContext实例,以便访问Servlet API  

33.        ActionContext ctx = ActionContext.getContext();  

34.        // 存入application  

35.        ctx.getApplication().put("msg", "application信息");  

36.        // 保存session  

37.        ctx.getSession().put("msg", "seesion信息");  

38.        // 保存request信息  

39.        HttpServletRequest request = ServletActionContext.getRequest();  

40.        request.setAttribute("msg", "request信息");  

41.        // 为persons赋值  

42.        persons = new LinkedList();  

43.        Person person1 = new Person();  

44.        person1.setName("pla1");  

45.        person1.setAge(26);  

46.        person1.setBirthday(new Date());  

47.        persons.add(person1);  

48.  

49.        Person person2 = new Person();  

50.        person2.setName("pla2");  

51.        person2.setAge(36);  

52.        person2.setBirthday(new Date());  

53.        persons.add(person2);  

54.  

55.        Person person3 = new Person();  

56.        person3.setName("pla3");  

57.        person3.setAge(16);  

58.        person3.setBirthday(new Date());  

59.        persons.add(person3);  

60.  

61.        return SUCCESS;  

62.  

63.    }  

64.  

65.    public List getPersons() {  

66.        return persons;  

67.    }  

68.  

69.    public void setPersons(List persons) {  

70.        this.persons = persons;  

71.    }  

72.}  

jsp页面showognl.jsp:

1.<%@ page language="java" contentType="text/html; charset=utf-8" pageEncoding="utf-8" %>    

2.    

3.<%@ taglib prefix="s" uri="/struts-tags" %>    

4.

DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http:

//www.w3.org/TR/ xhtml1/DTD/xhtml1-transitional.dtd">    

5.    

6.

//www.w3.org/1999/xhtml">    

7.    

8.    

9.    

10.    Struts2 OGNL 演示    

11.    

12.    

13.    

14.        

15.    

16.    

访问OGNL上下文和Action上下文

    

17.    

18.    

-使用OGNL访问属性值-->    

19.    

20.    

parameters:

 

property value="#parameters.msg" />

    

21.    

22.    

request.msg:

 

property value="#request.msg" />

    

23.    

24.    

session.msg:

 

property value="#session.msg" />

    

25.    

26.    

application.msg:

 

property value="#application.msg" />

    

27.    

28.    

attr.msg:

 

property value="#attr.msg" />

    

29.    

30.        

31.    

32.    

用于过滤和投影(projecting)集合

    

33.    

34.    

年龄大于20

    

35.    

36.    

        

    37.    

    38.    

    -判断年龄-->    

    39.    

    40.        

    iterator value="persons.{?

    #this.age>20}">    

    41.    

    42.            

  • property value="name" /> - 年龄:

    property value="age" />

  •     

    43.    

    44.        

    iterator>    

    45.    

    46.    

    

47.    

48.    

姓名为pla1的年龄:

 

property value="persons.{?

#this.name=='pla1'}.{age}[0]"/>

    

49.    

50.        

51.    

52.    

构造Map

    

53.    

54.    

set name="foobar" value="#{'foo1':

'bar1', 'foo2':

'bar2'}" />    

55.    

56.    

The value of key "foo1" is 

property value="#foobar['foo1']" />

    

57.      

58.       

59.      

60.    

%符号的用法

    

61.    

62.    

set name="foobar" value="#{'foo1':

'bar1', 'foo2':

'bar2'}" />    

63.    

64.    

The value of key "foo1" is 

property value="#foobar['foo1']" />

    

65.    

66.    

不使用%:

url value="#foobar['foo1']" />

    

67.    

68.    

使用%:

url value="%{#foobar['foo1']}" />

    

69.    

70.      

71.        <%    

72.            request.setAttribute("req", "request scope");    

73.            request.getSession().setAttribute("sess", "session scope");    

74.            request.getSession().getServletContext().setAttribute("app",    

75.                    "aplication scope");    

76.        %>    

77.        1.通过ognl表达式获取 属性范围中的值    

78.        
    

79.        

property value="#request.req" />    

80.            

81.        

property value="#session.sess" />    

82.            

83.        

property value="#application.app" />    

84.            

85.        


    

86.    

87.       2.通过

 #fafafa;">ognl表达式创建list 集合 ,并且遍历出集合中的值    

88.        
    

89.        

set name="list" value="{'eeeee','ddddd','ccccc','bbbbb','aaaaa'}">

set>    

90.        

iterator value="#list" var="o">    

91.            

-- ${o }
 -->    

92.            

property />    

93.                

94.        

iterator>    

95.            

96.        


    

97.    

98.       3.通过ognl表达式创建Map 集合 ,并且遍历出集合中的值    

99.        
    

100.        

set name="map"    

101.            value="#{'1':

'eeeee','2':

'ddddd','3':

'ccccc','4':

'bbbbb','5':

'aaaaa'}">

set>    

102.        

iterator value="#map" var="o">    

103.            

--      ${o.key }->${o.value }
   -->    

104.            

-- 

property value="#o.key"/>->

property value="#o.value"/>
   -->    

105.            

property value="key" />->

property value="value" />    

106.                

107.        

iterator>    

108.            

109.        


    

110.      4.通过ognl表达式 进行逻辑判断    

111.        
    

112.        

if test="'aa' in {'aaa','bbb'}">    

113.            aa 在 集合{'aaa','bbb'}中;    

114.        

if>    

115.        

else>    

116.            aa 不在 集合{'aaa','bbb'}中;    

117.        

else>    

118.            

119.        

if test="#request.req not in #list">    

120.                不 在 集合list中;    

121.        

if>    

122.        

else>    

123.             在 集合list中;    

124.        

else>    

125.            

126.        


    

127.          

128.       5.通过ognl表达式 的投影功能进行数据筛选    

129.        
    

130.        

set name="list1" value="{1,2,3,4,5}">

set>    

131.        

iterator value="#list1.{?

#this>2}" var="o">    

132.            

-- #list.{?

#this>2}:

在list1集合迭代的时候,从中筛选出当前迭代对象>2的集合进行显示 -->    

133.            ${o }    

134.        

iterator>    

135.            

136.        


    

137.       6.通过ognl表达式 访问某个类的静态方法和值    

138.        
    

139.        

property value="@java.lang.Math@floor(32.56)" />    

140.    

141.        

property value="@com.rao.struts2.action.OGNL1Action@aa" />    

142.            

143.            

144.        


    

145.      7.ognl表达式 迭代标签 详细    

146.        
    

147.        

set name="list2"    

148.            value="{'aa','bb','cc','dd','ee','ff','gg','hh','ii','jj'}">

set>    

149.            

150.                

151.                索引     

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 高中教育 > 初中教育

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1