Skip to content
This repository was archived by the owner on Sep 26, 2024. It is now read-only.

Latest commit

 

History

History
266 lines (224 loc) · 7.48 KB

SpringBootMVC异常处理、拦截器、AOP、静态资源处理.md

File metadata and controls

266 lines (224 loc) · 7.48 KB

SpringBootMVC异常处理

SpringBoot有一个ErrorMvcAutoConfiguration自动配置组件,默认加载BasicErrorController,Controller中定义了两个/error处理。(一个html响应、一个json响应)

当MVC程序底层发生异常,会自动转向/error请求处理,显示错误界面。

自定义ErrorController(全局处理)

自定义ErrorController组件,需要实现ErrorController接口或继承AbstractErrorController都可以。

@Controller
public class MyErrorController implements ErrorController{
//自定义/error请求处理逻辑
@RequestMapping("/error")
public ModelAndView error(){
    ModelAndView mav = new ModelAndView();
    mav.setViewName("error");//error.html
    return mav;
}

@Override
public String getErrorPath() {
    return "/error";
}

}

使用@ExceptionHandler

处理某个Controller异常,应用方法就是在Controller添加带Exception参数的方法,然后使用@ExceptionHandler标记。

@ExceptionHandler
@ResponseBody
public MyResult handlerException(Exception e){
    MyResult result = new MyResult();
    result.setStatus(0);
    result.setMsg("参数有错");
    result.setData(e.getMessage());
    return result;
}

SpringBootMVC拦截器

  1. 编写拦截器组件,实现HandlerInterceptor接口

    @Component//扫描
    public class SomeInterceptor implements HandlerInterceptor{
    
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
            throws Exception {
        System.out.println("开始执行Controller处理");
        return true;
    }
    
    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,
            ModelAndView modelAndView) throws Exception {
        // TODO Auto-generated method stub
        System.out.println("Controller执行完毕");
    }
    
    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex)
            throws Exception {
        // TODO Auto-generated method stub
        String param = request.getQueryString();
        System.out.println(request.getRequestURI()+"?"+param+"请求处理完毕");
    }
    

    }

  2. 配置拦截器

    @Configuration
    public class InterceptorConfiguration extends WebMvcConfigurerAdapter{
    
    @Autowired
    private SomeInterceptor some;
    
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(some).addPathPatterns("/compute.do");
    }
    

    }

SpringBoot AOP

AOP关键概念:切面、切入点、通知。

案例:记录每个Controller方法执行的时间

- 切面:计算方法执行时间
- 切入点:所有Controller方法 within(cn.xdl.controller.*)
- 通知:环绕通知 @Around
  1. 在pom.xml追加aop定义

    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-aop</artifactId>
    </dependency>
    
  2. 编写切面组件,使用@Aspect、@Around等标记

    @Component//ioc
    @Aspect//定义为切面
    public class WatchBean {
    
    @Around(&quot;within(cn.xdl.controller.*)&quot;)
    public Object execute(ProceedingJoinPoint pjp) throws Throwable{
        //开始计时
        StopWatch watch = new StopWatch();
        watch.start();
        Object obj = pjp.proceed();//执行controller方法
        //结束计时
        watch.stop();
        long time = watch.getTotalTimeMillis();//执行时长
        String targetClass = pjp.getTarget().getClass().getName();//组件名
        String methodName = pjp.getSignature().getName();//方法名
        System.out.println(&quot;组件:&quot;+targetClass+&quot;方法:&quot;+methodName+&quot;执行时长为:&quot;+time+&quot;ms&quot;);
        return obj;
    }
    

    }

SpringBoot静态资源管理

在SpringBoot工程中,默认静态资源目录如下:

src/main/resources/public (最低)
src/main/resources/static
src/main/resources/resources
src/main/resources/META-INF/resources(最高)

资源目录根据优先级,从高到低查找。

如果需要自定义静态资源存储路径,可以采用下面配置类

@Configuration
public class MyResourceConfiguration extends WebMvcConfigurerAdapter{
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
    registry.addResourceHandler(&quot;/mystatic/**&quot;)
        .addResourceLocations(&quot;classpath:/mystatic/&quot;);
}

}

提示:不要使用/**映射,会破坏原有默认静态资源访问。

SpringBoot对JavaWeb集成

  1. Servlet

    • 编写Servlet组件,继承HttpServlet
    • 利用@WebServlet注解配置
    • 在启动类中,添加@ServletComponentScan
    • 案例代码

      @WebServlet(name="helloservlet",urlPatterns="/hello.do")
      public class HelloServlet extends HttpServlet{
      
      public void service(
          HttpServletRequest request,HttpServletResponse response) throws IOException{
          response.setContentType(&quot;text/html;charset=UTF-8&quot;);
          PrintWriter out = response.getWriter();
          out.println(&quot;Hello Servlet&quot;);
          out.close();
      
      }
      

      }

  2. Filter

    • 编写Filter组件,实现Filter接口
    • 利用@WebFilter注解配置
    • 在启动类中,添加@ServletComponentScan
    • 案例代码

      @WebFilter(urlPatterns="/hello.do",filterName="somefilter")
      public class SomeFilter implements Filter{
      
      @Override
      public void init(FilterConfig filterConfig) throws ServletException {
          // TODO Auto-generated method stub
      
      }
      
      @Override
      public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
              throws IOException, ServletException {
          System.out.println(&quot;-----doFilter------&quot;);
          chain.doFilter(request, response);//调用后续servlet\jsp等
      
      }
      
      @Override
      public void destroy() {
          // TODO Auto-generated method stub
      
      }
      

      }

  3. Listener

    • 编写Listener组件
    • 利用@WebListener注解配置
    • 在启动类中,添加@ServletComponentScan
  4. 启用druid连接池的监控功能

    • 配置启用StatViewServlet组件

      @WebServlet(urlPatterns="/druid/*",initParams={
          @WebInitParam(name="loginUsername",value="xdl"),
          @WebInitParam(name="loginPassword",value="123")
      })
      public class DruidStatServlet extends StatViewServlet{
      

      }

    • 配置启用WebStatFilter组件

      @WebFilter(urlPatterns="/*",initParams={
      @WebInitParam(name="exclusions",value="*.js,*.jpg,*.css,/druid/*")
      })
      public class DruidStatFilter extends WebStatFilter{
      

      }

    • 打开浏览器访问

      http://localhost:xxxx/druid/index.html