springboot-web
springboot配置原理
//xxxxAutoConfiguration:帮我们给容器中自动配置组件;
//xxxxProperties:配置类来封装配置文件内容;
springboot对静态资源映射规则
- 设置和静态资源相关的参数,缓存时间等
@ConfigurationProperties("spring.web")
public class WebProperties {
private Locale locale;
private WebProperties.LocaleResolver localeResolver;
private final WebProperties.Resources resources;
- 所有/webjars/**,都去classpath:/META-INF/resources/webjars/下面找资源;
webjars以jar包形式引入资源;
//WebMvcAutoConfiguration
protected void addResourceHandlers(ResourceHandlerRegistry registry) {
super.addResourceHandlers(registry);
if (!this.resourceProperties.isAddMappings()) {
logger.debug("Default resource handling disabled");
} else {
ServletContext servletContext = this.getServletContext();
this.addResourceHandler(registry, "/webjars/**", "classpath:/META-INF/resources/webjars/");
this.addResourceHandler(registry, this.mvcProperties.getStaticPathPattern(), (registration) -> {
registration.addResourceLocations(this.resourceProperties.getStaticLocations());
if (servletContext != null) {
registration.addResourceLocations(new Resource[]{new ServletContextResource(servletContext, "/")});
}
});
}
}
- /**访问当前项目任何资源,静态资源文件夹
如:http://localhost:8080/abc 相当于到类路径下的静态资源文件夹去找abc,访问时不用写静态资源文件夹路径
"classpath:/META-INF/resources/",
"classpath:/resources/",
"classpath:/static/",
"classpath:/public/"
"/":当前项目根路径
- 配置欢迎页的映射
欢迎页:静态资源文件夹下的index.html,被/**访问路径映射
如:http://localhost:8080/ 默认会去找index.html页面
@Bean
public WelcomePageHandlerMapping welcomePageHandlerMapping(ApplicationContext applicationContext, FormattingConversionService mvcConversionService, ResourceUrlProvider mvcResourceUrlProvider) {
WelcomePageHandlerMapping welcomePageHandlerMapping = new WelcomePageHandlerMapping(new TemplateAvailabilityProviders(applicationContext), applicationContext, this.getWelcomePage(), this.mvcProperties.getStaticPathPattern());
welcomePageHandlerMapping.setInterceptors(this.getInterceptors(mvcConversionService, mvcResourceUrlProvider));
welcomePageHandlerMapping.setCorsConfigurations(this.getCorsConfigurations());
return welcomePageHandlerMapping;
}
模板引擎
- jsp, velocity, freemarker, thymeleaf
springboot推荐thymeleaf
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>
Thymeleaf
- 我们只需要把html模板放到/templates/目录下,thymeleaf就可以帮我们自动渲染页面了;
/success请求结果会查找classpath:/templates/success.html文件
@ConfigurationProperties(prefix = "spring.thymeleaf")
public class ThymeleafProperties {
private static final Charset DEFAULT_ENCODING;
public static final String DEFAULT_PREFIX = "classpath:/templates/";
public static final String DEFAULT_SUFFIX = ".html";
private boolean checkTemplate = true;
private boolean checkTemplateLocation = true;
private String prefix = "classpath:/templates/";
private String suffix = ".html";
private String mode = "HTML";
private Charset encoding;
}
//Controller
@Controller
public class HelloController {
@RequestMapping("/success")
public String success(Map<String, Object> map){
map.put("hello","你好");
return "success";
}
}
- html文件导入thymeleaf命名空间,方便代码提示
如下代码表示向画面展示hello变量的数据
<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<p>成功</p>
<div th:text="${hello}"></div>
</body>
</html>
- 语法规则一:标签
th支持任意html属性替换原生属性的值,如th:id,th:class- th:insert 相当于jsp的include
th:replace - th:each 相当于jsp中的c:forEach,写在哪个html标签上面,在遍历的时候就会把哪个标签内容遍历一次
- th:if 相当于jsp中的c:if
th:unless
th:switch
th:case - th:object 相当于jsp中的c:set
th:with - th:attr 任意属性修改,支持以下两个追加的形式
th:attrprepend
th:attrappend - th:value 修改指定属性默认值
th:href
th:src - th:text 修改标签体内容,转义特殊字符,字符表达原样输出
th:utext 修改标签体内容,不转义特殊字符,字符表达按效果展示 - th:fragment 声明片段
- th:remove
- th:insert 相当于jsp的include
- 语法规则:表达式
OGNL表达式表达式 释义 ${} 获取变量值
对象级联属性:${person.father.name}
对象级联属性:${person[‘father’][‘name’]}
${countriesByCode.ES}
Map中对象属性:${personsByName[‘xiaoming’].name}
数组中对象属性:${personsArray[0].name}
对象方法调用:${person.createCompleteName()}
对象方法调用:${person.createCompleteNameByseprator(’-’)}
内置对象属性获取
#ctx:上下文对象
#vars:上下文变量
#locale:locale区域数据,如国家代号${#locale.country}
#request:仅用在web上下文中的HttpServletRequest对象
#response:仅用在web上下文中的HttpServletResponse对象
#session:仅用在web上下文中的HttpSession对象
#servletContext:仅用在web上下文中的ServletContext对象
内置工具对象属性获取
#execInfo
#messages
#uris
#conversions
#dates
#calendars
#numbers 如:${#numbers.sequence(from, to)}
#strings 如:${#strings.toString(obj)}
#objects
#bools
#arrays
#lists
#sets
#maps
#aggregates
#ids*{} 变量选择表达式:和${}功能类似,但多了一个功能,配合th:object进行使用
*可以代表th:object已经取出来的指定对象,然后使用*{name}获取属性的值就可以了#{} 获取国际化内容 @{} 定义URL链接,好处是:
http://localhost:8080/progname/controller?userId=999&userName=小明
等价于
@{http://localhost:8080/progname/controller(userId=${user.id},userName=${user.name})}
@{/controller(userId=${user.id},userName=${user.name})}~{} ~{commons :: main}片段引用表达式 - 使用
数据遍历
<!--正常写法-->
<p th:text="${user}" th:each="user:${usersx}"></p>
<!--行内写法:转义特殊字符,字符表达原样输出-->
<p th:each="user:${usersx}">[[${user}]]</p>
<!--行内写法:不转义特殊字符,字符表达按效果展示-->
<p th:each="user:${usersx}">[(${user})]</p>
springmvc自动配置
spring boot自动配置了springmvc(WebMvcAutoConfiguration),默认提供如下特性:
- Inclusion of ContentNegotiatingViewResolver and BeanNameViewResolver beans
- 自动配置ViewResolver:视图解析器根据方法返回值获取到视图对象,视图对象决定如何渲染(是否转发或者重定向);
- ContentNegotiatingViewResolver:组合所有视图解析器进行解析;
- 定制视图解析器:给容器添加一个视图解析器;自动将其组合进来;
- 支持自定义ViewResolver,只需要实现该接口,添加把Bean到spring容器中即可
- Support for serving static resources, including support for WebJars
- 支持静态资源和webjars访问
- Automatic registration of Converter, GenericConverter, and Formatter beans
- Converter:转换器,类型转换使用Converter,如解决页面请求数据类型封装问题;
- Formatter:格式化器,2017-12-17转为Date,如页面的数据是2017-12-17文本,转为Date类型
- 支持自定义格式化转换器,只需要实现Converter通过Bean添加到spring容器中即可;
- Support for HttpMessageConverters
- SpringMvc用来转换http请求和响应的;如我们的一个方法返回User对象,我们想以Json格式写出去;
- 支持自定义添加HttpMessageConverters,只需通过HttpMessageConverter构造一个HttpMessageConverters并添加到Spring容器中;
- Automatic registration of MessageCodesResolver
- 支持定义错误代码生成规则,如JSR303数据校验时,某个字段数据校验出现问题,那么产生错误代码的message格式通过该生成规则来生成
- Static index.html support.
- 支持默认的静态首页访问
- Automatic use of a ConfigurableWebBindingInitializer bean
- 初始化web数据绑定器,如请求数据绑定到JavaBean
- 支持自定义ConfigurableWebBindingInitializer来替换默认,只需添加一个ConfigurableWebBindingInitializer添加到Spring容器中;
- web所有自动配置场景
- 包位置:org.springframework.boot.autoconfigure.web
如何修改springboot默认配置
- 模式
- springboot在自动配置很多组件时,会先看容器中是否有用户自己配置(@Bean,@Component)的组件,如果有就用用户自己配置的,如果没有,才会自动配置;如果有些组件可以有多个(如ViewResolver)那么将用户配置的和自己默认的组合起来;