[学习笔记] Struts2之OGNL

# 学习 # · 2021-03-23

OGNL在框架中的作用

1、OGNL(对象视图导航语言):是一个开源项目,取代页面中Java脚本,简化数据访问。OGNL和EL同属于表达式语言,但功能更为强大。

2、OGNL的应用:

(1)表达式语言:将表单或Struts 2标签与特定的Java数据绑定起来,用来将数据移入、移出框架。

(2)类型转换:数据进入和流出框架,在页面数据的字符串类型和Java数据类型之间进行转换。

3、OGNL融入Struts 2:

4、数据流入:数据最开始来自页面InputForm.html,表单以neme OGNL形式提交数据,请求以HTTPServletRequest进入Struts2框架,Struts2和OGNL对请求参数进行处理,类型转换并将数据匹配赋值最后保存至值栈。

5、数据流出:当Action完成业务处理后,最终会返回一个结果,并生成一个页面。

6、值栈(ValueStack):

(1)值栈类似于一个容器:存储区域,用来保存Mdel(模型)对象,用于在页面控制器之间数据传递交互展示。

(2)值栈具有栈的特征:可以存储多个对象,以先入后出原则存储,从上到下的顺序读取。


类型转换

1、内置转换器:Struts2提供内置转换器自动对客户端传来的数据进行类型转换。

(1)原始类型和包装类的转换。

(2)多值类型请求参数的处理:Struts2会将这样的数据转换为面向集合的数据类型。

(3)集合:Struts2支持将一系列请求参数自动转换到各种集合类型的属性。

2、自定义转换器:

(1)创建自定义类型转换器:

// 继承StrutsTypeConverter类编写自定义类型转换器
public class DateConverter extends StrutsTypeConverter {
    // 支持转换的多种日期格式,可增加时间格式
    private final DateFormat[] dfs = { 
            new SimpleDateFormat("yyyy 年MM 月dd 日"),
            new SimpleDateFormat("yyyy-MM-dd"),
            new SimpleDateFormat("MM/dd/yy"),
            new SimpleDateFormat("yyyy.MM.dd"),
            new SimpleDateFormat("yyMMdd"),
            new SimpleDateFormat("yyyy/MM/dd") };

    /**
     * 重写方法:将一个或多个字符串值转换为指定的类型
     */
    public Object convertFromString(Map context, String[] values, Class toType) {
        String dateStr = values[0];
        for (int i = 0; i < dfs.length; i++) {
            try {
                return dfs[i].parse(dateStr);
            } catch (Exception e) {
                continue;
            }
        }
        throw new TypeConversionException("转换错误");
    }

    /**
     * 重写方法:将指定对象转化为字符串
     */
    public String convertToString(Map context, Object object) {
        Date date = (Date) object;
        return new SimpleDateFormat("yyyy-MM-dd").format(date);
    }
}

(2)配置自定义类型转换器(应用于全局范围):创建resources/xwork-conversion.properties文件。

# 格式:转换类全名=类型转换器类全名
java.util.Date=com.aduo.ognl.util.DateConverter

(3)配置自定义类型转换器(应用于特定类):在特定类相同目录下创建ClassName-conversion.properties文件。

# 格式:特定类的属性名=类型转换器类全名
brithday=com.aduo.ognl.util.DateConverter

3、处理类型转换错误:

(1)处理类型转换错误的前提条件:

A、启动StrutsConversionErrorInterceptor拦截器,拦截器已经包含在defaultStack拦截器栈中。
B、Action要继承ActionSupport类,实质是实现ValidationAware接口。
C、配置input结果映射
D、页面使用Struts2表单标签或<s:fielderror>标签

(2)修改所有类型的转换错误信息:修改xwork.default.invalid.fieldvalue键的值。

步骤一:在struts.xml中指定资源文件的基名
<constant name="struts.custom.i18n.resources" value="message"/>

步骤二:在资源目录下创建资源文件message.properties并修改键值
xwork.default.invalid.fieldvalue=字段“{0}”的值无效

(3)定制特定字段的类型转换错误信息:在Action范围的资源文件中添加I18N消息键invalid.fieldvalue.xxx。

步骤一:在Action包下创建RegisterAction.properties,指定键值
invalid.fieldvalue.birthday=生日转换错误

OGNL表达式

1、OGNL访问Bean属性:

<s:property value="Action中属性名" default="默认数据" />
<s:property value="Action中对象名.对象属性" />

(1)如果没有设置default,且value为null,则空字符展示。

2、OGNL访问集合对象:

/* 迭代集合/数组 */
<s:iterator value="集合/数组" >
    <s:property/>
</s:iterator>

/* 迭代对象集合 */
<s:iterator value="对象集合" >
    <s:property value="对象属性名1" />
    <s:property value="对象属性名.." />
</s:iterator>

(1)访问列表或者数组的某一个元素:属性名[index]

(2)访问Map的某一个元素:属性名['Key']

(3)访问集合的长度:size或length

3、访问ActionContext中的数据:

(1)ActionContext:称为运行上下文。ActionContext中包含了框架处理一个请求时会用到的所有的数据。

(2)访问数据(非值栈对象)的方法:作用域存储的对象并不是在值栈中,取值时候, 通过 #作用域.对象名 访问。

4、查看ActionContext中的数据:

<s:debug/>

5、set标签:

<s:set name="country1" value="China"/>
<s:set name="country2" value="'China'" />

(1)name:指定变量的名字,类型为String。

(2)value:指定一个表达式赋给变量,类型为Object。

(3)scope:指定变量的作用域,默认为action,变量同时保存到request和ApplicationContext。

5、Struts2标签与OGNL表达式:

(1)Struts2标签的属性都可以使用OGNL表达式。Struts2标签的属性是具有类型的,分为字符串类型和对象类型。

(2)对于字符串类型的属性,访问其动态数据:使用%{...}

<s:set name="myurl" value="http://www.baidu.com" />
<s:url value="#myurl" />    // 显示#myurl
<s:url value="%{#myurl}" />    // 显示http://www.baidu.com

(3)对于对象类型的属性,将直接作为OGNL表达式进行计算。如果需要对对象类型的属性指定字符串常量,则必须在这个字符串常量外加上一对单引号或使用%{'constant string'}。

<s:property name="myurl" value="'http://www.baidu.com'" />
<s:property value="#myurl" />    // 显示http://www.baidu.com
<s:property value="%{#myurl}" />    // 显示http://www.baidu.com

URL标签和日期标签

1、URL标签:

(1)基本语法:

/**
 * value:URL地址
 * name:传递的参数名称
 * value:传递参数的值
 */
<s:url value="url">
    <s:param name="parname" value="parvalue"/>
</s:url>

(2)使用value指定URL地址:

<s:url value="http://www.baidu.com"/>

(3)使用变量生成URL地址:

<s:set name="myurl" value="'http://www.baidu.com'"/>
<s:url value="%{#myurl}"/>

(4)使用param指定参数:

<s:url value="show.action">
    <s:param name="id" value="123"/>
</s:url>

2、日期标签:

(1)基本语法:

/**
 * format:按照指定的格式进行日期格式化
 * nice:指定输出日期与当前时间的时差
 * name:需要格式化的日期
 * id:引用该元素的id值
 */
<s:data format="format" nice="true|false" name="name" id="id" />

(2)指定日期格式进行格式化:

<s:date name="currentDate" format="dd/MM/yyyy" />
如无特殊说明,本博所有文章均为博主原创。

如若转载,请注明出处:一木林多 - https://www.l5v.cn/archives/274/

评论