學習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;
}
}