一、Spring MVC原理
Servlet–>EJB–>Struts–>SpringMVC–>SpringBoot
Servlet
Servlet的本质:
- Servlet就是一个Java接口,这个接口定义了一套处理网络请求的规范,包含了init、destroy这两个生命周期的方法,和一个处理请求的service方法。
- 所有实现servlet接口的类,或者说,所有想要处理网络请求的类,都需要回答这三个问题:你初始化时要做什么?你销毁时要做什么?你接受到请求时要做什么?
- 实现Servlet类并不能直接处理请求,servlet不会和客户端打交道,需要servlet容器来实现。常见的如tomcat,里面包含servlet接口和实现。tomcat监听客户端端口,根据请求信息,将请求交给对应的servlet处理,调用servlet的service方法,返回response对象,再返回给客户端。
Servlet和JSP的区别:
- JSP就是在html里面写Java代码,Servlet就是在Java里面写html代码。其实JSP会转换为servlet代码,然后编译成类文件,供JVM运行。
- Servlet能够很好地组织业务逻辑代码,但是在Java源文件中通过字符串拼接的方式生成动态HTML内容会导致代码维护困难、可读性差。
- JSP虽然规避了Servlet在生成HTML内容方面的劣势,但是在HTML中混入大量、复杂的业务逻辑同样也是不可取的。
因此通过MVC模型,Controller层负责servlet,View层负责JSP,提高代码可读性和可维护性。
DispatcherServlet(前端控制器)
DispatcherServlet是整个流程控制的中心,由它调用其它组件处理用户的请求,DispatcherServlet的存在降低了组件之间的耦合性。
DispatcherServlet继承自Servlet。HttpServletBean抽象类仍然是spring提供,而HttpServlet抽象类、Servlet接口都是servlet容器(如tomcat)等提供。
HandlerMapping(处理器映射器)
HandlerMapping负责根据用户请求找到Handler即处理器,springmvc提供了不同的映射器实现不同的映射方式,例如:配置文件方式,实现接口方式,注解方式等,推荐使用注解开发。
Handler(处理器)
Handler 是继DispatcherServlet前端控制器的后端控制器,在DispatcherServlet的控制下Handler对具体的用户请求进行处理。由于Handler涉及到具体的用户业务请求,所以一般情况需要程序员根据业务需求开发Handler。
HandlerAdapter(处理器适配器)
通过HandlerAdapter对处理器进行执行,这是适配器模式的应用,通过扩展适配器可以对更多类型的处理器进行执行。
ViewResolver(视图解析器)
View Resolver负责将处理结果生成View视图,View Resolver首先根据逻辑视图名解析成物理视图名即具体的页面地址,再生成View视图对象,最后对View进行渲染将处理结果通过页面展示给用户。
二、Spring MVC核心源码
1、所有的源头从Servlet接口的service方法开始。
1 | public interface Servlet { |
2、FrameworkServlet类有service的方法的实现
1 | public abstract class FrameworkServlet extends HttpServletBean implements ApplicationContextAware { |
3、父类HttpServlet的service方法
1 | public abstract class HttpServlet extends GenericServlet { |
4、回到FrameworkServlet的doGet和processRequest方法
1 | public abstract class FrameworkServlet extends HttpServletBean implements ApplicationContextAware { |
5、DispatcherServlet的最核心SpringMVC源码
1 | public class DispatcherServlet extends FrameworkServlet { |
三、Spring Boot的Web开发
- Spring Boot提供了springboot-starter-web为Web开发予以支持。提供了嵌入的Tomcat以及Spring MVC的依赖。Web相关的自动配置存储在spring-boot-autoconfigure.jar的org.springframework.boot.autoconfigure.web下。
- jsp在内嵌的Servlet的容器中有问题,tomcat和jetty不支持以jar形式运行jsp,undertow不支持jsp,因此Spring Boot提供了大量模板引擎,有Freemarker、Thymeleaf、Groovy、Velocity(springboot2.0已弃用)等。
JSP
1 | <!DOCTYPE html> |
Freemarker
1 |
|
Thymeleaf
Thymeleaf『官网传送门』是一个java类库,是xml/xhtml/html5的模板引擎,作为MVC的Web应用的View层。
1 |
|
1 |
|
四、Web相关配置
Spring Boot提供的自动配置,通过WebMvcConfiguration及WebMvcProperties来设置。
1、自动配置的ViewResolver
- ContentNegotiatingViewResolver,特殊,最高级,代理给不同的ViewResolver来处理不同的View
- BeanNameViewResolver,根据控制器返回的字符串来查找Bean名称相同的视图
- InternaleResourceViewResolver,通过设置前后缀和控制器返回视图名的字符串来获得实际页面
2、自动配置的静态资源
通过自动配置类的addResourceHandlers方法来定义以下静态资源的自动配置。
- 类路径文件(/static、/public、/resources、/META-INF/resources)文件夹下的静态文件直接映射为/* * ,可通过http://localhost:8080/* * 来访问。
- webjar,把webjar的/META-INF/resources/webjars下的静态文件映射为/webjars/* * ,可通过http://localhost:8080/webjars/* * 来访问。
3、自动配置的Formatter和Converter
在WebMvcAutoConfiguration的方法addFormatters中,配置了Converter、GenericConverter和Formatter接口的实现类的Bean,并自动注册到Spring MVC中。
4、自动配置的HttpMessageConverters
定义了ByteArray、BufferedImage、Resource、Jackson、Gson等HttpMessageConverters。
接管Spring Boot的mvc配置
新建配置类,注解Configuration,重写WebMvcConfigurerAdapter的addViewControllers方法,不是覆盖,和自动配置同时生效。
1 |
|
tomcat替换为jetty或undertow
1 | <dependencies> |
SSL配置
使用keytool生成p12文件,并安装到服务器。p12文件放到src/main/resources路径下。
1 | $ keytool -genkey -alias tomcat -dname "CN=Andy,OU=kfit,O=kfit,L=HaiDian,ST=BeiJing,C=CN" -storetype PKCS12 -keyalg RSA -keysize 2048 -keystore keystore.p12 -validity 365 |
properties文件配置
1 | server.port = 8443 |
设置http8080自动跳转(springboot2版本)
1 |
|
favicon配置
禁用favicon
1 | spring.mvc.favicon.enabled=false |
设置favicon:将favicon.ico放到到静态路径下即可。