Spring Boot 探索之旅(五)——Web支持

目录

一、常规MVC配置

1.1 注册视图映射

1.2 注册拦截器

1.3 注册静态资源映射

1.4 注册对象格式器

1.5  注册对象转换器

二、注册Servlet、Filter、Listener

2.1 Servlet

2.2 Filter

2.3 Listener


一、常规MVC配置

/**
 * 主要WebMvc配置
 * @author sunyiran
 * @date 2018-09-29
 */
@Configuration
public class WebMvcConfig implements WebMvcConfigurer {

    /**
     * 注册自定义拦截器
     * @param registry
     */
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        
    }

    /**
     * 注册视图映射
     * @param registry
     */
    @Override
    public void addViewControllers(ViewControllerRegistry registry) {
       
    }

    /**
     * 注册资源映射
     * @param registry
     */
    @Override
    public void addResourceHandlers(ResourceHandlerRegistry registry) {
      
    }

    /**
     *注册类型格式
     * @param registry
     */
    @Override
    public void addFormatters(FormatterRegistry registry) {
       
    }

    /**
     * 配置转化器
     * @param converters
     */
    @Override
    public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
        
    }

    /**
     * 配置异常处理器
     * @param exceptionResolvers
     */
    @Override
    public void configureHandlerExceptionResolvers(List<HandlerExceptionResolver> exceptionResolvers) {
        
    }

    /**
     * 配置跨域请求
     * @param registry
     */
    @Override
    public void addCorsMappings(CorsRegistry registry) {
      
    }


}

1.1 注册视图映射

目标:输入localhost:8082时,访问非默认首页first.html

Spring Boot 探索之旅(五)——Web支持

第一步、编写视图映射注册器(ViewController访问相对路径,ViewName视图名称)

 /**
     * 注册视图映射
     * @param registry
     */
    @Override
    public void addViewControllers(ViewControllerRegistry registry) {
        /*访问相对路径为/时,映射至first,结合模版前后缀,跳转值/templates/first.html*/
        registry.addViewController("/").setViewName("first");
       
    }

第二步、运行项目测试

Spring Boot 探索之旅(五)——Web支持

1.2 注册拦截器

目标:访问healthy方法是,返回“Bad”(正常为OK)

Spring Boot 探索之旅(五)——Web支持

第一步、编写拦截器HealthyIntercepor

/**
 * @author sunyiran
 * @date 2018-09-29
 */
public class HealthyInterceptor implements HandlerInterceptor {


    /**
     * 调用前拦截
     * @param request
     * @param response
     * @param handler
     * @return  false:直接返回,不进入目标方法
     * @throws Exception
     */
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        response.setHeader("Content-Type","text/html");
        ServletOutputStream outputStream = response.getOutputStream();
        outputStream.write("<html><body>Bad</body></html>".getBytes());
        outputStream.close();
        return false;
    }

    /**
     * 调用后拦截
     * @param request
     * @param response
     * @param handler
     * @param modelAndView
     * @throws Exception
     */
    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {

    }
}

第二步、注册拦截器

 /**
     * 注册自定义拦截器
     * @param registry
     */
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        //注册healthy拦截器,匹配路径为正则表达
        registry.addInterceptor(new HealthyInterceptor()).addPathPatterns("/healthy");
      
    }

第三步、运行测试

Spring Boot 探索之旅(五)——Web支持

1.3 注册静态资源映射

目标:输入localhost:8082/file/test.jpg 能访问到file目录中的test.jpg

Spring Boot 探索之旅(五)——Web支持

第一步、注册资源映射

 /**
     * 注册资源映射
     * @param registry
     */
    @Override
    public void addResourceHandlers(ResourceHandlerRegistry registry) {
        registry.addResourceHandler("/file/**").addResourceLocations("classpath:/file/");
    }

第二步、运行测试

Spring Boot 探索之旅(五)——Web支持

1.4 注册对象格式器

目标:传入yyyy/MM-dd HH:ss:mm格式的字符串能自动解析为日期对象

Spring Boot 探索之旅(五)——Web支持

第一步、编写格式器(实现对象文本与对象实体的相互转换)

/**
 * @author sunyiran
 * @date 2018-09-29
 */
public class DateFormatter implements Formatter<Date> {

    private SimpleDateFormat format = new SimpleDateFormat("yyyy/MM-dd HH:ss:mm");

    @Override
    public Date parse(String s, Locale locale) throws ParseException {
        return format.parse(s);
    }

    @Override
    public String print(Date date, Locale locale) {
        return format.format(date);
    }

}

第二步、注册格式器

/**
     *注册类型格式
     * @param registry
     */
    @Override
    public void addFormatters(FormatterRegistry registry) {
        registry.addFormatter(new DateFormatter());
    }

第三步、运行测试

Spring Boot 探索之旅(五)——Web支持

Spring Boot 探索之旅(五)——Web支持

1.5  注册对象转换器

目标:传入yyyy/MM-dd HH:ss:mm格式的字符串能自动解析为日期对象

第一步、编写格式转换器

/**
 * @author sunyiran
 * @date 2018-09-29
 */
public class DateConvert implements Converter<String ,Date> {

    private SimpleDateFormat format = new SimpleDateFormat("yyyy/MM-dd HH:ss:mm");

    @Override
    public Date convert(String source) {
        try {
            return format.parse(source);
        } catch (ParseException e) {
            e.printStackTrace();
        }
        return null;
    }
}

第二步、注册转化器

/**
     *注册类型格式转换
     * @param registry
     */
    @Override
    public void addFormatters(FormatterRegistry registry) {
        //registry.addFormatter(new DateFormatter());
        registry.addConverter(new DateConvert());
    }

第三步、运行测试

Spring Boot 探索之旅(五)——Web支持

Spring Boot 探索之旅(五)——Web支持

  ********formatter和convert都可以直接用@component纳入容器,自动注册

二、注册Servlet、Filter、Listener

必要条件:在项目主类上添加@ServletComponentScan开启对@WebFilter等注解扫描

Spring Boot 探索之旅(五)——Web支持

2.1 Servlet

目标:输入localhost:8082/ts ,输出this is a servlet

第一步、编写servlet

/**
 * @author sunyiran
 * @date 2018-09-29
 */
@WebServlet(urlPatterns = "/ts")
public class MyServlet implements Servlet {
    @Override
    public void init(ServletConfig servletConfig) throws ServletException {

    }

    @Override
    public ServletConfig getServletConfig() {
        return null;
    }

    @Override
    public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
            servletResponse.getOutputStream().write("this is a servlet".getBytes());
    }

    @Override
    public String getServletInfo() {
        return null;
    }

    @Override
    public void destroy() {

    }
}

第二步、运行测试

Spring Boot 探索之旅(五)——Web支持

2.2 Filter

目标:访问localhost:8082/test ,打印 healthyFilter执行

第一步、编写filter

/**
 * @author sunyiran
 * @date 2018-09-29
 */
@WebFilter(urlPatterns = "/test")
public class HealthFilter implements Filter {

    @Override
    public void init(FilterConfig filterConfig) throws ServletException {

    }

    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        System.out.println("healthyFilter执行");
        filterChain.doFilter(servletRequest,servletResponse);
    }

    @Override
    public void destroy() {

    }
}

第二步、运行测试

Spring Boot 探索之旅(五)——Web支持

2.3 Listener

目标:访问任意资源,打印监听开始

第一步、编写监听器

/**
 * @author sunyiran
 * @date 2018-09-29
 */
@WebListener
public class MyListner implements ServletRequestListener {
    @Override
    public void requestDestroyed(ServletRequestEvent servletRequestEvent) {

    }

    @Override
    public void requestInitialized(ServletRequestEvent servletRequestEvent) {
        System.out.println("监听开始");
    }
}

第二步、运行测试

Spring Boot 探索之旅(五)——Web支持