您的位置:首页 > 编程语言 > Java开发

Struts2类型转换,数据验证

2016-10-20 09:17 387 查看

一、数据类型转换

1、struts内部自动将页面获取到的字符串类型的数据转为数据库中的类型的  insert,update,delete

public class MyConverter extends StrutsTypeConverter{
private SimpleDateFormat sdf = new SimpleDateFormat("MM/dd/yyyy");

public Object convertFromString(Map arg0,String[] arg1, Class arg2){
//判断有没有被转换的数据
if(arg1==null||arg1.length==0)
return null;
//得到被转换的数据
String data = arg1[0];
if(arg2==java.util.Date.class){
try{
return sdf.parse(date);
}catch(ParseException e){
e.prinStackTrace();
return null;
}
}
return null;
}


2、把数据库中某种类型的数据转成字符串显示在页面上  select查询

struts2实现的自动转换:

1:基本数据类型的转换

2:本地各式的日期类型(yyyy-MM-dd)———Date

3:把值是String[]类型的转换成了用“,+空格" 间隔的字符串

二、自定义类型转换器:

TypeConverter  的子类DefaultTypeConverter的子类 StrutsTypeConvrter

定义好的类型转换器需要注册:

a:该类型转换期只能被特定的类使用(局部的)

b:该类型转换器可以被全局使用(全局的)

1、把页面上的MM/dd/yyyy格式的日期转成Date类型

//第一个参数是OGNL上下文,第二个参数是被转换的数据,第三个参数是转成的类型

public class MyConverter extends StrutsTypeConverter{
private SimpleDateFormat sdf = new SimpleDateFormat("MM/dd/yyyy");

public Object convertFromString(Map arg0,String[] arg1, Class arg2){
//判断有没有被转换的数据
if(arg1==null||arg1.length==0)
return null;
//得到被转换的数据
String data = arg1[0];
if(arg2==java.util.Date.class){
try{
return sdf.parse(date);
}catch(ParseException e){
e.prinStackTrace();
return null;
}
}
return null;
}


2、把Date类型的日期转成字符串

c、定义好的类型转换器需要注册

1、局部的类型转换器,文件名的命名规则:JavaBean的名称-conversion.properties

birthday=com.lzh.web.converter,MyConverter   //键是字段名,值是类型转换器的类路径

2、定义全局的类型转换期,文件的命名规则是xwork-conversion.propertioe

java.util.Date=com.lzh.web.converter.MyConverter(转换器包名+转换器类名)

三、没有自定义类型转换器时的错误处理

1、定义结果视图 input

<result name="input">/regist.jsp</result>  数据回显

问题是回来了,但是没有显示数据

<%@ taglib uri="/struts-tags" prefix="s"%> struts的标签库

<s:filederror/>——只是显示错误信息,实现数据的回显,必须使用struts2的表单

struts2 的form和html的表单差不多

action:可以直接写动作

method:默认是post

enctype:表单编码的MIME类型

发生类型转换错误时为什么加入input结果视图就能实现数据回显?

拦截器conversionError实现的这个功能

注意:动作类必须继承ActionSupport

<s:form action = "regist.action">
<s:textfield name="username" label="用户名"></s:textfield>
<s:password name="password" label="密码" showPassword="true"></s:password>
<s:textfield name="birthday" label="出生日期"></s:textfield>
<s:submit value="注册"></s:submit>
</s:form>


2、
User.properties

invalid.field

四、数据验证

客户端验证,服务器端验证

服务器端验证:

1、编程式验证:写代码验证:写死了,硬编码

验证写在Action中,动作类中必须继承ActionSupport。重写ActionSupport中的public void validate()方法
Struts2内部封装了一个Map,Map的键就是表单上的name的值,Map的值就是错误信息

StringUtils.isEmpty()——判断是否为null或空字符串,但是不去除空格
StringUtils.isBlank()—— 判断是否为null或空字符串,去除空格

默认:validate方法在所有方法执行之前执行,为了让不需要验证的不去执行validate方法,解决方式有两种:
1:使用注解:@SkipValidation(给不需要执行的方法前加)
2:验证的方法名:validate+动作方法名
public void validateRegist
public void validate(){
//验证用户名不能为空
if(StringUtils.isEmpty(user.getUsername())){
addFieldError("username","用户名不能为空");
}
}

2、声名式验证:写xml代码验证
通过xml文件实现验证
在动作类所在的包下创建xml文件
文件名有命名规则:动作类名-validation.xml,默认验证动作类中的所有动作方法
希望某些方法不被验证1、加注解!@SkipValidation
2、xml文件名改成:动作类名-动作名-validation.xml
在xml文件中加入dtd约束(struts——apps——lib下的xwork-core.jar包中找到xwork-validator-1.0.3.dtd)

基于字段的验证:
<validators>
<!-- 基于字段的验证 -->
4000
;
<field name="username">
<!-- 怎么验证,struts内部定义了很多的验证器
requiredstring判断是否为null,或空字符串,去空格 -->
<field-validator type="requiredstring">
<message>用户名不能为空</message>
</field-validator>
</field>
</validators>

基于验证器的验证:
<validators>
<!-- 基于验证器的验证 -->

<!-- 怎么验证,struts内部定义了很多的验证器-->
<validator type="requiredstring">
<!-- 使用注入的方式指明验证谁
private String actionName
setActionName()-->
<param name ="fieldName">password</param>
<message>用户名不能为空</message>
</validator>
</field>
</validators>

小知识 1、选择框 <s:radio list="{‘男’,‘女’}">
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息