• Struts2ognl表达式和类型转换


    Struts2中的ognl,是一种非常强大的表达式语言,和JSP 中的EL表达式很类似,但是ognl表达式的功能远远强于EL表达式。ognl主要用于数据绑定和数据转移,通过ognl表达式可以很容易获取到valueStack中的数据,通过和Struts2的标签的结合,可以完全替代jsp页面中的Java代码和jsp标签。ognl应用:

    (1)支持基本类型属性

    假如value stack 中有一个id属性并且值为2,则可以通过"id"来获取id的值,但是要和strut2标签使用才有效,如<s:property value="id"/>

    (2)支持数组和list

    如Array[0],list[1],例如value stack中一个name的数组,User类型的list,如果要想获取name[1]的值,和user[1]中的usename的值,则可以如下获取<s:property value="name[1]"/>,<s:property value="user[1].name"/>

    (3)支持Map

    如map.key或者map['key']

    (4)支持基本运算 +-/*

    (5)方法的调用

    例如"hello.toUpperCase",将会得到“HELLO”

    (6)调用静态方法

    例如@java.lang.Math@abs("-125"),将会得到125

    (7)支持创建list和map类型

    如list类型:{1,2};map类型:{'name':'zhangsan','age':'24'}

    (8)关联属性、投影和过滤

    关联属性:user[0].name 获取use类型数组的第一个元素的name属性;投影:users.{name}获取users实例中的name的集合;过滤:users.{?this.age>28}获取users中age大于28的user集合。关联属性、投影和过滤不是很常用。

    ognl表达式中有时候需要用到%{ognl表达式},假如要一个链接地址为www.localhost:8080/struts2/list.action中传递一个id参数时,<a href="www.localhost:8080/struts2/list.action?id=%{id}" title="click me">hello</a> 其中%{}是告诉struts2大括号里的内容为ognl表达式。在配置struts.xml中可能会用到${ognl表达式},#ognl表达式表示将ognl表达式中的值放到Stack Context中。

    类型转换器:一般Http请求发送的参数都是字符串的形式,但是想要把传递的参数转换成javabean属性的类型,这个时候 就需要类型转换器。struts2中提供内建的类型转换器有boolean/Boolean char/Character int/Interger List Map Data Array等,但是有些时候我们需要自己创建类型转换器。

    自定类型转换器的步骤

    (1)编写一个继承DefaultTypeConverter类或者StrutsTypeConverter类,重写convertValue方法,例如重写public Object convertValue(Map context, Object value, Class toClass)的方法,注意类型转换是双向的,所以重写convertValue时,需要根据toClass进行判断,是将value转换成你想要的类型还是将你想要的类型转换成特定格式的字符串。struts2中StrutsTypeConverter类中convertValue代码如下:
        public Object convertValue(Map context, Object o, Class toClass) {
            if (toClass.equals(String.class)) {
                return convertToString(context, o);
            } else if (o instanceof String[]) {
                return convertFromString(context, (String[]) o, toClass);
            } else if (o instanceof String) {
                return convertFromString(context, new String[]{(String) o}, toClass);
            } else {
                return performFallbackConversion(context, o, toClass);
            }
        }

    (2)注册类型转换器:一般有三种方法:①通过java注释类来实现,此处不做介绍。

    ②通过编写一个ActionName-conversion.properties文件,在文件中填写 “你要进行类型转换的属性”=“你编写的类型转换器的详细包路径”,文件和你编写的ActionName类处在同一个目录下。此处为局部注册

    ③通过编写一个xword-conversion.properties文件,在文件中填写 “你要进行类型转换的属性”=“你编写的类型转换器的详细包路径”,文件放在web-inf下的classes路径下。注:此处为全局注册。

    由于本人水平有限,欢迎高手指正。

  • 相关阅读:
    0223_模拟2011
    0223_模拟2011
    0223_模拟2011
    0223_模拟2011
    12c DG broker DMON自动重启过程分析
    12c DG broker DMON自动重启过程分析
    12c DG broker DMON自动重启过程分析
    12c DG broker DMON自动重启过程分析
    CITA架构设计
    跨链合约示例
  • 原文地址:https://www.cnblogs.com/guiyi/p/struts_ognl.html
Copyright © 2020-2023  润新知