首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 软件管理 > 软件架构设计 >

《研磨struts2》第七章 值栈跟OGNL 之 7.2 OGNL

2012-06-30 
《研磨struts2》第七章 值栈和OGNL 之 7.2 OGNL7.2? OGNL7.2.1? OGNL概述OGNL是对象图导航语言Object-Graph

《研磨struts2》第七章 值栈和OGNL 之 7.2 OGNL

7.2? OGNL

7.2.1? OGNL概述

OGNL是对象图导航语言Object-Graph Navigation Language的缩写,它是一种功能强大的表达式语言(Expression Language,简称为EL),通过它简单一致的表达式语法,可以存取对象的属性,调用对象的方法,遍历整个对象的结构图,实现字段类型转化等功能。它使用相同的表达式去存取对象的属性。

在前面的例子中,登录页面输入框的name用到的名字就是OGNL的表达式,比如:“账号:<input type="text" name="account">”,在欢迎页面使用“<s:property value="account"/>”。两个"account"表达式都是相同的,但前一个保存对象属性的值,后一个是取得对象属性的值。

表达式语言简单、易懂却又功能强大,关于OGNL更多的介绍可以去http://www.ognl.org看看,那里有很详细的文档。

7.2.2? OGNL的基本使用

1:常量与操作符

在OGNL中,可以使用Java的常量操作和数学运算。需要注意的是,String常量可以使用单引号或者双引号括起来,但是单个字符也是使用单引号,所以只有在超过一个字符的时候,使用单引号界定的常量才是String类型的。如果需要只定义一个包含单个字符的String常量,就需要使用转义。

?????? 比如:<s:property value="'account'"/>这句话里面的account就是个字符串,因为它是用单引号括起来的。或者<s:property value="7+8"/>这句话,输出就是15,也就是数学运算后的值。

2:方法调用

OGNL支持方法的调用,这个在后面有演示,比如访问静态方法,比如访问集合对象的方法等,这里就不去赘述了。

3:设置数值及表达式列表

OGNL让你可以在单条语句中执行逗号分隔的多个表达式,最后一个表达式的返回值作为整条语句的输出。

4:使用OGNL访问ValueStack

在OGNL中,没有前缀代表了访问当前值栈。

?????? 比如前面的示例中,在欢迎页面中使用的“<s:property value="account"/>”,这句话中<s:property>标签的value属性的值就是使用的ognl,它没有任何前缀,就表示直接访问值栈。

访问到值栈过后,会按照从栈顶到栈底的顺序,寻找第一个匹配的对象,那就会找到Action中的account属性,然后就取到值了。

5:使用OGNL访问ActionContext

在ognl中,可以通过符号“#”来访问ActionContext中除了值栈之外的各种值,典型如:

  • #parameters:当前请求中的参数,对应request.getParameter(name)
  • #request:请求作用域中的属性,对应request.getAttribute(name)
  • #session:会话作用域中的属性,对应session.getAttribute(name)
  • #application:应用程序作用域的属性
  • #attr:按照页面page、请求request、会话session和应用application的顺序,返回第一个符合条件的属性。

    在引用的时候,需要加上前缀“#”,并指定范围,然后写出要引用哪个属性,形如:“#paramters.account”。

    在上一节的示例上稍加修改,来试验一下这些知识。

    (1)修改action,去掉PreResultListener的注册,然后设置Session和Application的属性值,示例如下:

    ?

    java代码:查看复制到剪贴板打印
    1. public?class?HelloWorldAction?extends?ActionSupport?{??
    2. ????private?String?account;??
    3. ????private?String?password;??
    4. ????private?String?submitFlag;??
    5. ????public?String?execute()?throws?Exception?{??
    6. ????????this.businessExecute();??
    7. ????????ActionContext?c?=?ActionContext.getContext();??
    8. ????????c.getSession().put("account",?"session中的account");??
    9. ????????c.getApplication().put("account",?"application中的account");??
    10. ??????????
    11. ????????return?"toWelcome";??
    12. ????}??
    13. ????/**?
    14. ?????*?示例方法,表示可以执行业务逻辑处理的方法,?
    15. ?????*/??
    16. ????public?void?businessExecute(){??
    17. ????????System.out.println("用户输入的参数为==="+"account="+account+",password="+password+",submitFlag="+submitFlag);??
    18. ????}??
    19. ????//属性对应的getter/setter方法,省略了??
    20. }??

    (2)修改欢迎页面,在页面上通过OGNL来获取这些值,示例如下:

    ?

    java代码:查看复制到剪贴板打印
    1. <%@?taglib?prefix="s"?uri="/struts-tags"%>??
    2. 欢迎账号为<s:property?value="account"/>的朋友来访??
    3. <br>??
    4. 请求参数中的帐号:<s:property?value="#parameters.account"/>??
    5. <br>??
    6. <%request.setAttribute("account","request的account");%>??
    7. 请求属性中的帐号:<s:property?value="#request.account"/>??
    8. <br>??
    9. 会话属性中的帐号:<s:property?value="#session.account"/>??
    10. <br>??
    11. 应用属性中的帐号:<s:property?value="#application.account"/>??
    12. <br>??
    13. attr中的帐号:<s:property?value="#attr.account"/>??

    再次运行测试一下,欢迎页面如下图所示:

    《研磨struts2》第七章 值栈跟OGNL 之 7.2 OGNL

    图7.2 ognl引用ActionContext

    (3)在ognl中还有另一种稍稍麻烦的写法来访问属性,形如“#request[‘account’]”,等价于使用“#request.account”,在访问更复杂对象的时候,两种方法可以混用。

    ?????? 一般建议:如果访问对象的属性,建议使用“.”的方式来访问;如果访问Map等复杂对象结构的时候,建议使用“[]”的方式来访问。

    7.2.3??访问静态方法和静态属性

    在OGNL中,可以通过关键字“@”来访问任意类中的静态方法和静态属性,格式为“@类的全路径名@属性名称”,或者“@类的全路径名@方法名称(参数列表)”。

    这里要注意一点,在低版本的Struts2中,默认是开启了访问类的静态方法的,但是在高版本的Struts2中,比如写作本书使用的2.1.8的版本,默认是关闭了访问类的静态方法的。也就是说,要想访问类的静态方法,需要去开启设置。

    配置非常简单,在struts.xml中,添加开启访问类的静态方法的配置,示例如下:

    ?

    java代码:查看复制到剪贴板打印
    1. <constant?name="struts.ognl.allowStaticMethodAccess"?value="true"/>??

    (1)写一个类,里面有一个静态方法和一个静态属性供外界访问,示例如下:

    ?

    java代码:查看复制到剪贴板打印
    1. package?cn.javass.action.action;??
    2. public?class?MyStatic?{??
    3. ????public?static?String?staticTest?=?"staticTestValue";??
    4. ????public?static?void?testMethod(){??
    5. ????????System.out.println("static?test?method.");??
    6. ????}??
    7. }??

    (2)在欢迎页面中添加访问它们的语句,示例如下:

    ?

    java代码:查看复制到剪贴板打印
    1. <%@?taglib?prefix="s"?uri="/struts-tags"%>??
    2. ??
    3. 欢迎账号为<s:property?value="account"/>的朋友来访??
    4. <br>??
    5. 静态属性值为:<s:property?value="@cn.javass.action.action.MyStatic@staticTest"/>??
    6. <br>??
    7. 调用静态方法??
    8. <s:property?value="@cn.javass.action.action.MyStatic@testMethod()"/>??

    (3)去测试运行一下,此时欢迎页面如下图所示:

    《研磨struts2》第七章 值栈跟OGNL 之 7.2 OGNL

    图7.3? 访问静态属性的欢迎页面

    后台输出信息如下:

    ?

    java代码:查看复制到剪贴板打印
    1. static?test?method22.??

    看来OGNL的基本使用是非常简单的,接下来看看稍复杂点的情况。

    私塾在线网站原创《研磨struts2》系列

    转自请注明出处:【http://sishuok.com/forum/blogPost/list/0/4069.html】

    欢迎访问http://sishuok.com获取更多内容

热点排行