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

下载本文档

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

文档简介

1、第第6章章 Struts2高级应用高级应用l6.1 类型转换l6.2 数据校验的方法l6.3 Struts2实现国际化的方法6.1 类型转换器类型转换器 lStruts2已经内建了字符串类型和如下类型之间相互转已经内建了字符串类型和如下类型之间相互转换的转换器换的转换器。lBoolean和booleanl完成字符串和布尔值之间的转换lCharacter和charl完成字符串和字符值之间的转换lLong和longl完成字符串和长整型值之间的转换lFloat和floatl完成字符串和单精度浮点值之间的转换lDouble和doublel完成字符串和双精度浮点值之间的转换lDatel完成字符串和日期类

2、型之间的转换,默认采用请求本地Locale的SHORT格式l数组l默认情况下,数组元素是字符串l集合l在默认情况下,假定集合元素类型为String,则创建一个新的ArrayList封装所有字符串如果需要将HTTP请求参数转换成上面这些类型,则无需开发者进行任何特殊的处理6.1.1 引用类型的转换方式引用类型的转换方式l借助于内置的类型转换器,Struts2可以完成字符串与基本类型之间的类型转换l借助于OGNL表达式,Struts2允许以另一种方式将请求参数转换成复合类型l示例代码(ognlConvert)lUser.javalloginAction.javalstruts.xmllinput.

3、jsp6.1.1 引用类型的转换方式引用类型的转换方式lUser.javapublic class User private String name; private String pass;/name属性的setter和getter方法public void setName(String name) = name; public String getName() return ; /pass属性的setter和getter方法public void setPass(String pass) this.pass = pass; public String

4、getPass() return this.pass;public class LoginAction implements Action/User类型属性封装请求参数private User user;private String tip;/user属性的setter和getter方法public void setUser(User user) this.user = user; public User getUser() return this.user; /tip属性的setter和getter方法public void setTip(String tip) this.tip = tip

5、;public String getTip() return this.tip;6.1.1 引用类型的转换方式引用类型的转换方式lLoginAction.jsppublic String execute() throws Exception/通过user属性的name属性和pass属性来判断控制逻辑if (getUser().getName().equals(“j2ee)& getUser().getPass().equals(“tust) )setTip(登录成功);return SUCCESS;elsesetTip(登录失败!);return ERROR;6.1.1 引用类型的转换

6、方式引用类型的转换方式6.1.1 引用类型的转换方式引用类型的转换方式lstruts.xml(片段)/welcome.jsp/error.jsp6.1.1 引用类型的转换方式引用类型的转换方式linput.jsp(片段) 6.1.1 引用类型的转换方式引用类型的转换方式lwelcome.jsp(片段)转换成功用户名为:密码为:6.1.1 引用类型的转换方式引用类型的转换方式lStruts2会把参数的值赋给Action实例的user属性的name属性l并将user.pass参数的值赋值给Action实例的user属性的pass属性。l注意:l系统必须为复合类(User类)提供无

7、参构造方法l如果希望使用请求参数的形式为Action实例的user属性的name属性赋值,则必须为user属性对应的复合类(User类)提供setName()方法。因为Struts2是通过调用该方法来为该属性赋值的。当然Action中还应该包含getUser()方法。6.1.2 自定义类型转换自定义类型转换l需要把一个字符串转换成一个复合对象l电话号码:User对象: abc, xyzlStruts2不知道如何完成字符串和复合对象之间的转换。l例子:localConverterlinput.jsplLoginAction.java6.1.2 自定义

8、类型转换自定义类型转换6.1.2 自定义类型转换自定义类型转换public class LoginAction implements Action/User类型属性封装请求参数private User user;private String tip;/属性的setter和getter方法public String execute() throws Exception /通过user属性的name属性和pass属性来判断控制逻辑if (getUser().getName().equals(“j2ee)& getUser().getPass().equals(“tust) ) setTip

9、(登录成功); return SUCCESS; else setTip(登录失败!);return ERROR;6.1.2 自定义类型转换自定义类型转换l1、定义类型转换器l2、在Web应用中注册类型转换器6.1.2 自定义类型转换自定义类型转换l自定义类型转换l1、实现TypeConverter接口 Xpublic interface TypeConverterpublic Object convertValue(Map context,Object target,Member member,String propertyName,Object value,Class toType);6.1

10、.2 自定义类型转换自定义类型转换l2、继承DefaultTypeConverterl重写convertValue()方法l负责完成类型的转换,双向转换:字符串 User实例l通过判断参数toType(需要转换的目标类型)的类型ltoType=String.classltoType=User.classlconvertValue()方法的参数和返回值的意义lcontext:类型转换的上下文,即Action的上下文lvalue:需要转换的参数,根据转换方向不一样,其值亦不同ltoType:转换的目标类型6.1.2 自定义类型转换自定义类型转换l UserConverter.javapublic

11、class UserConverter extends DefaultTypeConverter /类型转换器必须重写convertValue方法,该方法需要完成双向转换public Object convertValue(Map context, Object value, Class toType)/当需要将字符串向User类型转换时if (toType = User.class )/系统的请求参数是一个字符串数组String params = (String)value;/创建一个User实例User user = new User();/只处理请求参数数组第一个数组元素,并将该字符串以

12、英文逗号分割成两个字符串String userValues = params0.split(,);/为User实例赋值user.setName(userValues0);user.setPass(userValues1);/返回转换来的User实例return user;为何是字符串数组而不是字符串?文本框:用户输入一个普通字符串下拉列表框(可选多项):对应的请求参数是字符串数组。为了考虑到所有情形,因而把请求参数视为字符串数组。对于文本框中提供的请求参数,转换器把它当成长度为1的数组。6.1.2 自定义类型转换自定义类型转换else if (toType = String.class )/将

13、需要转换的值强制类型转换为User实例User user = (User) value;return ; return null ; 6.1.2 自定义类型转换自定义类型转换l配置类型转换器的方式:l配置局部类型转换器l仅仅对某个Action的属性起作用l配置全局类型转换器l对所有Action的特定类型的属性都会生效局部类型转换器的配置文件的名称为“类名-perties”,其中类名为使用该类型转换器的Action类的名称。如 LoginAperties 需要创建一个名为“perties”

14、的配置文件。6.1.2 自定义类型转换自定义类型转换l局部类型转换器 (LoginAperties)l与Action所在路径一致l增加的配置内容l=l:需要进行类型转换的属性l:类型转换器的实现类lLoginApertiesluser=org.crazyit.app.converter.UserConverter指定user属性需要使用UserConverter类来完成类型转换6.1.2 自定义类型转换自定义类型转换l局部类型转换器l只能对指定Action、指定属性起作用l如果应用中有多个Action都包含了User类

15、型的属性,或者一个Action中包含了多个User类型的属性,更适合用全局类型转换器l全局类型转换器l提供文件perties,置于应用程序的类加载路径下lorg.crazyit.app.domain.User=org.crazyit.app.converter.UserConverter指定org.crazyit.app.domain.User类型需要使用UserConverter来完成类型转换6.1.2 自定义类型转换自定义类型转换l3、继承StrutsTypeConverterlStrutsTypeConverter类是DefaultTypeConv

16、erter类的子类l实现了convertValue()方法,将两个不同转换方向替换成不同方法lconvertFromString()l当需要把字符串转换成复合类型时lconvertToString()l当需要把复合类型转换为字符串时l改写的 UserConverter类l参数说明l注册方法6.1.2 自定义类型转换自定义类型转换l改写的UserConverter类public class UserConverter extends StrutsTypeConverter /实现将字符串类型转换成复合类型的方法public Object convertFromString(Map context

17、, String values , Class toClass)/创建一个User实例User user = new User();/只处理请求参数数组第一个数组元素,/并将该字符串以英文逗号分割成两个字符串String userValues = values0.split(,);/为User实例赋值user.setName(userValues0);user.setPass(userValues1);/返回转换来的User实例return user;6.1.2 自定义类型转换自定义类型转换/实现将复合类型转换成字符串类型的方法public String convertToString(Map

18、 context, Object o)/将需要转换的值强制类型转换为User实例User user = (User) o;return ;6.1.3 类型转换中的错误处理类型转换中的错误处理l在表示层处理数据过程中,经常会出现没有严格按照页面要求进行的数据录入操作l输入电话号码 :02260274469l实际上,表现层数据涉及两个处理l数据校验&类型转换l只有当输入数据时有效数据时,才可以进行有效地类型转换l有效类型转换是基础,然后才做数据校验l为了处理类型转换错误,Strus 2提供了处理类型转换错误的拦截器,名称为“conversionError”,在“struts-default

19、.xml”文件包含对该拦截器的配置。l此拦截器负责将对应错误封装成表单域错误(FieldError),并将它们放入ActionContext中。l输出出错信息:6.1.3 类型转换中的错误处理类型转换中的错误处理输出的错误提示Struts2的表单标签使用xhtml主题时,本身就会输出错误提示6.2 数据校验的方法数据校验的方法l6.2.1 数据校验的必要性l6.2.2 通过Action中的validate()方法实现校验l6.2.3通过Xwork框架实现校验6.2.1 输入校验的必要性l用户在客户端的浏览器中输入信息,通过网络提交到服务器,服务器对接收的信息进行处理并将结果返回给用户。l要想保

20、证这一过程能够顺利执行就必须保证用户提交信息的合法性。l输入校验l确保数据信息的有效性l保证Web应用的安全性6.2.1 输入校验的必要性l输入校验分为两部分:l客户端校验:l通常使用脚本语言校验,例如JavaScript。l校验输入信息是否满足一定的要求或满足一定的结构,如 校验输入的文本是否为空校验输入的文本是否是数字校验E-mail的格式是否正确l优点:可以快速提示用户输入错误,提高响应速度。防止将无效数据发送到服务器,从而减轻服务器的负担。6.2.1 输入校验的必要性l服务端校验:l通过检查HTTP请求信息以校验输入是否正确l有些数据必须通过程序交给服务器去处理,l校验注册的用户名是否

21、存在l校验登录的密码是否正确l另一个原因就是如果用户浏览器禁用了脚本执行,客户端校验就会失效。l安全性校验l错误登录次数限制l使用访问来源校验l实现方式l通过Action中的validate()方法l使用xWork校验框架6.2.2 编程方式编程方式实现实现输入输入校验校验l在Action类中手动创建校验数据的代码,包括:l在execute()方法中实现校验:l使用validate()方法实现校验:l实现校验逻辑与业务逻辑的分离。lvalidate*()的使用:l可以为不同的方法配置其独立的校验代码l只需将相同的校验逻辑放在validate()方法即可。6.2.2 编程方式实现输入校验编程方式

22、实现输入校验lvalidate*()使用的示例:public class ValidateTest extends ActionSupport /省略属性及其set、get方法public String login() /用于登录return login;public String regist() /用于注册return regist;public void validate() /相同的校验/省略校验代码public void validateLogin() /只对login()方法的请求执行校验/省略校验代码public void validateRegist() /只对regist()

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

24、架实现l修改ch6-3的例子l将LoginAction.java中的validate()方法和validateLog()方法删除l在com.action包下创建验证文件LoginAction-validation.xml文件6.2.3 通过通过XWork校验框架实现校验框架实现l验证文件的几个关键问题l命名规则l校验配置方式l校验器6.2.3 通过通过XWork校验框架实现校验框架实现l命名规则lactionName-validation.xml,actionName是指需要校验的Action的类名,且该文件与Action类同路径l当用户提交请求后,系统会自动加载该文件完成对用户请求的校验。l

25、当一个Action中有多个业务处理方法,需要多个校验逻辑时,定义校验文件actionName-methodName-validation.xml6.2.3 通过通过XWork校验框架实现校验框架实现lStruts2框架的数据校验步骤lStruts2框架中的类型转换器对HTTP请求的数据进行数据类型转换,得到符合类型的值l使用Struts2中的Xwork校验框架进行校验l调用validateX()方法进行数据校验l调用validate()方法进行数据校验6.2.3 通过通过XWork校验框架实现校验框架实现l两种配置校验文件的方式l字段校验方式(Field-valiator)l针对字段或属性,在

26、校验时任何一个字段都能够返回一个明确的消息。l非字段校验方式(Non-Field validator)l将字段有效地组合到一起,不能对一个字段返回一个明确的消息。6.2.3 通过通过XWork校验框架实现校验框架实现l字段校验方式1900-01-012050-02-21生日必须在$min到$max之间被校验的字段校验器名为校验器指定校验参数校验失败后的提示信息6.2.3 通过通过XWork校验框架实现校验框架实现l非字段方式 birth 1900-01-01 2050-02-21 6.2.3 通过通过XWork校验框架实现校验框架实现l校验器(valiator)lrequired valida

27、tor(必填校验器)lrequiredstring validator(必填字符串校验器)lstringlength validator(字符串长度校验器)lregex validator(表达式校验器)lemail validator(邮件校验器)lurl validator(网址校验器)lint validator(整数校验器)ldouble validator(双精度数校验器)6.2.2 编写校验规则文件编写校验规则文件l利用Struts2的校验框架进行输入验证l例子:basicValidatel无需对程序代码做任何改变,只需编写校验规则文件。lregist.jsplRegistActi

28、on.javalRegistAction-validation.xmllstruts.xml6.3 国际化支持国际化支持l程序国际化是商业系统的一个基本要求l今天的软件系统不再是简单的单机程序,往往都是一个开放系统。l需要面对来自全世界各个地方的浏览者。l因此,国际化是商业系统中不可缺少的一部分。lStruts2的国际化是建立在Java国际化的基础上l通过提供不同国家/语言环境的消息资源,l然后通过ResourceBuddle加载指定Locale对应的资源文件,l再取得该资源文件中指定key对应的消息。lStruts2框架对Java程序国际化进行了进一步的封装,从而简化了应用程序的国际化。6.

29、3.1 国际化实现原理l国际化即通常所说的i18n(Internationalization),是指程序能够在不修改内部代码的前提下,根据不同的语言以及地区显示相应的界面。l国际化中涉及到的几个概念:l国际化资源文件:l保存各种版本语言编写的消息。l程序拥有自动选择国际化资源文件的功能。lLocale:l对应区域/语言等信息。lResourceBundle:l用来加载国际化资源。lI18nInterceptor:lStruts 2提供的国际化拦截器,负责处理Locale相关信息。6.3.1 国际化实现原理i18n拦截器ActionResult你好确定LocalResourceBundlehel

30、lo=bonjourhello=你好hello=hello中文国际化资源英文国际化资源法文国际化资源其他国际化资源请求页面显示结果页面修改浏览器语言设置修改浏览器语言设置修改浏览器语言设置修改浏览器语言设置6.3.2 准备国际化资源文件lStruts 2的国际化资源文件以.properties结尾,文件名前缀可以任意命名。习惯上命名方式有以下3种:l文件名前缀.properties。l文件名前缀_语言种类.properties。l文件名前缀_语言种类_国家代码.propertiesl语言代码字段必须是有效的ISO(International Standardization Organizati

31、on,国际标准化组织)语言代码,ISO-639标准定义的这些代码格式为英文小写、双字符。6.3.2 准备国际化资源文件l国家代码字段语言语言语言代码语言代码国家代码国家代码汉语(汉语(Chinese)ZhCN英语(英语(English)EnUS法语(法语(French)FrFR德语(德语(German)deDE日语(日语(Japanese)jaJP意大利语(意大利语(Italian)itIT6.3.2 准备国际化资源文件l国际化资源文件的内容结构l“key”=“value” l“key”对应消息名,可以任意命名,l“value”则应该是同一信息不同的语言表示,l对于不同语言的配置文件,“key

32、”都是一致的而“value”的内容不同。汉语的配置文件内容为:hello=你好英语的配置文件内容为:hello=hello法语的配置文件内容为:hello=bonjour6.3.2 准备国际化资源文件l根据国际化信息的作用范围可以将国际化资源文件分为3种:l全局范围:l包范围lAction范围6.3.2 准备国际化资源文件l全局范围:l该资源文件被放置在WEB-INF/classes路径下,文件信息可以在整个工程范围内被使用。它在“struts.xml”中配置方式的为:ll属性value的值为全局范围资源文件的文件名前缀6.4.2 准备国际化资源文件l包范围:l该资源文件被放置在对应包的根路径下,且文件名

温馨提示

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

评论

0/150

提交评论