一、整合springmvc/访问静态资源
我们接着上一节的说,对于springboot我们应该也是有了相应的了解了,上节中说到修改tomcat端口号,我们可以先测试一下,在application.properties中添加如下配置
# tomcat端口
server.port=80
启动,看控制台就会发现端口号已被修改成80了,springboot项目在启动时,会默认寻找application.properties文件,里面的端口等各种配置,springboot都是有默认值的,如我们引入了想用的依赖,又没有对其进行配置,springboot会对自动进行默认的配置,这就是springboot如此受欢迎的原因之一。
好的,那么接下来我们想一下,springboot项目是打成jar包直接运行的,我们并没有在项目结构中发现webapp或者WebContentl目录,那我们的静态资源放在哪昵,我们用idea的快捷键:ctrl+shift+alt+N,搜索类ResourceProperties,打开,他是个class文件,位于spring-boot-autoconfigurejar包中,第一次打开这个编译后的class文件,idea会提示我们是否下载源码,点击下载。就可以打开java文件了。该类中对静态资源的默认查找路径进行了配置。
默认的静态资源路径为:
-
classpath:/META-INF/resources/
-
classpath:/resources/
-
classpath:/static/
-
classpath:/public
只要静态资源放在这些目录中任何一个,SpringMVC都会帮我们处理。
一般我们会把静态资源放在classpath:/static/
目录下。我们创建目录,并且添加一些静态资源:
结构如下:
我们在静态资源路径下,放了一个1.png的图片,我们重启一下服务测试。
访问成功。
二、配置拦截器
拦截器是需要经常使用的,他不是一个普通属性,而是一个类,所以就要用到java配置方式了。
这里我们采用的方式是:实现WebMvcConfigurer接口
并添加@Configuration
注解来实现自定义部分SpringMvc配置。
我们先定义一个拦截器,新建包interceptor,用于放拦截器,定义拦截器如下:
package com.springboot.interceptor;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class LoginInterceptor implements HandlerInterceptor {
/**
* preHandle方法是进行处理器拦截用的,顾名思义,该方法将在Controller处理之前进行调用,SpringMVC中的Interceptor拦截器是链式的,可以同时存在
* 多个Interceptor,然后SpringMVC会根据声明的前后顺序一个接一个的执行,而且所有的Interceptor中的preHandle方法都会在
* Controller方法调用之前调用。SpringMVC的这种Interceptor链式结构也是可以进行中断的,这种中断方式是令preHandle的返
* 回值为false,当preHandle的返回值为false的时候整个请求就结束了。
*/
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
System.out.println("preHandle method 执行了......!");
return true;
}
/**
* 这个方法只会在当前这个Interceptor的preHandle方法返回值为true的时候才会执行。postHandle是进行处理器拦截用的,它的执行时间是在处理器进行处理之
* 后,也就是在Controller的方法调用之后执行,但是它会在DispatcherServlet进行视图的渲染之前执行,也就是说在这个方法中你可以对ModelAndView进行操
* 作。这个方法的链式结构跟正常访问的方向是相反的,也就是说先声明的Interceptor拦截器该方法反而会后调用,这跟Struts2里面的拦截器的执行过程有点像,
* 只是Struts2里面的intercept方法中要手动的调用ActionInvocation的invoke方法,Struts2中调用ActionInvocation的invoke方法就是调用下一个Interceptor
* 或者是调用action,然后要在Interceptor之前调用的内容都写在调用invoke之前,要在Interceptor之后调用的内容都写在调用invoke方法之后。
*/
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
System.out.println("postHandle method 执行了......!");
}
/**
* 该方法也是需要当前对应的Interceptor的preHandle方法的返回值为true时才会执行。该方法将在整个请求完成之后,也就是DispatcherServlet渲染了视图执行,
* 这个方法的主要作用是用于清理资源的,当然这个方法也只能在当前这个Interceptor的preHandle方法的返回值为true时才会执行。
*/
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
System.out.println("afterCompletion method 执行了......!");
}
}
方法作用看注释,拦截器定义好了,下一步就是定义配置类,注册拦截器:
在config下新建类InterceptorConfig,用于注册拦截器:
package com.springboot.config;
import com.springboot.interceptor.LoginInterceptor;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
@Configuration
public class InterceptorConfig implements WebMvcConfigurer {
/**
* 通过@Bean注解,将我们定义的拦截器注册到Spring容器
* @return
*/
@Bean
public LoginInterceptor loginInterceptor(){
return new LoginInterceptor();
}
/**
* 重写接口中的addInterceptors方法,添加自定义拦截器
* @param registry
*/
@Override
public void addInterceptors(InterceptorRegistry registry) {
// 通过registry来注册拦截器,通过addPathPatterns来添加拦截路径
registry.addInterceptor(this.loginInterceptor()).addPathPatterns("/**");
}
}
结构如下:
定义好了拦截器并注册到了spring,接下来我们测试一下,因为我们配置的拦截路径是所有请求,那我们重启项目之后随意访问一个路径,观察控制台:
注意打印顺序,与拦截器中的注释相对应理解。