1.数据校验
springmvc数据校验步骤
pom.xml导入校验jar文件
配置校验器
校验器注入到处理器适配器中
添加校验规则
错误信息文件
捕获错误信息
显示错误信息
2.分组校验
pojo被多个controller供用,而controller类校验规则不相同,这时候采用分组校验,
使之适应不同controler类的校验规则。
@validated支持分组
所谓分组:需要定义接口
(1)创建不同接口(规则个数对应接口个数)
public interface GV1 {}
public interface GV2 {}
(2)pojo类成员属性上,指定分组
@Size(min=1,max=20,message="{items.name.length.error}",groups={GV1.class})
private String name;
@NotNull(message="{items.createtime.isNULL}",groups={GV2.class})
private Date createtime;
(3)控制类controller中方法参数 @Validated指定分组
public String doXXX(Model model,
@Validated(value=GV2.class) ItemsCustom itemsCustom, BindingResult bindingResult) {
if(bindingResult.hasErrors()){
List<ObjectError> allErrors = bindingResult.getAllErrors();
for(ObjectError objectError:allErrors) {
System.out.println(objectError.getDefaultMessage());
}
model.addAttribute("err_msg", allErrors);
}
//页面上显示错误信息 使用属性defaultMessage
<c:if test="${err_msg !=null }">
<c:forEach items="${err_msg }" var="error">
<font color="red"> ${error.defaultMessage } </font><br>
</c:forEach>
</c:if>
2.数据回显:
定义:页面请求控制类时,传递的数据,会经过控制类返回数据到页面进行显示,称之为回显
(1)
springmvc默认支持数据回显,存放在request请求中
显示时通过el表达式pojo类的首字母小写获取 ${userInfo} ${userInfo.username}
(2)
获取pojo对象的名字和 pojo类的首字母小写不一致,在控制类的参数上@modelAttribute修饰
public String registerUser(@ModelAttribute("user") UserInfo user){
。。。。。
}
${user }
(3)也可以
request.setAttribute(key,value)
model.addAttribute(key,value)
3.异常处理
springmvc通过异常处理器,对请求过程中的控制层,业务层,模型层中的异常进行捕获并处理。
步骤
(1)定义自定义异常类
(2)定义异常处理器
(3)配置异常处理器
//需求:登录失败异常处理
login.jsp用户登录:
<form action="${pageContext.request.contextPath}/UserLogin" method="post">
用户名 <input type="text" name="username" value="${userInfo.username }">
密码 <input type="text" name="password" value="${userInfo.password }">
<input type="submit" value="登录">
</form>
(1)自定义异常类
public class MyException extends Exception{
private String message;
//get set
public MyException(String message){
super(message);
this.message=message;
}
//记录异常信息
public void writeLog(){
System.out.println("该异常"+message+"正在写入日志中....");
}
}
(2)控制类中
@RequestMapping(value="/UserLogin",method={RequestMethod.POST})
public String login(String username,String password) throws MyException{
//查询数据库,没有匹配的用户,发生异常
if(!"admin".equals(username)||!"123".equals(password)){
throw new MyException("登录失败!!!");
}else{
return "index";
}
}
定义异常处理器
@ExceptionHandler(value={MyException.class})
public String doMyExce(Model model,MyException ex){
ex.writeLog();
model.addAttribute("err_msg", ex.getMessage());
return "failure";
}
//作用域是某control类中
全局的异常处理
action中同上(但是不需要@ExceptionHandler处理器)
在springmvcConfig.xml中
<bean id="exceptionResover" class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver">
<property name="exceptionMappings">
<props>
<prop key="com.edu.exception.MyException">failure</prop> //failure,failure_01,failure_02为视图逻辑
<prop key="java.lang.Exception">failure_01</prop>
<prop key="java.lang.Throwable">failure_02</prop>
</props>
</property>
</bean>
页面中${exception.message }取值
4.拦截器
(1)实现HandlerInterceptor接口
public class MyInteruptor implements HandlerInterceptor{
//预处理:调用控制类方法之前执行 ,返回值是false拦截,true放行(身份认证和权限设置)
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
throws Exception {
System.out.println("预处理--------------");
return true;
}
//调用控制类方法之后,渲染视图之前执行:公用数据(菜单导航)传入视图层
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,
@Nullable ModelAndView modelAndView) throws Exception {
System.out.println("渲染视图前--------------");
}
//控制类方法完全执行之后,异常处理,日志记录
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler,
@Nullable Exception ex) throws Exception {
System.out.println("----end----------");
}
}
(2)配置拦截器
<mvc:interceptors>
<mvc:interceptor>
<!-- <mvc:mapping path="/addUser"/> -->
<mvc:mapping path="/**"/> <!--所有url包以及子包 -->
<mvc:exclude-mapping path="/**/images/**"/>
<mvc:exclude-mapping path="/**/fonts/**"/>
<bean class="com.edu.interceptor.MyInteruptor"></bean>
</mvc:interceptor>
</mvc:interceptors>
===应用 ://验证用户是否登录,没有登录跳转到登录
public class SessionInteruptor implements HandlerInterceptor{
//预处理:调用控制类方法之前执行 ,返回值是false拦截,true放行(身份认证和权限设置)
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
throws Exception {
//获取请求地址 :登录页提交处理需要放行,其他做session验证
String url=request.getRequestURI();
System.out.println(url);
if(url.endsWith("UserLogin")){
return true;
}else{
HttpSession session=request.getSession();
if(session.getAttribute("user")!=null){
return true;
}else{
request.setAttribute("msg", "请登录");
request.getRequestDispatcher("login.jsp").forward(request, response);
return false;
}
}
}
}
配置
<mvc:interceptors>
<mvc:interceptor>
<!-- <mvc:mapping path="/addUser"/> -->
<mvc:mapping path="/**"/> <!--所有url包以及子包 -->
<mvc:exclude-mapping path="/**/images/**"/>
<mvc:exclude-mapping path="/**/fonts/**"/>
<bean class="com.edu.interceptor.MyInteruptor"></bean>
</mvc:interceptor>
<mvc:interceptor>
<!-- <mvc:mapping path="/addUser"/> -->
<mvc:mapping path="/**"/> <!--所有url包以及子包 -->
<mvc:exclude-mapping path="/**/images/**"/>
<mvc:exclude-mapping path="/**/fonts/**"/>
<bean class="com.edu.interceptor.SessionInteruptor"></bean>
</mvc:interceptor>
</mvc:interceptors>