OGNL表达式的综合应用.ppt

上传人:w****2 文档编号:14675014 上传时间:2020-07-28 格式:PPT 页数:30 大小:832.50KB
收藏 版权申诉 举报 下载
OGNL表达式的综合应用.ppt_第1页
第1页 / 共30页
OGNL表达式的综合应用.ppt_第2页
第2页 / 共30页
OGNL表达式的综合应用.ppt_第3页
第3页 / 共30页
资源描述:

《OGNL表达式的综合应用.ppt》由会员分享,可在线阅读,更多相关《OGNL表达式的综合应用.ppt(30页珍藏版)》请在装配图网上搜索。

1、7.7 OGNL表达式的综合应用,环境准备: 用户新建web项目ch07,导入struts 2类库,在web.xml文件中配置FilterDispatcher。 Step1:编写领域对象 Package org.sunxin.struts 2.ch07.mode1 ; Public class Address Private sting country ; Private sting city ; Private sting street ; Public Address(sting country, sting city,sting street) This. Country= countr

2、y ; This. city = city ; This. street = street ; ,Employee.java Package org.sunxin.struts 2.ch07.mode1 Import java.util.map Public class employee Private sting name ; Private int age ; Private float salary ; Private Address address ; Private sting emails ; Public mapaccounts: Public employee(sting na

3、me, int age, float salary, Address address, sting emails, mapaccounts) Super() ; This.name=name This.age=age This salary= salary,Step2:编写OgnlAction 说明:OgnlAction类负责准备数据,他实现parameterAware、RequestAware 、SessionAware和ApplicationAware4个接口。框架通过parameterAware接口向action注入保存了请求参数的map对象。 OgnlAction类完整代码: Pack

4、age org.sunxin.struts 2.ch07.action; import java.util.ArrayList ; import java.util.HashMap ; import java.util. List ; import java.util. Map; import org.apache.struts2.interceptor. ApplicationAware; import org.apache.struts2.interceptor. parameterAware ; import org.apache.struts2.interceptor. Request

5、Aware ; import org.apache.struts2.interceptor. SessionAware ; import org.sunxin. Struts2.ch07.model.Address; import org.sunxin. Struts2.ch07.model.Employee;,import com.opensymphony.xwork2.Action; public class OgnlAction implements Action, ParameterAware, RequestAware, SessionAware, ApplicationAware

6、private Map parameters; private Map request; private Map session; private Map application; private List emps = new ArrayList(); /* * 初始化雇员信息,将Employee对象保存到List对象emps中。 */ public void initEmps() Address address1 = new Address(中国, 北京, 海淀南路18号); Address address2 = new Address(中国, 上海, 南京西路20号); Address

7、address3 = new Address(中国, 成都, 春熙路8号); String emails1 = new String , ; String emails2 = new String , ; String emails3 = new String , ;,Step3:编写ognl.jsp OGNL执行成功后,请求将转向ognl.jsp页面,在这个页面中使用OGNL表达式访问Action携带的数据。 环境:在WebRoot目录下新建ognl.jsp页面,代码如下: 见书本p159,3.2.1 内建转换器介绍,从上面那个例子可以看出,Sturts 2为常用的数据类型提供了内建的类型转

8、换器,所以根本不用自定义转换器。对于内建的转换器,Struts在遇到这些类型时,会自动去调用相应的转换器。 下面列举了全部的内建转换器。具体如下。 基本数据类型以及其封装类。包括:boolean和Boolean、char和Character、int和Integer、long和Integer、float和Float、double和Double。完成字符串和基本数据类型或其封装类之间的转换。 日期类型。使用当前区域的短格式转换,即DateFormat.getInstance(DateFormat.SHORT)。完成字符串和日期类型之间的转换。 集合(Collection)类型。将request.g

9、etParameterValues(String arg)返回的字符串数据与java.util.Collection转换。集合元素为String类型。 集合(Set)类型。与Collection的转换相似,只是去掉了相同的值。集合元素为String类型。 数组类型。将request.getParameterValues(String arg)返回的字符串数组中的每个字符串值取出组成一个数组。数组元素为String类型。,3.2.2 基本数据类型转换器,下面再来看下Struts 2提供的内建类型转换器,是如何完成字符串和基本数据类型之间的转换的。,3.2.3 基本数据类型的封装类转换器,Stru

10、ts 2不但提供了基本数据类型转换器,同时也提供了基本数据类型封装类的转换器。其用法和基本数据类型基本一样,只需修改业务控制器中的属性为对应的封装类就可以了。,3.2.4 数组类型转换器,Struts 2还提供了一个数组类型的转换器。这个转换器非常有用,比如多个表单元素的name属性相同,那么提交的参数就不再是字符串而是一个字符串数组。通过Sturts 2提供的数组类型的转换器就能很方便的将多个相同name属性的表单元素的值封装到Action中的一个数组中。,3.2.5 集合类型转换器,上面介绍的是通过字符串数组来接受参数值,同样也可以通过集合类型来接受参数值。Struts 2提供的集合类型转

11、换器,会将参数值自动赋值到集合类型属性中。,3.3 OGNL表达式语言,Struts 2已经实现了一些常用的类型转换器,但是这些类型转换器毕竟还是有限的。如果是开发者自己定义的数据类型,就必须自定义类型转换器来进行转换。在Struts 2中自定义类型转化器是非常方便和简单。因为Struts 2的类型转换是基于OGNL来实现的,所以在介绍自定义类型转换器之前先简单介绍OGNL。,3.3.1 简单介绍OGNL以及如何下载OGNL源代码,OGNL(Object Graph Navigation Language)是一种强大的表达式语言。可以通过OGNL提供的TypeConvert接口以及实现了Typ

12、eConvert的DefaultTypeConvert类来实现自定义的类型转换器。 OGNL提供的类和接口全部包含在ognl 2.6.11.jar这个库文件中,这些库文件中都是已经编译好的class文件,为了能查看这些类的源代码必须先下载OGNL的源代码。以前下载的Struts 2源代码中只包含struts2-core库文件中的代码,其他的源代码必须自行下载。,3.3.2 在Eclipse中查看OGNL类文件,因为导入的库文件都是已经编译好的class文件,而不是源文件。必须把这些class文件和下载好的源代码进行关联,这样就能在Eclipse中查看这些库文件中的类了。 具体步骤如下。,3.4

13、 自定义类型转换器,Struts 2已经实现了一些常用的类型转换器,但是这毕竟这些类型转换器毕竟还是有限的。如果是开发者自己定义的数据类型,就必须自定义类型转换器来进行转换。,3.4.1 项目需求,前面介绍的都是Sturts 2内建的类型转换器,下面来看如何创建自定义的类型转换器。 加入现在项目要求有如下一个输入页面,如图3-23所示。在该输入页中的name文本框中输入“firstName lasNamet”模式的字符串,注意中间使用空格隔开。单击“input”按钮提交,将该字符串转换成一个Name对象。,3.4.2 实现自定义类型转换器,前面提到过,Struts 2的类型转换器是基于OGNL

14、实现的。首先在导入的OGNL类库中找到TypeConverter类,代码如下所示。 package ognl; import java.lang.reflect.Member; import java.util.Map; public interface TypeConverter public Object convertValue(Map context, Object target, Member member, String propertyName, Object value, Class toType); ,3.4.3 注册自定义类型转换器,要想使自定义的类型转换器起作用还必须将其

15、在Web应用中注册。类型转换器的注册分为两种,一种是局部类型转换器,一种是全局类型转换器。 局部类型转换器和全局类型转换器从字面上来看,就是说一个可以进行全局的类型转换,一个只能进行局部的类型转换。 注册局部类型转换器非常简单,只需要在相应的Action目录下新建一个资源文件。该资源文件名格式如下。 ActionName-conversion.properties 其中ActionName表示需要进行转换的Action的类名,“-conversion.properties”字符串则是固定格式的。该文件也是一个典型资源文件,文件由键值对组成。如下所示。 name=net.hncu.convert

16、.NameConvert,3.4.4 新建显示页测试程序,自定义类型转换器也注册好了,现在来创建一个显示页类进行输出。测试程序是否能完成类型转换。步骤如下所示。,3.4.5 程序执行流程,项目成功的完成了预定的功能。为了加深印象,下面讲一下程序执行的流程。程序执行中有两个重要的步骤。 从字符串转换为自定义类型,其执行流程图如图3-26所示。 从自定义类型转换为字符串类型,其执行流程图如图3-27所示。,3.4.6 使用Struts 2提供的StrutsTypeConverter,前面介绍了TypeConverter接口以及实现TypeConverter接口的DefaultTypeConvert

17、er类。但是大家有没有发现通过继承DefaultTypeConverter类来实现自定义类型转换器比较麻烦。 其实Struts 2提供了一个StrutsTypeConverter的抽象类,开发时可以直接继承这个类来进行转换器的构建。通过继承该类来构建类型转换器,可以不用对转换的类型进行判断。这样又可以省去不少的时间和代码。 StrutsTypeConverter类在导入的struts2-core-2.0.11.jar库文件中。和关联OGNL源代码类型一样,可以把class文件和源代码进行关联。在单击“External Folder”按钮后选择Struts 2的解压目录,这里分别选择“src”、

18、“core”、“src”、“main”、“java”目录。单击“ok”按钮完成关联。StrutsTypeConverter. class代码如下所示。,3.5 局部类型转换器和全局类型转换器,Struts 2注册类型转换器有两种方式,一种是注册局部类型转换器,另一种是注册全局类型转换器。下面将分别介绍如何注册局部类型转换器和注册全局类型转换器,以及介绍两种注册方式的区别。,3.5.1 局部类型转换器,假设现在项目需要增加需求,需要在用户输入页中增加一个文本框用来输入othername值。这时只要在Action中添加一个Name类型的属性,然后再注册自定义类型转换器就可以了。下面针对该需求编写项

19、目步骤。 编写项目步骤如下。,3.5.2 全局类型转换器,输入页面中,name参数值和othername参数值都需要进行类型转换为Name类型。在LoginAction中添加name和othername两个属性,两个属性的类型都为Name类型。这时在注册类型转换器时,就必须配置这两个属性对应的类型转换器。 如果在输入页面再添加一个文本框,其参数值也是要转换成Name类型,这样的话就必须再在资源文件中注册吗?这样会不会很麻烦?这样确实很麻烦,这种注册方式注册的是局部类型转换器。不过不用担心,Sturts 2提供了注册全局类型转换器的方式,这样就不用这么麻烦了。 Sturts 2中提供了注册全局类

20、型转换器的方式。通过这种方式就就不必重复指定Action中的属性以及对应的转换器类。即使系统中多个Action都包含了Name类型的属性,也可以通过定义全局类型器来一次实现,而无需多次注册。 要实现全局类型转换器,必须提供一个xwork-conversion.properties文件,该文件必须保存在classes目录下。该资源文件名格式如下。 要进行转换的类=对应的类型转换器 可以通过注册全局类型转换器来完成上一个实例,注册文件代码如下。 net.hncu.bean.Name=net.hncu.convert.NameConvert 如果注册了全局类型转换器,那么对于所有的Name类型属性都

21、能起作用。,3.6 实现集合类型转换器,通过自定义类型转换器,可以将用户请求参数设置到集合类型的属性中。下面将分别介绍如何定义数组属性的类型转换器以及集合属性的类型转换器。,3.6.1 数组属性的类型转换器,假如现在项目需求改变了,在用户输入页中使用两个name属性同为“name”的文本框。这样的话这两个请求参数的名称都为name,在服务器端接受到的参数不再是单一的字符串而是一个字符串数组。可以在Action中定义一个Name类型的数组来存放多个Name类型的值。Action类代码如下。,3.6.2 集合属性的类型转换器,假如现在Action中的name属性不使用Name类型的数组,能想出其他

22、的方法来封装用户信息吗?这时可以使用集合来封装用户的信息。 下面修改Action中的name属性,不再使用Name类型的数组,而是使用集合来储存用户信息。,3.7 类型转换中错误处理,在进行类型转换中,如果出现错误将会提示错误信息。Struts 2默认提供了错误信息提示,但是这些错误信息提示不够友好,下面将介绍如何自定义错误信息来取代Struts 2的默认错误信息。,3.7.1 定义全局类型转换错误处理信息,前面输入的用户信息,都是按照转换要求来输入的。假如不按照要求输入,都会出现转换错误提示信息,如图3-31所示。,3.7.2 定义局部类型转换错误处理信息,局部类型转换错误处理信息就是对每个属性进行类型转换时出现的错误信息进行定义。这样的错误对用户更加友好,使得用户能够更加的明白到底出现了什么错误。定义局部类型转换错误处理信息的步骤如下。,3.8 小结,本章详细地介绍了为什么要进行类型转换以及如何进行类型转换。介绍了如何通过OGNL的DefaultTypeConverter类和Struts的StrutsTypeConverter进行类型转换。详细介绍了局部类型转换和全局类型转换的使用以及类型转换错误信息的处理以及国际化。类型转换和数据校验是紧密结合的,下章将结合类型转换来讲解数据校验,所以一定要弄懂类型转换的基础知识。,

展开阅读全文
温馨提示:
1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
2: 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
3.本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
关于我们 - 网站声明 - 网站地图 - 资源地图 - 友情链接 - 网站客服 - 联系我们

copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!