Struts高级特性.ppt

上传人:牧羊曲112 文档编号:6521456 上传时间:2023-11-08 格式:PPT 页数:53 大小:1.17MB
返回 下载 相关 举报
Struts高级特性.ppt_第1页
第1页 / 共53页
Struts高级特性.ppt_第2页
第2页 / 共53页
Struts高级特性.ppt_第3页
第3页 / 共53页
Struts高级特性.ppt_第4页
第4页 / 共53页
Struts高级特性.ppt_第5页
第5页 / 共53页
点击查看更多>>
资源描述

《Struts高级特性.ppt》由会员分享,可在线阅读,更多相关《Struts高级特性.ppt(53页珍藏版)》请在三一办公上搜索。

1、第7章 Struts高级特性,本章导航,本章仍然围绕管理员登录案例,将进一步深入介绍Struts的一些高级特性,通过本章的学习,将帮您解决如下几个问题:什么是国际化?如何对Struts应用进行国际化?Struts中如何进行异常处理?如何使用动态ActionForm?如何应用Validator验证框架对界面中输入数据进行校验?,本章目标,通过本章的学习,读者应该能够完成如下几个目标:掌握Struts的国际化与异常处理;学会使用动态ActionForm;会用Validator验证框架对ActionForm进行输入校验。,本章内容,Struts异常处理与国际化,1,动态ActionForm,2,St

2、ruts数据校验,3,Struts综合应用实例,4,7.1 Struts国际化与异常处理,7.1.1 Struts国际化所谓的国际化即我们通常所说的i18n(internationalization),是指程序能够在不修改内部代码的前提下,根据不同的语言及地区显示相应的界面。Struts是一种支持国际化的框架,使用Struts开发国际化程序是一件很便利的事情。,1.为什么需要国际化?,国际化是商业系统中不可或缺的一部分,目前很多跨国的商务需求都需要实现多语言,对用户而言他们始终想看到用他们熟悉的语言显示的网站,因此这势必要求开发网站所采用的技术具有国际化的特点。若采用普通的编程方式实现国际化可

3、能需要花费大量的时间和精力,而采用Struts则可以极大地简化程序员在做国际化时所需的工作。Struts允许将不同语言的文字写在多个资源文件中,每个资源对应一种语言,在JSP页面上通过Struts标签从资源文件中分别获取不同区域特征的文本,并显示在页面上,以此实现国际化的目的。,2.认识Struts国际化组件,要实现国际化,首先应该有存放各种版本语言编写的消息的地方。实际上,这些信息就被存储在多个文本文件中,每个文件对应着一种不同语言的版本。这些文件被称做资源文件,所有资源文件合在一起被称为资源包(Resource Bundle)。资源文件必须以.properties结尾,文件名前缀可以任意命

4、名,习惯上命名方式有以下两种:文件名前缀.properties。文件名前缀_语言种类.properties。,其中,语言种类字段必须是有效的ISO(International Standardization Organization,国际标准化组织)语言代码,ISO-639标准定义的这些代码格式为英文小写、双字符,如表7-1所示。表7-1 ISO-639标准常用语言代码,下面是一个资源包的代码,其中包含两个资源文件:用于创建英语界面的Application_ en.properties文件和用于创建中文界面的Application_zh.properties文件,这两个资源文件代码如下。App

5、lication_en.properties:#English ResourceMessage=login=login=login success=welcome login#validation and error messages=username is required=password is required login.error=username or password is not correct,资源文件Application_zh.properties:#中文资源信息=登录页面=登录页面=登录成功页面=欢迎登录#验证错误信息提示=用户名不能为空=密码不能为空login.err

6、or=用户名或密码错误在上面的资源信息文件中,以#开头的行是注释部分,其他的行都是key=value(键值)的形式,定义了一个key对应当前语言下的文字。,在进行国际化处理时,资源文件中包含中文字符,若不进行编码转换页面将会出现乱码。在JDK中提供了一个native2ascii程序,它能够实现字符编码转换。例如要转换Application.properties文件中的字符,在DOS中执行以下的命令:native2ascii-encoding GB2312 Application.properties Application_zh.properties经过native2ascii命令转换后,就得

7、到一个新的文件Application_zh.properties,它的内容如下:login.jsp.title=u767bu5f55u9875u9762login.jsp.page.heading=u767bu5f55u9875u9762login.jsp.label.username=u7528u6237u540duff1alogin.jsp.label.password=u5bc6u7801uff1alogin.jsp.button.submit=u63d0u4ea4login.jsp.button.reset=u91cdu5199,3.访问资源包的方式,访问资源包的方式主要包括两种:一种

8、是在JSP页面中通过Struts标签来访问,另一种是在程序中访问。在JSP页面中通过Struts标签来访问资源包需要以下两个步骤。将标签库描述文件struts-bean.tld复制到应用工程的WEB-INF目录下。在JSP页面中引入标签库,引入的方式如下代码所示:,在程序中访资源包可通过Action类提供的getResources()方法先获得 类的一个实例,之后就可以按照request对象中的Locale信息来获取相应资源包中的文本,示例代码如下:/获取请求的的Locale信息Locale locale=getLocale(request);/获取资源包MessageResources me

9、ssage=getResources(request);/从资源包中得到信息文本并输出);,实例 管理员登录程序的国际化处理,在本例中,我们将完善之前的用户登录程序,将用户登录程序做成一个国际化程序。当用户浏览器设置显示的语言是中文时,显示中文界面,当用户浏览器设置显示的语言是英文时,显示英文界面,如图7-1和图7-2所示。,图7-1 login.jsp页面国际化中文显示界面,图7-2 login.jsp页面国际化英文显示界面,基本思路,本应用程序使用国际化资源文件和Struts标签来实现,其步骤如下。创建国际化资源文件。配置资源文件,让struts加载资源文件 在页面中使用标签显示国际化信息

10、,7.1.2 Struts异常处理异常是当JVM(JAVA虚拟机)在执行应用程序的某个方法的时候遇到的非正常现象,JVM就会生成一个异常对象,抛给客户以便客户进行异常处理.Struts框架的异常处理机制建立在java异常处理的基础之上.在研究Struts异常处理之前,先回顾一下java异常处理原理,理解java虚拟机JVM的异常处理过程有助于应用设计正确的异常处理方法.处理异常需要JVM付出不小的开销,所以用于必须慎重使用.,1.Java异常处理JAVA异常是在java程序运行的时候遇到非正常的情况而创建的对象,它封装了异常信息,java异常的根类为,整个类有两个直接子类和;Error是程序本

11、身无法恢复的严重错误.Exception则表示可以被程序捕获并处理的异常错误.JVM用方法调用栈来跟踪每个线程中一系列的方法调用过程,该栈保存了每个调用方法的本地信息.对于独立的JAVA程序,可以一直到该程序的main方法.当一个新方法被调用的时候,JVM把描述该方法的栈结构置入栈顶,位于栈顶的方法为正确执行的方法.当一个JAVA方法正常执行完毕,JVM回从调用栈中弹处该方法的栈结构,然后继续处理前一个方法.,如果java方法在执行代码的过程中抛出异常,JVM必须找到能捕获异常的catch块代码.它首先查看当前方法是否存在这样的catch代码块,如果存在就执行该catch代码块,否则JVM回调

12、用栈中弹出该方法的栈结构,继续到前一个方法中查找合适的catch代码块.最后如果JVM向上追到了main()方法,也就是一直把异常抛给了main()方法,仍然没有找到该异常处理的代码块,该线程就会异常终止,如果该线程是主线程,应用程序也随之终止,此时JVM将把异常直接抛给用户,在用户终端上会看到原始的异常信息.回顾完了JAVA的异常处理机制,就要开始研究Struts的异常处理了.,2.Struts异常处理Struts框架在视图层和控制层提供了对异常处理的支持.Struts的控制器负责捕获各种异常,包括控制器运行中本身抛出的异常,以及调用模型的业务方法的异常.当异常被控制器捕获的时候,在异常处理

13、代码块中,创建描述异常信息的ActionMessage对象把它保存在ActionMessages或者它的子类ActionErrors对象中,然后把它保存在特定的范围内,比如request或session.接下来在视图层标签检索特定范围的ActionMessages对象,把本地化错误消息输出到页面上.这种异常处理机制可以避免用户看到原始的java异常信息.可以更友好的把错误信息展示给用户.,在以前的Struts开发过程中,主要采用上述的手动处理的方式来处理异常。即先通过try/catch捕获异常,然后定制个性化的错误信息放在ActionMessages中,最后在页面中把这些错误信息返回给页面。但

14、是,这种手动处理异常的方式是以JVM的异常处理机制为基础的,尽管它提供了强大的通用错误处理机制,但是不能保证捕获到所有的异常或者错误。借助于Struts的异常处理框架,异常处理只需通过struts-config.xml文件中配置即可,配置方法可以避免在Action类中通过硬编码来处理异常,提高应用的灵活性、可重用性和可维护性。我们把这种处理异常的方式叫自动异常处理。即在Action中不捕获异常,而是将异常交由Struts异常处理框架来处理。,根据异常在配置文件中定义的位置不同,异常可分为局部异常和全局异常两种:局部异常在action的子元素中定义 全局异常在global-exceptions元

15、素中定义 异常定义的格式如下:其中:key属性用于指定错误消息key,根据这个key到ResourceBundle中寻找匹配的消息文本;type属性指定该Exception的类绝对路径;scope属性指定ActionMessages对象的存放范围,默认request;path属性指定异常处理页面(没配该属性时会到input页面处理,因为默认异常处理类ExceptionHandler会先判断getPath是否有值,非空就new一个该getPath的ActionForward,为空就设置为mapping.getInputForward的值)。,【实例】Struts异常控制,说明:上面的业务逻辑,会

16、抛出两个业务逻辑异常。其中UserNameException和UserPasswordException两个异常类都是自己定义的RuntimeException异常类的子类。Struts Action的execute方法被设计成可以抛出任何类型的异常。因此,重写该方法也可以抛出任何异常,保证了execute方法调用业务逻辑方法时,无须使用try/catch块。下面是Action的源代码:,Action的execute方法在执行时会抛出异常,Struts异常处理框架可以负责处理这些异常。只须要在struts-config.xml配置文件中配置元素即可。struts-config.xml配置文件的

17、相关代码如下:,上面的配置文件中定义了两个局部异常,当LoginAction的execute方法抛出异常或.UserPasswordException异常时,Struts将重定向到/login_error.jsp页面,并将显示异常提示信息。若当任何一个Action的execute方法抛出一种不可预知异常时,想让Struts重定向到/login_error.jsp页面,则可以定义一个全局异常。可以在配置文件的标签中加入如下内容:,该定义表明,不管哪个Action的execute方法抛出一种不可预知异常时,都会重定向到/login_error.jsp页面,并在页面中显示异常提示信息。异常提示信息存

18、放在Application资源文件中。相关的资源文件片段如下:,如在用户名的文本框中输入任意字符串,只要不是admin,而密码框中输入admin,然后提交表单,根据业务逻辑方法,将抛出UserNotFoundException异常,异常框架开始工作,于是会将页面重定向到/login_error.jsp,并将显示出“用户名不存在”异常提示信息。,7.2 动态ActionForm,从Struts1.1版本开始,Struts提供了动态ActionForm,引入动态ActionForm,可以完全不再需要写ActionForm,Struts框架包中的DynaActionForm类及其子类实现了动态Act

19、ionForm。DynaActionForm类扩展了ActionForm类,用户可以直接使用DynaActionForm类,或者扩展该类以覆盖validate()和reset()方法。,7.2.1 配置动态ActionForm 使用动态ActionForm与前面不同的是,必须在配置文件中配置对应的属性,配置动态ActionForm可以使用元素。具体方法是:在配置文件中配置一个元素,将其属性设置为DynaActionForm或者它的某个子类的全名。例如,下面代码配置了一个名为DynaActionForm的动态ActionForm,它包含两个属性:username和password。,7.2.2

20、访问动态ActionForm动态ActionForm把所有的属性保存在一个Map对象中,因此访问动态ActionForm的属性与访问Map对象的方法类似:public Object get(String name);public void set(String name,Object value);其中,get(String name)方法根据指定的属性名返回属性值;set(String name,Object value)方法用于为指定的属性赋值。,下面根据前一小节配置的动态ActionForm来演示如何访问动态ActionForm的属性。在Action的execute的方法中,写如下代码:

21、,动态ActionForm的reset()方法DynaActionForm基类中提供了initialize()方法,该方法把表单的所有属性恢复为默认值。表单属性的默认值由元素的子元素的initial属性来决定。如果没有设置initial属性,则表单属性的默认值由Java类型来自动决定。默认情况下,在DynaActionForm基类的reset()方法中不执行任何操作。如果希望Struts框架在每次把表单数据组装到动态ActionForm中之前,先把所有的属性恢复为默认值,可以定义一个扩展DynaActionForm类的子类,然后覆盖其reset()方法,在reset()方法中只要调用initi

22、alize()方法即可,代码如下:,动态ActionForm的表单验证 DynaActionForm类的validate()方法没有提供任何默认的验证行为,可以通过定义扩展DynaActionForm类的子类,然后覆盖validate()方法。但是以编程方式来验证动态ActionForm并不是一种理想的办法,因为以编程方式来验证动态ActionForm违背了Struts框架提供动态ActionForm的初衷,即以配置来代替编程。动态ActionForm的验证应该使用Struts的Validator插件。Validator插件允许使用特定的配置文件为动态ActionForm配置验证规则,如检查必

23、需的输入域、日期时间等。关于Validator的使用方法,将在下一节进行介绍。,7.3 Struts的数据校验,Struts框架提供了对接收到的表单数据进行验证的内置机制。Struts的数据校验大致有如下几种形式:ActionForm的代码校验。Action中的代码校验。使用Validator验证框架的校验。,7.3.1 Validator验证框架简介Validator框架需要两个基于xml形式的配置文件来配置程序的验证规则,这两个文件的名称为:validator-rules.xml和validation.xml。其中,Validator-rules.xml文件包含一组通用的验证规则。而val

24、idation.xml配置文件是针对某个具体应用的,其中定义了针对某个具体应用的ActionForm而设置的验证规则,其作用相当于ActionForm中以编程方式来实现的验证逻辑。,要使用Validator验证框架,需要在Struts中添加Validator验证框架,可以采用Struts的插件机制把Validator加入到Struts框架中,即在配置文件struts-config.xml的元素中配置Struts插件的内容。配置代码如下:,7.3.2 对标准ActionForm的校验 1对标准ActionForm的校验的基本步骤(1)Struts的ActionForm必须继承ValidatorF

25、orm(2)编写校验规则(3)struts-config.xml的配置(4)加载校验规则文件(5)编写校验所需的国际化资源文件(6)在页面中输出出错提示,2Validator框架验证规则在Struts1.3版本自带的Validator验证框架中包含了27种默认的验证规则。下面列出几种常用的校验规则。required:必填。va1idwhen:必须满足某个有效条件。minlength:输入必须大于最小长度。maxlength:输入必须小于最大长度。mask:输入匹配正确的表达式。byte:输入只能是一个byte类型变量。short:输入只能是一个short类型变量。integer:输入只能是一个

26、integer变量。long:输入只能是一个long变量。float:输入只能是一个float变量。double:输入只能是一个double变量。date:输入必须是一个日期。intRange:输入的数字必须在整数范围内。floatRange:输入的数字必须在单精度浮点数范围内。doubleRange:输入的数字必须在双精度浮点数范围内。email:输入必须是有效的E-mail地址。url:输入必须是有效的url地址。,(1)validwhen验证规则 例:,(2)mask验证规则 例:,(3)intRange验证规则 例:,(4)email验证规则 例:,7.3.3 对动态ActionFor

27、m的校验 DynaVaidatorForm支持在动态ActionForm中使用Validator框架,对动态ActionForm进行校验的操作与标准ActionForm的校验操作完全一样。不同的是此时使用的 ActionForm 的实现类,必须既是动态 Form,也是验证 Form,DynaValidatorForm就是满足这两个条件的Form。下面是使用 DynaValidatorForm的 struts-config.xrnl文件的源代码:,7.3.4 Validator框架中使用JavaScript的校验 Validator框架提供了一个方法可以生成JavaScript代码,使表单在客户

28、端就可以进行基本验证,实现的方法也很简单。如需要弹出客户端JavaScript校验非常简单,无须修改其他配置文件,只需修改登录使用的JSP 页面的两个地方。(1)为 form元素增加onsubmit=retum validateXxxForm(this);属性,其中的XxxForm就是需要校验的form名,与 struts-config.xrnl中配置的form-bean的 name属性一致,也与 validation.xrnl文件中需要校验的form的 name属性一致。(2)增加,其中 xxxForm 是需要校验的form 名。,下面是修改的 login.jsp 页面的代码,注意粗体部分。

29、,7.4 Struts综合应用实例,【例7-1】本实例将完成用户注册功能。当用户注册一个新用户时,将向数据库Users表中插入一条记录。【案例分析】(1)视图部分 一个注册页面register.jsp;国际化资源文件ApplicationResources_zh.properties,ApplicationResources_en.properties。(2)控制器部分 核心控制器ActionServlet由系统提供,负责拦截用户请求。一个业务逻辑控制器用于处理用户请求,该例的业务逻辑控制器为RegisterAction.java。(3)模型部分一个用于在注册界面和业务逻辑层之间传递数据的Fo

30、rmBean:RegisterForm和一个与用户表对应的User类,User类中的属性与数据表中字段相同。,(4)DAO层 本实例将数据操作、逻辑处理的功能从系统中分离出来,单独形成了若干个DAO(数据访问对象,Data Access Object)接口和实现类。通过这种功能分离方式,可以使系统更容易维护和升级,以使系统的层次更清晰。本例只涉及一个表Users。因此,只需要有一个DAO接口(UserDAO)和DAO实现类(UserDAOImpl)即可。除了这两个类外,还需一个直接访问数据库的类(DAOSupport),所有的DAO实现类应该继承该类,以使DAO实现类获得数据库的访问能力。(5

31、)其它 输入校验文件RegisterAction-validation.xml;配置文件struts-config.xml。,本章小结,本章在第6章介绍Struts基础知识的基础上进一步介绍了Struts的一些高级特性,主要包括:Struts的国际化、异常处理、动态ActionForm、Validator验证框架等内容,在讲解这些内容时都结合了一些小实例,并在本章最后给出了Web应用程序中常用的用户注册模块。本章这些高级特性在进行Web应用开发时经常用到,因此也是比较重要的。希望读者通过本章的学习,能够利用这些高级特性进行Web应用开发。,本章实训,【实训目的】1)学会开发国际化的Struts应用程序。2)了解Struts的异常处理机制。3)学会使用动态ActionForm。4)学会使用Validator验证框架对输入数据进行校验。,【实训任务】1参考教材内容,在第6章实训的基础上开发基于Struts框架的用户登录模块V3.0版。要求:界面要实现国际化;使用动态ActionForm;采用validator验证框架对界面输入的数据进行校验。2参考教材内容,在第6章实训的基础上开发基于Struts框架的图书管理模块V3.0版。要求:界面要实现国际化;采用validator验证框架对界面输入的数据进行校验。,本章结束,谢谢大家!,休息一会儿。,

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

当前位置:首页 > 生活休闲 > 在线阅读


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号