目录
Spring Boot基本使用(Thymeleaf模板、国际化)
Spring Boot对Spring MVC的装配
SpringBoot对SpringMVC的默认配置的内容都在WebMvcAutoConfiguration中
(1)配置了ContentNegotiatingViewResolver和BeanNameViewResolver,也就是视图解析器,只要给容器添加视图解析器,ContentNegotiatingViewResolver就会自动将其组合进来,组合了所有的视图解析器
(2)静态资源首页访问
(3)图标favcicon.ico
(4)静态资源文件夹路径和webjars
(5)自动注册Converter、GenericConverter、Formatter,自己添加的格式化器转换器只需要放在容器中即可
(6)HttpMessageConverter功能,如果需要自己添加消息转换器,只需要放在容器中即可
消息转换器:SpringMVC用来转换Http请求和响应的
(7)MessageCodeResolver定义错误代码生成规则
(8)ConfigurableWebBindingnitializer初始化Web数据绑定器;把请求数据绑定到JavaBean中
Spring Boot对于整个web的配置远远不仅仅只有这些,可以查看jar包的Web模块,spring-boot-autoconfigure-版本.RELEASE.jar里面Web块里面配置了大量的Web场景的自动配置
Spring Boot对静态资源的映射规则
按照以前的形式,一个Web应用在main文件夹下会有一个webapp文件夹;将页面都导入在这个文件夹,现在的Spring Boot工程是一个jar的方式,这种方式的页面要按照一定的规则存放,规则都是在WebMvcAutoConfiguration里面
什么是WebJars?
WebJars是被打包成JAR文件(Java Archive)形式的客户端Web资源库(例如:jQuery、Bootstrap等)。即WebJars是库,是各种Web资源库,打包成jar文件形式
原理:任何兼容Servlet 3标准的容器,都会自动把WEB-INF/lib目录中的WebJars的JAR包视作静态资源。这是因为任何在WEB-INF/lib目录中的JAR包中的META-INF/resources目录中的内容都会自动视作公开的静态资源
xxxxAutoConfiguration:给容器中自动配置组件;
xxxxProperties:配置类来封装配置文件的内容;
1.以webjars的形式访问
所有/webjars/**请求都会去classpath:/META-INF/resources/webjars/下找资源。webjars:以jar包的方式引入静态资源
访问路径:http://localhost:8080/webjars/jqeury/3.5.1/jquery.js
<dependency>
<groupId>org.webjars</groupId>
<artifactId>jquery</artifactId>
<version>3.5.1</version>
</dependency>
(1)导入相关依赖
在官网生成相关资源的Webjars的Maven依赖:https://www.webjars.org/
(2)如何访问?
访问路径:http://localhost:8080/webjars/jqeury/1.12.4/jquery.js
2.非webjars访问
org.springframework.boot.autoconfigure.web.servlet
表示访问当前项目的任何资源,如果没有被处理,则默认去下面的路径去找
在这些路径里存放静态资源都是没有问题,都是可以被访问到
classpath:/META-INF/resources/
classpath:/resources/
classpath:/static/
classpath:/public/
在application.propertis中配置静态资源访问(加载)路径
#端口号
server.port=8081
#默认前缀
spring.mvc.view.prefix=/
#响应页面默认后缀
spring.mvc.view.suffix=.html
#默认值为 /**
spring.mvc.static-path-pattern=/**
#指定静态资源加载路径,多个使用英文逗号隔开
spring.resources.static-locations=classpath:/META-INF/resources/,classpath:/resources/,classpath:/static/,classpath:/public/
3.配置欢迎页面
在Spring Boot中,默认的欢迎界面是index.html(static,静态文件)
使用template下文件作为欢迎页面
(1)实现WebMvcConfigurer的addViewControllers
@Configuration
public class DefaultIndexView implements WebMvcConfigurer {
@Override
public void addViewControllers(ViewControllerRegistry registry) {
registry.addViewController("/").setViewName("index");
registry.addViewController("/index").setViewName("index");
registry.addViewController("/index.html").setViewName("index");
WebMvcConfigurer.super.addViewControllers(registry);
}
}
(2)配置对应Controller
@Controller
public class PageController {
@RequestMapping("/index")
public String getIndex() {
return "/index";
}
}
4.配置网站图标
在Spring Boot项目的issues中提出,如果提供默认的Favicon图标可能会导致网站信息泄露。如果用户不进行自定义的Favicon的设置,而Spring Boot项目会提供默认的图标,那么势必会导致泄露网站的开发框架。
因此,在Spring Boot2.2.x中,将默认的favicon.ico移除,同时也不再提供下述.properties中的属性配置。也就是没有了spring.mvc.favicon的配置
在早些版本中Spring Boot对Favicon进行了默认支持,并且通过如下配置进行关闭操作:
#关闭
spring.mvc.favicon.enable=false
2.2.x之前配置
①只需要在properties、yml文件中配置
spring.mvc.favicon.enabled=false
②在resources文件夹中添加favicon.ico图片既可
2.2.x之后配置
(1)不需要在yml、properties文件中配置
(2)在html中配置
自定义网站的Favicon(2.2.x之后)
正常情况下,直接将命名为favicon.ico的网站图标放在resources或static目录下即可显示,但如果使用的版本无法显示。
首先排除浏览器缓存的问题。在撰写本文时多次遇到浏览器缓存导致无法展示的情况。一般操作步骤:①清除浏览器缓存、②重启浏览器;即可展示。
#关闭模板缓存
spring.thymeleaf.cache=false
logo在线生成工具:https://tool.lu/favicon/
同时,如果需要在页面中通过代码进行引入(实现不同页面不同logo图标)。使用Thymeleaf时的引入方式
<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="UTF-8"/>
<title>Hello Favicon</title>
<link rel="icon" th:href="@{/favicon.ico}" type="image/x-icon"/>
<link rel="bookmark" th:href="@{/favicon.ico}" type="image/x-icon"/>
</head>
<body>
<h1>Hello Favicon!</h1>
</body>
</html>
th:href可以自定义路径,相对于图标文件存放的路径
如果使用其他前端框架,可使用如下方式:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8"/>
<title>Hello Favicon</title>
<link rel="icon" href="/favicon.ico" type="image/x-icon"/>
<link rel="bookmark" href="/favicon.ico" type="image/x-icon"/>
</head>
<body>
<h1>Hello Favicon!</h1>
</body>
</html>
注意事项
在使用的过程中,遇到最多的问题其实就是缓存导致的问题,比如Thymeleaf缓存未关闭、浏览器缓存等。所以,如果在浏览器中打开网页并没有展示出效果,并不代表程序没起效。这时,可采用直接访问favicoin的形式来验证
http://localhost:8080/favicon.ico
## 5.修改启动banner logo (1)在src/main/resources下新建一个banner.txt文件 (2)将生成的字符图案复制到classpath:resources/banner.txt文件中 网站生成字符: http://patorjk.com/software/taag/
(3)重新运行Spring Boot项目,启动时图案就改变了
Maven使用Thymeleaf
1.导入maven依赖
只需加入thymeleaf-2.1.4.RELEASE.jar(http://www.thymeleaf.org/download.html)包,若用maven,则加入如下配置
<dependency>
<groupId>org.thymeleaf</groupId>
<artifactId>thymeleaf</artifactId>
<version>2.1.4</version>
</dependency>
2.然后增加头文件
<html lang="en" xmlns:th="http://www.thymeleaf.org">
3.使用th标签动态替换掉静态数据
后台传出的message会将静态数据“Red Chair”替换掉,若访问静态页面,则显示数据“Red Chair”
<td th:text="${message}">Red Chair</td>
Spring Boot基本使用(staic、template)
1.静态文件
用来保存静态文件的目录,比如html、js、css、jpg等,不需要服务器进行数据绑定的页面
直接在static放一个hello.html,然后直接输入http://localhost:8080/hello.html便能成功访问(好像可以新建一个public文件夹,也可以放静态文件)
也可以通过controller跳转
@Controller
public class IndexController {
@RequestMapping("/static")
public String sayHello() {
return "index.html";
}
}
然后输入http://localhost:8080/Hi就可以成功访问
2.动态模板文件(Thymeleaf模板)
用来保存动态模板文件的目录。比如Freemarker、Jsp、Thymeleaf等需要服务器渲染的文件。由于页面渲染需要服务器中的数据,所以该文件必须经过Controller控制器进行Model数据绑定后,由服务器进行跳转,所以直接访问无意义,也访问不到。
Spring Boot建议不要使用JSP,默认使用Thymeleaf来做动态页面
Thymeleaf模板
一个XML/XHTTML/HTML5模板引擎,能够将一组转换应用于模板文件,以便显示由应用程序生成的数据或文本。它更适合在Web应用程序中为XHTML/HTML5提供服务,但它可以处理任何XML文件,无论是Web还是独立的应用程序
(1)pom导入Thymeleaf依赖
现在pom中要添加Thymeleaf组件
<!--html解析引擎 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>
Thymeleaf最新版本已经是3.0.11(2018年),版本交由Spring Boot依赖控制
(2)配置Thymeleaf(使用默认值)
Thymeleaf的常用配置
要使用thymeleaf需要按照它的配置规则,只要把HTML页面放在classpath:/templates/下,thymeleaf就能自动进行渲染(Spring Boot中对它进行了默认的配置)
都以“spring.thymeleaf.”开头
Thymeleaf常用配置 | 描述 |
---|---|
prefix = classpath:/templates/ | 在构建URL时预先查看名称的前缀 |
suffix = .html | 构建URL时附加到查看名称的后缀 |
template-resolver-order = | 链中模板解析器的顺序。默认情况下,模板解析器为第一名 |
cache = true | 启用模板缓存 |
check-template = true | 在呈现模板之前检查模板是否存在 |
check-template-location = true | 检查模板位置是否存在 |
content-type = text/html | Content-Type值 |
enabled = true | 启用MVC Thymeleaf视图分辨率 |
encoding = UTF-8 | 模板编码 |
mode = HTML5 | 应用于模板的模板模式 |
view-names = | 可以解析的视图名称的逗号分隔列表 |
excluded-view-names = | 从解决方案中排除的视图名称的逗号分隔列表 |
(3)创建控制器Controller
@Controller
public class IndexController {
@RequestMapping("/template")
public String sayHello() {
return "/index";
}
@RequestMapping("/static")
public String sayHello() {
return "redirect:/index.html";
}
}
在tempates文件夹中也新建一个index.html但内容不同
①(static)
直接访问http://localhost:8080/index.html,结果显然访问的是静态文件夹里面的那个hello.html
②(template)
访问http://localhost:8080/templdate,无法访问到index.html(static)了;因为静态页面的return默认是跳转到/static/index.html,当在pom.xml中引入了thymeleaf组件,动态跳转会覆盖默认的静态跳转,默认就会跳转到/templates/index.html,注意看两者return代码也有区别,动态没有html后缀
③使用动态模板后(template),跳转到(static)
如果用了动态模板还想返回static中的页面,那么就要用重定向:return “redirect:/index.html”;跳转到/static/index.html
return "redirect:/index.html";
视图映射(WebMvcConfigurer)
template文件夹不是静态资源文件夹,默认是无法直接访问的,所以要添加视图映射
也就是将该请求映射给内部Contorller,由Controoler进行数据绑定后返回给用户
在实际开发中,如果只是靠Spring Boot的自动配置,是完全不够用的。所以需要定制一些的拦截器之类的。Spring Boot提供了扩展,如果想要保持Spring Boot对Spring MVC自动配置的功能,而且只是想添加一些额外的功能,可以添加一个自己@Configuration类,但是这个配置类的类型要求是WebMvcConfigurerAdapter,并且不能标注@EnableWebMvc注解
WebMvcConfigurerAdapter在2.0的版本被废弃,在2.0以后提供了WebMvcConfigurationSupport实现定制,但是如果继承这个类就会导致WebMvcAutoConfiguration失效,所以实现WebMvcConfigurer这个接口更好,这样原本的默认配置也有,自己加的扩展配置也成立
@Configuration
public class DefaultIndexView implements WebMvcConfigurer {
@Override
public void addViewControllers(ViewControllerRegistry registry) {
// 浏览器发送/index请求会来到index(Controller)
registry.addViewController("/index").setViewName("index");
WebMvcConfigurer.super.addViewControllers(registry);
}
}
// 页面跳转的重写方法,访问一个另页面
@Override
public void addViewControllers(ViewControllerRegistry registry) {
registry.addViewController("/login").setStatusCode(HttpStatus.OK).setViewName("login");
}
addViewController:访问URL
setStatusCode:响应状态码
setViewName:跳转URL
@Autowired
private TestInterceptor testInterceptor; // 自定义拦截器
// 拦截器addInterceptor: 需要一个实现HandlerInterceptor接口的拦截器实例
// 主要用途:进行用户登录状态的拦截,日志的拦截
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(testInterceptor)
.addPathPatterns("/**")
.excludePathPatterns("/api/**");
}
addInterceptor:用于设置拦截器的过滤路径规则
addPathPatterns:拦截相应的请求
excludePathPatterns:用于设置不需要拦截的过滤规则
// 静态资源映射规则:自定义静态资源映射目录,配置静态访问资源
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
registry.addResourceHandler("/my/**")
.addResourceLocations("classpath:/my/");
}
addResourceHandler:指对外暴露的访问路径
addResourceLocations:指内部文件放置的目录
// 默认静态资源处理器
@Override
public void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer) {}
// 信息转换器
@Override
public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {}
// 跨域
@Override
public void addCorsMappings(CorsRegistry registry) {
registry.addMapping("/cors/**")
.allowedHeaders("*")
.allowedMethods("POST", "GET")
.allowedOrigins("*");
}
国际化
国际化信息也称为本地化信息 。 Java 通过 java.util.Locale 类来表示本地化对象,它通过 “语言类型” 和 “国家/地区” 来创建一个确定的本地化对象
通过浏览器的语言信息,来动态显示页面的国际化效果。即美国使用的语言是英文,中国访问网站就是中文
1.国际化配置文件,抽取页面需要显示的国际化消息
在resource目录下创建一个i18n文件夹用于管理国际化文件,在i18n文件夹下创建三个文件。文件名格式:基础名(login) + 语言代码(zh) + 国家代码(CN),用下划线“_”连接
国际化文件
login.properties 用于存放默认
login_zh_CN.properties 用于存放中文
login_en_US.properties 用于存放英文
2.配置管理国际化资源组件(Spring Boot默认配置好了)
org.springframework.boot.autoconfigure.context.MessageSourceAutoConfiguration
3.编写页面(使用Thymeleaf模板)
<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="UTF-8">
<html>
</head>
<body>
动态页面
<h3 th:text="#{login.btn}"></h3>
<h3 th:text="#{login.password}"></h3>
<h3 th:text="#{login.remember}"></h3>
<h3 th:text="#{login.tip}"></h3>
<h3 th:text="#{login.username}"></h3>
</body>
</html>
4.配置properties
Spring Boot默认国际化文件为:classpath:message.properties,如果放在其它文件夹中,则需要在application.properties配置属性spring.messages.basename:
#表示放在classpath的i18n文件夹,文件前缀为mess
spring.messages.basename=i18n.mess
使用IDEA实现国际化
在配置的时候,idea在文件的下面有一个Resource Bundle可以方便添加国际化
创建:Resource Bundle
生成目录
实现点击按钮实现国际化(自定义,不使用默认配置)
如果要实现点击按钮实现国际化,需要了解原理。国际化之所以有效果,有一个重要的对象Locale:区域信息对象。所有要获取区域信息对象的时候,有一个组件叫做LocaleResolver作用是来获取区域对象
Spring Boot默认配置了区域信息解析器(WebMvcAutoConfiguration)。如果在属性里面指定了固定的,就使用固定的,否则使用AcceptHeaderLocaleResolver,它会解析区域信息,从request请求头里面去拿区域信息;如果需要自己去实现点击按钮切换国际化,就可以把这个解析器换掉即可
org.springframework.boot.autoconfigure.web.servlet.WebMvcAutoConfiguration
org.springframework.web.servlet.i18n.AcceptHeaderLocaleResolver
默认:本地区域信息(Locale)
1.实现区域解析器(LocaleResovler)
public class TestLocaleResovler implements LocaleResolver {
/**
* 解析区域信息
*/
@Override
public Locale resolveLocale(HttpServletRequest request) {
// 获取参数
String parameterLanguage = request.getParameter("locale");
// 获取区域信息
Locale locale = request.getLocale();
if (!StringUtils.isEmpty(parameterLanguage)) {
String[] split = parameterLanguage.split("_");
locale = new Locale(split[0], split[1]);
}
return locale;
}
/**
* 设置区域信息
*/
@Override
public void setLocale(HttpServletRequest request, HttpServletResponse response, Locale locale) { }
}
2.配置自定义区域解析器(@Bean)
@Configuration
public class DefaultIndexView implements WebMvcConfigurer {
@Override
public void addViewControllers(ViewControllerRegistry registry) {
registry.addViewController("/")
.setStatusCode(HttpStatus.OK)
.setViewName("index");
WebMvcConfigurer.super.addViewControllers(registry);
}
@Bean
public LocaleResolver localeResolver() {
return new TestLocaleResovler();
}
}
如果不生效检查配置类中的TestLocaleResovler的方法名是不是localeResolver
3.页面配置
<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="UTF-8">
<html>
</head>
<body>
动态页面
<h3 th:text="#{login.btn}"></h3>
<h3 th:text="#{login.password}"></h3>
<h3 th:text="#{login.remember}"></h3>
<h3 th:text="#{login.tip}"></h3>
<h3 th:text="#{login.username}"></h3>
<a th:href="@{index.html?locale=zh_CN}">中文</a>
<a th:href="@{index.html?locale=en_US}">English</a>
</body>
</html>