发表于: 2019-10-17 23:16:51
1 981
今天完成的事:
1、校验参数。
一般校验较多的是前端的校验,比如在页面中js的校验(表单验证),对于安全性较高的则要求在服务端进行校验。
控制层、业务层校验较多,dao层一般不校验。
springmvc使用hibernate的一个校验框架validation。校验思路就是页面提交的参数,请求到controller方法中,使用validation进行校验,若出错,就将错误信息展示在页面。
参考网址:
所需jar包依赖如下。
完成接口校验后,点击进入list页面报错。应该是mvc-dispatcher加载有问题,百度的方向也是这方面的,但是大部分答案都说是jdk版本冲突或缺少jar包,我查看后面的报错信息也都不符合,尝试后果然也是不行。
后来开始搜索ssm使用validator校验的方法,想看下是不是之前查看的实例有问题,看到了之前有疑惑的地方就是,在springmvc.xml文件中将校验器注入处理器适配器中时,如下第二行,conversionService并没有什么说法解释,而且报错信息中也提到了这个,但是另外一个实例中有一个bean的声明,如下第一行,于是添加之后尝试运行,竟然成功了。。
报错信息中最后是这个bean信息,因为是在最后面,查找方法时是先查的前面的错误信息。
这也是给我提了个醒,报错后要好好看看报错信息,像今天这样,就算开始没有查对方向,就因为看到了这个报错信息,在查看下一个实例的时候能够反应过来这里可能有问题,再进行尝试。如果没有看到,这里很可能就忽略过去了。
添加时,没有输入信息,直接提交,提示编写的错误信息,此处进行的长度校验,在实体类中使用注解@Size。
将报错信息改为中文,中文乱码。
springmvc中添加如下代码,即可。
进行非空校验,添加了@NotNull注解,但是无法识别姓名为空的错误,经师兄指点,String类型变量不能使用@NotNull注解,这里选择用@NotEmpty注解,成功识别为空的错误信息。
其中@NotNull、@NotEmpty、@NotBlank的区别,简单说,@NotNull主要用在基本数据类型上(Integer、Double等),@NotBlank主要用在String字符串上,@NotEmpty主要用在集合、数组上,也可以用在String字符串上。
将三个变量都设置了错误信息,错误信息都能显示,但是比较杂乱,而且显示顺序还是随机的。
希望能在各自文本框后面显示相应的错误信息,如下图的效果。具体代码见下文。
参考网址:
只是添加了一个错误信息配置文件,修改了springmvc.xml配置文件、实体类、controller类、添加数据的jsp页面。
springmvc.xml配置文件:
<!-- 校验器 -->
<bean id="validator" class="org.springframework.validation.beanvalidation.LocalValidatorFactoryBean">
<!-- 校验器,使用hibernate校验器 -->
<property name="providerClass" value="org.hibernate.validator.HibernateValidator"/>
<!-- 指定校验使用的资源文件,在文件中配置校验错误信息,如果不指定则默认使用classpath下面的ValidationMessages.properties文件 -->
<property name="validationMessageSource" ref="messageSource"/>
</bean>
<!-- 校验错误信息配置文件 -->
<bean id="messageSource" class="org.springframework.context.support.ReloadableResourceBundleMessageSource">
<!-- 资源文件名,使用basenames,不用加后缀名,此处需注意name不是basename-->
<property name="basenames">
<list>
<value>classpath:CustomValidationMessage</value>
</list>
</property>
<!-- 资源文件编码格式 -->
<property name="fileEncodings" value="UTF-8"/>
<!-- jsp页面编码格式 -->
<property name="defaultEncoding" value="UTF-8"/>
<!-- 对资源文件内容缓存时间,单位秒 -->
<property name="cacheSeconds" value="120"/>
</bean>
<bean id="conversionService" class="org.springframework.context.support.ConversionServiceFactoryBean"></bean>
<!-- 将校验器注入处理适配器中 -->
<mvc:annotation-driven conversion-service="conversionService" validator="validator"></mvc:annotation-driven>
实体类:
private int id;
//校验名称:1-10字符之间
//message提示校验出错显示的信息
@Size(min = 1,max = 10,message = "{items.name.length.error}")
private String name;
//非空校验
@NotNull(message = "{items.qq.isNull}")
private Integer qq;
//非空校验、长度校验:0-10字符之间
@NotEmpty(message = "{items.school.isNull}")
@Size(min = 0,max = 10,message = "{items.school.length.error}")
private String school;
controller类:
//在需校验的pojo前,添加@Validated,在需校验的pojo后添加BindingResult bindingResult接收校验出错信息
//注意!!@Validated和BindingResult bindingResult 是配对出现的,并且在形参里的顺序是固定的(一前一后)
@RequestMapping("/addCategory")
public ModelAndView addCategory(@Validated Category category,BindingResult bindingResult)throws Exception{
ModelAndView mav = new ModelAndView();
//获取校验的错误信息
if(bindingResult.hasErrors()){
//输出错误信息
List<ObjectError> allErrors = bindingResult.getAllErrors();
System.out.println("你说"+allErrors);
//将错误信息传至页面
mav.addObject("allErrors",allErrors);
mav.setViewName("addGo");
//出错则重新至添加页面
return mav;
}
//调用service添加
categoryService.add(category);
mav.setViewName("redirect:/listCategory");
return mav;
}
添加数据的jsp页面:
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8" import="java.util.*"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<div style="width:500px;margin:0px auto;text-align:center">
<div style="text-align:center;margin-top:40px">
<form method="post" action="/addCategory">
名称: <input name="name"type="text">
<br/>
qq: <input name="qq"type="text">
<br/>
学校: <input name="school"type="text">
<br/>
<input type="submit" value="添加">
</form>
<!-- 显示错误信息 -->
<c:if test="${allErrors != null }">
<c:forEach items="${allErrors}" var="error">
<font color="red" >${error.defaultMessage}</font>
</c:forEach>
</c:if>
</div>
</div>
错误信息配置文件CustomValidationMessage.properties:
#配置错误信息
items.name.length.error=姓名长度错误
items.school.isNull=学校为空
items.qq.isNull=qq为空
items.school.length.error=学校长度错误
效果:
在上述代码基础上修改,代码修改如下:
controller类:
//在需要校验的pojo前,添加@Validated,在需要校验的pojo后添加BindingResult bindingResult接收校验出错信息
//注意!!@Validated和BindingResult bindingResult 是配对出现的,并且在形参里的顺序是固定的(一前一后)
@RequestMapping("/addCategory")
public ModelAndView addCategory(@Validated @ModelAttribute("category") Category category,BindingResult bindingResult){
ModelAndView mav = new ModelAndView();
//获取校验的错误信息
if(bindingResult.hasErrors()){
/* 删除下述代码:
//输出错误信息
List<ObjectError> allErrors = bindingResult.getAllErrors();
System.out.println("你说"+allErrors);
//将错误信息传至页面
mav.addObject("allErrors",allErrors);
*/
mav.setViewName("addGo");
//出错则重新至添加页面
return mav;
}
//调用service添加
categoryService.add(category);
mav.setViewName("redirect:/listCategory");
return mav;
}
数据添加的jsp页面(几乎全改动):
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8" import="java.util.*"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<%@taglib prefix="sf" uri="http://www.springframework.org/tags/form"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<%--
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
--%>
<title>Insert title here</title>
</head>
<body>
<sf:form action="/addCategory" method="post" modelAttribute="category">
<table>
<TR>
<td>姓名:</td>
<td>
<INPUT name="name" value="${category.name}"> <sf:errors path="name" cssStyle="color:red"></sf:errors>
</td>
</TR>
<TR>
<td>qq:</td>
<td>
<INPUT name="qq" value="${category.qq}"> <sf:errors path="qq" cssStyle="color:red"></sf:errors>
</td>
</TR>
<TR>
<td>学校:</td>
<td>
<INPUT name="school" value="${category.school}"> <sf:errors path="school" cssStyle="color:red"></sf:errors>
</td>
</TR>
<tr>
<td>
<INPUT input type="submit" value="添加">
</td>
</tr>
</sf:form>
</table>
</body>
</html>
2、查看国际化配置。
之前看的实例是整体的web项目根据语言选择进行国际化配置,各种名词老长了,看着头晕。最后才了解,上面进行参数校验时就已经在springmvc.xml中添加了国际化配置了,所谓的国际化配置进行校验,其实就是使用配置文件进行错误信息的展示,根据各种语言进行各个配置文件的编写、引用。而真实的使用validator进行参数校验,都是在实体类中变量注解里message中直接编写错误信息,这样的话修改很麻烦,耦合度大,使用国际化配置文件的形式可以解耦。
明天计划的事:
1、国际化配置再了解下实现过程。
2、配置Nginx,完成任务二。
遇到的问题:
1、国际化配置的实现流程还有有些迷惑,任务拖了很久,这里先放一放,留待任务三研究。
收获:
1、使用validator校验参数,添加message错误信息实现国际化配置。
2、简单了解国际化配置。
评论