第6章Struts2之数据校验与国际化_第1页
第6章Struts2之数据校验与国际化_第2页
第6章Struts2之数据校验与国际化_第3页
第6章Struts2之数据校验与国际化_第4页
第6章Struts2之数据校验与国际化_第5页
已阅读5页,还剩58页未读 继续免费阅读

下载本文档

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

文档简介

第6章Struts2高级应用6.1类型转换6.2数据校验的方法6.3Struts2实现国际化的方法6.1类型转换器Struts2已经内建了字符串类型和如下类型之间相互转换的转换器。Boolean和boolean完成字符串和布尔值之间的转换Character和char完成字符串和字符值之间的转换Long和long完成字符串和长整型值之间的转换Float和float完成字符串和单精度浮点值之间的转换Double和double完成字符串和双精度浮点值之间的转换Date完成字符串和日期类型之间的转换,默认采用请求本地Locale的SHORT格式数组默认情况下,数组元素是字符串集合在默认情况下,假定集合元素类型为String,则创建一个新的ArrayList封装所有字符串如果需要将HTTP请求参数转换成上面这些类型,则无需开发者进行任何特殊的处理6.1.1引用类型的转换方式借助于内置的类型转换器,Struts2可以完成字符串与基本类型之间的类型转换借助于OGNL表达式,Struts2允许以另一种方式将请求参数转换成复合类型示例代码(ognlConvert)User.javaloginAction.javastruts.xmlinput.jsp6.1.1引用类型的转换方式User.javapublic

classUser{privateStringname;privateStringpass;//name属性的setter和getter方法public

voidsetName(Stringname){=name;}publicStringgetName(){return

;}//pass属性的setter和getter方法public

voidsetPass(Stringpass){this.pass=pass;}publicStringgetPass(){return

this.pass;}}public

classLoginActionimplementsAction{//User类型属性封装请求参数privateUseruser;privateStringtip;//user属性的setter和getter方法public

voidsetUser(Useruser){this.user=user;}publicUsergetUser(){return

this.user;}//tip属性的setter和getter方法public

voidsetTip(Stringtip){this.tip=tip;}publicStringgetTip(){return

this.tip;}6.1.1引用类型的转换方式LoginAction.jsppublicStringexecute()throwsException{//通过user属性的name属性和pass属性来判断控制逻辑if(getUser().getName().equals(“j2ee")&&getUser().getPass().equals(“tust")){setTip("登录成功");return

SUCCESS;}else{setTip("登录失败!!");return

ERROR;}}}6.1.1引用类型的转换方式6.1.1引用类型的转换方式struts.xml(片段)<actionname="login"class="org.crazyit.app.action.LoginAction"><resultname="success">/welcome.jsp</result><resultname="error">/error.jsp</result></action>6.1.1引用类型的转换方式input.jsp(片段)<s:formaction="login"> <!--该表单域封装的请求参数名为-->

<s:textfieldname=""label="用户名"/> <!--该表单域封装的请求参数名为user.pass-->

<s:textfieldname="user.pass"label="密码"/> <tr> <tdcolspan="2"><s:submitvalue="转换"theme="simple"/> <s:resetvalue="重填"theme="simple"/></td> </tr></s:form>6.1.1引用类型的转换方式welcome.jsp(片段)<head><title>转换成功</title></head><body><s:propertyvalue="tip"/><br/>用户名为:<s:propertyvalue=""/><br/>密码为:<s:propertyvalue="user.pass"/><br/></body>6.1.1引用类型的转换方式Struts2会把参数的值赋给Action实例的user属性的name属性并将user.pass参数的值赋值给Action实例的user属性的pass属性。注意:系统必须为复合类(User类)提供无参构造方法如果希望使用请求参数的形式为Action实例的user属性的name属性赋值,则必须为user属性对应的复合类(User类)提供setName()方法。因为Struts2是通过调用该方法来为该属性赋值的。当然Action中还应该包含getUser()方法。6.1.2自定义类型转换需要把一个字符串转换成一个复合对象电话号码ser对象:abc,xyzStruts2不知道如何完成字符串和复合对象之间的转换。例子:localConverterinput.jspLoginAction.java6.1.2自定义类型转换6.1.2自定义类型转换public

classLoginActionimplementsAction{//User类型属性封装请求参数privateUseruser;privateStringtip;//属性的setter和getter方法publicStringexecute()throwsException{//通过user属性的name属性和pass属性来判断控制逻辑if(getUser().getName().equals(“j2ee")&&getUser().getPass().equals(“tust")){setTip("登录成功");return

SUCCESS;}else{setTip("登录失败!!");return

ERROR;}}}6.1.2自定义类型转换1、定义类型转换器2、在Web应用中注册类型转换器6.1.2自定义类型转换自定义类型转换1、实现TypeConverter接口XpublicinterfaceTypeConverter{publicObjectconvertValue(Mapcontext,Objecttarget,Membermember,StringpropertyName,Objectvalue,ClasstoType);}6.1.2自定义类型转换2、继承DefaultTypeConverter重写convertValue()方法负责完成类型的转换,双向转换:字符串User实例通过判断参数toType(需要转换的目标类型)的类型toType==String.classtoType==User.classconvertValue()方法的参数和返回值的意义context:类型转换的上下文,即Action的上下文value:需要转换的参数,根据转换方向不一样,其值亦不同toType:转换的目标类型√6.1.2自定义类型转换

UserConverter.javapublic

classUserConverterextendsDefaultTypeConverter{//类型转换器必须重写convertValue方法,该方法需要完成双向转换publicObjectconvertValue(Mapcontext,Objectvalue,ClasstoType){//当需要将字符串向User类型转换时if(toType==User.class){//系统的请求参数是一个字符串数组String[]params=(String[])value;//创建一个User实例Useruser=newUser();//只处理请求参数数组第一个数组元素,并将该字符串以英文逗号分割成两个字符串String[]userValues=params[0].split(",");//为User实例赋值user.setName(userValues[0]);user.setPass(userValues[1]);//返回转换来的User实例returnuser;}为何是字符串数组而不是字符串?文本框:用户输入一个普通字符串下拉列表框(可选多项):对应的请求参数是字符串数组。为了考虑到所有情形,因而把请求参数视为字符串数组。对于文本框中提供的请求参数,转换器把它当成长度为1的数组。6.1.2自定义类型转换else

if(toType==String.class){//将需要转换的值强制类型转换为User实例Useruser=(User)value;return"<"+user.getName()+","+user.getPass()+">";}return

null;}}6.1.2自定义类型转换配置类型转换器的方式:配置局部类型转换器仅仅对某个Action的属性起作用配置全局类型转换器对所有Action的特定类型的属性都会生效

局部类型转换器的配置文件的名称为“类名-perties”,其中类名为使用该类型转换器的Action类的名称。如LoginAperties

需要创建一个名为“perties”的配置文件。

6.1.2自定义类型转换局部类型转换器

(LoginAperties)与Action所在路径一致增加的配置内容<propName>=<ConvertClass><propName>:需要进行类型转换的属性<ConvertClass>:类型转换器的实现类LoginApertiesuser=org.crazyit.app.converter.UserConverter指定user属性需要使用UserConverter类来完成类型转换6.1.2自定义类型转换局部类型转换器只能对指定Action、指定属性起作用如果应用中有多个Action都包含了User类型的属性,或者一个Action中包含了多个User类型的属性,更适合用全局类型转换器全局类型转换器提供文件perties,置于应用程序的类加载路径下org.crazyit.app.domain.User=org.crazyit.app.converter.UserConverter指定org.crazyit.app.domain.User类型需要使用UserConverter来完成类型转换6.1.2自定义类型转换3、继承StrutsTypeConverterStrutsTypeConverter类是DefaultTypeConverter类的子类实现了convertValue()方法,将两个不同转换方向替换成不同方法convertFromString()当需要把字符串转换成复合类型时convertToString()当需要把复合类型转换为字符串时改写的UserConverter类参数说明注册方法6.1.2自定义类型转换改写的UserConverter类publicclassUserConverterextendsStrutsTypeConverter

{ //实现将字符串类型转换成复合类型的方法

publicObjectconvertFromString(Mapcontext ,String[]values,ClasstoClass) { //创建一个User实例

Useruser=newUser(); //只处理请求参数数组第一个数组元素,

//并将该字符串以英文逗号分割成两个字符串

String[]userValues=values[0].split(","); //为User实例赋值

user.setName(userValues[0]); user.setPass(userValues[1]); //返回转换来的User实例

returnuser; } 6.1.2自定义类型转换//实现将复合类型转换成字符串类型的方法

publicStringconvertToString(Mapcontext,Objecto) { //将需要转换的值强制类型转换为User实例

Useruser=(User)o; return"<"+user.getName()+"," +user.getPass()+">"; }}6.1.3类型转换中的错误处理在表示层处理数据过程中,经常会出现没有严格按照页面要求进行的数据录入操作输入电话号码:02260274469实际上,表现层数据涉及两个处理数据校验&类型转换只有当输入数据时有效数据时,才可以进行有效地类型转换有效类型转换是基础,然后才做数据校验为了处理类型转换错误,Strus2提供了处理类型转换错误的拦截器,名称为“conversionError”,在“struts-default.xml”文件包含对该拦截器的配置。此拦截器负责将对应错误封装成表单域错误(FieldError),并将它们放入ActionContext中。输出出错信息:<s:fielderror/>6.1.3类型转换中的错误处理<s:fielderror/>输出的错误提示Struts2的表单标签使用xhtml主题时,本身就会输出错误提示6.2数据校验的方法6.2.1数据校验的必要性6.2.2通过Action中的validate()方法实现校验6.2.3通过Xwork框架实现校验6.2.1输入校验的必要性用户在客户端的浏览器中输入信息,通过网络提交到服务器,服务器对接收的信息进行处理并将结果返回给用户。要想保证这一过程能够顺利执行就必须保证用户提交信息的合法性。输入校验确保数据信息的有效性保证Web应用的安全性6.2.1输入校验的必要性输入校验分为两部分:客户端校验:通常使用脚本语言校验,例如JavaScript。校验输入信息是否满足一定的要求或满足一定的结构,如校验输入的文本是否为空校验输入的文本是否是数字校验E-mail的格式是否正确优点:可以快速提示用户输入错误,提高响应速度。防止将无效数据发送到服务器,从而减轻服务器的负担。6.2.1输入校验的必要性服务端校验:通过检查HTTP请求信息以校验输入是否正确有些数据必须通过程序交给服务器去处理,校验注册的用户名是否存在校验登录的密码是否正确另一个原因就是如果用户浏览器禁用了脚本执行,客户端校验就会失效。安全性校验错误登录次数限制使用访问来源校验实现方式通过Action中的validate()方法使用xWork校验框架6.2.2

编程方式实现输入校验在Action类中手动创建校验数据的代码,包括:在execute()方法中实现校验:使用validate()方法实现校验:实现校验逻辑与业务逻辑的分离。validate*()的使用:可以为不同的方法配置其独立的校验代码只需将相同的校验逻辑放在validate()方法即可。6.2.2编程方式实现输入校验validate*()使用的示例:publicclassValidateTestextendsActionSupport{ //省略属性及其set、get方法

publicStringlogin(){ //用于登录

return"login"; } publicStringregist(){ //用于注册

return"regist"; } publicvoidvalidate(){ //相同的校验

//省略校验代码

} publicvoidvalidateLogin(){//只对login()方法的请求执行校验

//省略校验代码

} publicvoidvalidateRegist(){//只对regist()方法的请求执行校验

//省略校验代码

}}6.2.2

编程方式实现输入校验P.170ch6-3工程6.2.3通过XWork校验框架实现使用validate方法校验时,如果Web应用中存在大量Action就需要多次重写validate方法,这使得代码非常繁琐。Struts2的校验框架本质上是基于XWork的validator框架,因此可以使用XWork的validator框架来对Struts2进行数据校验,以减少代码量。使用XWork的validator框架实现数据校验,只需编写一个简单的验证文件即可。

6.2.3通过XWork校验框架实现修改ch6-3的例子将LoginAction.java中的validate()方法和validateLog()方法删除在com.action包下创建验证文件LoginAction-validation.xml文件6.2.3通过XWork校验框架实现验证文件的几个关键问题命名规则校验配置方式校验器6.2.3通过XWork校验框架实现命名规则actionName-validation.xml,actionName是指需要校验的Action的类名,且该文件与Action类同路径当用户提交请求后,系统会自动加载该文件完成对用户请求的校验。当一个Action中有多个业务处理方法,需要多个校验逻辑时,定义校验文件actionName-methodName-validation.xml6.2.3通过XWork校验框架实现Struts2框架的数据校验步骤Struts2框架中的类型转换器对HTTP请求的数据进行数据类型转换,得到符合类型的值使用Struts2中的Xwork校验框架进行校验调用validateX()方法进行数据校验调用validate()方法进行数据校验6.2.3通过XWork校验框架实现两种配置校验文件的方式字段校验方式(Field-valiator)针对字段或属性,在校验时任何一个字段都能够返回一个明确的消息。非字段校验方式(Non-Fieldvalidator)将字段有效地组合到一起,不能对一个字段返回一个明确的消息。6.2.3通过XWork校验框架实现字段校验方式<fieldname="birth"><field-validatortype="date"><!--下面指定日期字符串时,必须使用本Locale的日期格式--><paramname="min">1900-01-01</param><paramname="max">2050-02-21</param><message>生日必须在${min}到${max}之间</message></field-validator></field>被校验的字段校验器名为校验器指定校验参数校验失败后的提示信息6.2.3通过XWork校验框架实现非字段方式<!—指定校验器名--><validatortype="date"><!--使用该校验器校验birth属性--><paramname="fieldName">birth</param><!--指定日期校验器的范围--><paramname="min">1900-01-01</param><paramname="max">2050-02-21</param><!--指定校验失败后的输出birth.rang对应的国际化信息--><messagekey="birth.range"/></validator>6.2.3通过XWork校验框架实现校验器(valiator)requiredvalidator(必填校验器)requiredstringvalidator(必填字符串校验器)stringlengthvalidator(字符串长度校验器)regexvalidator(表达式校验器)emailvalidator(邮件校验器)urlvalidator(网址校验器)intvalidator(整数校验器)doublevalidator(双精度数校验器)6.2.2编写校验规则文件利用Struts2的校验框架进行输入验证例子:basicValidate无需对程序代码做任何改变,只需编写校验规则文件。regist.jspRegistAction.javaRegistAction-validation.xmlstruts.xml6.3国际化支持程序国际化是商业系统的一个基本要求今天的软件系统不再是简单的单机程序,往往都是一个开放系统。需要面对来自全世界各个地方的浏览者。因此,国际化是商业系统中不可缺少的一部分。Struts2的国际化是建立在Java国际化的基础上通过提供不同国家/语言环境的消息资源,然后通过ResourceBuddle加载指定Locale对应的资源文件,再取得该资源文件中指定key对应的消息。Struts2框架对Java程序国际化进行了进一步的封装,从而简化了应用程序的国际化。6.3.1国际化实现原理国际化即通常所说的i18n(Internationalization),是指程序能够在不修改内部代码的前提下,根据不同的语言以及地区显示相应的界面。国际化中涉及到的几个概念:国际化资源文件:保存各种版本语言编写的消息。程序拥有自动选择国际化资源文件的功能。Locale:对应区域/语言等信息。ResourceBundle:用来加载国际化资源。I18nInterceptor:Struts2提供的国际化拦截器,负责处理Locale相关信息。6.3.1国际化实现原理修改浏览器语言设置修改浏览器语言设置6.3.2准备国际化资源文件Struts2的国际化资源文件以.properties结尾,文件名前缀可以任意命名。习惯上命名方式有以下3种:文件名前缀.properties。文件名前缀_语言种类.properties。文件名前缀_语言种类_国家代码.properties语言代码字段必须是有效的ISO(InternationalStandardizationOrganization,国际标准化组织)语言代码,ISO-639标准定义的这些代码格式为英文小写、双字符。6.3.2准备国际化资源文件国家代码字段语言语言代码国家代码汉语(Chinese)ZhCN英语(English)EnUS法语(French)FrFR德语(German)deDE日语(Japanese)jaJP意大利语(Italian)itIT6.3.2准备国际化资源文件国际化资源文件的内容结构“key”=“value”“key”对应消息名,可以任意命名,“value”则应该是同一信息不同的语言表示,对于不同语言的配置文件,“key”都是一致的而“value”的内容不同。

汉语的配置文件内容为: hello=你好 英语的配置文件内容为: hello=hello

法语的配置文件内容为: hello=bonjour6.3.2准备国际化资源文件根据国际化信息的作用范围可以将国际化资源文件分为3种:全局范围:包范围Action范围6.3.2准备国际化资源文件全局范围:该资源文件被放置在WEB-INF/classes路径下,文件信息可以在整个工程范围内被使用。它在“struts.xml”中配置方式的为:<constantname="struts.custom.i18n.resources"value=""/>属性value的值为全局范围资源文件的文件名前缀6.4.2准备国际化资源文件包范围:该资源文件被放置在对应包的根

温馨提示

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

评论

0/150

提交评论