zoukankan      html  css  js  c++  java
  • Struts2基础学习(四)—类型转换器和数据校验

    一、自定义类型转换器

    1.概述

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

         image

    2.编写类型转换器

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

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

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

    	public Object convertValue(Map<String,Object> 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<String,Object> 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

    <s:form action="personAction">
        
            <s:textfield label="用户名" name="username"></s:textfield>
            <s:textfield label="密 码" name="password"></s:textfield>
            <s:textfield label="年 龄"  name="age"></s:textfield>
            <s:textfield label="生 日" name="birthday"></s:textfield>
            
            <s:submit value="提交"></s:submit>
        </s:form>
    struts.xml
    		<action name="personAction"  class="com.kiwi.action.PersonAction">
    			<result name="success">/success.jsp</result>
    			<result name="input">/index.jsp</result>
    		</action>

    结果:

          image

    二、数据校验

    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

    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE validators PUBLIC
      		"-//Apache Struts//XWork Validator 1.0.3//EN"
      		"http://struts.apache.org/dtds/xwork-validator-1.0.3.dtd">
      		
     <validators>
     
     	<field name="username">
     		<field-validator type="requiredstring">
     			<message>用户名不能为空</message>
     		</field-validator>
     	</field>
     	
     	<field name="password">
     		<field-validator type="requiredstring">
     			<message>密码不能为空</message>
     		</field-validator>
     		
     		<field-validator type="stringlength">
     			<param name="minLength">3</param>
     			<param name="maxLength">12</param>
     			<message>密码长度必须在3~12之间</message>
     		</field-validator>
     		
     	</field>
     
     </validators>

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

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

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

    image

    	<!-- required 必填校验器 -->
    	<field-validator type="required">
    		<message>性别不能为空!</message>
    	</field-validator>
    
    	<!-- requiredstring 必填字符串校验器 -->
    	<field-validator type="requiredstring">
    		<param name="trim">true</param>
    		<message>用户名不能为空!</message>
    	</field-validator>
    
    	<!-- stringlength:字符串长度校验器 -->
    	<field-validator type="stringlength">
    		<param name="maxLength">10</param>
    		<param name="minLength">2</param>
    		<param name="trim">true</param>
    		<message><![CDATA[产品名称应在2-10个字符之间]]></message>
    	</field-validator>
    
    	<!-- int:整数校验器 -->
    	<field-validator type="int">
    		<param name="min">1</param>
    		<param name="max">150</param>
    		<message>年龄必须在1-150之间</message>
    	</field-validator>
    
    	<!-- date: 日期校验器 -->
    	<field-validator type="date">
    		<param name="min">1900-01-01</param>
    		<param name="max">2050-02-21</param>
    		<message>生日必须在${min}到${max}之间</message>
    	</field-validator>
    
    	<!-- url: 网络路径校验器 -->
    	<field-validator type="url">
    		<message>一个有效网址</message>
    	</field-validator>
    
    	<!-- email:邮件地址校验器 -->
    	<field-validator type="email">
    		<message>电子邮件地址无效</message>
    	</field-validator>
    
    	<!-- regex:正则表达式校验器 -->
    	<field-validator type="regex">
    		<param name="expression"><![CDATA[^13d{9}$]]></param>
    		<message>手机号格式不正确!</message>
    	</field-validator>
    
    	<!-- fieldexpression : 字段表达式校验 -->
    	<field-validator type="fieldexpression">
    		<param name="expression"><![CDATA[(password==repassword)]]></param>
    		<message>两次密码输入不一致</message>
    	</field-validator>
  • 相关阅读:
    7-[CSS]-css介绍,引入方式
    6-[HTML]-标签属性
    5-[HTML]-body常用标签2
    4-[HTML]-body常用标签1
    3-[HTML]-head标签介绍
    2-[HTML]--介绍
    1-[前端]--前端内容介绍
    35
    33 -jQuery 属性操作,文档操作(未完成)
    1o xiaomi
  • 原文地址:https://www.cnblogs.com/yangang2013/p/5474835.html
Copyright © 2011-2022 走看看