1. 程式人生 > >學習springboot筆記(三)配置springmvc

學習springboot筆記(三)配置springmvc

springboot預設是配置好了SpringMVC的,所以,如果之前有使用SpringMVC的經驗的話,就可以直接在這裡使用了,但是預設的配置往往難以滿足使用的需求,那麼如何來實現springboot中個性化配置的SpringMVC呢? 一、配置檢視解析器 有的時候我們需要指定哪些URL對應跳轉哪個頁面,這個時候就需要檢視解析器,配置程式碼如下

@Configuration
public class MyMvcConfig implements WebMvcConfigurer {

    @Override
    public void addViewControllers(ViewControllerRegistry registry) {
        registry.addViewController("/"
).setViewName("index"); registry.addViewController("/index.html").setViewName("index"); registry.addViewController("/main.html").setViewName("dashboard"); registry.addViewController("/main.html").setViewName("dashboard"); }

@Configuration這個註解的作用是,宣告這個類是一個配置類,並且新增這個bean到容器中 WebMvcConfigurer這個介面,是springboot自動配置SpringMVC的介面,我們在寫自己的SpringMVC的配置類的時候需要實現這個介面(在springboot2.0之前不是要實現這個介面,而是要繼承WebMvcConfigurerAdapter這個類,但是在springboot2.0之後這個類被標記為不推薦了,因為springboot2.0之後的Java版本起步為Java8,而Java8的一個很重要的特性是介面可以有自己的預設方法,所以WebMvcConfigurerAdapter這個類就不再被需要了) 方法addViewControllers,這個方法就是向檢視解析器新增URL和檢視的對應關係的了,registry.addViewController的引數是URL,registry.addViewController(“url”).setViewName(“index”)的引數是檢視名稱,springboot預設的檢視字尾名稱是html,可以通過在application.properties檔案中”spring.mvc.view.suffix”屬性來配置檢視的字尾名稱

二、配置攔截器 配置攔截器的時候也需要我們寫一個攔截器,然後在一個配置類中將攔截器註冊進去,攔截器實現HandleInterceptor介面,比如我們要攔截URL,判斷當前是否為登入狀態,那我們實現preHandle方法就行,攔截器的程式碼如下:

public class LoginHandlerInterceptor implements HandlerInterceptor {

    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws
Exception { Object user = request.getSession().getAttribute("loginUser"); if( user == null){ request.setAttribute("msg","請先登入"); request.getRequestDispatcher("/index.html").forward(request,response); return false; } return true; } }

然後寫一個配置類註冊攔截器

@Configuration
public class MyMvcConfig implements WebMvcConfigurer {

    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(new LoginHandlerInterceptor()).addPathPatterns("/**")
                .excludePathPatterns("/","/index.html","/login","/asserts/**","/webjars/**");
    }
}

addPathPatterns引數是要攔截的URL,/**代表攔截所有的URL,excludePathPatterns的引數是不攔截的URL 三、配置過濾器 過濾器程式碼

public class MyFilter 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("FilterProcessing...");
        filterChain.doFilter(servletRequest,servletResponse);
    }

    @Override
    public void destroy() {

    }
}

然後註冊過濾器

@Configuration
public class MyServletConfig {
    @Bean
    public FilterRegistrationBean myFilter(){
        FilterRegistrationBean filterRegistrationBean = new FilterRegistrationBean();
        filterRegistrationBean.setFilter(new MyFilter());
        filterRegistrationBean.setUrlPatterns(Arrays.asList("/hello","/myServlet"));
        return filterRegistrationBean;
    }
}

四、配置監聽器 監聽器的程式碼

public class MyListener implements ServletContextListener {
    @Override
    public void contextInitialized(ServletContextEvent servletContextEvent) {
        System.out.println("contextInitialized...web啟動");
    }

    @Override
    public void contextDestroyed(ServletContextEvent servletContextEvent) {
        System.out.println("contextDestroyed...web銷燬");
    }
}

註冊監聽器

@Configuration
public class MyServletConfig {
    @Bean
    public ServletListenerRegistrationBean myListener(){
        ServletListenerRegistrationBean<MyListener> myListenerServletListenerRegistrationBean = new ServletListenerRegistrationBean<>(new MyListener());
        return myListenerServletListenerRegistrationBean;
    }

}