荐 SpringMVC进行数据格式化以及数据校验
一. 数据格式化
数据格式也属于类型转换的范畴,Spring在格式化模块中定义了一个实现ConversionService接口的FormattingConversionService实现类,该实现了即有类型转换的功能,也有格式化的功能,这个实现了拥有一个工厂FormattingConversionServiceFactoryBean工厂类,该工厂类就是用于Spring中构造FormattingConversionService实现类的。该工厂类中已经在内部注册了:
- @NumberFormat注解,用于进行数字类型的格式化
- @DateFormat注解,用来进行日期类型的格式化
范例:Emp(员工实体类)中加入工资和生日属性,需要对工资和生日进行格式化
①:Emp中加入salary和birthday属性,并且制定格式化类型
@NumberFormat(pattern="#,###,###,###.#")
private Double salary;
@DateTimeFormat(pattern="yyyy-MM-dd")
private Date birthday;
②:配置
<!--
mvc:annotation-driven : 是万能的注解驱动
conversion-service : 配置SpringMVC上下文中中的类型转换器
- 不配置:使用默认的
- 配置:默认的+配置的
-->
<mvc:annotation-driven conversion-service="conversionService"></mvc:annotation-driven>
<bean id="empConverter" class="com.wanbangee.util.EmpConverter"></bean>
<!-- 配置ConversionFactoryBean 的 converters 属性 -->
<bean id="conversionService" class="org.springframework.format.support.FormattingConversionServiceFactoryBean">
<property name="converters">
<set>
<ref bean="empConverter"/>
</set>
</property>
</bean>
③:修改表单,进行测试
<f:form modelAttribute="emp" method="post">
<c:if test="${emp.empId != null}"> <!-- 修改 -->
<f:hidden path="empId"/>
<input type="hidden" name="_method" value="put">
</c:if>
<c:if test="${emp.empId == null}"> <!-- 新增 -->
EMPNAME:<f:input path="empName"/>
<br>
</c:if>
EMPMAIL:<f:input path="empMail"/>
<br>
EMPGENDER:<f:radiobuttons path="empGender" items="${genders}" />
<br>
DEPTNAME:<f:select path="deptId" items="${depts}" itemLabel="deptName" itemValue="deptId"></f:select>
<br>
SALARY:<f:input path="salary"/>
<br>
BIRTHDAY:<f:input path="birthday"/>
<br>
<f:button>Submit</f:button>
现在数据格式化是成功的,如果失败,我们知道,失败的信息都会绑定到BindingResult中,BindingResult对象可以作为处理器目标方法的入参。
@RequestMapping(value="emp",method=RequestMethod.POST)
public String insertEmp(Emp emp,BindingResult result) {
System.out.println(emp);
//this.empManagerSerivce.insertEmp(emp);
if(result.getErrorCount() > 0) { //如果错误数量大于0
List<FieldError > errors = result.getFieldErrors();//获取所有的错误信息
for (FieldError error : errors) {
System.out.println(error.getField() +"-----"+error.getDefaultMessage());
}
}
return "redirect:/emps";
}
二. 数据校验
JSR303是Java为bean数据合法性校验提供的标准的框架,已经包含在JavaEE6.0中,JSR303是通过在Bean的属性上面注解类似于@NULL,@NOTNULL,@MAX等标准的注解指定校验规则,并通过标准的接口对bean的属性进行验证,注解有:
序号 | 注解 | 说明 |
---|---|---|
1 | @Null | 被注解的属性必须为NULL |
2 | @NotNull | 被注解的属性必须不能为空 |
3 | @Past | 必须是一个过去的日期 |
4 | @Future | 必须是一个将来的日期 |
5 | @Pattern | 必须满足指定的正则规则 |
6 | @Max | 不能大于指定的最大值 |
7 | @Min | 不能小于指定的最小值 |
Hibernate Validator扩展注解,是JSR303的一个参考的实现,并且除了支持基本的校验注解外,还进行了扩展:
- @Email:必须符合电子邮箱格式
- @Length:字符串长度必须在指定范围内
- @NotEmpty:必须非空
- @Range:必须在指定的返回内
需要加入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
测试:
@NotEmpty
private String empName;
@Email
private String empMail;
private Integer empGender;
private Integer deptId;
private Dept dept;
@Range(1000,10000)
@NumberFormat(pattern="#,###,###,###.#")
private Double salary;
@Past
@DateTimeFormat(pattern="yyyy-MM-dd")
private Date birthday;
前端处理器的请求目标方法:
@RequestMapping(value="emp",method=RequestMethod.POST)
public String insertEmp(@Valid Emp emp,BindingResult result) { //@Valid用来数据校验
if(result.getErrorCount() > 0) { //如果错误数量大于0
List<FieldError > errors = result.getFieldErrors();//获取所有的错误信息
for (FieldError error : errors) {
System.out.println(error.getField() +"-----"+error.getDefaultMessage());
}
}
return "redirect:/emps";
}
本文地址:https://blog.csdn.net/codeliang20/article/details/107369599