zoukankan      html  css  js  c++  java
  • 【struts2】OGNL

      1 OGNL概述

      OGNL是对象图导航语言Object-Graph Navigation Language的缩写,它是一种功能强大的表达式语言(Expression Language,简称为EL),通过它简单一致的表达式语法,可以存取对象的属性,调用对象的方法,遍历整个对象的结构图,实现字段类型转化等功能。它使用相同的表达式去存取对象的属性。在前面的例子中,登录页面输入框的name用到的名字就是OGNL的表达式,比如:“账号:<input type="text" name="account">”,在欢迎页面使用“<s:property value="account"/>”。两个"account"表达式都是相同的,但前一个保存对象属性的值,后一个是取得对象属性的值。表达式语言简单、易懂却又功能强大。

      OGNL的基本使用

      2.1 常量与操作符

      在OGNL中,可以使用Java的常量操作和数学运算。需要注意的是,String常量可以使用单引号或者双引号括起来,但是单个字符也是使用单引号,所以只有在超过一个字符的时候,使用单引号界定的常量才是String类型的。如果需要只定义一个包含单个字符的String常量,就需要使用转义。比如:<s:property value="'account'"/>这句话里面的account就是个字符串,因为它是用单引号括起来的。或者<s:property value="7+8"/>这句话,输出就是15,也就是数学运算后的值。

      2.2 方法调用

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

      2.3 设置数值及表达式列表

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

      2.4 使用OGNL访问ValueStack

      在OGNL中,没有前缀代表了访问当前值栈。比如前面的示例中,在欢迎页面中使用的“<s:property value="account"/>”,这句话中<s:property>标签的value属性的值就是使用的ognl,它没有任何前缀,就表示直接访问值栈。访问到值栈过后,会按照从栈顶到栈底的顺序,寻找第一个匹配的对象,那就会找到Action中的account属性,然后就取到值了。

      2.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”。

      2.6 应用示例  

      这里我们在登陆的例子上稍加修改,来试验一下这些知识。

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

    public class HelloWorldAction extends ActionSupport {  
        private String account;  
        private String password;  
        private String submitFlag;  
        public String execute() throws Exception {  
            this.businessExecute();  
            ActionContext c = ActionContext.getContext();  
            c.getSession().put("account", "session中的account");  
            c.getApplication().put("account", "application中的account");  
              
            return "toWelcome";  
        }  
        /** 
         * 示例方法,表示可以执行业务逻辑处理的方法, 
         */  
        public void businessExecute(){  
            System.out.println("用户输入的参数为==="+"account="+account+",password="+password+",submitFlag="+submitFlag);  
        }  
        //属性对应的getter/setter方法,省略了  
    }  

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

    <%@ page language="java" contentType="text/html; charset=utf-8"  
        pageEncoding="utf-8"%>  
    <html>  
    <head>  
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8">  
    <title>Insert title here</title>  
    </head>  
    <body>  
    <%@ taglib prefix="s" uri="/struts-tags"%>  
    欢迎账号为<s:property value="account"/>的朋友来访  
    
    <br>  
    请求参数中的帐号:<s:property value="#parameters.account"/>  
    <br>  
    <%request.setAttribute("account","request的account");%>  
    请求属性中的帐号:<s:property value="#request.account"/>  
    <br>  
    会话属性中的帐号:<s:property value="#session.account"/>  
    <br>  
    应用属性中的帐号:<s:property value="#application.account"/>  
    <br>  
    attr中的帐号:<s:property value="#attr.account"/>  
    </body>  
    </html>  

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

      备注:在ognl中还有另一种稍稍麻烦的写法来访问属性,形如“#request[‘account’]”,等价于使用“#request.account”,在访问更复杂对象的时候,两种方法可以混用。一般建议:如果访问对象的属性,建议使用“.”的方式来访问;如果访问Map等复杂对象结构的时候,建议使用“[]”的方式来访问。

      3 访问静态方法和静态属性

      在OGNL中,可以通过关键字“@”来访问任意类中的静态方法和静态属性,格式为“@类的全路径名@属性名称”,或者“@类的全路径名@方法名称(参数列表)”。这里要注意一点,在低版本的Struts2中,默认是开启了访问类的静态方法的,但是在高版本的Struts2中,比如写作本书使用的2.1.8的版本,默认是关闭了访问类的静态方法的。也就是说,要想访问类的静态方法,需要去开启设置。配置非常简单,在struts.xml中,添加开启访问类的静态方法的配置,示例如下:

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

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

    package cn.javass.hello.struts2impl.action;
    
    public class MyStatic {
        public static String staticTest = "staticTestValue"; // 静态属性
        
        //静态方法
        public static void testMethod() {
            System.out.println("+++++++++++++++++++static test method.++++++++++++++++++");
        }
    }

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

    <%@ page language="java" contentType="text/html; charset=utf-8"  
        pageEncoding="utf-8"%>  
    <html>  
    <head>  
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8">  
    <title>Insert title here</title>  
    </head>  
    <body>  
    <%@ taglib prefix="s" uri="/struts-tags"%>  
    欢迎账号为<s:property value="account"/>的朋友来访  
    
    <br>  
    静态属性值为:<s:property value="@cn.javass.hello.struts2impl.action.MyStatic@staticTest"/>  
    <br>  
    调用静态方法  
    <s:property value="@cn.javass.hello.struts2impl.action.MyStatic@testMethod()"/>  
    </body>  
    </html>  

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

     

      另外,后台输出信息如下:

    +++++++++++++++++++static test method.++++++++++++++++++

      参考资料:http://www.iteye.com/topic/1124526

  • 相关阅读:
    Elementary Methods in Number Theory Exercise 1.2.25
    Elementary Methods in Number Theory Exercise 1.2.14
    图解欧几里德算法
    图解欧几里德算法
    Elementary Methods in Number Theory Exercise 1.2.14
    Android中的长度单位详解(dp、sp、px、in、pt、mm)
    分享下多年积累的对JAVA程序员成长之路的总结
    android异常之都是deamon惹的祸The connection to adb is down, and a severe error has occured.
    TomatoCartv1.1.8.2部署时报错
    JavaScript浏览器对象之二Document对象
  • 原文地址:https://www.cnblogs.com/ningvsban/p/3739868.html
Copyright © 2011-2022 走看看