提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
目录
(1).前端页面可以通过表单、url传值、ajax方式等传输数据到控制端。
方式1:若传送form表单数据,表单属性名称与Controller中方法参数名保持一致,这时可以不用注解,直接传参。
方式2:前端的参数名与Controller方法中的参数名不一致时,可以使用@RequestParam注解来指定URL参数与方法参数之间的映射关系 。
方式3:在RESTFul风格的请求中,常将参数在url中以“/param”的方式进行传递,这时就需要使用@PathVariable注解从url中获取相应的参数值。
前言
使用Spring Boot进行Web项目开发,一般会使用MVC模式,主要包括模型端、视图层和控制端。在使用Spring MVC框架进行Web应用开发时,视图层主要由HTML和JSP承担,Spring Boot提供了一些视图技术支持,官网建议使用Thymeleaf模板引擎。
一、静态资源访问
1.默认配置
ResourceProperties类里面,描述了默认的静态资源映射路径,路径数组描述了相关路径。
默认配置的/**会映射到相应路径,访问路径为:当前项目根路径+/静态资源名。
private static final String[] CLASSPATH_RESOURCE_LOCATIONS = new String[]{
"classpath:/META-INF/resources/",
"classpath:/resources/",
"classpath:/static/",
"classpath:/public/"
};
若在默认的路径下有同名的文件,则访问时优先高的先响应,优先级顺序为:
META-INF/resources > resources > static > public。
根据默认的配置(/**)拦截所有请求,若要访问 http://localhost:8080/js/index.js
(1).先去controller中找有没有相对应的请求来处理index.js,有则处理,没有则将请求交给静态资源处理器;
(2) .静态资源处理器映射到默认路径下找资源,若找到则显示,若找不到则响应404页面。
2.webjars的使用
webjars可以将前端的各种框架、组件以jar包的形式来使用。webjars将通用的Web前端资源(如js,css等)打成jar包文件,部署在Maven中央仓库上,借助Maven工具对其进行统一依赖管理,保证这些Web资源版本唯一性,升级也比较容易。
(1).在webjars官网 查找相关依赖 pom文件引用
<!-- 引入webjars依赖 -->
<dependency>
<groupId>org.webjars</groupId>
<artifactId>jquery</artifactId>
<version>3.6.0</version>
</dependency>
(2). 请求访问相关资源
请求META-INF/resources下的/webjars/jquery/3.6.0/下的jquery.js资源:http://localhost:8080/webjars/jquery/3.6.0/jquery.js
3.自定义静态资源目录
(1).配置文件中配置
在项目中用户自己定义静态资源加载的位置,需要进行配置才能正常访问到,可以在配置文件中配置或定义一个配置类配置。
项目的resources下创建文件夹mystatic,其中放置静态文件index.js
spring.resources.static-locations=classpath:/mystatic/,classpath:/METAINF/resources/,classpath:/resources/,classpath:/static/,classpath:/public/
(2).定义配置类配置
项目的resources目录下,新建文件夹res,在res中创建静态资源文件index2.js
二、用户请求和响应处理
1、用户请求与响应处理流程
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
2、用户请求参数传递
(1).前端页面可以通过表单、url传值、ajax方式等传输数据到控制端。
控制端:@RequestParam、@PathVariable、@ RequestBody、@ ModelAttribute
方式1:若传送form表单数据,表单属性名称与Controller中方法参数名保持一致,这时可以不用注解,直接传参。
使用url请求传参,请求的url为: http://localhost:8080/user?username=aaa&telephone =1111,参数名和方法的属性名保持一致,同样可以将值传输到Controller方法中。
方式2:前端的参数名与Controller方法中的参数名不一致时,可以使用@RequestParam注解来指定URL参数与方法参数之间的映射关系 。
默认参数值不能为空,否则会出现异常信息,可以使用required属性指明参数是否允许为空。
方式3:在RESTFul风格的请求中,常将参数在url中以“/param”的方式进行传递,这时就需要使用@PathVariable注解从url中获取相应的参数值。
@PathVariable注解的value属性值和地址中的第一个参数名一致,表示把此参数值传给方法的第一个参数。
方式4: 若content-type不是默认的application/x-www-form-urlcoded编码,而是application/json或者application/xml等,则可以使用@RequestBody注解。
@RequestMapping("/login")
public String login(@RequestBody User user){
return user.getUsername()+" :"+user.getPwd();
}
3、用户响应处理
(1).返回对应视图页面
如html页面或jsp页面,类名使用@Controller注解,即返回对应的页面。
(2).返回数据
如JSON格式的数据,若在类名或方法上结合使用了@ResponseBody注解,则返回 JSON格式的数据。
.可以在类名直接 使用@RestController注解,替代@Controller+@ResponseBody这两个注解
三、Thymeleaf简介
1.Thymeleaf简介
Thymeleaf是一款支持html、xml、text、javascript、css、raw等的模板引擎。
包含两种标记模板模式:html和xml,三种文本模板板式:text、javascript、css,一个无操作模板模式raw。
(1).引入依赖
<!-- 引入Thymeleaf依赖-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>
(2). 模板文件中 加入引用
<html lang="zh" xmlns:th="http://www.thymeleaf.org">
@Controller
public class HelloController {
@GetMapping("/test1")
public String test1(Model model){
model.addAttribute("message"," 新闻");
return "test1";
}
}
<h2 th:text="${message}">标题2 </h2>
(3).进行基础配置
#设置模板模式
spring.thymeleaf.mode=HTML5
#设置模板编码
spring.thymeleaf.encoding=UTF-8
#设置文档响应类型
spring.thymeleaf.content-type=text/html
#关闭缓存,不然开发时没法看到实时页面
spring.thymeleaf.cache=false
2、Thymeleaf基本语法
(1).标准表达式
① 变量表达式
变量表达式实际上是将上下文中包含的变量映射到OGNL表达式或Spring EL表达式,使用格式为:${…},一般用在html标签的元素属性中。
<input type="text" name="username" value="admin" th:value="${user.username}">
user.username表示引用用户对象user的username属性,若当前项目服务未启动或user.username值不存在,则文本输入框中显示值admin,若当前项目服务启动并且user.username值存在,则替换静态默认值admin,达到模板引擎动态替换数据。
② 选择(星号)表达式
一般来说,选择表达式和变量表达式使用效果一样,主要区别是:选择表达式计算所选对象而不是整个上下文,使用格式为:*{…}。
<div th:object="${user}">
<span th:text="*{username}"></span>
</div>
div th:object="${user}"选择表达式可以和标签th:object一起使用,完成对象属性的简写,表示直接获取object对象中的属性。 表示先取到用户对象user,再获取用户名属性。
③ 消息表达式
消息表达式主要用于模板页面国际化资源的动态替换和展示,使用格式为:#{…}。需要先定义国际化的资源文件(*.properties),再使用#{}格式动态获取资源文件的值。
#英文资源文件resource_en_US.properties:
home.welcome=Welcome!
#中文资源文件resource_zh_CN.properties:
home.welcome=欢迎!
<p th:text="#{home.welcome}">hello</p>
④ 链接网址表达式
链接网址表达式可以把有用的上下文或会话信息添加到URL中,使用格式为:@{...},一般和th:href、th:src等标签结合使用,显示Web应用中的URL链接,支持绝对路径和相对路径。
<a href="detail.html" th:href="@{/user/detail(id=${userId})}">show</a>
<a href="/unit4demo /user/detail?id=1}">show</a>
在Thymeleaf的表达式中,可以取各种类型的数据,如:文本(‘one text’,‘hello!’)、数值(0,12.3,4.5)、布尔类型(true,false)、空值(null)。在进行各种运算时,主要有使用“+”进行字符串连接、使用“+、-、*、/、%”等进行算术运算、使用“!、not、and、or”等进行逻辑运算、使用“>、<、>=、<=、==、!=(gt、lt、ge、le、eq、ne)”等进行关系运算、使用“?:”进行条件运算。
(2).常用th标签属性
① th:text属性
#控制端存储数据代码
map.put("message","<h3>test</h3>");
#前台获取代码
<p th:text="${message}">th:text</p>
<p th:utext="${message}">th:utext</p>
② th:object标签
用于表单数据对象绑定,将表单绑定到后台控制端的一个JavaBean参数,一般与th:field一起使用进行表单数据绑定。
#控制端存储数据代码
<form th:action="@{/test2}" th:object="${user}" method="post">
<input type="text" th:field="*{username}"/>
<input type="submit"/>
</form>
th:field表示绑定数据到表单元素,使用*{username}表示获取user对象中的属性username的值
th:object标签获取后台传过来的上下文中的user对象。
th:action表示后台控制器路径,使用@{}表达式进行路径处理
③ th:if和th:unless标签
th:if和th:unless表示条件判断,th:if是当条件成立时显示,th:unless则是条件不成立时显示。
<p th:if="${message}!=null" th:text="${message}">对象不空,则显示信息</p>
<p th:unless="${message}==null" th:text="${message}">对象为空,没有数据显示</p>
${message}!=null判断message是否为空对象,若不为空,则显示其内容。th:if的属性值若为非0数值、非0字符值、非“false”“off”“no”字符串等,则认为条件成立。
④ th:switch和th:case标签
th:switch和th:case标签类似于Java的switch-case结构
<div th:switch="${user.role}">
<p th:case="admin">管理员用户</p>
<p th:case="nuser">普通用户</p>
<p th:case="*">其他用户</p>
</div>
用th:switch进行用户角色判断,使用th:case进行匹配,若没有匹配成功,用th:case="*"表示,类似于Java中的default。
⑤ th:each标签
th:each标签用于循环遍历,遍历的对象可以为普通对象、列表、数组等。
#控制端在用户对象中存储了数据,并存在了map中
<div th:each="u:${user}">
<p th:text="${u.id}">id</p>
<p th:text="${u.username}">username</p>
</div>
这里使用th:each迭代获取对象,u代表迭代出的某一个具体对象,使用th:text显示u对象的id和username属性值。
例如:
#控制端在users列表中存储了user对象,并存在了map中
<tr th:each="user,iterStat: ${users}">
<td th:text="${iterStat.index+1}">index</td>
<th th:text="${user.id}">id</th>
<td th:text="${user.username}">name</td>
</tr>
th:each遍历users列表中的user对象,iterStat表示状态变量,其属性主要有:
index:当前迭代对象的index(从0开始计算)
count:当前迭代对象的index(从1开始计算)
size:被迭代对象的大小 current:当前迭代变量
even/odd:布尔值,当前循环是否是偶数/奇数(从0开始计算)
first:布尔值,当前循环是否是第一个 last:布尔值,当前循环是否是最后一个
总结
以上就是今天要讲的内容,本文仅仅简单介绍了spring和web的项目开发,主要包括模型端、视图层和控制端。