SpringBoot web开发
静态资源
web开发必然存在着各种页面和静态资源,那么SpringBoot哪个目录存放静态资源呢,分析源码
WebMvcAutoConfiguration配置类的addResourceHandlers方法为加载静态资源
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
//表示自定义静态资源路径
if (!this.resourceProperties.isAddMappings()) {
logger.debug("Default resource handling disabled");
return;
}
Duration cachePeriod = this.resourceProperties.getCache().getPeriod();
CacheControl cacheControl = this.resourceProperties.getCache().getCachecontrol().toHttpCacheControl();
//webjars下的静态资源
if (!registry.hasMappingForPattern("/webjars/**")) {
customizeResourceHandlerRegistration(registry.addResourceHandler("/webjars/**")
.addResourceLocations("classpath:/META-INF/resources/webjars/")
.setCachePeriod(getSeconds(cachePeriod)).setCacheControl(cacheControl));
}
String staticPathPattern = this.mvcProperties.getStaticPathPattern();
if (!registry.hasMappingForPattern(staticPathPattern)) {
customizeResourceHandlerRegistration(registry.addResourceHandler(staticPathPattern)
.addResourceLocations(getResourceLocations(this.resourceProperties.getStaticLocations()))
.setCachePeriod(getSeconds(cachePeriod)).setCacheControl(cacheControl));
}
}
WebJars下的静态资源
webJars是将客户端(浏览器)资源(JavaScript,Css等)打成jar包文件,借助Maven工具对其管理
官网:https://www.webjars.org/
引入jqueryjar
<dependency>
<groupId>org.webjars</groupId>
<artifactId>jquery</artifactId>
<version>3.5.1</version>
</dependency>
默认的静态资源存放路径
webJars是已经打包好的静态资源文件,如果是自己开发的,则应该放在默认的路径下
其读取优先级为resources>static>public
首页
首页也可以放在静态资源目录下,templates目录下也可放置,但需要通过controller层跳转才能访问,需要模板引擎的支持。
Thymeleaf 模板引擎
Thymeleaf简介
Thymeleaf是一个流行的模板引擎,该模板引擎采用Java语言开发,能够处理HTML、XML、JavaScript、CSS甚至纯文本,模板引擎是一个技术名词,是跨领域跨平台的概念,在Java语言体系下有模板引擎,在C#、PHP语言体系下也有模板引擎。除了thymeleaf之外还有Velocity、jsp、FreeMarker等模板引擎,与其它模板引擎(比如FreeMaker)相比,Thymeleaf最大的特点是能够直接在浏览器中打开并正确显示模板页面,而不需要启动整个Web应用(更加方便前后端分离,比如方便类似VUE前端设计页面),功能类似。
官网:https://www.thymeleaf.org/
SpringBoot 配置Thymeleaf
导入依赖(必须是3.XX的版本)
<!--Thymeleaf-->
<dependency>
<groupId>org.thymeleaf</groupId>
<artifactId>thymeleaf-spring5</artifactId>
</dependency>
<dependency>
<groupId>org.thymeleaf.extras</groupId>
<artifactId>thymeleaf-extras-java8time</artifactId>
<version></version>
</dependency>
开发的页面放在此路径下,文件后缀名以html结尾
Controller跳转
@RestController
@RequestMapping("/test")
public class TestController {
@RequestMapping("/test")
public String hello(){
return "test";
}
}
使用Thymeleaf开发只需要导入对应依赖,然后在templates目录下开发页面即可。
Thymeleaf语法
官方说明在线文档:https://www.thymeleaf.org/doc/tutorials/3.0/usingthymeleaf.html#creating-and-configuring-the-template-engine
使用Thymeleaf的东西需要在页面引入
<html xmlns:th="http://www.thymeleaf.org">
@Controller
@RequestMapping("/test")
public class TestController {
@RequestMapping("/test")
public String hello(Model model){
model.addAttribute("msg","Thymeleaf ");
return "test";
}
}
使用Thymeleaf可以替换任何html元素,格式为th:元素名
Thymeleaf更多语法可查看相关文档
扩展SprongMVC配置
springboot对各个功能模块进行了封装,而各个功能模块有默认内置了许多功能组件,例如对于mvc模块来说,其内置了拦截器和视图解析器等各种组件,如果想开发自定义视图解析器,springboot也提供了支持。
定义一个自己的视图解析器,其步骤如下:
- 自定义一个配置类,实现WebMvcConfigurer接口
- 自定义一个视图解析器MyViewResolver
- 将自定义视图解析器注册为bean,springboot就会监测到
@Configuration
public class MyConfig implements WebMvcConfigurer {
//将自定义的视图解析器注册为bean,springboot将会监测到
@Bean
public MyViewResolver myViewResolver(){
return new MyViewResolver();
}
//自定义一个视图解析器
public static class MyViewResolver implements ViewResolver{
@Override
public View resolveViewName(String s, Locale locale) throws Exception {
return null;
}
}
}
通过断点可以看到自定义的视图解析器被加载
总结
如果想自定义组件,只需要将自定义组件注册为bean,就可以交给springboot接管了。
Thymeleaf国际化
对于一般的html文件,如果要转化为Thymeleaf页面,则需要修改为Thymeleaf的标准(主要是页面引用的静态资源),例如:
页面国际化
定义i18n文件
如果要实现中英文切换,需要自定义LocaleResolver,并将其注册为bean
public class MyLocaleResolver implements LocaleResolver {
//解析请求
@Override
public Locale resolveLocale(HttpServletRequest httpServletRequest) {
//获取请求参数
String language = httpServletRequest.getParameter("l");
System.out.println(language);
//获取默认值
Locale locale = Locale.getDefault();
//请求携带国际化参数
if(!StringUtils.isEmpty(language)){
//zh,CN
String[] str = language.split("_");
locale = new Locale(str[0],str[1]);
}
return locale;
}
@Override
public void setLocale(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Locale locale) {
}
}
@Configuration
public class MyConfig implements WebMvcConfigurer {
@Override
public void addViewControllers(ViewControllerRegistry registry) {
registry.addViewController("/").setViewName("index");
registry.addViewController("/index.html").setViewName("index");
}
@Bean
public LocaleResolver localeResolver(){
return new MyLocaleResolver(
);
}
}
点击中英文链接即可切换
注意点:
链接里面用@{},国际化用#{}
开发中注意点
springboot默认时间格式是yyyy/mm/dd,如果想使用yyyy-mm-dd格式,需要显示配置spring.mvc.format.date=yyyy-MM-dd
Thymeleaf前端传值时,如果name属性也是一个对象,那么需要用form封装,否则只能传其子属性