版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
新企学.IT企业直通车第8章Struts基本方法和关键技术第8章Struts基本方法和关键技术8.1Struts数据校验8.2Struts2框架国际化的方法8.3Struts拦截器8.4自定义拦截器8.5本章小结8.1.1基本类型转换8.1.2Action中的validate()校验方法8.1.3XWork校验框架8.1Struts数据校验8.1Struts数据校验数据校验指对数据合法性进行检查,根据验证数据的位置可以分为客户端验证和服务器端验证。客户端校验指的是通过JavaScript代码检验用户的输入是否正确;服务器端校验指的是在服务器端的程序通过检查HTTP请求信息以校验输入是否正确。客户端校验只能简单的过滤用户输入,而大量的数据校验一般都是在服务器端校验时来完成。服务器端数据验证主要特点:数据提交后在服务器端验证防止绕过客户端验证提交的非法数据可以在服务器端处理数据前保证数据的合法性
Struts2中有两种实现服务器端验证的方式,分别是通过Action中的validate方法实现和使用XWork校验框架实现。Web应用程序的交互都是建立在HTTP之上的,互相传递的都是字符串。也就是说服务器接收到的来自用户的数据只能是字符串或者是字符数组,而在Web应用的对象中,往往使用了多种不同的类型,如整数(int)、浮点数(float)、日期(Date)或者是自定义数据类型等。因此在服务器端必须将字符串转换成合适的数据类型。Struts2框架提供了一系列默认的基本类型转换器,可以在字符串类型和其他类型之间互相转换。这些类型转换器包括:String和boolean、Boolean:完成字符串与布尔值之间的转换String和char、Character:往常字符串与字符之间的转换String和int、Integer:完成字符串与整型之间的转换String和long、Long:完成字符串与长整型值之间的转换String和double、Double:完成字符串与双精度浮点值的转换String和float、Float:完成字符串和单精度浮点之间的转换String和Date:完成字符串和日期类型之间的转换,可以接收yyyy-MM-dd格式字符串String和数组:可以将多个同名参数,转换到数组中String和Map、List:支持将数据保存到List或者Map集合8.1.1基本类型转换8.1.2Action中的validate()校验方法Struts2提供了一个Validateable接口,这个接口中只存在validate()方法,实现这个接口的类可直接被Struts2调用,ActionSupport类就实现了Vadidateable接口,但他的validate()方法是一个空方法,需要我们来重写。validate()方法会在execute()方法执行前执行,仅当数据校验正确,才执行execute()方法,如错误则将错误添加到fieldErrors域中,如果定义的Action中存在多个逻辑处理方法,且不同的处理逻辑需要不同的校验规则,这种情况下validate()会对所有处理逻辑使用相同的校验规则,为了实现不同的校验逻辑,需要通过validateX()方法,其中X表示处理逻辑的方法名。使用validate方法校验时,虽然实现思路清晰易懂,但是如果Web应用中存在大量Action就需要多次重写validate方法,将导致代码非常繁琐。Struts2的校验框架本质上是基于XWork的validator框架,因此可以使用XWork的validator框架来对Struts2进行数据校验,以减少代码量。在com.action包下创建验证文件LoginAction-validation.xml,注:当一个Action中有多个业务处理方法是,命名规则为:actionName-methodName-validation.xml,其中actionName为Action类名,methodName为Action中某个业务处理方法的方法名,并且文件的搜索顺序与方式与validate()和validateX()一样。8.1.3XWork校验框架Struts2常用校验器:8.1.3XWork校验框架8.2.1编写国际化资源文件8.2.2访问国际化资源文件8.2.3资源文件加载过程8.2Struts2框架国际化的方法Struts2框架实现国际化的方式是使用国际化资源文件,对于一个复杂的系统往往会有大量的内容需要实现国际化,为了解决仅有一个国际化资源文件导致处理过程效率低下的问题,国际化资源文件分为几种,包括包范围资源文件、类范围资源文件、全局资源文件才及临时指定资源文件。
国际化资源文件的后缀都是properties,它们的内容格式都是key-value形式,在需要使用这些信息时,可以通过key值得到value值。一个中文的国际化资源文件格式如下:login=登录error=错误uccess=成功8.2.1编写国际化资源文件8.2.1编写国际化资源文件1、包范围资源文件
该资源文件只允许包下的Action访问,且被放在包的根路经下,文件名的格式为package_language_perties。其中package固定不变,language和country表示语言和国家,例如:中文国际化资源就是package_zh_CN.properties。2、类范围资源文件该资源文件能被指定类所对应的Action访问,通常被放到Action类所在的路径下,其命名格式是ActionName_language_perties。其中ActionName指的是Action类名。8.2.1编写国际化资源文件
3、全局范围资源文件
该资源文件能被所有的Action、JSP访问,一般被放到工程的src目录下,其命名格式为perties,其中name表示文件名。命名通常采用BaseName_language_perties。其中BaseName自定义。全局范围资源文件的加载不是自动的,必须在Struts2配置文件中加以指定,并在常量struts.custom.i18n.resources中进行配置,而该常量的值即为合局范围资源文件的BaseName。
系统要加载的全局范围资源文件为globalMperties或globalMessage_en_US.properties,可以在struts.xml文件中添加如下指定代码:<constantname="struts.custom.i18n.resources"value="globalMessage">也可以在perties文件中添加如下代码:struts.custom.i18n.resources=globalMessage配置如struts.custom.i18n.resources常量后,应用软件自动加载全局资源文件。这样struts2框架就可以直接取出这些国际化资源中的信息了。8.2.1编写国际化资源文件
4、临时指定资源文件
临时资原文件通常只对应一个JSP,该文件的使用需在JSP文件中指定,即只有在JSP文件中通过struts2标签指定该文件后,才能使用该文件信息。<s:i18n.../>标签的name属性指定临时的国际化资源文件8.2.2访问国际化资源文件Struts2框架提供4种方式来访问国际化资源文件:(1)在Action类中使用ActionSupport类的getText方法要访问国际化消息。(2)在JSP页面中使用Struts2框架的<s:textname="key"/>标签来访问。(3)在JSP页面中的表单元素中指定一个key属性,对应着国际化资源文件中的key值,依据key值最终就能得到对应value值。(4)在验证框架xml配置文件的国际化:RegisterAction-validation.xml文件<messagekey=“username.invalid”/>。8.2.3资源文件加载过程Struts2框架提供了多种方式来加载国际化资源文件,下面这些国际化资源文件在不同情况下的加载顺序。Action中加载资源文件,假设我们在某个ChildAction中调用了getText("user.title"),Struts2.0的将会执行以下的操作:(1)优先加载系统中保存在ChildAction的类文件相同位置,且baseName为ChildAction的系列资源文件。(2)如果在(1)中找不到指定key对应的消息,且ChildAction有父类ParentAction,则加载系统中保存在ParentAction的类文件相同位置,且baseName为ParentAction的系列资源文件。(3)如果在(2)中找不到指定key对应的消息,且ChildAction有实现接口IChildAction,则加载系统中保存在IChildAction的类文件相同位置,且baseName为IChildAction的系列资源文件。(4)如果在(3)中找不到指定key对应的消息,且ChildAction有实现接口ModelDriven(即使用模型驱动模式),则对于getModel()方法返回的model对象,重新执行第(1)步操作。(5)如果在(4)中找不到指定key对应的消息,则查找当前包下baseName为package的系列资源文件。(6)如果在(5)中找不到指定key对应的消息,则沿着当前包上溯,直到最顶层包来查找baseName为package的系列资源文件。(7)如果在(6)中找不到指定key对应的消息,则查找struts.custom.i18n.resources常量指定baseName的系列资源文件。(8)如果经过上面的步骤一直找不到key对应的消息,将直接输出该key的字符串值。8.2.3资源文件加载过程对于在JSP中访问国际化消息,则简单的多,他们又可以分为两种形式:
(1)对于使用<s:i18n.../>标签作为父标签的<s:text.../>标签、表单标签的形式:
a、将从<s:i18n.../>标签指定的国际化资源文件中加载指定key对应的消息。
b、如果在a中找不到指定key对应的消息,则查找struts.custom.i18n.resources常量指定baseName的系列资源文件。
c、如果经过上面步骤一直找不到该key对应的消息,将直接输出该key的字符串值。
(2)如果<s:text.../>标签、表单标签没有使用<s:i18n.../>标签作为父标签:
直接加载struts.custom.i18n.resources常量指定baseName的系列资源文件。如果找不到该key对应的消息,将直接输出该key的字符串值。8.3.1Struts拦截器原理8.3.2Struts2内置拦截器8.3Struts拦截器拦截器是Struts2的核心组件,Struts2为了支持数据校验、国际化、文件上传和下载等功能,提供了一个强在的拦截器策略,拦截的主要机制就是定义一个功能模块。该模块用于在一个Action执行的前后来进行一些处理或阻止其执行。同时它还提供了一种将通用代码模块化的方式。通过该方式,可以把多个Action中都需要重复指定的代码提取出来,统一放在拦截器里进行定义,从而更好地实现了代码重用。8.3.1Struts拦截器原理拦截器与Action之间的关系,具体流程如下:初始化一个指向servlet容器的HttpServletRequest(如Tomcat)请求,这个请求经过一系列的过滤器(Filter)
;接着FilterDispatecher被调用,它会访问ActionMapper,来决定这个请求是否要调用某个Action,如果需要FilterDispatecher把请求的处理权交给ActionProxy;ActionProxy将会通过ConfigurationManager来查找框架的配置文件struts.xml,找到要调用的Action,创建一个ActionInvocation的实例,使用命令模式来调用Action类(涉及到一些拦截器的调用,Interceptor框架在调用action之前执行),Interceptor做一些拦截或者初始的工作;一旦Action执行完毕,ActionInvocation负责根据struts.xml中的配置找到对应的返回结果,Result类型可以是jsp或者Html、
FreeMarker的模版等;这些请求的结果和ActionMapper一起以HttpServletResponse的形式返回给请求的url(注意拦截器的执行顺序)8.3.1Struts拦截器原理拦截器与过滤器的区别:1、拦截器是基于Java反射机制的,而过滤器是基于函数回调的。
2、过滤器依赖于servlet容器,而拦截器不依赖于servlet容器。
3、拦截器只能对Action请求起作用,而过滤器则可以对几乎所有请求起作用。
4、拦截器可以访问Action上下文、值栈里的对象,而过滤器不能。
5、在Action的生命周期中,拦截器可以多次调用,而过滤器只能在容器初始化时被调用一次。8.3.1Struts拦截器原理Struts2中内置了许多拦截器,它们提供了Struts2的许多核心功能和可选的高级特性。Struts2中每个拦截器都实现了某一种特定功能,可将它们灵活组合使用。Struts2框架中的内置拦截器通常定义在struts-default.xml文件中,它们以name-class的方式配置,name表示该拦截器的名称,class表示该拦截器对应的处理类。开发者无需手动控制这些拦截器,因为struts-default.xml文件中已经配置了这些拦截器,只要我们定义的包继承了系统的struts-default包,就可以直接使用这些拦截器。8.3.2Struts2内置拦截器8.3.2Struts2内置拦截器alias:实现在不同请求中相似参数别名的转换。autowiring:这是个自动装配的拦截器,主要用于当Struts2和Spring整合时,Struts2可以使用自动装配的方式来访问Spring容器中的Bean。chain:构建一个Action链,使当前Action可以访问前一个Action的属性,一般和<resulttype="chain".../>一起使用。conversionError:这是一个负责处理类型转换错误的拦截器,它负责将类型转换错误从ActionContext中取出,并转换成Action的FieldError错误。createSession:该拦截器负责创建一个HttpSession对象,主要用于那些需要有HttpSession对象才能正常工作的拦截器中。debugging:当使用Struts2的开发模式时,这个拦截器会提供更多的调试信息。execAndWait:后台执行Action,负责将等待画面发送给用户。exception:这个拦截器负责处理异常,它将异常映射为结果。:这个拦截器主要用于文件上传,它负责解析表单中文件域的内容。i18n:这是支持国际化的拦截器,它负责把所选的语言、区域放入用户Session中。logger:这是一个负责日志记录的拦截器,主要是输出Action的名字。model-driven:这是一个用于模型驱动的拦截器,当某个Action类实现了ModelDriven接口时,它负责把getModel()方法的结果堆入ValueStack中。scoped-model-driven:如果一个Action实现了一个ScopedModelDriven接口,该拦截器负责从指定生存范围中找出指定的Modol,并将通过setModel方法将该Model传给Action实例。params:这是最基本的一个拦截器,它负责解析HTTP请求中的参数,并将参数值设置成Action对应的属性值。8.3.2Struts2内置拦截器prepare:如果action实现了Preparable接口,将会调用该拦截器的prepare()方法。static-params:这个拦截器负责将xml中<action>标签下<param>标签中的参数传入action。scope:这是范围转换拦截器,它可以将Action状态信息保存到HttpSession范围,或者保存到ServletContext范围内。servlet-config:如果某个Action需要直接访问ServletAPI,就是通过这个拦截器实现的。注意:尽量避免在Action中直接访问ServletAPI,这样会导致Action与Servlet的高耦合。roles:这是一个JAAS(JavaAuthenticationandAuthorizationService,Java授权和认证服务)拦截器,只有当浏览者取得合适的授权后,才可以调用被该拦截器拦截的Action。timer:这个拦截器负责输出Action的执行时间,这个拦截器在分析该Action的性能瓶颈时比较有用。token:这个拦截器主要用于阻止重复提交,它检查传到Action中的token,从而防止多次提交。token-session:这个拦截器的作用与前一个基本类似,只是它把token保存在HttpSession中。validation:通过执行在xxxAction-validation.xml中定义的校验器,从而完成数据校验。workflow:这个拦截器负责调用Action类中的validate方法,如果校验失败,则返回input的逻辑视图。8.4.1创建自定义拦截器8.4.2配置自定义拦截器8.4.3拦截器执行顺序分析8.4.4创建和配置方法过滤拦截器8.4自定义拦截器Struts2框架提供了非常丰富的拦截器。Struts2还提供了创建自定义拦截器的功能,在Struts2中自定义拦截器非常简单。用户在定义自己的拦截器类时,需要实现erceptor.Interceptor接口。Interceptor接口中只定义了三个方法,前两个方法分别用来初始化和清除必要的资源。三个方法都只给出声明而未进行定义,因此,直接实现该接口的类必须实现这三个方法。它们的作用如下:init():主要用于初始化系统资源。对于一个拦截器而言,init方法只会被调用一次。在拦截器执行之前调用init()方法,destroy():在拦截器实例被销毁之前,系统将会调用该方法来释放和拦截器相关的资源。intercept():该方法是用来添加真正执行拦截工作的代码,实现具体的拦截操作。它返回一个字符串作为逻辑视图,系统根据返回的字符串跳转到对应的页面。其中ActionInvocation参数包含了被拦截的Action的引用,可以通过该参数的invoke()方法,将控制权转给下一个拦截器或者转给Action的execute()方法。8.4.1创建自定义拦截器自定义拦截器的配置方法是,只需要在<interceptor>的class属性中指定自定义的拦截器类就可以,假设有一个自定义的拦截器类为LoggerInterceptor,其路径为erceptor.LoggerInterceptor,则其配置方式如下。<interceptorname=”logger”class=”erceptor.LoggerInterceptor”/>上面代码配置了一个名为logger的拦截器,其实现通过LoggerInterceptor拦截器类来完成。在定义完拦截器后就可以配置其使用了,这和配置内置拦截器的方法是一样的。8.4.2配置自定义拦截器Struts2的拦截器机制采用了嵌套调用拦截器的方式,每一个拦截器都有一个在ActionInvocation接口中包含的invoke()方法,当在某一个拦截器方法中调用invoke()方法时,就会调用下一个拦截器方法,如此嵌套调用下去。如果当前拦截器是最后一个拦截器,则会调用Action的execute()方法。Action执行完后,按照与原来相反的顺序返回执行拦截器中剩余代码,即最后一个拦截器继续执行其剩余代码,然后返回倒数第二个拦截器继续执行其剩余
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- GB/Z 177.9-2026人工智能终端智能化分级第9部分:耳机
- 2021年西藏中考英语真题及解析
- 2026年物理安徽初赛试题及答案
- 深度解析(2026)《GBT 30030-2023自动导引车 术语》
- 《GBT 2423.40-2013环境试验 第2部分:试验方法 试验Cx:未饱和高压蒸汽恒定湿热》(2026年)合规红线与避坑实操手册
- 《DLT 5479-2022通信工程建设预算项目划分导则》(2026年)合规红线与避坑实操手册
- 2026年食品冷链运输协议
- 单片机原理及应用实践教程 课件全套 徐锋 第1-8章 单片机基本原理 -单片机应用系统设计
- 年产80台有机废弃物干式厌氧发酵罐项目可行性研究报告模板拿地申报
- 别墅大门防火门提档升级项目可行性研究报告模板拿地申报
- 2026中国餐饮菜单心理学应用与产品组合定价策略报告
- 2026新疆阿克苏库车市招聘职业化社区工作者31人笔试参考题库及答案解析
- (2026版)《中国老年2型糖尿病防治临床指南》深入解读
- 智慧树知到《形势与政策》2026春章节测试附答案
- JJG(吉) 27-2003 喷油泵试验台计量检定规程
- 2026江西省江铜宏源铜业有限公司第二批次社会招聘2人笔试历年备考题库附带答案详解
- 毕业设计(论文)-谷物烘干机设计
- 浙江省中考社会考点课件
- 老年人安全移动照护 使用助行器老年人安全移动照护
- 禽呼肠孤病毒感染
- 骨关节保健品会销动力宝
评论
0/150
提交评论