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

1SpringMVC标签库

2、自定义参数转换器WebDataBinder

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

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

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


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配置文件:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context"
	xmlns:mvc="http://www.springframework.org/schema/mvc"
	xsi:schemaLocation="http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-4.0.xsd
		http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
		http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.0.xsd">

	<context:component-scan base-package="com.tcent"></context:component-scan>
	<bean
		class="org.springframework.web.servlet.view.InternalResourceViewResolver">
		<property name="prefix" value="/jsp/"></property>
		<property name="suffix" value=".jsp"></property>
	</bean>
	<mvc:annotation-driven></mvc:annotation-driven>
	<mvc:default-servlet-handler />

</beans>

web.xml中的配置内容:

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xmlns="http://java.sun.com/xml/ns/javaee"
	xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
	id="WebApp_ID" version="2.5">
	<display-name>tag</display-name>
	
	<!-- 解决中文乱码的filter -->
	<filter>
		<filter-name>CharacterEncodingFilter</filter-name>
		<filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
		<init-param>
			<param-name>encoding</param-name>
			<param-value>UTF-8</param-value>
		</init-param>
		<init-param>
			<param-name>forceEncoding</param-name>
			<param-value>true</param-value>
		</init-param>
	</filter>
	<filter-mapping>
		<filter-name>CharacterEncodingFilter</filter-name>
		<url-pattern>/*</url-pattern>
	</filter-mapping>
	<!-- 支持restful风格的filter -->
	<filter>
		<filter-name>HiddenHttpMethodFilter</filter-name>
		<filter-class>org.springframework.web.filter.HiddenHttpMethodFilter</filter-class>
	</filter>
	<filter-mapping>
		<filter-name>HiddenHttpMethodFilter</filter-name>
		<url-pattern>/*</url-pattern>
	</filter-mapping>
	
	
	<!-- The front controller of this Spring Web application, responsible for handling all application requests -->
	<servlet>
		<servlet-name>springDispatcherServlet</servlet-name>
		<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
		<init-param>
			<param-name>contextConfigLocation</param-name>
			<param-value>classpath:springmvc.xml</param-value>
		</init-param>
		<load-on-startup>1</load-on-startup>
	</servlet>

	<!-- Map all requests to the DispatcherServlet for handling -->
	<servlet-mapping>
		<servlet-name>springDispatcherServlet</servlet-name>
		<url-pattern>/</url-pattern>
	</servlet-mapping>
	
	<welcome-file-list>
		<welcome-file>index.html</welcome-file>
		<welcome-file>index.htm</welcome-file>
		<welcome-file>index.jsp</welcome-file>
		<welcome-file>default.html</welcome-file>
		<welcome-file>default.htm</welcome-file>
		<welcome-file>default.jsp</welcome-file>
	</welcome-file-list>
</web-app>

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页面:

<body>
		<!-- 
			springMVC的标签form标签可以关联Request域中bean对象
			我们在隐含模型中保存的key值。也一定要跟form:form标签中的modelAttribute值对应上。
		 -->
		这里是添加用户页面
		<form:form action="${ pageContext.request.contextPath }/addPerson" method="delete" 
			modelAttribute="person">
		name:<form:input path="name"/><br/>
<%-- 		birthDate:<form:input path="birthDate"/><br/> --%>
		email:<form:input path="email"/><br/>
		salary:<form:input path="salary"/><br/>	
		<input type="submit" />		
		</form:form>
	</body>

4、创建PersonController控制器

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

@Controller
public class PersonController {

	@RequestMapping(value = "/toAddPerson")
	public String toAddPerson(Map<String, Object> map) {
		System.out.println("经过toAddPerson方法");
		// 隐含模型中必须要有一个form标签对应的pojo对象
		map.put("person", new Person(12, "wzg168", null, "wzg168@qq.com",
				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的关系。



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

然后注入到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<String, Date> {
	// 字符串和日期类型相互转换的工具类
	private static SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
	/**
	 * convert就是转换器工作时调用的转换方法<br/>
	 * 参数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配置文件中做如下的配置:

<!-- 配置FormattingConversionServiceFactoryBean去创建ConversionService组件,用于类型转换 -->
	<bean id="conversionService" class="org.springframework.format.support.FormattingConversionServiceFactoryBean">
		<!-- 将自己定义的各种Converter转换器。注入到ConversionService中 -->
		<property name="converters">
			<set>
				<bean class="com.tcent.converter.MyStringToDateConverter" />
			</set>
		</property>
	</bean>
	
	<!-- 静态资源的支持 -->
	<mvc:default-servlet-handler/>
	<!-- springmvc注解驱动 -->
	<mvc:annotation-driven conversion-service="conversionService"></mvc:annotation-driven>

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

<mvc:annotation-driven conversion-service="conversionService"></mvc:annotation-driven>

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


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值<br/>
	 * @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对象的数据<br/>
	 * 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="字段名" />输出对应字段的错误信息

<body>
		<!-- 
			springMVC的标签form标签可以关联Request域中bean对象
			我们在隐含模型中保存的key值。也一定要跟form:form标签中的modelAttribute值对应上。
		 -->
		这里是添加用户页面
		<form:form action="${ pageContext.request.contextPath }/addPerson" method="delete" 
			modelAttribute="person">
		name:<form:input path="name"/><form:errors path="name" /><br/>
		birthDate:<form:input path="birthDate"/><form:errors path="birthDate" /><br/>
		email:<form:input path="email"/><form:errors path="email" /><br/>
		salary:<form:input path="salary"/><form:errors path="salary" /><br/>	
		<input type="submit" />		
		</form:form>
	</body>

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、在源码目录下配置错误信息的属性配置文件


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中配置如下:

<!-- 告诉Spring容器,去加载自定义的错误信息 -->
	<bean id="messageSource" class="org.springframework.context.support.ResourceBundleMessageSource">
		<property name="basename" value="validate" />
	</bean>


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

Jar包下载


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值