1. springBoot对静态资源的映射
boot对静态资源的配置都在类WebMvcAutoConfiguration中,打开该类,可以看到有一个方法addResourceHandlers,方法定义如下:
public void addResourceHandlers(ResourceHandlerRegistry registry) {
if (!this.resourceProperties.isAddMappings()) {
logger.debug("Default resource handling disabled");
} else {
Duration cachePeriod = this.resourceProperties.getCache().getPeriod();
CacheControl cacheControl = this.resourceProperties.getCache().getCachecontrol().toHttpCacheControl();
if (!registry.hasMappingForPattern("/webjars/**")) {
this.customizeResourceHandlerRegistration(registry.addResourceHandler(new String[]{"/webjars/**"}).addResourceLocations(new String[]{"classpath:/META-INF/resources/webjars/"}).setCachePeriod(this.getSeconds(cachePeriod)).setCacheControl(cacheControl));
}
String staticPathPattern = this.mvcProperties.getStaticPathPattern();
if (!registry.hasMappingForPattern(staticPathPattern)) {
this.customizeResourceHandlerRegistration(registry.addResourceHandler(new String[]{staticPathPattern}).addResourceLocations(WebMvcAutoConfiguration.getResourceLocations(this.resourceProperties.getStaticLocations())).setCachePeriod(this.getSeconds(cachePeriod)).setCacheControl(cacheControl));
}
}
}
从该代码中可以看出:
1.1 webjars引入插件
所有 /webjars/** ,都去 classpath:/META-INF/resources/webjars/ 找资源,webjars是以jar包的方式引入静态资源。webjars官网地址:http://www.webjars.org/
例如:引入jQuery
操作步骤:
1)打开webjars官网
2)找到jQuery,以maven的形式查看,如图:
3)复制maven依赖到项目
<dependency>
<groupId>org.webjars</groupId>
<artifactId>jquery</artifactId>
<version>3.3.0</version>
</dependency>
引入之后,jar包如下:
可以看到其目录结构正是 META-INF/resources/webjars/jQuery,该路径正好对应映射 /webjars/** 如果,我们在浏览器发送localhost:8080/webjars/abc 这个连接会去类路径下(jar包)/META-INF/resources/webjars/abc,但是这时候我们的目录下没有abc,所以会报错,如图:
访问jQuery:http://localhost:8080/webjars/jquery/3.3.0/jquery.js,如图:
4)在项目中引入对应的插件
<link href="asserts/css/bootstrap.min.css" rel="stylesheet" th:href="@{/webjars/bootstrap/4.0.0/css/bootstrap.css}">
<!-- Custom styles for this template -->
<link href="asserts/css/signin.css" rel="stylesheet" th:href="@{/asserts/css/signin.css}">
1.2 引入自己的静态资源
在方法中,有一个变量staticPathPattern ,其值就是 /** ,在ResourceProperties中,staticLocations的值是一个常量CLASSPATH_RESOURCE_LOCATIONS,其是一个字符串数组,
private static final String[] CLASSPATH_RESOURCE_LOCATIONS =
new String[]{"classpath:/META-INF/resources/", "classpath:/resources/", "classpath:/static/", "classpath:/public/"};
也就是 访问当前项目的任何资源,都去(静态资源的文件夹)找映射
"classpath:/META‐INF/resources/",
"classpath:/resources/",
"classpath:/static/",
"classpath:/public/"
"/":当前项目的根路径
只要我们将我们的静态资源文件放在上面的目下,访问的时候只要没有处理的逻辑,都会在静态资源的文件夹下查找内容。
1.2.1 classpath:/META‐INF/resources/
classpath为resources目录,例如:
该方式一般不会有人用
1.2.2 classpath:/resources/
在类路径根路径下(resources)下创建一个文件夹,名称为resources,例如:
1.2.3 classpath:/public/
将自己的文件夹asserts复制到public目录下,如图;
我们需要访问Chart.min.js,在浏览器输入连接http://localhost:8080/asserts/js/Chart.min.js 运行结果如下:
注意:因为程序会去静态资源文件夹下查找,所以我们在访问的时候不需要添加静态资源文件夹public
1.2.4 classpath:/static/
同classpath:/public/
1.3 欢迎页
还是类WebMvcAutoConfiguration在中有方法welcomePageHandlerMapping,该方法用来处理欢迎页的映射,代码如下:
@Bean
public WelcomePageHandlerMapping welcomePageHandlerMapping(ApplicationContext applicationContext, FormattingConversionService mvcConversionService, ResourceUrlProvider mvcResourceUrlProvider) {
WelcomePageHandlerMapping welcomePageHandlerMapping = new WelcomePageHandlerMapping(new TemplateAvailabilityProviders(applicationContext), applicationContext, this.getWelcomePage(), this.mvcProperties.getStaticPathPattern());
welcomePageHandlerMapping.setInterceptors(this.getInterceptors(mvcConversionService, mvcResourceUrlProvider));
welcomePageHandlerMapping.setCorsConfigurations(this.getCorsConfigurations());
return welcomePageHandlerMapping;
}
最后我们找到了,程序会读取下面的数组的值
private static final String[] CLASSPATH_RESOURCE_LOCATIONS = new String[]{"classpath:/META-INF/resources/", "classpath:/resources/", "classpath:/static/", "classpath:/public/"};
最后调用getIndexHtml方法,查找上面路径中的index.html页面,并被/**映射
如图:
所以,我们只需要在静态资源文件夹下放一个index.html文件即可。
例如:
如果我们希望改变icon,也很简单,只需要在静态资源文件夹中放入你的图标即可
1.4 改变静态文件夹路径
如果我们不想使用boot提供的默认的静态文件夹,我们希望使用指定的文件夹的话,也是可以配置的
spring.resources.static-locations=classpath:/zoudm
如果要配置多个路径,可以直接用逗号分隔
spring.resources.static-locations=classpath:/zoudm,classpath:/zoudm1
注意:如果改变了静态文件夹路径,那么boot的默认的就没用了。
2. 表单数据校验
springboot对表单数据校验的技术特点:springboot中使用了hibernate-validate校验框架,在boot的web启动器中已经包含了该jar包,如图:
2.1 校验步骤
2.1.1 以注解的形式添加校验规则
例如:非空校验 @NotBlank
注意:@NotBlank默认的校验不通过信息为“不能为空”
2.1.2 在 Controller 中开启校验—— @Valid
在参数上添加注解 @Valid 进行开启注解校验
2.1.3 注入校验结果——BindingResult
在参数列表中加入参数BindingResult,该对象封装了校验的结果信息
BindingResult会根据当前对象User的添加了校验的属性字段开启变量,名称与属性名称相同,也就是说,在前台通过th:error获取错误信息的时候,可以通过“ xx.属性 ”的形式来完成,但是这个“ xx ”是什么了?当校验User对象不合法的时候,这个User对象会被SpringMVC将它的参数user放到ModelAndView中做传递,传递到页面当中,user被放到ModelAndView中的时候,它的key会采用对象的驼峰式的命名方式。所以我们在前台可以通过th:error="${user.name}",来获取属性,但是,值得注意的是,这里的user并不是参数列表中的user,而是BindingResult创建的user变量。
2.2 使用th:error显示错误信息
当我们使用BindingResult进行数据校验封装错误信息的时候,可以在Thymeleaf模板中使用th:error来显示错误信息,例如:
用户姓名: <input type="text" name="name"/><font color="red" th:errors="${user.name}"></font><br/>
运行项目,发现程序报错了,根据错误信息,可以知道在域中没有user对象,这是因为我们页面跳转是通过页面跳转方式进行的,该对象没有被保存在域中
2.3 解决数据校验时的异常问题
解决异常的方法, 在跳转页面的方法中注入一个对象, 来解决问题。 要求参数对象的变量名必须是对象的类名的全称首字母小写,因为spring中对变量名默认采用的驼峰式命名规则。
例如:
/**
* 解决异常的方式。 可以在跳转页面的方法中注入一个 Uesrs 对象。
* 注意: 由于 springmvc 会将该对象放入到 Model 中传递。 key 的名称会使用
该对象的驼峰式的命名规则来作为 key。
* 参数的变量名需要与对象的名称相同。 将首字母小写。
* *
@param users
* @return
*/
@RequestMapping("/addUser")
public String showPage( User user){
return "add";
}
注意:这里要求比较死板,我们是否一定要将变量名以驼峰式命名规则写了?当然是否,spring给我们提供了一个注解@ModelAttribute,可以指定变量名,例如:
@RequestMapping("/addUser")
public String showPage(@ModelAttribute("aa") User user){
return "add";
}
2.4 常见的校验注解
1)@NotBlank: 判断字符串是否为 null 或者是空串(去掉首尾空格)
2)@NotEmpty: 判断字符串是否 null 或者是空串
3)@Length: 判断字符的长度(最大或者最小)
4)@Min: 判断数值最小值
5)@Max: 判断数值最大值
6)@Email: 判断邮箱是否合法