精华内容
下载资源
问答
  • 9.全局异常拦截器 全局异常拦截器可以拦截程序中出现的已知异常(主动声明的异常)和未知异常。关于异常拦截,建立一个全局异常拦截器,对程序中所有异常进行分类拦截,并友好的返回异常信息,有利于提高程序的健壮性...

    9.全局异常拦截器

    全局异常拦截器可以拦截程序中出现的已知异常(主动声明的异常)和未知异常。关于异常拦截,建立一个全局异常拦截器,对程序中所有异常进行分类拦截,并友好的返回异常信息,有利于提高程序的健壮性。

    构建全局异常拦截器:Throwable异常的顶级父类
    1. 添加@ControllerAdvice注解,拦截所有的含有@RequestMapping注解的方法。
    2. @ExceptionHandler(XxxException.class) 声明拦截的异常类型。
    3. @ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR) 声明遇到此异常时响应的状态码。
    例:拦截业务异常
    @ExceptionHandler(BussinessException.class)
    @ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR)
    @ResponseBody
    public ErrorTip notFount(BussinessException e) {
        LogManager.me().executeLog(LogTaskFactory.exceptionLog(ShiroKit.getUser().getId(), e));
        getRequest().setAttribute("tip", e.getMessage());
        log.error("业务异常:", e);
        //这里的ErrorTip类为 code + message 形式的自定义响应体结构。
        return new ErrorTip(e.getCode(), e.getMessage());
    }
    当拦截未知异常的时候,可以将@ExceptionHandler(Throwable.class)中的异常类型设置为Throwable。
    

    10.代码生成器

    业务场景:开发新业务的时候,减少重复代码的编写,利用代码生成器构建业务框架模板。

    Guns框架中的代码生成器是如何实现的?

    原理:模板 + 变量 = 代码
    设计方面分三块:config + engine + template
    config:配置方面,定义全局配置,针对不同模板类型进行相关配置。
        ContextConfig:全局基础配置
        ControllerConfig:Controller模板配置
        ServiceConfig:Service模板配置
        DaoConfig:DAO模板配置
        PageConfig:页面模板配置
    engine:模板引擎,初始化config的相关配置,结合template进行代码生成。
        AbstractTemplateEngine:抽象模板引擎父类
        GunsTemplateEngine:Guns模板引擎
        SimpleTemplateEngine:模板引擎具体实现类 -- 通用
    template:采用beetl模板引擎进行模板页面的构造。
        XxxController.java.btl
    标记一点:模板设计模式,在GunsTemplateEngine中定义逻辑骨架,将实现步骤推迟到子类SimpleTemplateEngine中去完成。
    

    骨架实现:这里只说明GunsTemplateEngine模板引擎中的重要方法。

    protected GroupTemplate groupTemplate; //引入Beetl的组模板生成对象
    
    //config的配置加入模板引擎 binding表明将config绑定模板页面中的变量,类比model.addAttribute()。
    public void configTemplate(Template template){
        template.binding("controller", super.getControllerConfig());
        template.binding("context", super.getContextConfig());
        template.binding("dao", super.getDaoConfig());
        template.binding("service", super.getServiceConfig());
    }
    
    //重点:生成文件方法 template是模板页面路径,filePath是生成文件路径 -- 自定义
    public void generateFile(String template,String filePath){
        Template pageTemplate = groupTemplate.getTemplate(template);
        configTemplate(pageTemplate);
        //路径分隔符配置 基于不同平台系统
        if(PlatformUtil.isWindows()){
            filePath = filePath.replaceAll("/+|\\\\+","\\\\");
        }else{
            filePath = filePath.replaceAll("/+|\\\\+","/");
        }
        //生成文件目录
        File file = new File(filePath);
        File parentFile = file.getParentFile();
        if(!parentFile.exists()){
            parentFile.mkdirs();
        }
        try {
            //渲染出生成文件
            pageTemplate.renderTo(new FileOutputStream(file));
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        }
    } 
    
    //上述提到的模板设计模式,在此处得以应用,实现交给子类SimpleTemplateEngine去完成。
    protected abstract void generatePageEditHtml();
    protected abstract void generatePageAddHtml();
    protected abstract void generatePageInfoJs();
    protected abstract void generatePageJs();
    protected abstract void generatePageHtml();
    protected abstract void generateController();
    protected abstract void generateDao();
    protected abstract void generateService();
    

    具体实现:SimpleTemplateEngine具体模板引擎实现类。

    public class SimpleTemplateEngine extends GunsTemplateEngine {
    
        @Override
        protected void generatePageEditHtml() {
            String path = ToolUtil.format(super.getContextConfig().getProjectPath() + getPageConfig().getPageEditPathTemplate(),
                    super.getContextConfig().getBizEnName(),super.getContextConfig().getBizEnName());
            //核心代码:template为模板页面路径,path为自定义文件生成路径。
            generateFile("gunsTemplate/page_edit.html.btl", path);
            System.out.println("生成编辑页面成功!");
        }
    }
    

    这里需要说明path的处理方式:

    1. ToolUtil.format 格式化文本
        public static String format(String template, Object... values) {
            return StrKit.format(template, values);
        }
        调用了StrKit.format的静态方法,template为预设路径,values为需要替换预设路径中占位符的字符串集合。
        例:StrKit.format("aaa {} ccc","bbb") 格式化后为:"aaa bbb ccc" 
        进入super.getContextConfig().getProjectPath() + getPageConfig().getPageEditPathTemplate()模板预设路径中:
        pageEditPathTemplate = "\\src\\main\\webapp\\WEB-INF\\view\\" + contextConfig.getModuleName() + "\\{}\\{}_edit.html";
        可以看到模板预设路径中含有{}占位符,因此,方法的第二个参数就是自定义的填充占位符的字符集。
        经过填充占位符之后,拼接成自定义的文件生成路径作为generateFile的path。
    2.  ContextConfig 设置自定义的填充占位符字符集,即对全局配置ContextConfig成员变量进行赋值。
        这部分可以自定义,字符集中主要包括:模块名 + 业务名 + ...
    

    开启模板引擎,进行代码生成:

    GunsTemplateEngine gunsTemplateEngine = new SimpleTemplateEngine();
    //导入全局配置信息
    gunsTemplateEngine.setContextConfig(contextConfig);
    //代码生成器启动
    gunsTemplateEngine.start();
    

    start()方法:开启生成器进行代码生成。

    //生成器开始方法
    public void start() {
        //配置之间的相互依赖
        super.initConfig();
    
        //生成模板 -- 判断各项配置开关是否开启,开启后进行生成 -- 实现交给子类去完成
        if(super.contextConfig.getControllerSwitch()){
            generateController();
        }
        if(super.contextConfig.getIndexPageSwitch()){
            generatePageHtml();
        }
        if(super.contextConfig.getAddPageSwitch()){
            generatePageAddHtml();
        }
        if(super.contextConfig.getEditPageSwitch()){
            generatePageEditHtml();
        }
        if(super.contextConfig.getJsSwitch()){
            generatePageJs();
        }
        if(super.contextConfig.getInfoJsSwitch()){
            generatePageInfoJs();
        }
        if(super.contextConfig.getDaoSwitch()){
            generateDao();
        }
        if(super.contextConfig.getServiceSwitch()){
            generateService();
        }
    
    }
    
    展开全文
  • Spring 异常拦截器

    2019-09-28 17:00:19
    搭建环境 异常 拦截器 两个拦截器 搭建环境 在web.xml文件中配置 前端控制器 初始化 SpringConfig.xml配置文件 配置过滤器使请求为utf-8 前端控制器 <servlet> <servlet-name>dispatcherServl...

      搭建环境          异常             拦截器         两个拦截器

    搭建环境

    在web.xml文件中 配置     前端控制器     初始化 SpringConfig.xml 配置文件        配置过滤器 使请求为utf-8

     前端控制器
      <servlet>
        <servlet-name>dispatcherServlet</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <init-param>
          <param-name>contextConfigLocation</param-name>
          <param-value>classpath:springmvc.xml</param-value>
        </init-param>
        <load-on-startup>1</load-on-startup>
      </servlet>
      <servlet-mapping>
        <servlet-name>dispatcherServlet</servlet-name>
        <url-pattern>/</url-pattern>
      </servlet-mapping>
      配置过滤器
      <filter>
        <filter-name>characterEncodingFilter</filter-name>
        <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
        <init-param>
          <param-name>encoding</param-name>
          <param-value>UTf-8</param-value>
        </init-param>
      </filter>
      <filter-mapping>
        <filter-name>characterEncodingFilter</filter-name>
        <url-pattern>/*</url-pattern>
      </filter-mapping>

     在SpringConfig.xml  中  开启注解扫描   开启视图解析器 让方法返回字符串时能解析地址    配置前端控制器 不拦截 js资源

     开启注解扫描
        <context:component-scan base-package="com.wyc"/>
    
        视图解析器
        <bean id="internalResourceViewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
            <property name="prefix" value="/WEB-INF/pages/"/>
            <property name="suffix" value=".jsp"/>
        </bean>
    
        前端控制器,哪些资源不拦截
        <mvc:resources mapping="/js/" location="/js/**"></mvc:resources>
    
        开启注解  springmvc注解支持
        <mvc:annotation-driven></mvc:annotation-driven>

    异常

    当服务器出现异常时  异常最终都被从 Dao 到service 到web 到前端控制器 再抛到 前端控制器 再抛到浏览器

     我们可以在  前端控制器 编写一个 异常处理器  处理异常后再返回给 浏览器

      1.编写自定义异常类

    public class SysException extends Exception {
        
        存储异常信息
        private String msg;
        public SysException(String msg) {
            this.msg = msg;
        }  get set 方法...}

      2.编写异常处理器 

    public class SysExceptionResolver implements HandlerExceptionResolver {
    
        @Override      处理异常逻辑
        public ModelAndView resolveException(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, Exception e) {
            SysException exception= null;
            if (e instanceof SysException){     如果是 自己写的异常  强转为自己的异常
                exception = (SysException)e;
            }else {               如果不是  new 一个自己的异常
                exception = new SysException("系统正在维护@");
    
            }
            ModelAndView mv = new ModelAndView();
            mv.addObject("errorMsg",exception.getMsg());
            mv.setViewName("error");   跳转到 error页面
            return mv;
        }}
    

    3.配置异常处理器   在SpringConfig.xml中配置   注册异常处理器

        配置异常处理器
        <bean id="sysExceptionResolver" class="com.wyc.exception.SysExceptionResolver"></bean>

    拦截器

    1.编写拦截器

        public class Interceptor1 implements HandlerInterceptor {
        @Override
        public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
            System.out.println("拦截器--先--11111");
            return true;
        }
    
        @Override
        public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
            System.out.println("拦截器-返回响应前---11111");
        }
    
        @Override
        public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
            System.out.println("拦截器-返回响应后---1111");
        }
    }
    

     必须实现HandlerInterceptor 接口   

       1.  preHandle 预处理在前端控制器执行  return true 表示放行       2.postHandle在前端控制器返回响应前执行  可设置response

       3.afterCompletion在给完响应后执行  一般用于释放资源  

    2.配置/注册  拦截器

       /user/**  表示user/下的所有请求拦截             /user/*   user/下的一级目录拦截            

        配置多个拦截器
        <mvc:interceptors>
            <mvc:interceptor>     第一个拦截器
                <mvc:mapping path="/user/*"/>         要拦截的方法
                <!--<mvc:exclude-mapping path=""/>-->     <!--不拦截的方法-->
                配置拦截器对象
                <bean class="com.wyc.interceptors.Interceptor1"></bean>
            </mvc:interceptor>
        </mvc:interceptors>

      执行结果

    <a href="/user/test1">hahah</a>           index页面
    <%System.out.println("响应的页面");%>      sucess页面
    
    拦截器--先--11111
    test1执行了...                前端控制器
    拦截器-返回响应前---11111
    响应的页面
    拦截器-返回响应后---1111

       不放行  只会执行preHandle    后面的所有都不会执行 可以使用

        @Override
        public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
            System.out.println("拦截器--先--11111");
            request.getRequestDispatcher("/WEB-INF/pages/error.jsp").forward(request,response);
            return false;    }

        在postHandle中跳转时   

        @Override
        public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
            request.getRequestDispatcher("/WEB-INF/pages/error.jsp").forward(request,response);
            System.out.println("拦截器-返回响应前---11111");
        }

        响应会先跳转到    前端控制器  的响应页面    但是又因为响应前跳转 所以最后 跳转到  error页面

    拦截器--先--11111
    test1执行了...                 前端控制器
    拦截器-返回响应前---11111
    响应的页面
    拦截器-返回响应后---1111
    

     两个拦截器执行循序

        配置拦截器
        <mvc:interceptors>
            <mvc:interceptor>     第一个拦截器
                <mvc:mapping path="/user/*"/>                    要拦截的方法
    
                <!--配置拦截器对象-->
                <bean class="com.wyc.interceptors.Interceptor1"></bean>
            </mvc:interceptor>
            <mvc:interceptor>     第二个拦截器
                <mvc:mapping path="/user/*"/>                    要拦截的方法
    
                配置拦截器对象
                <bean class="com.wyc.interceptors.Interceptor2"></bean>
            </mvc:interceptor>
        </mvc:interceptors>
    拦截器--先--11111
    拦截器--先--2222
    test1执行了...
    拦截器--返回响应前---2222
    拦截器--返回响应后---2222
    拦截器-返回响应后---1111

     

     

     

    展开全文
  • JSR303参数检验实例:校验手机号和密码字段 自定义注解 image.png 指定校验器 ...为了让客户端显示更加友好,需要自定义异常拦截器 对于此实例,只需要拦截绑定异常并...

    JSR303参数检验实例:校验手机号和密码字段

    img_b0ca5871b50686441aabd37fafa94b0d.png
    img_9ca86755b3c051f236cfda7193f063e3.png

    自定义注解

    img_c7099354d2828858b25caecd6a5b55e3.png
    image.png

    指定校验器


    img_dbb93252d7f73b8a348e24422bda9dff.png

    指定校验器的实现


    img_ee979e89da7aa2a30070c5cc75692e0f.png

    实际返回效果显示
    img_f41a5f6ee10837ec53b0776cc79a4be0.png
    image.png

    为了让客户端显示更加友好,需要自定义异常拦截器

    对于此实例,只需要拦截绑定异常并输出相关信息即可


    img_c9343b08573eda46896e9c03bebacf0a.png
    自定义的绑定异常处理器
    img_60521d42c13e6bda4e606a8d0f4c79a6.png
    效果显示

    如此一来,controller类的方法就不需要先进行参数校验代码编写了

    展开全文
  • 先新建包,com.itcast.controller,然后把异常拦截的项目的UserController复制过来。 复制过来稍作修改 ...创建pages文件件,然后新建...编写拦截器需要的步骤 转载于:https://www.cnblogs.c...




    先新建包,com.itcast.controller,然后把异常拦截的项目的UserController复制过来。



    复制过来稍作修改

    创建pages文件件,然后新建success.jsp页面


    部署当前的项目


    启动服务器



    编写拦截器需要的步骤





     

    转载于:https://www.cnblogs.com/wangjunwei/p/11385364.html

    展开全文
  • 拦截器1 SpringMVC异常处理异常处理思路1.1 自定义异常类1.2 异常处理器1.3 响应页面2 拦截器2.1 编写拦截器类2.2 配置拦截器springmvcConfig.xmlController2.3 成功后跳转页面success.jsp2.4 结果 1 SpringMVC异常...
  • 跨域访问2.1 跨域访问介绍2.2 跨域环境搭建2.3 跨域访问支持3 拦截器3.1 拦截器...拦截器配置4 异常处理4.0 异常处理的方式方式1(了解)方式2(XML了解)方式3(注解)掌握4.1 异常处理解决方案4.2 自定义异常5 实用技术5.
  • 编写异常界面二、拦截器1. 拦截器的概述2.拦截器1.编写拦截器类,必须实现HandlerInterceptor接口。2.在springmvc.xml中配置拦截器类 一、异常处理 流程:Controller调用service,service调用dao,异常都是向上抛...
  • 编写异常处理器 配置异常处理器(跳转到提示页面) SpringMVC的拦截器: SpringMVC的拦截器类似于Servlet开发中的过滤器Filter,用于对处理器进行预处理与后处理; 先在拦截器中执行代码1,可以放行之后进入到...
  • SpringMVC的拦截器 01-SpringMVC拦截器-拦截器的作用(理解) Spring MVC 的拦截器类似于 Servlet 开发中的过滤器 Filter,用于对处理器进行预处理和后处理。 将拦截器按一定的顺序联结成一条链,这条链称为拦截器...
  • (五)拦截器编写controller (六)拦截器拦截器入门代码 (七)拦截器拦截器接口方法演示 (一)拦截器的介绍和搭建环境 (二)异常处理:演示程序异常 (三)异常处理:异常处理代码编写 (四)异常处理:分析和搭建环境 ...
  • 目录异常异常处理的思路异常处理实现步骤拦截器拦截器的概述自定义拦截器步骤HandlerInterceptor接口中的方法配置多个拦截器 异常 异常处理的思路 思路:Controller调用service,service调用dao,异常都是向上抛出...
  • 文章目录第七章 SpringMVC异常处理1、异常处理的过程1.1默认的过程1.2SpringMVC的过程2、SpringMVC配置异常处理器2.1 编写自定义异常类2.2 编写异常处理器2.3 配置异常处理器2.4 编写异常处理返回的界面2.5 案例源码...
  • SpringMVC——(7)拦截器与处理异常

    千次阅读 2018-11-22 00:37:42
    一、自定义拦截器 1、HandlerInterceptor 接口 2、后台: 3、配置拦截器 二、拦截器执行顺序 1、单个拦截器执行顺序 2、多个拦截器 三、异常处理 1、基于控制器 2、基于自定义的异常类 3、统一全局处理...
  • SpringMVC文件上传、异常处理以及拦截器3.6 SpringMVC实现文件上传SpringMVC传统方式文件上传SpringMVC跨服务器方式文件上传3.7 SpringMVC的异常处理3.8 SpringMVC框架中的拦截器1、 拦截器的概述2、 自定义拦截器...
  • SpringMVC编码过滤+拦截器+异常处理

    千次阅读 2018-10-15 15:38:46
    一、SpringMVC 编码过滤+拦截器+异常处理 1.编码过滤 1.1 基本概念 1.2 传统乱码解决 1.3 SpringMVC编码过滤器 2.拦截器 2.1 基本概念 2.2 实现HandlerInterceptor 3.异常处理 3.1 基本简介 3.2 ...
  • 1. SpringMVC中的拦截器(Interceptor) 1.1. 基本概念 在SpringMVC中的拦截器可以是运行在控制器(Controller)之前的组件,可以设置拦截器应用于哪些请求路径,当发生这些请求时,拦截器会自动执行,在执行过程中,...
  • 2.编写拦截器类,继承HandlerInterceptor接口并重写prehandler方法 3.在spring-mvc.xml文件中将编写的自定义拦截器配置进去 1.修改前端的跳转url ![在这里插入图片描述]...
  • 解决步骤4.1编写异常类4.2自定义异常处理类4.2.1注意点4.3 springmvc.xml中配置该异常处理器4.4 提供跳转异常界面4.5 测试二、拦截器1.拦截器思路图解2.拦截器入门实现代码2.1编写拦截器类,实现HandlerInterceptor...
  • SpringMVC异常处理 异常处理思路 Controller调用service,service调用dao,异常都是向上抛出的,最终有DispatcherServlet找异常处理器进行异常的处理。 SpringMVC的异常处理 自定义异常类 package ...
  • 主要作用:作为控制层组件、请求拦截(编码拦截器、请求验证拦截器、非法文字拦截器) 结果拦截(懒加载拦截器) 语法: 1 包声明 2 包导入 import java.io.* ;import javax.servlet.* ;import javax.servlet....
  • 在SpringBoot中,过滤器的配置可以简单的使用@WebFilter来达到我们需要的结果,对于拦截器异常处理程序,我们也可以实现SpringBoot提供给我们的一些接口,再配置进去,即可达到效果 快速开始 版本说明:...
  • 拦截器组件编写规则实现HandlerInterceptor接口,例如 public class CheckLoginInterceptor implements HandlerInterceptor{ public void afterCompletion(HttpServletRequest arg0, HttpServletResponse arg1, ...
  • 1.编写全局异常拦截类 public class MyExpextFilter : ExceptionFilterAttribute { private ILogger<MyExpextFilter> logger; public MyExpextFilter(ILogger<MyExpextFilter> logger) { this....
  • Spring MVC 的处理器拦截器类似于 Servlet 开发中的过滤器 Filter,用于对处理器进行预处理和后处理。 用户可以自己定义一些拦截器来实现特定的功能。 谈到拦截器,还要向大家提一个词——拦截器链(Interceptor ...
  • SpringMVC异常处理异常分类:异常处理目的:异常处理思路:异常处理步骤 异常处理 异常分类: 异常类型 异常处理 预期异常 通过捕获异常从而获取异常信息 运行时异常 通过规范代码开发、测试通过手段减少...
  • springmvc-异常处理器以及拦截器

    千次阅读 2019-06-24 14:56:53
    dao、service、controller都可能出现异常,当出现异常都通过throws Exception向上抛出,最后由SpringMVC前端控制交由异常处理器进行异常处理,SpringMVC提供全局异常处理器(一个系统只有一个异常处理器)进行统一...
  • } } SpringMVC 中的异常处理 自定义异常: 1 编写异常类和错误页面 异常类: package com.wz; public class SysException extends Exception { private String message; @Override public String getMessage() { ...
  • springmvc文件上传,异常处理和拦截器

    千次阅读 2019-08-19 15:24:23
    思路:逐级往上抛,最终由DispatcherServlet找异常处理器进行异常处理 自定义异常类 继承Exception 定义serialVersionUID private static final long serialVersionUID = 405594514712801630...
  • Struts 2拦截器

    千次阅读 2017-05-23 21:08:21
    学习内容 拦截器工作原理 Struts 2自带拦截器 自定义拦截器能力目标 熟悉Struts 2拦截器工作原理 熟练使用和配置拦截器本章简介上一章我们深入学习了Struts 2框架的配置,包括Action的配置、Result的配置等等,...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 39,058
精华内容 15,623
关键字:

编写异常拦截器