在这个互联网时代,使用Spring框架除了开发少数的独立应用,大部分情况下实际上在使用SpriugnMVC开发web应用,为了帮助我们简化快速搭建并开发一个Web项目,SpringBoot为我们提供了spring-boot-starter-web自动配置模块
只要将spring-boot-starter-web加入项目的maven依赖:
< dependency>
< groupId> org. springframework. boot</ groupId>
< artifactId> spring- boot- starter- web</ artifactId>
</ dependency>
我们就得到了一个直接可执行的web应用,当前项目下运行mvn spring-boot: run就可以直接启动一个使用了嵌入式tomcat服务请求的Web应用,只不过,我们还没有提供任何服务Web请求的Controller,所以,访问任何路径都会返回一个SpringBoot默认提供的错误页面(一般称其为whiltelable error page),我们可以在当前项目下新建一个服务根路径Web请求的Controller实现:
@RestController
public class IndexController {
@RequestMapping("/")
public String index() {
return "hello, there";
}
}
重新运行mvn spring-boot: run 并访问http://localhost:8080,错误页面将被我们的Controller返回的消息所替代,一个简单的Web应用就这样完成了。
但是,简单的背后,其实却有很多“潜规则”(约定),我们只有充分了解了这些“潜规则”,才能更好地应用spring-boot-starter-web
项目结构层面的约定
项目结构层面与传统打包为war的Java Web应用的差异在于,静态文件和页面模板的存放位置变了,原来是放在srac/main/webapp目录下的一系列资源,现在都统一放在src/main/resources相应子目录下,比如:
- src/main/resources/static用于存放各类静态资源,比如css,js等
- src/main/resources/templates用于存放模板文件,比如*.vm
注意 当然,如果还是希望使用war包形式,而不是springboot推荐使用的独立jar包形式发布Web应用,也可以继续原来Java Web应用的项目结构约定。
SpringMVC框架层面的约定和定制
spring-boot-starter-web默认将为我们自动配置如下一些springMVC必要组件:
- 必要的ViewResolver,比如ContentNegotiatingViewResolver和Beran-NameViewResolver
- 将必要的Convertor、GenericConverter和Formatter等bean注册到IoC容器
- 添加一系列的HttpMessageConvertor以便支持对Web请求和相应的类型转换
- 自动配置和注册MessageCodesResolver
- 其它
任何时候,如果我们对默认提供的SpringMVC组件设定不满意,可以在IoC容器中注册新的同类型的bean定义来替换,或者直接提供一个基于WebMvcConfigurerAdapter类型的bean定义来定制,甚至直接提供一个标注了@EnableWebMvc的@Configuration配置类完全接管所有SpringMVC的相关配置,自己完全重新配置
嵌入式Web容器层面的约定和定制
spring-boot-starter-web默认使用嵌入式tomcat作为web容器对外提供HTTP服务,默认将使用8080端口对外监听和提供服务
- 假设我们不想使用默认的嵌入式tomcat(spring-boot-starter-tomcat自动配置模块),那么可以引入spring-boot-starter-jetty或者spring-boot-starter-undertow作为替代方案
- 假设我们不想使用默认的8080端口,那么我们可以通过更改配置项server.port使用自己指定的端口,比如:
server.port=9000
spring-boot-starter-web提供了很多以server.为前缀的配置项用于对嵌入式Web容器提供配置,比如:
- server.port
- server.address
- server.ssl.*
- server.tomcat.*
如果这些依然无法满足需求,SpringBoot甚至允许我们直接对嵌入式的Web容器实例进行定制,这可以通过向IoC容器中注册一个EmbeddedServletContainerCustomizer类型的组件来对嵌入式Web容器进行定制:
public class UnveilSpringEmbeddedTomcatCustomizer implements EmbeddedServletContainerCustomizer {
@Override
public void customize( ConfigurableEmbeddedServletContainer container) {
container. setPort( 9999);
container. setContextPath("/ unveil- spring- chapter3");
// ...
}
}
再深入的定制则需要针对特定的嵌入式Web容器,使用实现对应的Factory并注册到IoC容器:
- TomcatEmbeddedServletContainerFactory
- JettyEmbeddedServletContainerFactory
- UndertwoEmbeddedServletContainerFactory
但是,笔者认为大家几乎没有走到这一步的必要,而且建议最好也不要走到这一步,目前来看,spring-boot-starter-web提供的配置项列表已经是最简单和完备的定制方式了。