二Spring MVC 进阶

Posted 元源创意

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了二Spring MVC 进阶相关的知识,希望对你有一定的参考价值。

2.1、Spring MVC基本配置

Spring MVC的定制配置需要我们的配置类继承一个WebMvcConfigurerAdapter类,并在此类上使用@EnableWebMvc注解,来开启对Spring MVC的配置支持。

2.1.1、静态资源映射

程序的静态文件(js、css、image)等需要直接访问,这时我么需要在配置里重写addResourceHandlers。 
示例:

/** * 对外暴露的访问路径(静态资源) * @param registry */
 @Override
 public  void  addResourceHandlers(
ResourceHandlerRegistry registry){   registry.addResourceHandler("/assets/**").   addResourceLocations("classpath:/assets/");    }

2.1.2、拦截器配置

拦截器(interceptor)实现对每一个请求处理前后进行相关的业务处理,类似与Servlet的Filter。实现方式有,可以让普通的Bean实现HandlerInterceptor接口或者继承类HandlerInterceptorAdapter类实现自定义拦截器。 
示例: 
自定义拦截器DemoInterceptor继承HandlerIntercepterAdapter。

package com.dy.springmvc.interceptor;
import org.springframework.lang.Nullable;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.handler.HandlerInterceptorAdapter;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/** * Author:dy_bom * Description: 配置拦截器Bean * Date:Created in 上午1:10 2018/4/12 * Copyright (c)  xdy_0722@sina.com All Rights Reserved. */
public class DemoInterceptor extends HandlerInterceptorAdapter{    @Override    public boolean preHandle(HttpServletRequest request,
HttpServletResponse response, Object handler) throws Exception {        
   long startTime = System.currentTimeMillis();    request.setAttribute("startTime",startTime);        
   return super.preHandle(request, response, handler);    }    
   @Override    public void postHandle(HttpServletRequest request,
   HttpServletResponse response,
   Object handler,
   @Nullable ModelAndView modelAndView) throws Exception {        
       long startTime =(Long) request.getAttribute("startTime");        request.removeAttribute("startTime");
       long endTime = System.currentTimeMillis();        System.out.println("本次请求处理时间为:"
       +new Long(endTime-startTime) +"ms");        request.setAttribute("handlingTime",endTime-startTime);    } }

加入配置,注入Bean:

    /**     * 注入拦截器     * @return     */
    @Bean
    public DemoInterceptor demoInterceptor(){   
        return new DemoInterceptor();    }    /**     * 注册拦截器     * @param registry     */    @Override    public void addInterceptors(InterceptorRegistry registry){        registry.addInterceptor(demoInterceptor());    }

2.1.3、@ControllerAdvice

通过该注解,我们可以将对于控制器的全局配置放在同一个位置,注解了@Controller的类的方法可使用@ExceptionHandler、@InitBinder、@ModelAttribute注解到方法上。 
@ExceptionHandler:用于全局处理控制器里的异常。 
@InitBinder:用来设置WebDataBinder,自动绑定前台请求参数到Model中。 
@ModelAttribute:绑定键值对到Model里。 
示例: 
定制ControllerAdvice

package com.dy.springmvc.advice;
import org.springframework.ui.Model;
import org.springframework.web.bind.WebDataBinder;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.InitBinder;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.servlet.ModelAndView;
/** * Author:dy_bom * Description: 声明一个控制器建言
@ControllerAdvice
组合了@Component,自动注册为Bean * Date:Created in 上午1:22 2018/4/12 * Copyright (c)  xdy_0722@sina.com All Rights Reserved. */
@ControllerAdvice
public class ExceptionHandlerAdvice {    /**     * 异常全局处理,拦截所有的异常     *     * @param exception     * @return     */    @ExceptionHandler(value = Exception.class)    
   public ModelAndView exception(Exception exception) {        //error页面        ModelAndView modelAndView = new ModelAndView("error");        modelAndView.addObject("errorMessage", exception.getMessage());        
       return modelAndView;    }    
   /**     * 键值对将添加到全局     * 注解将键值对添加到全局,     * 所有注解@RequestMapping的方法可以获取此键值对     * @param model     */    @ModelAttribute    public void addAttributes(Model model) {        model.addAttribute("msg", "额外信息");    }    
   /**     * 定制webDataBinder     * 忽略request参数的id     * @param webDataBinder     */    @InitBinder    public void initBinder(WebDataBinder webDataBinder) {        webDataBinder.setDisallowedFields("id");    } }

2.1.4、其他配置

1、快捷的ViewController 
在一些控制器中,有一些简单的页面跳转代码,如:

@Controller
public class HelloController {@GetMapping({"/index", "/"})    
public String hello() {        return "index";    } }

我们可以在配置中,重写addViewControllers方法,如下:

/** * 快捷的控制器配置 * * @param registry */
 @Override
 public void addViewControllers(ViewControllerRegistry registry) {
     registry.addViewController("/index").
     setViewName("/index");
 }

2.1.5、Spring MVC的高级配置

1、文件上传配置 
文件上传功能,Spring MVC可以通过配置一个MultipartResolver来上传文件。在控制器中通过MultipartFile file来接受文件。 
示例: 
配置MultipartResolver

/** * 文件上传 * @return 
*/
@Bean
public MultipartResolver multipartResolver() {    CommonsMultipartResolver multipartResolver =  
     new CommonsMultipartResolver();    multipartResolver.setMaxUploadSize(1000000);
   return multipartResolver; }

控制器:

@Controller
public class UploadController {    /**     * @param file     * @return     */    @PostMapping("/upload")    
   public @ResponseBody    String upload(MultipartFile file) {        
   try {            FileUtils.writeByteArrayToFile(new File("/tmp/logs/" + file.getOriginalFilename()), file.getBytes());
           return "OK";        } catch (Exception e) {            e.printStackTrace();  
            return "wrong";        }    } }

代码:点我 


以上是关于二Spring MVC 进阶的主要内容,如果未能解决你的问题,请参考以下文章

Spring MVC 教程

Spring框架进阶Spring V2.0 MVC

Spring MVC 3.2 Thymeleaf Ajax 片段

我的Android进阶之旅NDK开发之在C++代码中使用Android Log打印日志,打印出C++的函数耗时以及代码片段耗时详情

如果你的同事这样使用Spring MVC,你该怎么办 ?

Spring Boot进阶系列二