版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第四章数据类型转换与数据验证上节回顾
OGNL语言及使用OGNL如何访问对象
Struts2常用标签的使用UI标签非UI标签主要内容Struts2中的数据类型转换
Struts2中的数据验证验证框架的使用Struts2国际化本讲目标Struts2中的数据类型转换
Struts2中的数据验证Struts2国际化OGNL基础OGNL融入Struts2为什么进行类型转换为什么进行类型转换在基于HTTP协议的Web应用中客户端请求的所有内容都以文本编码方式传输到服务器端服务器端的编程语言却有着丰富的数据类型Servlet中,类型转换工作由开发者自己完成Struts2提供了多种内置类型转换器,自动对客户端传来的数据进行类型转换,另外开发者可以开发自定义类型转换器Stringagestr=request.getParameter("age");intage=Integer.parseInt(agestr);通过表单实现信息的录入,包括名称、年龄、生日、坐标信息其中的年龄、生日、坐标分别为整型、日期类型和自定义类型,而不是字符串类型,这会涉及类型转换类型转换实例第一步:定义和配置Action内置类型转换器publicclassRegisterActionextendsActionSupport{ privateStringname;
privateintage; privateDatebirthday;
privatePointpoint; ...//省略各个属性的setter和getter方法}publicclassPoint{ privateintx;//X坐标
privateinty;//Y坐标
…//省略setter和getter方法}<struts> <packagename="Struts2"extends="struts-default"> <actionname="register" class="cn.jbit.action.RegisterAction"> <resultname="success">success.jsp</result>
<resultname="input">register.jsp</result> </action> </package></struts>第二步:创建页面录入页面register.jsp成功页面success.jsp内置类型转换器<html><head><title>录入页面</title></head> <body> <h2>信息录入</h2> <br/> <s:formaction="register"> <s:textfieldname="name"label="名称"/> <s:textfieldname="age"label="年龄"/> <s:textfieldname="birthday"label="生日"/> <s:textfieldname="point"label="坐标"/> <s:submitvalue="提交"></s:submit> <s:resetvalue="重置"></s:reset> </s:form> </body></html><html> <head> <title>录入成功</title> </head> <body>
录入信息如下<br/> <hr>
名称:<s:propertyvalue="name"/><br>
年龄:<s:propertyvalue="age"/><br>
生日:<s:propertyvalue="birthday"/><br>
坐标:<s:propertyvalue="point"/><br> </body></html>内置类型转换器Struts2提供了一些内置类型转换器,可以处理大多数常用的类型转换
继承StrutsTypeConverter抽象类继承org.apache.struts2.util.StrutsTypeConverter类创建自定义类型转换器#将一个或多个字符串值转换为指定的类型publicObjectconvertFromString(Mapcontext,String[]val,ClasstoType)#将指定对象转化为字符串publicStringconvertToString(Mapcontext,Objectobject)应用于全局范围的类型转换器在src目录创建perties应用于特定类的类型转换器在特定类的相同目录下创建一个名为ClassNperties的属性文件
配置自定义类型转换器转换类全名=类型转换器类全名特定类的属性名=类型转换器类全名创建坐标类型转换器publicclassPointConverterextendsStrutsTypeConverter{ publicObjectconvertFromString(Mapcontext,String[]values,
ClasstoType){ //获取X、Y坐标
Stringstr=values[0]; Stringxy[]=str.split(","); intx=Integer.parseInt(xy[0]); inty=Integer.parseInt(xy[1]); //构建坐标对象
Pointpoint=newPoint(); point.setX(x); point.setY(y); returnpoint;//返回坐标对象 } publicString
convertToString(Mapcontext,Objectobject){ //将坐标对象转换为字符串
Pointpoint=(Point)object; intx=point.getX(); inty=point.getY(); Stringstr="("+x+","+y+")"; returnstr;//返回字符串 }}将字符串转换为坐标类型将坐标对象转换为字符串应用于特定类在RegisterAction类同一个目录下创建文件RegisterAction-perties
配置坐标类型转换器point=cn.jbit.converter.PointConverterAction类中的属性名,不是类名或其他创建日期类型转换器publicclassDateConverterextendsStrutsTypeConverter{ privatefinalDateFormat[]dfs={
newSimpleDateFormat("yyyy年MM月dd日"), newSimpleDateFormat("yyyy-MM-dd"), newSimpleDateFormat("yyyy/MM/dd")}; publicObjectconvertFromString(Mapcontext,String[]values, ClasstoType){ StringdateStr=values[0];//获取日期的字符串
for(inti=0;i<dfs.length;i++){//遍历日期支持格式,进行转换
try{ returndfs[i].parse(dateStr); }catch(Exceptione){ continue;
} }
thrownewTypeConversionException(); } publicStringconvertToString(Mapcontext,Objectobject){ Datedate=(Date)object; //输出的格式是yyyy-MM-dd returnnewSimpleDateFormat("yyyy-MM-dd").format(date); }}将指定格式字符串转换为日期类型将日期转换为指定格式字符串支持转换的多种日期格式应用于全局范围src目录下创建文件perties
配置日期类型转换器java.util.Date=cn.jbit.converter.DateConverterDate类的完整类名,而不是属性名birthday或其他如果在录入界面中输入了错误格式的内容,比如年龄、日期、坐标都随意输入字符串,会出现什么情况呢?处理类型转换错误向用户输出类型转换错误的前提条件启动StrutsConversionErrorInterceptor拦截器拦截器已经包含在defaultStack拦截器栈中Action要继承ActionSupport类其实是要实现ValidationAware接口配置input结果映射页面使用Struts2表单标签或<s:fielderror>标签Struts2表单标签内嵌了输出错误信息功能普通HTML标签需使用<s:fielderror>标签输出转换错误处理类型转换错误修改所有类型的转换错误信息思路修改xwork.default.invalid.fieldvalue键的值处理类型转换错误实现在struts.xml中指定资源文件的基名在src目录下创建资源文件并修改键值 xwork.default.invalid.fieldvalue =字段“{0}”的值无效<constantname="struts.custom.i18n.resources" value="message"/>定制特定字段的类型转换错误信息思路在Action范围的资源文件中添加I18N消息键invalid.fieldvalue.xxx处理类型转换错误实现在RegisterAction相同包下创建RegisterAperties,指定键值
invalid.fieldvalue.birthday=生日转换错误对用户登录添加表单验证功能Struts2提供了数据验证机制,需要继承ActionSupport类来完成Action开发ActionSupport类不仅对Action接口进行简单实现,同时增加了验证、本地化等支持Struts2的数据校验修改LoginActionStruts2的数据校验publicclassLoginActionextendsActionSupport{ … publicvoidvalidateExecute(){ if(“admin".equals(username)&&“123".equals(password)){ Map<String,Object>session= ActionContext.getContext().getSession(); if(session.containsKey(CURRENT_USER)){
session.remove(CURRENT_USER); } session.put(CURRENT_USER,username); }else{
super.addActionError("用户名为空,或用户名密码不匹配。"); } } publicStringexecute(){
returnSUCCESS; }} 继承ActionSupport验证出错,指定错误提示信息验证成功修改JSP页面Struts2的数据校验<%@taglibprefix="s"uri="/struts-tags"%>…<div>
<s:actionerror/></div><s:formaction="/login.action"> <div>
用户名:
<s:textfieldname="username"/> </div> <div>
密
码:
<s:passwordname="password"/> </div> <inputtype="submit"value="提交"/></s:form> 显示服务器返回的错误信息修改struts.xml文件Struts2的数据校验…<struts> <!--设置用户界面主题,默认值为xhtml风格--> <constantname="struts.ui.theme"value="simple"/> <packagename="default"namespace="/"extends="struts-default"> <actionname="login"class="cn.jbit.strutsdemo.LoginAction"> <resultname="success">/success.jsp</result>
<resultname="input">/login.jsp</result>
</action> </package></struts>“input”结果:指定用户输入不能通过验证时的返回页面对用户注册功能进行验证用户名:不能为空,长度在6和10之间密码:不能为空,密码长度>=6确认密码:必须和密码相同电话:不能为空,符合电话号码格式用户姓名:不能为空,长度在2和4之间使用验证框架进行验证用户无需编码,在外部配置文件中指定某个字段的验证类型,并提供出错信息即可使用验证框架可以减轻开发者负担,提高开发效率验证框架第一步:创建RegisterAction实现对用户注册的处理第二步:在struts.xml中配置action通过“input”指定验证错误时需返回的页面验证框架publicclassRegisterActionextendsActionSupport{
privateUseruser;//用户信息
privateStringrepassword; //确认密码
… publicStringexecute(){ returnSUCCESS; }}<actionname="register"class="cn.houserent.action.RegisterAction"> <resultname="success">/index.jsp</result>
<resultname="input">/page/register.jsp</result></action>第三步:创建注册页面register.jsp第四步:创建验证文件验证框架<s:formaction="register"> <s:textfieldname=""label="用户名"/> <s:passwordname="user.password"label="密码"/> <s:passwordname="repassword"label="确认密码"/> <s:textfieldname="user.telephone"label="电话"/> <s:textfieldname="user.username"label="用户姓名"/> <s:submitvalue="立即注册"></s:submit></s:form><?xmlversion="1.0"encoding="UTF-8"?><!DOCTYPEvalidatorsPUBLIC "-//OpenSymphonyGroup//XWorkValidator1.0.2//EN"
"/xwork/xwork-validator-1.0.2.dtd"><validators></validators>
第五步:使用验证框架编写验证规则用户名:不能为空,长度在6和10之间验证框架<validators> <fieldname=""> <field-validatortype="requiredstring"> <paramname="trim">true</param> <message>用户名不能为空</message> </field-validator>
<field-validatortype="stringlength"> <paramname="maxLength">10</param> <paramname="minLength">6</param> <message>用户名长度须在${minLength}和 ${maxLength}之间</message> </field-validator> </field> </validators>第五步:使用验证框架编写验证规则密码:不能为空,密码长度>=6密码和确认密码必须一致验证框架<validators> <fieldname="user.password"> … </field> <fieldname="repassword"> … <field-validatortype="fieldexpression"> <paramname="expression">
user.password==repassword </param> <message>密码和确认密码必须相同</message> </field-validator> </field> </validators>第五步:使用验证框架编写验证规则电话号码:不能为空,符合电话号码格式验证框架<validators> <fieldname="user.telephone"> <field-validatortype="requiredstring"> <message>电话号码不能为空</message> </field-validator> <field-validatortype="regex"> <paramname="expression">
^(\d{3,4}-){0,1}(\d{7,8})$ </param> <message>电话号码格式不正确</message> </field-validator> </field></validators>国际化(Internationalization:I18N)使程序在不做任何修改的情况下,可以在不同国家或地区和不同语言环境下,按照当地的语言和格式习惯显示字符本地化(Localization:L10N)一个国际化的程序,当它运行在本地机器时,能够根据本地机器的语言和地区设置显示相应字符国际化和本地化国际化和本地化Java程序的国际化思路将程序中的提示信息、错误信息等放在资源文件中,为不同国家/语言编写对应资源文件资源文件由很多key-value对组成,key保持不变,value随国家/语言不同而不同这些资源文件使用共同的基名,通过在基名后面添加语言代码、国家和地区代码来进行区分实现对用户注册功能的国际化对英文用户显示英文界面和验证错误信息对中国香港用户显示繁体中文界面和验证错误信息对其他用户显示简体中文界面和验证错误信息实现国际化步骤在struts.xml中指定资源文件的基名及存储路径按照需求创建对应的三个资源文件,存放相应资源实现JSP页面信息的国际化显示实现验证错误信息的国际化显示使用Struts2实现国际化第一步:指定资源文件的基名及存储路径第二步:创建对应的三个资源文件位置在src目录下,或者直接在WEB-INF/classes目录名称message_pertiesmessage_zh_HK.propertiesperties使用Struts2实现国际化<struts> <constantname="struts.custom.i18n.resources"value="message"/> <constantname="struts.i18n.encoding"value="UTF-8"/> …… </struts>第三步:实现JSP页面信息的国际化显示使用Struts2实现国际化<html> <head> <title>
<s:textname="register.page"/> </title> </head> <body> <h2>
<s:textname="register.title"/> </h2> <s:formaction="register"> <s:textfieldname=""key="name"/> <s:passwordname="user.password"key="password"/> <s:passwordname="repassword"label="%{getText('repassword')}"/> <s:textfieldname="user.telephone"label="%{getText('telephone')}"/> <s:textfieldname="user.username"label="%{getText('username')}"/> <s:submitvalue="%{getText('submit')}"/> </s:form> </body></html>注册页面#message_pertiesregister.page=HouserRent-UserRegisterregister.title=NewUserRegistername=Name…submit=RegisterNow#message_zh_HK.propertiesregister.page=青鳥租房-用戶註冊register.title=新用戶註冊name=用戶名…submit=立即註冊#pertiesregister.page=青鸟租房-用户注册register.title=新用户注册name=用户名…submit=立即注册资源文件第四步:实现验证错误信息的国际化显示使用Struts2实现国际化#message_pertiesname.null=Namecannotbenullname.length=Nameshouldbebetween${minLength}and${maxLength}password.null=Passwordcannotbenullpassword.length=Mininumpasswordlengthis${minLength}…#message_zh_HK.propertiesname.null=用戶名不能為空name.length=用戶名長度必須在
${minLength}和${maxLength}之間password.null=密碼長度不能為空password.length=密碼長度必須大於等於${minLength}…#perties
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 常州市溧阳中学高三地理一轮复习第三章(6)农业学案
- 3目标图案的提取
- 2025年中职(建筑装饰技术)施工工艺阶段测试试题及答案
- 2025-2026年初一语文(单元)上学期期中测试卷
- 2025年中职美容美发(皮肤护理方法)试题及答案
- 2026年综合测试(交通工程能力)考题及答案
- 2025年高职城市轨道交通车辆技术(车辆驾驶)试题及答案
- 2025年大学护理(护理伦理)试题及答案
- 2026年注册会计师(会计)考点梳理及真题
- 2025年大学数字媒体设计(数字媒体创意)试题及答案
- 中国2型糖尿病运动治疗指南(2024版)解读课件
- 《燃料电池与制氢》课件
- TSZUAVIA 001-2021 低慢小无人机探测反制系统要求
- 2025年小米集团招聘笔试参考题库含答案解析
- DB45T 2415-2021 在用桥(门)式起重机安全评估规程
- 【MOOC】经济法学-西南政法大学 中国大学慕课MOOC答案
- 《J监狱突发事件应急管理现状及完善对策研究》24000字(论文)
- GB/T 6556-2024机械密封的型式、主要尺寸、材料和识别标志
- 2024版8部编版语文四年级上《蝴蝶的家 》教学教案
- 热电解制氢集成技术创新
- 中药山药课件
评论
0/150
提交评论