SpringMVC详解四、自带标签库及自定义参数转换器

1SpringMVC标签库

2、自定义参数转换器WebDataBinder

3(conversionService )自定义Stringjava.util.Date类型转换器

4(Validate)较验器----参数的有效性验证Validate----Hibernate(JSR303)

5(bindingResult)自定义错误信息的回显

SpringMVC详解四、自带标签库及自定义参数转换器_第1张图片

1SpringMVC标签库*用的不多*

1、搭建SpringMVC开发环境

导入springmvc所需要的jar

commons-logging-1.1.3.jar

log4j-1.2.17.jar

spring-aop-4.0.0.RELEASE.jar

spring-beans-4.0.0.RELEASE.jar

spring-context-4.0.0.RELEASE.jar

spring-core-4.0.0.RELEASE.jar

spring-expression-4.0.0.RELEASE.jar

spring-web-4.0.0.RELEASE.jar

spring-webmvc-4.0.0.RELEASE.jar

 

配置配置文件:

 

log4j.properties


# Global logging configuration
log4j.rootLogger=INFO, stdout
# Console output...
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%5p [%t] - %m%n

Springmvc配置文件:




	
	
		
		
	
	
	


web.xml中的配置内容:



	tag
	
	
	
		CharacterEncodingFilter
		org.springframework.web.filter.CharacterEncodingFilter
		
			encoding
			UTF-8
		
		
			forceEncoding
			true
		
	
	
		CharacterEncodingFilter
		/*
	
	
	
		HiddenHttpMethodFilter
		org.springframework.web.filter.HiddenHttpMethodFilter
	
	
		HiddenHttpMethodFilter
		/*
	
	
	
	
	
		springDispatcherServlet
		org.springframework.web.servlet.DispatcherServlet
		
			contextConfigLocation
			classpath:springmvc.xml
		
		1
	

	
	
		springDispatcherServlet
		/
	
	
	
		index.html
		index.htm
		index.jsp
		default.html
		default.htm
		default.jsp
	

2、创建对象模型Person对象

public class Person {
	private Integer id;
	private String name;
	private Date birthDate;
	private String email;
	private BigDecimal salary;

3、在webContent下创建jsp页面

springMVC的标签form标签可以关联Request域中bean对象

method="delete" 此时的methodcrudrestful风格,可以增删改查

addPerson.jsp页面:


		
		这里是添加用户页面
		
		name:
<%-- birthDate:
--%> email:
salary:

4、创建PersonController控制器

隐含模型中必须要有一个form标签对应的pojo对象

@Controller
public class PersonController {

	@RequestMapping(value = "/toAddPerson")
	public String toAddPerson(Map map) {
		System.out.println("经过toAddPerson方法");
		// 隐含模型中必须要有一个form标签对应的pojo对象
		map.put("person", new Person(12, "wzg168", null, "[email protected]",
				new BigDecimal(30000)));

		return "addPerson";
	}

	@RequestMapping(value = "/addPerson")
	public String addPerson(Person person) {
		System.out.println("添加用户【" + person + "】到数据库");
		return "redirect:/index.jsp";
	}

}

2、自定义参数转换器WebDataBinder

2.1WebDataBinder类介绍

SpringMVC中有WebDataBinder类。这个类专门用来负责将请求参数类型转换。以及请求参数数据验证错误信息绑定等功能。

WebDataBinder类中有三个组件分别处理三种不同的功能。

(1)conversionService 负责处理参数类型转换。把请求的参数转换成为Controller中的方法参数值。

converters接口:ConversionService组件中需要各种类型转换器,在conversionService组件中需要依赖于各种转换器类去实现转换工作。

(2)validators 负责验证传入的参数值是否合法。

(3)bindingResult 负责接收验证后的错误信息。

下图展示了WebDataBinderConversionServiceConverter的关系。

SpringMVC详解四、自带标签库及自定义参数转换器_第2张图片


如果我们要自定义请求参数的类型转换器。需要实现org.springframework.core.convert.converter.Converter接口。

然后注入到ConversionService组件中。最后再将ConversionService注入到WebDataBinder中。创建ConversionService组件,需要配置:

org.springframework.format.support.FormattingConversionServiceFactoryBean对象。

3(conversionService )自定义Stringjava.util.Date类型转换器

方法一:Stringjava.util.Date转换


/**
 * 自定义 String转换成为java.util.Date类
 *
 */
public class MyStringToDateConverter implements Converter {
	// 字符串和日期类型相互转换的工具类
	private static SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
	/**
	 * convert就是转换器工作时调用的转换方法
* 参数source就是客户端传递过来的值。 */ @Override public Date convert(String source) { // 以下情况上null,无法转换 if (source == null) { return null; } if (source != null && "".equals(source.trim())) { return null; } try { // 将日期 字符串转换成为 java.util.Date类型 return sdf.parse(source); } catch (ParseException e) { e.printStackTrace(); throw new IllegalArgumentException("Invalid Date value '" + source + "'"); } } }

springmvc配置文件中做如下的配置:


	
		
		
			
				
			
		
	
	
	
	
	
	

最后再将ConversionService注入到WebDataBinder:通过mvc的注解驱动

3.1@DateTimeFormat注解类型转换器

方法二:Stringjava.util.Date转换


我们也可以像上面。在类的Date类型的属性上标上注解。就可以自动String类型转换成为Date数据

 

pattern属性表示 日期的格式。最完成的格式是:yyyy-MM-dd hh:mm:ss

yyyy表示年份必须是4

MM 表示月份必须是2

dd 表示日期必须是2

 

hh 表示小时,必须是2

mm 表示分钟,必须是2

ss 表示秒钟,必须是2

SpringMVC详解四、自带标签库及自定义参数转换器_第3张图片

4(Validate)较验器----参数的有效性验证Validate----Hibernate

JavaEE6.0中,定义了很多的验证规范。这些规范统称为:JSR303验证规范。

而这些规范的实现。我们使用现在业内比较认可的Hibernate-Validate验证

 

@AssertTrue

用于boolean字段,该字段只能为true  

@AssertFalse

该字段的值只能为false

@CreditCardNumber

对信用卡号进行一个大致的验证

@DecimalMax

只能小于或等于该值

@DecimalMin

只能大于或等于该值

@Digits(integer=,fraction=)

检查是否是一种数字的整数、分数,小数位数的数字

@Email

检查是否是一个有效的email地址

@Future

检查该字段的日期是否是属于将来的日期

@Length(min=,max=)

检查所属的字段的长度是否在minmax之间,只能用于字符串

@Max

该字段的值只能小于或等于该值

@Min

该字段的值只能大于或等于该值

@NotNull

不能为null

@NotBlank

不能为空,检查时会将空格忽略

@NotEmpty

不能为空,这里的空是指空字符串

@Null

检查该字段为空

@Past

检查该字段的日期是在过去

@Pattern(regex=,flag=)

被注释的元素必须符合指定的正则表达式

@Range(min=,max=,message=)

被注释的元素必须在合适的范围内

@Size(min=, max=)

检查该字段的size是否在minmax之间,可以是字符串、数组、集合、Map

@URL(protocol=,host,port)

检查是否是一个有效的URL,如果提供了protocolhost等,则该URL还需满足提供的条件

 

使用Hiberante的验证器较验数据分以下步骤:

1、导入Hibernate验证的jar

classmate-0.8.0.jar

hibernate-validator-5.0.0.CR2.jar

hibernate-validator-annotation-processor-5.0.0.CR2.jar

jboss-logging-3.1.1.GA.jar

validation-api-1.1.0.CR1.jar

 

2、在实体bean对象的属性上使用较验的注解

public class Person {
	private Integer id;
	/**
	 * @NotNull表示验证当前name属性不能为null值
* @Length(min = 5, max = 12)表示验证name属性最小5位,最大12位 */ @NotNull @Length(min = 5, max = 12) private String name; /** * @Past 表示日期的值必须是过去的时间 */ @Past @DateTimeFormat(pattern = "yyyy-MM-dd") private Date birthDate; /** * @Email 表示当前email属性必须是合法的邮箱格式 */ @Email private String email; /** * @Max(value = 100) 表示当前salary的值不能大于100 */ @Max(value = 100) private BigDecimal salary;

3、Controller的方法参数上,给需要验证的bean对象。添加验证注解@Valid,以及在验证对象后跟一个BindingResult 对象用于接收验证的错误信息

/**
	 * @Valid Person person=====@Valid表示要验证当前这个person对象的数据
* BindingResult personBindingResult用来接收前面一个pojo对象验证的错误信息。 */ @RequestMapping(value = "/addPerson") public String addPerson(@Valid Person person, BindingResult personBindingResult) { // 判断输入的数据是否有错误, if (personBindingResult.hasErrors()) { System.out.println("*********************************************"); System.out.println( personBindingResult.getAllErrors() ); System.out.println("*********************************************"); return "addPerson"; } System.out.println("添加用户【" + person + "】到数据库"); return "redirect:/index.jsp"; }

4、SpringMVCform表单字段后,使用<form:errors path="字段名" />输出对应字段的错误信息


		
		这里是添加用户页面
		
		name:
birthDate:
email:
salary:

5(bindingResult)自定义错误信息的回显

5.1、错误消息规则:

这是校验错误的key规则:

 

格式1 Pattern.bean.property

说明: 校验格式.隐含模型包.属性名

示例:Email.person.email------------person对象的email属性验证Email格式失败

 

格式2 Pattern.property

说明: 校验格式.属性名

示例:Email.email-----------任何对象的email属性验证Email格式失败

 

格式3 Pattern.javaType

说明: 校验格式.字段数据类型

示例:Email.java.lang.String-----------任何String类型的属性验证Email格式失败

 

key4 Pattern

说明: 校验格式

示例:Email-----------校验Email格式失败

 

 

参数转换失败的key规则:

 

格式1 typeMismatch.bean.property

说明: 类型不匹配.隐含模型名.属性名

示例:typeMismatch.person.birthDate-----------person对象的birthDate属性转换失败

 

格式2 typeMismatch.property

说明: 类型不匹配.属性名

示例:typeMismach.birthDate-----------任何对象的birthDate属性转换失败

 

格式3 typeMismatch.javaType

说明: 类型不匹配.字段数据类型

示例:typeMismach.java.util.Date ----------- Java.util.Date类型转换失败

 

格式4 typeMismatch

说明: 类型不匹配

示例:typeMismach-----------字段类型转换失败

5.2、在源码目录下配置错误信息的属性配置文件

SpringMVC详解四、自带标签库及自定义参数转换器_第4张图片

validate.properties属性配置文件的内容如下:

Email.person.email=\u81EA\u5B9A\u4E49-\u90AE\u7BB1\u683C\u5F0F\u4E0D\u5408\u6CD5
NotNull=\u81EA\u5B9A\u4E49-\u503C\u4E0D\u80FD\u4E3A\u7A7A
Length.name=\u81EA\u5B9A\u4E49-\u957F\u5EA6\u5FC5\u987B\u4E3A 5 \u5230 12 \u4F4D
Past=\u81EA\u5B9A\u4E49-\u65F6\u95F4\u5FC5\u987B\u662F\u8FC7\u53BB\u7684\u65F6\u95F4
Max=\u81EA\u5B9A\u4E49-\u503C\u4E0D\u80FD\u5927\u4E8E 100
typeMismatch=\u81EA\u5B9A\u4E49-\u4E0D\u8981\u968F\u4FBF\u8F93\u5165

输入的汉字会立刻转换成16进制(有点小神秘~_`~)

 

占位符的使用:

{0}表示第一个传入的参数。 {0}第一个参数固定是验证的属性名

Length.name=\u81EA\u5B9A\u4E49-\u957F\u5EA6\u5FC5\u987B\u4E3A {0} \u5230 12 \u4F4D
Max=\u81EA\u5B9A\u4E49-\u503C\u4E0D\u80FD\u5927\u4E8E {0}

5.3、在Spring中配置如下:


	
		
	


 SpringMVC详解三、Restful风格及基于Restful的CRUD

Jar包下载


你可能感兴趣的:(SpringMVC)