4. springBoot-web开发基础

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文件即可。

例如:

访问http://localhost:8080/

如果我们希望改变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: 判断邮箱是否合法

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值