springboot项目基础-web

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
  • 语法规则:表达式
    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)那么将用户配置的和自己默认的组合起来;
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值