博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Struts2基础学习(四)—类型转换器和数据校验
阅读量:4509 次
发布时间:2019-06-08

本文共 5104 字,大约阅读时间需要 17 分钟。

一、自定义类型转换器

1.概述

     Struts2提供了常规类型转换器,可以用于常用数据类型的转换,但如果目标类型是一个特殊类型,则需要自定义转换器。Struts2 类型转换器实际上都是基于OGNL实现的,在OGNL项目中,有一个TypeConverter接口,自定义类型转换器必须实现

ongl.TypeConverter。

    

 

2.编写类型转换器

(1)实现TypeConverter接口,实现一个方法

public Object convertValue(Map
context, Object target, Member member, String propertyName, Object value, Class toType);

(2)继承DefaultTypeConverter类,重写一个方法

public Object convertValue(Map
context,Object value,Class toType)

(3)继承StrutsTypeConverter类重写两个方法

public Object convertFromString(Map context,String[] values,Class toClass)
public String convertToString(Map context,Object o)

 

     java.util.Date类型的属性可以接收格式为2009-07-20的请求参数值。但如果我们需要接收格式为20091221的请求参数,我们必须定义类型转换器,否则struts2无法自动完成类型转换。

第一种:继承DefalutTypeConverter类

public class DateConvert extends DefaultTypeConverter{	@Override	public Object convertValue(Map
context,Object value,Class toType){ SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd"); try{ //String--->Date if(toType == Date.class){ String[] params = (String[])value; return sdf.parseObject(params[0]); } else if(toType == String.class){ //Date--->String Date date = (Date)value; return sdf.format(date); } }catch(ParseException e){ e.printStackTrace(); } return super.convertValue(context,value,toType); }}

第二种继承StrutsTypeConverter类

public class DateConvert2 extends StrutsTypeConverter{	private SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd");		//String--->Date	@Override	public Object convertFromString(Map context,String[] values,Class toClass){				if(toClass == Date.class){			try{				String date = values[0];				return sdf.parse(date);			}catch(ParseException e){				e.printStackTrace();			}		}		return null;	}	//Date--->String	@Override	public String convertToString(Map context,Object o){				if(o instanceof Date){			return sdf.format(o);		}				return null;	}}

 

3.注册类型转换器

(1)局部注册

     针对的是表单中某个字段生效。分为属性驱动方式模型驱动方式两种。

      属性驱动的方式

     注意: 在Action所在的包下创建一个文件,文件的格式是:Action类名-conversion.properties文件,该文件中配置要转换数据的字段和对应的转换器全路径。birthday=com.kiwi.convert.DateConvert2

      模型驱动的方式

     注意: 在实体类所在的包下创建一个文件,文件的格式是:实体类名-conversion.properties文件,该文件中配置要转换数据的字段和对应的转换器全路径。

 

(2)全局注册

     针对整个项目所有的日期类型都会生效。

     在src的目录下,创建一个xwork-conversion.properties      

     例如: java.util.Date=cn.itcast.demo3.MyDateConverter

 

4.类型转换的错误处理

(1)当发生类型转换错误的时候,根据报错的信息提示,没有提供input类型的结果视图。那可以在<action>标签中配置input结果视图。

(2)如果Struts2的类型转换器执行类型转换时出现错误,该拦截器将负责将对应错误封装成表单域错误(FieldError),并将这些错误信息放入ActionContext中。
(3)使用类型转换中的错误处理用户定义Action必须继承ActionSupport。
(4)在自定义类型转换器中,异常必须抛出不能捕获,conversionError会处理该异常,然后转入名为input的逻辑视图。
(5)在Action所在包中,创建 ActionName.properties,在局部资源文件中配置提示信息

         invalid.fieldvalue.属性名= 错误信息

 

index.jsp

struts.xml
/success.jsp
/index.jsp

结果:

     

 

二、数据校验

1.概述

     数据校验分为前台校验后台校验两种方式:

     (1) JavaScript可以在前台完成校验,但是这种方式主要是提升用户的体验,通过可以绕行的方式进入到后台程序中。

     (2) 后台的数据校验,在Servlet/Action中需要做数据的校验(必须要做的校验)。

     Struts2提供了两种校验方式:

     (1)手动编码校验。

     (2)配置文件校验。

 

2.手动编码校验

开发步骤:

          步骤一: 封装数据。

          步骤二: 实现校验Action ,必须继承ActionSupport 类。 
          步骤三: 覆盖validate方法,完成对Action的业务方法 数据校验 this.addFieldError (ActionSupport提供)。
          步骤四: 在jsp中 通过 <s:fieldError/> 显示错误信息。

 

(1)针对Action所有的方法进行校验

     让Action继承ActionSupport类,重写ActionSupport类中的validate()方法,在该方法中完成数据校验。

//针对所有Action进行校验	@Override	public void validate(){				//用户名为空		if(StringUtils.isEmpty(person.getUsername())){						addFieldError("username","用户名不能为空");		}		//密码不能为空		if(StringUtils.isEmpty(person.getPassword())){						addFieldError("password","密码不能为空");		}			}

 

(2)针对Action某个方法进行校验

     手动在Action中编写一个方法,方法名称是validate方法名称()  例如: public void validateAdd(){  }

public String save(){		System.out.println("save()......");		return NONE;	}	// 针对save方法进行校验	public void validateSave(){		// 用户名为空		if(StringUtils.isEmpty(person.getUsername())){			addFieldError("username","用户名不能为空");		}		// 密码不能为空		if(StringUtils.isEmpty(person.getPassword())){			addFieldError("password","密码不能为空");		}	}

注意:

       (1)编写的是Action都需要继承ActionSupport类。

       (2)代码校验不适用于大型项目,流程数据复杂时,开发量和维护量都会很大。

 

3.配置文件校验

(1)针对Action中所有的方法进行校验

     在Action所在包中创建一个XML文件,命名规则: Action类型-validation.xml。

     PersonAction-validation.xml

用户名不能为空
密码不能为空
3
12
密码长度必须在3~12之间

 

(2)针对的是Action的某个方法进行校验

    在Action所在包创建一个XML文件,命名规则: Action类名-方法名-validation.xml

 

4.Struts2提供的内置校验器列表

性别不能为空!
true
用户名不能为空!
10
2
true
1
150
年龄必须在1-150之间
1900-01-01
2050-02-21
生日必须在${min}到${max}之间
一个有效网址
电子邮件地址无效
手机号格式不正确!
两次密码输入不一致

转载于:https://www.cnblogs.com/yangang2013/p/5474835.html

你可能感兴趣的文章
使用x64dbg分析微信聊天函数并实现发信息
查看>>
robotframework-selenium2library各个版本
查看>>
插入排序
查看>>
LeetCode全文解锁 √
查看>>
[BZOJ 1566] 管道取珠
查看>>
[Codeforces 1060F] Shrinking Tree
查看>>
Winfrom 桌面弹窗拦截 关闭进程简易程序 源代码下载
查看>>
NGUI Atlas Panel和Depth的关系
查看>>
推荐一些相见恨晚的 Python 库 「一」
查看>>
POJ 1062 昂贵的聘礼 (带限制的最短路)
查看>>
TCP协议、UDP协议、端口、套接字
查看>>
设计模式之——单例模式
查看>>
Linux下vim上编辑实现进度条
查看>>
ubuntu 设置plank开机自启之后关机键失效变为注销键
查看>>
JS--我发现,原来你是这样的JS(三)(基础概念--灵魂篇)
查看>>
手指滑动切换手机图片
查看>>
解决Oracle EM无法启动
查看>>
java.lang.ClassNotFoundException: org.springframework.web.context.ContextLoaderListener
查看>>
PHP 跨域资源共享 CORS 设定
查看>>
男神鹏:使用Redis 的一些 问题解决方案。
查看>>