2. Spring Boot基本使用(Thymeleaf模板、国际化)

目录


Spring Boot专栏目录(点击进入…)



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/htmlContent-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>
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

未禾

您的支持是我最宝贵的财富!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值