OGNL表达式的综合应用.ppt

上传人:scccc 文档编号:13936036 上传时间:2022-01-27 格式:PPT 页数:29 大小:790.50KB
返回 下载 相关 举报
OGNL表达式的综合应用.ppt_第1页
第1页 / 共29页
OGNL表达式的综合应用.ppt_第2页
第2页 / 共29页
OGNL表达式的综合应用.ppt_第3页
第3页 / 共29页
OGNL表达式的综合应用.ppt_第4页
第4页 / 共29页
OGNL表达式的综合应用.ppt_第5页
第5页 / 共29页
点击查看更多>>
资源描述

《OGNL表达式的综合应用.ppt》由会员分享,可在线阅读,更多相关《OGNL表达式的综合应用.ppt(29页珍藏版)》请在三一文库上搜索。

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

2、mployee.javaPublic class employeePrivate sting name ;Private int age ; Private float salary ;Private Address address ;Private sting emails ;Public mapaccounts:Public employee(sting name, int age, float salary, Address address, sting emails, mapaccounts)Super() ;This.name=nameThis.age=ageThis salary=

3、 salary,Step2:编写OgnlAction 说明:OgnlAction类负责准备数据,他实现parameterAware、RequestAware 、SessionAware和ApplicationAware4个接口。框架通过parameterAware接口向action注入保存了请求参数的map对象。OgnlAction类完整代码:import java.util. List ;import java.util. Map;,ublic class OgnlAction implements Action, ParameterAware, RequestAware,SessionAw

4、are, ApplicationAwareprivate 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(中国, 上海, 南京西路2

5、0号);Address 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,从上面那个例子可以看出,Sturts 2为常用的数据类型提供了内建的类型转换器,所以根

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

7、集合元素为String类型。数组类型。将request.getParameterValues(String arg)返回的字符串数组中的每个字符串值取出组成一个数组。数组元素为String类型。,下面再来看下Struts 2提供的内建类型转换器,是如何完成字符串和基本数据类型之间的转换的。,Struts 2不但提供了基本数据类型转换器,同时也提供了基本数据类型封装类的转换器。其用法和基本数据类型基本一样,只需修改业务控制器中的属性为对应的封装类就可以了。,Struts 2还提供了一个数组类型的转换器。这个转换器非常有用,比如多个表单元素的name属性相同,那么提交的参数就不再是字符串而是一个字

8、符串数组。通过Sturts 2提供的数组类型的转换器就能很方便的将多个相同name属性的表单元素的值封装到Action中的一个数组中。,上面介绍的是通过字符串数组来接受参数值,同样也可以通过集合类型来接受参数值。Struts 2提供的集合类型转换器,会将参数值自动赋值到集合类型属性中。,3.3 OGNL表达式语言,Struts 2已经实现了一些常用的类型转换器,但是这些类型转换器毕竟还是有限的。如果是开发者自己定义的数据类型,就必须自定义类型转换器来进行转换。在Struts 2中自定义类型转化器是非常方便和简单。因为Struts 2的类型转换是基于OGNL来实现的,所以在介绍自定义类型转换器之

9、前先简单介绍OGNL。,OGNL(Object Graph Navigation Language)是一种强大的表达式语言。可以通过OGNL提供的TypeConvert接口以及实现了TypeConvert的DefaultTypeConvert类来实现自定义的类型转换器。,因为导入的库文件都是已经编译好的class文件,而不是源文件。必须把这些class文件和下载好的源代码进行关联,这样就能在Eclipse中查看这些库文件中的类了。具体步骤如下。,3.4 自定义类型转换器,Struts 2已经实现了一些常用的类型转换器,但是这毕竟这些类型转换器毕竟还是有限的。如果是开发者自己定义的数据类型,就必

10、须自定义类型转换器来进行转换。,前面介绍的都是Sturts 2内建的类型转换器,下面来看如何创建自定义的类型转换器。加入现在项目要求有如下一个输入页面,如图3-23所示。在该输入页中的name文本框中输入“firstName lasNamet”模式的字符串,注意中间使用空格隔开。单击“input”按钮提交,将该字符串转换成一个Name对象。,前面提到过,Struts 2的类型转换器是基于OGNL实现的。首先在导入的OGNL类库中找到TypeConverter类,代码如下所示。package ognl;public interface TypeConverter public Object co

11、nvertValue(Map context, Object target, Member member, String propertyName, Object value, Class toType);,要想使自定义的类型转换器起作用还必须将其在Web应用中注册。类型转换器的注册分为两种,一种是局部类型转换器,一种是全局类型转换器。局部类型转换器和全局类型转换器从字面上来看,就是说一个可以进行全局的类型转换,一个只能进行局部的类型转换。注册局部类型转换器非常简单,只需要在相应的Action目录下新建一个资源文件。该资源文件名格式如下。ActionName-conversion.proper

12、ties其中ActionName表示需要进行转换的Action的类名,“-conversion.properties”字符串则是固定格式的。该文件也是一个典型资源文件,文件由键值对组成。如下所示。,自定义类型转换器也注册好了,现在来创建一个显示页类进行输出。测试程序是否能完成类型转换。步骤如下所示。,项目成功的完成了预定的功能。为了加深印象,下面讲一下程序执行的流程。程序执行中有两个重要的步骤。从字符串转换为自定义类型,其执行流程图如图3-26所示。从自定义类型转换为字符串类型,其执行流程图如图3-27所示。,前面介绍了TypeConverter接口以及实现TypeConverter接口的De

13、faultTypeConverter类。但是大家有没有发现通过继承DefaultTypeConverter类来实现自定义类型转换器比较麻烦。其实Struts 2提供了一个StrutsTypeConverter的抽象类,开发时可以直接继承这个类来进行转换器的构建。通过继承该类来构建类型转换器,可以不用对转换的类型进行判断。这样又可以省去不少的时间和代码。,3.5 局部类型转换器和全局类型转换器,Struts 2注册类型转换器有两种方式,一种是注册局部类型转换器,另一种是注册全局类型转换器。下面将分别介绍如何注册局部类型转换器和注册全局类型转换器,以及介绍两种注册方式的区别。,假设现在项目需要增加

14、需求,需要在用户输入页中增加一个文本框用来输入othername值。这时只要在Action中添加一个Name类型的属性,然后再注册自定义类型转换器就可以了。下面针对该需求编写项目步骤。编写项目步骤如下。,输入页面中,name参数值和othername参数值都需要进行类型转换为Name类型。在LoginAction中添加name和othername两个属性,两个属性的类型都为Name类型。这时在注册类型转换器时,就必须配置这两个属性对应的类型转换器。如果在输入页面再添加一个文本框,其参数值也是要转换成Name类型,这样的话就必须再在资源文件中注册吗?这样会不会很麻烦?这样确实很麻烦,这种注册方式

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

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

17、以使用集合来封装用户的信息。下面修改Action中的name属性,不再使用Name类型的数组,而是使用集合来储存用户信息。,3.7 类型转换中错误处理,在进行类型转换中,如果出现错误将会提示错误信息。Struts 2默认提供了错误信息提示,但是这些错误信息提示不够友好,下面将介绍如何自定义错误信息来取代Struts 2的默认错误信息。,前面输入的用户信息,都是按照转换要求来输入的。假如不按照要求输入,都会出现转换错误提示信息,如图3-31所示。,局部类型转换错误处理信息就是对每个属性进行类型转换时出现的错误信息进行定义。这样的错误对用户更加友好,使得用户能够更加的明白到底出现了什么错误。定义局部类型转换错误处理信息的步骤如下。,

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 社会民生


经营许可证编号:宁ICP备18001539号-1