第五章 数据转移:OGNL和类型转换
5.1 数据转移和类型转换:Web应用程序领域的常见任务
5.2 OGNL和Struts 2
OGNL代表Object-Graph Navigation Language(对象图导航语言)。它被集成在Struts 2框架中用来帮助实现数据转移和类型转换。
表达式语言允许我们使用简单的语法来引用Java环境中存在的对象。
OGNL如何融入框架,如下图所示:
params拦截器将会把请求对象中的数据转移到ValueStack上。这个工作微妙的地方是将参数的名字映射到ValueStack上的一个真实的属性。这是OGNL进入的地方。params拦截器把请求参数的名字解析为一个OGNL表达式,用来在ValueStack上定位正确的目标属性。
ValueStack是一个虚拟的对象?这听起来有点复杂,但实际上并不复杂。ValueStack持有一堆对象,这些对象都有属性。ValueStack的魔力是这些对象的所有属性看起来像是ValueStack的属性。
5.3 内建的类型转换器
Struts 2 框架自带了对HTTP本地字符串和以下列出的Java类型之间转换的内建支持。
- String
- boolean/Boolean,true和false字符串可以被转换为Boolean的原始类型和对象类型
- char/Character,原始类型或者对象类型
- int/Integer、float/Float、long/Long、double/Double,原始类型或者对象类型
- Date,当前Locale的SHORT格式的字符串版本(例如,12/10/98)
- Array,每一个字符串元素必须能够转换为数组的类型
- List,默认情况下使用String填充,也可以使用泛型
- Map,默认情况下使用String填充,也可以使用泛型
当框架定位到一个给定的OGNL表达式指向的Java属性时,它会查找这个类型的转换器。如果这个类型在前面的列表中,你不需要做任何事情,等着接收数据即可。
类型转换错误导致用户会被返回到输入页面,这与验证出错的情况相似。
当尝试导航到目标属性时,如果发现深层OGNL表达式中的任何中间属性不存在(null),框架会自动实例化它们。解决不存在属性的访问能力依赖于每一个属性都存在一个默认的构造方法。
5.4 自定义类型转换
类型转换是OGNL的一部分。正因如此,所有类型转换器必须都实现ognl.TypeConverter接口。Struts 2 提供了一个开发人员编写自定义类型转换器时可以使用的便利基类,org.apache.struts2.util.StrutsTypeConverter。
public abstract class StrutsTypeConverter extends DefaultTypeConverter { 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); } } /** * Hook to perform a fallback conversion if every default options failed. By default * this will ask Ognl's DefaultTypeConverter (of which this class extends) to * perform the conversion. * * @param context * @param o * @param toClass * @return The fallback conversion */ protected Object performFallbackConversion(Map context, Object o, Class toClass) { return super.convertValue(context, o, toClass); } /** * Converts one or more String values to the specified class. * * @param context the action context * @param values the String values to be converted, such as those submitted from an HTML form * @param toClass the class to convert to * @return the converted object */ public abstract Object convertFromString(Map context, String[] values, Class toClass); /** * Converts the specified object to a String. * * @param context the action context * @param o the object to be converted * @return the converted String */ public abstract String convertToString(Map context, Object o); }
其中的两个抽象方法是必须实现的。
配置框架使用自定义转换器有两种方式:
- 属性专用。第一种选择是指定这个转换器用来转换给定动作类上的给定属性。我们使用ActionName-conversion.properties文件为特定的属性指定自定义转换器。
- 全局类型转换。我们使用xwork-conversion.properties文件指定类型转换器。
相关推荐
本文将深入探讨Struts2的核心概念,包括Action、Result、配置文件、OGNL与ValueStack、Tags以及项目中的关键实践。 **一、Action** Action是Struts2中处理业务逻辑的核心组件,它是实现了`...
**Struts2实战——《Struts2 In Action中文版》** 《Struts2 In Action》是一本专为Java开发者设计的实战指南,旨在深入解析Struts2框架的使用与实践。Struts2作为一款强大的MVC(Model-View-Controller)框架,极...
### Struts2的类型转换与OGNL表达式语言 #### 一、Struts2的类型转换类型 在Struts2框架中,类型转换是处理用户输入数据时的一个关键环节。Struts2支持多种内置的数据类型转换,同时也允许开发人员自定义类型转换...
"Struts2 in Action" 是一本深入探讨Struts2框架的专业书籍,旨在帮助开发者掌握这一框架的核心概念和实践技巧。这本书的中文版不仅提供了理论知识,还附带有配套的源代码,方便读者进行实践操作,加深理解。 ...
本教程将深入探讨Struts2的核心概念、JQuery的使用、类型转换以及OGNL表达式语言。 首先,让我们来看看Struts2的基础知识。Struts2是基于Apache的开源项目,它是对早期Struts框架的升级,引入了拦截器模式,提供了...
第二部分 核心概念:动作、拦截器和类型转换 第3章 使用Struts 2动作 36 3.1 Struts 2动作简介 36 3.2 打包动作 39 3.2.1 Struts 2公文包示例应用程序 39 3.2.2 组织你的包 39 3.2.3 使用struts-default包中的组件 ...
值栈是Struts2框架中的核心概念之一,它是一个用于临时存储对象的栈结构,这些对象包括Action实例、模型对象、临时对象等。值栈中的对象可以按照以下四种类型划分: 1. 栈顶对象:在程序执行过程中,由容器自动创建...
要深入学习和掌握Struts2,建议阅读官方文档,参与实际项目实践,也可以参考相关的技术书籍和教程,例如《Struts2技术内幕——深入解析Struts2架构设计与实现原理》等资源,来提升对Struts2框架的全面理解。
Struts2是一个流行的Java web应用程序框架,它极大地简化了MVC(模型-视图-控制器)...通过阅读和分析这些源代码,我们可以深入理解OGNL如何在Struts2中发挥作用,以及如何优化和保护我们的应用免受潜在的安全威胁。
中文版的《Struts2 in Action》为中文阅读者提供了方便,使得理解复杂的框架概念变得更加容易。书中详细介绍了Struts2的核心组件、配置、拦截器、结果类型、插件等,以及如何将它们整合到实际项目中。同时,书中还...
### Struts2 学习重点知识点总结 #### 一、Struts2 概念与架构 **1.1 Struts2 简介** - **定义**:Struts2 是 Apache 组织提供的一个基于 MVC ...掌握 Struts2 的核心概念和技术要点,对于 Web 开发者来说至关重要。
核心技术篇首先分析了Struts2中多种具有代表性的设计模式,然后对Struts2中的精华——OGNL表达式引擎和XWork框架的原理及机制进行了全面深入的分析和讲解。运行主线篇首先对Struts2的两大运行主线——初始化主线和...
通过阅读README,你可以了解如何配置开发环境,如何编译和部署`Struts2InAction.war`这个Web应用。 `Struts2InAction.war`是一个预打包的Web应用程序,它是按照Maven或者Ant等构建工具的标准结构组织的。这个WAR...
其中,OGNL(Object-Graph Navigation Language)是Struts2中的核心表达语言,用于在视图层与模型层之间传递数据。在深入理解OGNL的源码之前,我们首先需要了解OGNL的基本概念和用法。 OGNL是一种强大的表达式语言...
- **核心概念**:标签中的“struts2 action”指出了本书关注的一个核心概念——Action,这是Struts2框架中处理用户请求的关键组件。通过理解和掌握Action的工作原理及其相关配置,开发者可以更好地设计和实现Web应用...
Struts2 OGNL语言学习笔记 OGNL(Object-Graph Navigation Language)是 Struts 2 中的一种表达式语言,主要用于简化 JSP 页面中的编码,使页面与后台代码分离。下面是 OGNL 语言的主要特点和用法: 1. 支持对象...
13. ** strut2四天笔记**:这份学习笔记可能涵盖了以上所有知识点,包括如何创建Action,配置struts.xml,使用OGNL表达式,处理异常,以及实践中的各种技巧和最佳实践。 在四天的学习过程中,你应该通过实践和理解...
OGNL作为Struts2框架的核心技术之一,其强大的表达能力和灵活的使用方式极大地提高了开发效率。理解并熟练掌握OGNL的使用,对于深入学习和高效开发基于Struts2的应用程序至关重要。通过本文对OGNL在Struts2中的应用...
Struts2是一个强大的MVC(模型-视图-控制器)框架,用于构建可维护、可扩展且具有松耦合架构的Java Web...通过阅读这些文档,开发者可以更好地掌握Struts2的核心概念和实践技巧,从而提升开发效率和应用程序的质量。