OGNL表达式的综合应用.ppt_第1页
OGNL表达式的综合应用.ppt_第2页
OGNL表达式的综合应用.ppt_第3页
OGNL表达式的综合应用.ppt_第4页
OGNL表达式的综合应用.ppt_第5页
已阅读5页,还剩25页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

7.7OGNL表达式的综合应用,环境准备:用户新建web项目ch07,导入struts2类库,在web.xml文件中配置FilterDispatcher。Step1:编写领域对象Packageorg.sunxin.struts2.ch07.mode1;PublicclassAddressPrivatestingcountry;Privatestingcity;Privatestingstreet;PublicAddress(stingcountry,stingcity,stingstreet)This.Country=country;This.city=city;This.street=street;,Employee.javaPackageorg.sunxin.struts2.ch07.mode1Importjava.util.mapPublicclassemployeePrivatestingname;Privateintage;Privatefloatsalary;PrivateAddressaddress;Privatestingemails;Publicmapaccounts:Publicemployee(stingname,intage,floatsalary,Addressaddress,stingemails,mapaccounts)Super();T=nameThis.age=ageThissalary=salary,Step2:编写OgnlAction说明:OgnlAction类负责准备数据,他实现parameterAware、RequestAware、SessionAware和ApplicationAware4个接口。框架通过parameterAware接口向action注入保存了请求参数的map对象。OgnlAction类完整代码:Packageorg.sunxin.struts2.ch07.action;importjava.util.ArrayList;importjava.util.HashMap;importjava.util.List;importjava.util.Map;erceptor.ApplicationAware;erceptor.parameterAware;erceptor.RequestAware;erceptor.SessionAware;importorg.sunxin.Struts2.ch07.model.Address;importorg.sunxin.Struts2.ch07.model.Employee;,importcom.opensymphony.xwork2.Action;publicclassOgnlActionimplementsAction,ParameterAware,RequestAware,SessionAware,ApplicationAwareprivateMapparameters;privateMaprequest;privateMapsession;privateMapapplication;privateListemps=newArrayList();/*初始化雇员信息,将Employee对象保存到List对象emps中。*/publicvoidinitEmps()Addressaddress1=newAddress(中国,北京,海淀南路18号);Addressaddress2=newAddress(中国,上海,南京西路20号);Addressaddress3=newAddress(中国,成都,春熙路8号);Stringemails1=newStringzhangsan,zhangsan;Stringemails2=newStringlisi,lisi;Stringemails3=newStringwangwu,wangwu;,Step3:编写ognl.jspOGNL执行成功后,请求将转向ognl.jsp页面,在这个页面中使用OGNL表达式访问Action携带的数据。环境:在WebRoot目录下新建ognl.jsp页面,代码如下:见书本p159,3.2.1内建转换器介绍,从上面那个例子可以看出,Sturts2为常用的数据类型提供了内建的类型转换器,所以根本不用自定义转换器。对于内建的转换器,Struts在遇到这些类型时,会自动去调用相应的转换器。下面列举了全部的内建转换器。具体如下。基本数据类型以及其封装类。包括:boolean和Boolean、char和Character、int和Integer、long和Integer、float和Float、double和Double。完成字符串和基本数据类型或其封装类之间的转换。日期类型。使用当前区域的短格式转换,即DateFormat.getInstance(DateFormat.SHORT)。完成字符串和日期类型之间的转换。集合(Collection)类型。将request.getParameterValues(Stringarg)返回的字符串数据与java.util.Collection转换。集合元素为String类型。集合(Set)类型。与Collection的转换相似,只是去掉了相同的值。集合元素为String类型。数组类型。将request.getParameterValues(Stringarg)返回的字符串数组中的每个字符串值取出组成一个数组。数组元素为String类型。,3.2.2基本数据类型转换器,下面再来看下Struts2提供的内建类型转换器,是如何完成字符串和基本数据类型之间的转换的。,3.2.3基本数据类型的封装类转换器,Struts2不但提供了基本数据类型转换器,同时也提供了基本数据类型封装类的转换器。其用法和基本数据类型基本一样,只需修改业务控制器中的属性为对应的封装类就可以了。,3.2.4数组类型转换器,Struts2还提供了一个数组类型的转换器。这个转换器非常有用,比如多个表单元素的name属性相同,那么提交的参数就不再是字符串而是一个字符串数组。通过Sturts2提供的数组类型的转换器就能很方便的将多个相同name属性的表单元素的值封装到Action中的一个数组中。,3.2.5集合类型转换器,上面介绍的是通过字符串数组来接受参数值,同样也可以通过集合类型来接受参数值。Struts2提供的集合类型转换器,会将参数值自动赋值到集合类型属性中。,3.3OGNL表达式语言,Struts2已经实现了一些常用的类型转换器,但是这些类型转换器毕竟还是有限的。如果是开发者自己定义的数据类型,就必须自定义类型转换器来进行转换。在Struts2中自定义类型转化器是非常方便和简单。因为Struts2的类型转换是基于OGNL来实现的,所以在介绍自定义类型转换器之前先简单介绍OGNL。,3.3.1简单介绍OGNL以及如何下载OGNL源代码,OGNL(ObjectGraphNavigationLanguage)是一种强大的表达式语言。可以通过OGNL提供的TypeConvert接口以及实现了TypeConvert的DefaultTypeConvert类来实现自定义的类型转换器。OGNL提供的类和接口全部包含在ognl2.6.11.jar这个库文件中,这些库文件中都是已经编译好的class文件,为了能查看这些类的源代码必须先下载OGNL的源代码。以前下载的Struts2源代码中只包含struts2-core库文件中的代码,其他的源代码必须自行下载。,3.3.2在Eclipse中查看OGNL类文件,因为导入的库文件都是已经编译好的class文件,而不是源文件。必须把这些class文件和下载好的源代码进行关联,这样就能在Eclipse中查看这些库文件中的类了。具体步骤如下。,3.4自定义类型转换器,Struts2已经实现了一些常用的类型转换器,但是这毕竟这些类型转换器毕竟还是有限的。如果是开发者自己定义的数据类型,就必须自定义类型转换器来进行转换。,3.4.1项目需求,前面介绍的都是Sturts2内建的类型转换器,下面来看如何创建自定义的类型转换器。加入现在项目要求有如下一个输入页面,如图3-23所示。在该输入页中的name文本框中输入“firstNamelasNamet”模式的字符串,注意中间使用空格隔开。单击“input”按钮提交,将该字符串转换成一个Name对象。,3.4.2实现自定义类型转换器,前面提到过,Struts2的类型转换器是基于OGNL实现的。首先在导入的OGNL类库中找到TypeConverter类,代码如下所示。packageognl;importjava.lang.reflect.Member;importjava.util.Map;publicinterfaceTypeConverterpublicObjectconvertValue(Mapcontext,Objecttarget,Membermember,StringpropertyName,Objectvalue,ClasstoType);,3.4.3注册自定义类型转换器,要想使自定义的类型转换器起作用还必须将其在Web应用中注册。类型转换器的注册分为两种,一种是局部类型转换器,一种是全局类型转换器。局部类型转换器和全局类型转换器从字面上来看,就是说一个可以进行全局的类型转换,一个只能进行局部的类型转换。注册局部类型转换器非常简单,只需要在相应的Action目录下新建一个资源文件。该资源文件名格式如下。ActionNperties其中ActionName表示需要进行转换的Action的类名,“-perties”字符串则是固定格式的。该文件也是一个典型资源文件,文件由键值对组成。如下所示。name=net.hncu.convert.NameConvert,3.4.4新建显示页测试程序,自定义类型转换器也注册好了,现在来创建一个显示页类进行输出。测试程序是否能完成类型转换。步骤如下所示。,3.4.5程序执行流程,项目成功的完成了预定的功能。为了加深印象,下面讲一下程序执行的流程。程序执行中有两个重要的步骤。从字符串转换为自定义类型,其执行流程图如图3-26所示。从自定义类型转换为字符串类型,其执行流程图如图3-27所示。,3.4.6使用Struts2提供的StrutsTypeConverter,前面介绍了TypeConverter接口以及实现TypeConverter接口的DefaultTypeConverter类。但是大家有没有发现通过继承DefaultTypeConverter类来实现自定义类型转换器比较麻烦。其实Struts2提供了一个StrutsTypeConverter的抽象类,开发时可以直接继承这个类来进行转换器的构建。通过继承该类来构建类型转换器,可以不用对转换的类型进行判断。这样又可以省去不少的时间和代码。StrutsTypeConverter类在导入的struts2-core-2.0.11.jar库文件中。和关联OGNL源代码类型一样,可以把class文件和源代码进行关联。在单击“ExternalFolder”按钮后选择Struts2的解压目录,这里分别选择“src”、“core”、“src”、“main”、“java”目录。单击“ok”按钮完成关联。StrutsTypeConverter.class代码如下所示。,3.5局部类型转换器和全局类型转换器,Struts2注册类型转换器有两种方式,一种是注册局部类型转换器,另一种是注册全局类型转换器。下面将分别介绍如何注册局部类型转换器和注册全局类型转换器,以及介绍两种注册方式的区别。,3.5.1局部类型转换器,假设现在项目需要增加需求,需要在用户输入页中增加一个文本框用来输入othername值。这时只要在Action中添加一个Name类型的属性,然后再注册自定义类型转换器就可以了。下面针对该需求编写项目步骤。编写项目步骤如下。,3.5.2全局类型转换器,输入页面中,name参数值和othername参数值都需要进行类型转换为Name类型。在LoginAction中添加name和othername两个属性,两个属性的类型都为Name类型。这时在注册类型转换器时,就必须配置这两个属性对应的类型转换器。如果在输入页面再添加一个文本框,其参数值也是要转换成Name类型,这样的话就必须再在资源文件中注册吗?这样会不会很麻烦?这样确实很麻烦,这种注册方式注册的是局部类型转换器。不过不用担心,Sturts2提供了注册全局类型转换器的方式,这样就不用这么麻烦了。Sturts2中提供了注册全局类型转换器的方式。通过这种方式就就不必重复指定Action中的属性以及对应的转换器类。即使系统中多个Action都包含了Name类型的属性,也可以通过定义全局类型器来一次实现,而无需多次注册。要实现全局类型转换器,必须提供一个perties文件,该文件必须保存在classes目录下。该资源文件名格式如下。要进行转换的类=对应的类型转换器可以通过注册全局类型转换器来完成上一个实例,注册文件代码如下。net.hncu.bean.Name=net.hncu.convert.NameConvert如果注册了全局类型转换器,那么对于所有的Name类型属性都能起作用。,3.6实现集合类型转换器,通过自定义类型转换器,可以将用户请求参数设置到集合类型的属性中。下面将分别介绍如何定义数组属性的类型转换器以及集合属性的类型转换器。,3.6.1数组属性的类型转换器,假如现在项目需求改变了,在用户输入页中使用两个name属性同为“name”的文本框。这样的话这两个请求参数的名称都为name,在服务器端接受到的参数不再是单一的字符串而是一个字符串数组。可以在Acti

温馨提示

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

评论

0/150

提交评论