springboot学习(二):web 开发
要解决的问题:
- 导入静态资源
- 首页
- jsp,模板引擎Thymeleaf
- 装配拓展SpringMVC
- 增删改查
- 拦截器
- 国际化
静态资源的导入
按照之前的逻辑,找到mvc的自动配置类WebMvcAutoConfiguration.java,发现有一个方法
1 |
|
第一种:webjars
WebJars是将web前端资源(js,css等)打成jar包文件,然后借助Maven工具,以jar包形式对web前端资源进行统一依赖管理,保证这些Web资源版本唯一性。WebJars的jar包部署在Maven中央仓库上。
也就是用maven引入jar包,并且用这种方式引入的jar包会自动到classpath:/META-INF/resources/webjars/
下,而我们访问静态资源时,输入的路径为localhost:8080/webjars/**,这个路径会自动映射到classpath:/META-INF/resources/webjars/,
但是一般不会使用这种方式
第二种:
点进getStaticPathPattern()
1 | public String[] getStaticLocations() { |
再找到this.staticLocations
1 | private static final String[] CLASSPATH_RESOURCE_LOCATIONS = { "classpath:/META-INF/resources/", |
所以我们的静态资源可以放在
- classpath:/META-INF/resources/
- classpath:/resources/
- classpath:/static/
- classpath:/public/
第一种和webjars类似,一般不用
后面三种访问时的路径为localhost:8080/**
,这个路径会自动映射到三个路径中,且优先级为:resources>static(默认)>puiblic,
定制首页
依旧是再WevMvcAutoConfiguration里面找,发现有一个
上半部分是遍历静态资源的路径,并调用getIndexHtml方法
找到一个叫index.html的页面,如果存在,则能正常得到首页,否则去servletContext里找,还是找不到的话,就返回null
所以我们得到结论:首页可以放在上面静态资源放的位置,且名称为index.html
thymleaf模板引擎
模板引擎
前端交给我们的页面,是html页面。如果是我们以前开发,我们需要把他们转成jsp页面,jsp好处就是当我们查出一些数据转发到JSP页面以后,我们可以用jsp轻松实现数据的显示及交互等。
jsp支持非常强大的功能,包括能写Java代码,但是呢,我们现在的这种情况,SpringBoot这个项目首先是以jar的方式,不是war,像第二,我们用的还是嵌入式的Tomcat,所以呢,他现在默认是不支持jsp的。
那不支持jsp,如果我们直接用纯静态页面的方式,那给我们开发会带来非常大的麻烦,那怎么办呢?
SpringBoot推荐你可以来使用模板引擎:
模板引擎,我们其实大家听到很多,其实jsp就是一个模板引擎,还有用的比较多的freemarker,包括SpringBoot给我们推荐的Thymeleaf,模板引擎有非常多,但再多的模板引擎,他们的思想都是一样的,什么样一个思想呢我们来看一下这张图:
模板引擎的作用就是我们来写一个页面模板,比如有些值呢,是动态的,我们写一些表达式。而这些值,从哪来呢,就是我们在后台封装一些数据。然后把这个模板和这个数据交给我们模板引擎,模板引擎按照我们这个数据帮你把这表达式解析、填充到我们指定的位置,然后把这个数据最终生成一个我们想要的内容给我们写出去,这就是我们这个模板引擎,不管是jsp还是其他模板引擎,都是这个思想。只不过呢,就是说不同模板引擎之间,他们可能这个语法有点不一样。其他的我就不介绍了,我主要来介绍一下SpringBoot给我们推荐的Thymeleaf模板引擎,这模板引擎呢,是一个高级语言的模板引擎,他的这个语法更简单。而且呢,功能更强大。
引入Thymeleaf
1 | <!--引入thymeleaf--> |
且在ThymeleafProperties.java文件中我们可以得知,默认的路径是classpath:/templates/,templates这个目录跟之前的WEB-INF一样,是不能直接访问,只能通过视图跳转访问
我们只需要把我们的html页面放在类路径下的templates下,thymeleaf就可以帮我们自动渲染了。
使用thymeleaf不需要什么配置,只需要将他放在指定的文件夹下即可!
Thymeleaf 语法
简单表达式
- 变量表达式:
${...}
- 选择变量表达式:
*{...}
- 消息表达式:
#{...}
- 链接网址表达式:
@{...}
- 片段表达式:
~{...}
- 变量表达式:
文字
- 文本文本:,,…
'one text'``'Another one!'
- 数字文字: , , , ,…
0``34``3.0``12.3
- 布尔文字: ,
true``false
- 空文本:
null
- 文字标记: , , ,…
one``sometext``main
- 文本文本:,,…
- 文本操作:
- 字符串串联:
+
- 文字替换:
|The name is ${name}|
- 字符串串联:
- 算术运算:
- 二元运算符: , , , , ,
+``-``*``/``%
- 减号(一元运算符):
-
- 二元运算符: , , , , ,
- 布尔运算:
- 二元运算符: ,
and``or
- 布尔否定(一元运算符):,
!``not
- 二元运算符: ,
- 比较和平等:
- 比较器: , , , ( , , ,
>``<``>=``<=``gt``lt``ge``le
) - 等运算符: , (,
==``!=``eq``ne
)
- 比较器: , , , ( , , ,
特殊代币:
- 无操作:
_
- 无操作:
Simple expressions:
- Variable Expressions:
${...}
- Selection Variable Expressions:
*{...}
- Message Expressions:
#{...}
- Link URL Expressions:
@{...}
- Fragment Expressions:
~{...}
- Variable Expressions:
Literals
- Text literals: , ,…
'one text'``'Another one!'
- Number literals: , , , ,…
0``34``3.0``12.3
- Boolean literals: ,
true``false
- Null literal:
null
- Literal tokens: , , ,…
one``sometext``main
- Text literals: , ,…
Text operations:
- String concatenation:
+
- Literal substitutions:
|The name is ${name}|
- String concatenation:
- Arithmetic operations:
- Binary operators: , , , ,
+``-``*``/``%
- Minus sign (unary operator):
-
- Binary operators: , , , ,
- Boolean operations:
- Binary operators: ,
and``or
- Boolean negation (unary operator): ,
!``not
- Binary operators: ,
- Comparisons and equality:
- Comparators: , , , (, , ,
>``<``>=``<=``gt``lt``ge``le
) - Equality operators: , (,
==``!=``eq``ne
)
- Comparators: , , , (, , ,
- Conditional operators:
- If-then:
(if) ? (then)
- If-then-else:
(if) ? (then) : (else)
- Default:
(value) ?: (defaultvalue)
- If-then:
- Special tokens:
- No-Operation:
_
- No-Operation:
使用thymeleaf
1 |
|
1 | package com.example.springboot03web.controller; |
MVC配置原理
在进行项目编写前,我们还需要知道一个东西,就是SpringBoot对我们的SpringMVC还做了哪些配置,包括如何扩展,如何定制
意思就是如果我们要在默认的SpringMVC自动配置的基础上,进行拓展,只需要自己写一个类,加上@Configuration
注解,而且我们注意到WebMvcConfigurer
是一个接口,所以我们写的配置类去实现这个接口即可;另外,官方贴别标注了不能加@EnableWebMvc
,这个我们读了源码就知道原因了,我们先试着重写接口的一个方法
重写 addViewControllers视图控制器方法
1 |
|
然后启动项目,输入localhost:8080/hanser,发现正常跳转到了localhost:8080/test页面,说明我们的配置生效了
为什么不能加@EnableWebMvc
我们点进@EnableWebMvc源码查看
1 |
|
发现他导入了DelegatingWebMvcConfiguration
一个类
1 | public class DelegatingWebMvcConfiguration extends WebMvcConfigurationSupport {} |
而这个类实现了WebMvcConfigurationSupport
,并且我们注意到WebMvcAutoConfiguration
这个类有一个注解
1 | @ConditionalOnMissingBean(WebMvcConfigurationSupport.class) |
说明只有当容器中不存在WebMvcConfigurationSupport
这个类时,自动配置类才会生效,而我们使用了@EnableWebMvc
注解后,自动导入了这个类,说明我们想全权接管springMVC的配置,所以会出现问题