导入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
public class Person {
private Integer id;
private String name;
private Date birthDate;
private String email;
private BigDecimal salary;
springMVC的标签form标签可以关联Request域中bean对象
method="delete" 此时的method有crud的restful风格,可以增删改查
addPerson.jsp页面:
这里是添加用户页面
name:
<%-- birthDate:
--%>
email:
salary:
隐含模型中必须要有一个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";
}
}
在SpringMVC中有WebDataBinder类。这个类专门用来负责将请求参数类型转换。以及请求参数数据验证,错误信息绑定等功能。
在WebDataBinder类中有三个组件分别处理三种不同的功能。
(1)、conversionService 负责处理参数类型转换。把请求的参数转换成为Controller中的方法参数值。
converters接口:在ConversionService组件中需要各种类型转换器,在conversionService组件中需要依赖于各种转换器类去实现转换工作。
(2)、validators 负责验证传入的参数值是否合法。
(3)、bindingResult 负责接收验证后的错误信息。
下图展示了WebDataBinder、ConversionService、Converter的关系。
如果我们要自定义请求参数的类型转换器。需要实现org.springframework.core.convert.converter.Converter接口。
然后注入到ConversionService组件中。最后再将ConversionService注入到WebDataBinder中。创建ConversionService组件,需要配置:
org.springframework.format.support.FormattingConversionServiceFactoryBean对象。
方法一:String到java.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的注解驱动
方法二:String到java.util.Date转换
我们也可以像上面。在类的Date类型的属性上标上注解。就可以自动将String类型转换成为Date数据
pattern属性表示 日期的格式。最完成的格式是:yyyy-MM-dd hh:mm:ss
yyyy表示年份必须是4位
MM 表示月份必须是2位
dd 表示日期必须是2位
hh 表示小时,必须是2位
mm 表示分钟,必须是2位
ss 表示秒钟,必须是2位
在JavaEE6.0中,定义了很多的验证规范。这些规范统称为:JSR303验证规范。
而这些规范的实现。我们使用现在业内比较认可的Hibernate-Validate验证
@AssertTrue |
用于boolean字段,该字段只能为true |
@AssertFalse |
该字段的值只能为false |
@CreditCardNumber |
对信用卡号进行一个大致的验证 |
@DecimalMax |
只能小于或等于该值 |
@DecimalMin |
只能大于或等于该值 |
@Digits(integer=,fraction=) |
检查是否是一种数字的整数、分数,小数位数的数字 |
检查是否是一个有效的email地址 |
|
@Future |
检查该字段的日期是否是属于将来的日期 |
@Length(min=,max=) |
检查所属的字段的长度是否在min和max之间,只能用于字符串 |
@Max |
该字段的值只能小于或等于该值 |
@Min |
该字段的值只能大于或等于该值 |
@NotNull |
不能为null |
@NotBlank |
不能为空,检查时会将空格忽略 |
@NotEmpty |
不能为空,这里的空是指空字符串 |
@Null |
检查该字段为空 |
@Past |
检查该字段的日期是在过去 |
@Pattern(regex=,flag=) |
被注释的元素必须符合指定的正则表达式 |
@Range(min=,max=,message=) |
被注释的元素必须在合适的范围内 |
@Size(min=, max=) |
检查该字段的size是否在min和max之间,可以是字符串、数组、集合、Map等 |
@URL(protocol=,host,port) |
检查是否是一个有效的URL,如果提供了protocol,host等,则该URL还需满足提供的条件 |
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、在SpringMVC的form表单字段后,使用<form:errors path="字段名" />输出对应字段的错误信息
这里是添加用户页面
name:
birthDate:
email:
salary:
这是校验错误的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-----------字段类型转换失败
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}
Jar包下载