数据校验,异常处理,拦截器

本文深入探讨SpringMVC框架的高级功能,包括数据校验、分组校验、数据回显、异常处理及拦截器的实现与配置,提供详细的步骤与代码示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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>
     
 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值