1、简介
使用SpringBoot;
1)、创建SpringBoot应用,选中我们需要的模块;
2)、SpringBoot已经默认将这些场景配置好了,只需要在配置文件中指定少量配置就可以运行起来
3)、自己编写业务代码;
2、SpringBoot对静态资源的映射规则(查看源码WebMvcAutoConfiguration);
1)、所有 /webjars/** ,都去 classpath:/META-INF/resources/webjars/ 找资源;
● webjars:以jar包的方式引入静态资源; 【可以去这个网站去找webjars静态资源:http://www.webjars.org/】
例如:<!‐‐引入jquery‐webjar‐‐>在访问的时候只需要写webjars下面资源的名称即可
<dependency>
<groupId>org.webjars</groupId>
<artifactId>jquery</artifactId>
<version>3.3.1</version>
</dependency>
访问:localhost:8080/webjars/jquery/3.3.1/jquery.js ,就可以访问到jQuery
webjars引入Jquery.png
2)、"/**" 访问当前项目的任何资源,都去(静态资源的文件夹)找映射
"classpath:/META‐INF/resources/",
"classpath:/resources/",
"classpath:/static/",
"classpath:/public/"
"/":当前项目的根路径
localhost:8080/abc === 去静态资源文件夹里面找abc
3)、欢迎页; 静态资源文件夹下的所有index.html页面;被"/**"映射;
localhost:8080/ 找index页面
4)、所有的 **/favicon.ico 都是在静态资源文件下找;
3、模板引擎
1、模板引擎有:JSP、Velocity、Freemarker、Thymeleaf
★ 2、SpringBoot推荐的Thymeleaf;语法更简单,功能更强大;
3、Thymeleaf 的使用
①、导入Thymeleaf 的依赖
<dependency>
<groupId>org.springframework.boot</groupId>
【默认是2.1.6版本,现在都有3以上版本了(可以查看Thymeleaf github中的文档)】
<artifactId>spring‐boot‐starter‐thymeleaf</artifactId>
</dependency>
切换thymeleaf版本的方法:
<properties>
<thymeleaf.version>3.0.9.RELEASE</thymeleaf.version>
<!‐‐ 布局功能的支持程序 thymeleaf3主程序,对应的 layout2以上版本 ‐‐>
<!‐‐ thymeleaf2 对应的 layout1‐‐>
<thymeleaf‐layout‐dialect.version>2.2.2</thymeleaf‐layout‐dialect.version>
</properties>
②、Thymeleaf使用
@ConfigurationProperties(prefix = "spring.thymeleaf")
public class ThymeleafProperties {
private static final Charset DEFAULT_ENCODING = Charset.forName("UTF-8");
private static final MimeType DEFAULT_CONTENT_TYPE = MimeType.valueOf("text/html");
public static final String DEFAULT_PREFIX = "classpath:/templates/";
public static final String DEFAULT_SUFFIX = ".html";
● 查看源码,由ThymeleafProperties 类可知,只要把HTML页面放在classpath:/templates/,thymeleaf 就能自动渲染;
③、导入thymeleaf的名称空间
<html lang="en" xmlns:th="http://www.thymeleaf.org">
4、语法规则(查看Thymeleaf的官方文档)
1)、th:text;改变当前元素里面的文本内容;
th:任意html属性;来替换原生属性的值
2)、常用的有:
th:replace、th:each、th:if、th:switch、th:case、th:value、th:href、th:src、
th:text【转义特殊字符】、th:utext【不转义特殊字符】
3)、支持表达式
①、Simple expressions:(表达式语法)
● Variable Expressions: ${...}:获取变量值;OGNL;
1)、获取对象的属性、调用方法
2)、使用内置的基本对象(比如从request,session等内置对象中取数据)
3)、内置的一些工具对象(比如使用arrays工具类进行一些操作 )
● Selection Variable Expressions: *{...}:选择表达式:和${}在功能上是一样
<div th:object="${session.user}">
<p>Name: <span th:text="*{firstName}">Sebastian</span></p>
等价于
<p>Name: <span th:text="${session.user.firstName}">Sebastian</span></p>
● Message Expressions: #{...}:获取国际化内容
● Link URL Expressions: @{...}:定义URL;
@{/order/process(execId=${execId},execType='FAST')}
● Fragment Expressions: ~{...}:片段引用表达式
<div th:insert="~{commons :: main}">...</div>
②、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 operations:(文本操作)
String concatenation: +
Literal substitutions: |The name is ${name}|
④、Arithmetic operations:(数学运算)
Binary operators: + , ‐ , * , / , %
⑤、Boolean operations:(布尔运算)
Binary operators: and , or
Boolean negation (unary operator): ! , not
⑥、Comparisons and equality:(比较运算)
Comparators: > , < , >= , <= ( gt , lt , ge , le )
Equality operators: == , != ( eq , ne )
⑦、Conditional operators:条件运算(三元运算符)
If‐then: (if) ? (then)
If‐then‐else: (if) ? (then) : (else)
Default: (value) ?: (defaultvalue)
4、如何修改SpringBoot的默认配置
模式:
1)、SpringBoot在自动配置很多组件的时候,先看容器中有没有用户自己配置的(@Bean、@Component),如果有就用用户配置的,
如果没有,才自动配置;如果有些组件可以有多个(ViewResolver)将用户配置的和自己默认的组合起来;
2)、在SpringBoot中会有非常多的xxxConfigurer帮助我们进行扩展配置
3)、在SpringBoot中会有很多的xxxCustomizer帮助我们进行定制配置
8、配置嵌入式Servlet容器
SpringBoot默认使用Tomcat作为嵌入式的Servlet容器;
Springboot内嵌的tomcat.png
1)、如何定制和修改Servlet容器的相关配置;
方法1、修改和server有关的配置(ServerProperties实现了【EmbeddedServletContainerCustomizer】);
● server.xxx //通用的Servlet容器设置
● server.tomcat.xxx //通用的Tomcat的设置
例如:
server.port=8081
server.context‐path=/crud
server.tomcat.uri‐encoding=UTF‐8
方法2、编写一个EmbeddedServletContainerCustomizer:嵌入式的Servlet容器的定制器;来修改Servlet容器的配置
@Bean //一定要将这个定制器加入到容器中
public EmbeddedServletContainerCustomizer embeddedServletContainerCustomizer(){
return new EmbeddedServletContainerCustomizer() {
//定制嵌入式的Servlet容器相关的规则
@Override
public void customize(ConfigurableEmbeddedServletContainer container) {
container.setPort(8083);
}
};
}
2)、注册Servlet三大组件【Servlet、Filter、Listener】
由于SpringBoot默认是以jar包的方式启动嵌入式的Servlet容器来启动SpringBoot的web应用,没有web.xml文件。
▲ 注册三大组件用以下方式
①、ServletRegistrationBean
//注册三大组件
@Bean
public ServletRegistrationBean myServlet(){
ServletRegistrationBean registrationBean = new ServletRegistrationBean(newMyServlet(),"/myServlet");
return registrationBean;
}
②、FilterRegistrationBean
@Bean
public FilterRegistrationBean myFilter(){
FilterRegistrationBean registrationBean = new FilterRegistrationBean();
registrationBean.setFilter(new MyFilter());
registrationBean.setUrlPatterns(Arrays.asList("/hello","/myServlet"));
return registrationBean;
}
③、ServletListenerRegistrationBean
@Bean
public ServletListenerRegistrationBean myListener(){
ServletListenerRegistrationBean<MyListener> registrationBean = new
ServletListenerRegistrationBean<>(new MyListener());
return registrationBean;
}
● SpringBoot帮我们自动配置SpringMVC的时候,自动的注册SpringMVC的前端控制器:DispatcherServlet;
● DispatcherServletAutoConfiguration中:就使用 ServletRegistrationBean 注册
@Bean(name = DEFAULT_DISPATCHER_SERVLET_REGISTRATION_BEAN_NAME)
@ConditionalOnBean(value = DispatcherServlet.class, name = DEFAULT_DISPATCHER_SERVLET_BEAN_NAME)
public ServletRegistrationBean dispatcherServletRegistration(DispatcherServlet dispatcherServlet) {
ServletRegistrationBean registration = new ServletRegistrationBean(
dispatcherServlet, this.serverProperties.getServletMapping());
//默认拦截: / 所有请求;包静态资源,但是不拦截jsp请求; /*会拦截jsp
//可以通过server.servletPath来修改SpringMVC前端控制器默认拦截的请求路径
registration.setName(DEFAULT_DISPATCHER_SERVLET_BEAN_NAME);
registration.setLoadOnStartup(
this.webMvcProperties.getServlet().getLoadOnStartup());
if (this.multipartConfig != null) {
registration.setMultipartConfig(this.multipartConfig);
}
return registration;
}
3)、SpringBoot能支持其他的Servlet容器,替换为其他嵌入式Servlet容器
● Tomcat(默认使用)
● Jetty(长连接)
● Undertow(不支持JSP)
▲ 引入方法:引入web模块,因为默认就是使用嵌入式的Tomcat作为Servlet容器,所以需要在web模块使用exclusions标签排除tomcat,
然后引入引入其它的Servlet容器
4)、嵌入式Servlet容器自动配置原理;
步骤:
1)、SpringBoot根据导入的依赖情况,给容器中添加相应的EmbeddedServletContainerFactory
【TomcatEmbeddedServletContainerFactory】;
2)、容器中某个组件要创建对象就会惊动后置处理器;EmbeddedServletContainerCustomizerBeanPostProcessor;
只要是嵌入式的Servlet容器工厂,后置处理器就工作;
3)、后置处理器从容器中获取所有的EmbeddedServletContainerCustomizer,调用定制器的定制方法
SpringBoot支持的三个容器.png
9、使用外置的Servlet容器
1)、嵌入式Servlet容器:应用打成可执行的jar
2)、优点:简单、便携;
3)、缺点:默认不支持JSP、优化定制比较复杂(使用定制器【ServerProperties、自定义EmbeddedServletContainerCustomizer】,
自己编写嵌入式Servlet容器的创建工厂【EmbeddedServletContainerFactory】);
4)、外置的Servlet容器:外面安装Tomcat---应用war包的方式打包;
5)、步骤
①、必须创建一个war项目;(利用idea创建好目录结构)
②、将嵌入式的Tomcat指定为provided;
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring‐boot‐starter‐tomcat</artifactId>
<scope>provided</scope>
</dependency>
③、必须编写一个SpringBootServletInitializer的子类,并调用configure方法
public class ServletInitializer extends SpringBootServletInitializer {
@Override
protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {
//传入SpringBoot应用的主程序
return application.sources(SpringBoot04WebJspApplication.class);
}
}
6)、启动服务器就可以使用;
网友评论