SpringMVC 的基本组件与使用

2.4 SpringMVC对视图的支持

控制器和模型的相关使用都已经介绍了,还需要补充视图才能把数据展示给用户,完整的MVC 才算构建完成。
SpringMVC 对视图的支持非常丰富,包括各种视图的模板引擎和内置的特殊视图。同时还提供了视图自动查找能力,根据视图名通过视图解析器解析出对应的视图,这和控制器中处理器的查找和执行分离是相同的,这里分离了视图的查找和渲染。这些步骤都是在控制器的最后渲染步骤中执行的

2.4.1 视图类型

Spring MVC 通过接口 org. springframework. web. servlet. View 封装了所有视图的实现, 通过该接口的 render 方法, 依据传入的 Map 类型的 model, 对视图文件进行渲染并写入到 Response来完成处理过程。控制器只负责调用视图的渲染方法,将视图与 Model 进行绑定,而视图的渲染则是由视图的实现来执行的, 这种分离接口和实现的方式在面向对象中也是很好的解耦设计。 以下是三种常用的实现

1.内部资源视图 InternalResourceView

该视图代表内部的资源。创建该视图时,需要传入 URL, 代表内部资源的路径,而在该视图渲染时,会进行请求转发。通过调用请求的 getRequestDispatcher 方法, 传入 URL 参数, 拿到内部的 RequestDispatcher后转发这个请求。
该类型的使用场景常见的有 3种。 

 访问静态资源:

这种场景一般针对一些静态资源,例如要通过控制器根据逻辑分发到不同的静态资源时,一般可以使用这种视图。这种视图一般结合 SimpleUrl-HandlerMapping使用,视图名是静态资源路径, 处理器一般是HttpRequestHandler, 直接把资源文件数据通过流写入HTTP 响应中。


访问JSP视图: 

当使用外部 Tomcat容器启动时, 默认支持JSP视图,对于JSP视图的支持方式就是通过内部资源视图实现的。但是在 SpringBoot中,因为使用了内嵌 Tomcat容器, 故对 JSP 的支持并不充分, 这里不再详细阐述。


转发视图:

Spring MVC 提供了转发视图, 通过为视图名添加 forward:前缀, 可以在服务器内部进行一次转发,转发路径是视图名去掉 forward:前缀。转发无需浏览器重新请求, 中间请求的跳转是完全通过服务器内部进行的,所以浏览器上面的 URL 并不会改变。 

因为这 3 种的实现原理都是通过获取对应路径的RequestDispatcher 实现的, 故使用内部资源可以实现这3个功能。下面提供一个转发视图的示例,有一点需要注意的是: 在转发视图中,转发前模型中的属性通过 request. setAttribute方法添加到 request的属性中, 若要在转发的目标中使用,则需要通过 request. getAttribute 获取。因为在转发过程中 request 是不会改变的, 所以可以通过 request 进行属性共享。该示例同时演示了这种属性传递,示例代码如下: 

//访问的目标请求
@RequestMapping( path = "/forwardView", method = RequestMethod.GET)
public String forwardView( Model model) {
//设置转发前的模型属性
 model. addAttribute(" info", "转发前属性") ;
// 返回转发视图, 转发目标是 forwardTargetView
 return " forward:forwardTargetView";
}
//转发的目标请求
@RequestMapping( path = "/forwardTargetView", method = RequestMethod.GET)
public String forwardTargetView(HttpServletRequest request, Model model){
// 注入HttpServletRequest类型的参数, 拿到原始的 request
// 通过 request. getAttribute 获取请求属性,拿到转发前模型中的属性
 Object first = request. getAttribute(" info") ;
//设置模型属性
 model. addAttribute(" first", first);
 model. addAttribute(" second", "转发后属性") ;
 return "viewView";
}

相应的View视图为:

<!DOCTYPE html>
< html xmlns: th=" http://www.thymeleaf.org ">
< body>
<h2 th: text="'参数 first为:'+${ first}+',参数 second为:'+${ second}"></h2></ body>
</ html>

 访问 localhost:8080/forwardView, 可以看到页面显示了两个参数, 参数 first 为转发前属性,参数 second为转发后属性,此时页面的URL 仍然是 localhost:8080/forwardView, 该请求被正常转发了, 属性也被正常传递了。

2.重定向视图 RedirectView

 上面内部视图为请求转发提供了支持,除了转发,视图还有重定向的概念。重定向是通过向浏览器返回状态码302, 并设置响应头中的 Location为需要重定向的地址实现的。
类似于转发请求, 重定向的视图只需要在视图名前添加 redirect:前缀即可, 此时转发视图会自动处理视图名为URL 视图, 并对HTTP 的响应设置状态码为302, 响应头 Location 是根据 redirect:后面的名称取到的地址。
同时重定向时的属性传递也比较特殊,在前面提到了 RedirectAttributes类型的 Model,就是为了处理重定向时的属性的,下面的例子同时演示了重定向视图与其属性传递。

//访问的目标请求
@RequestMapping( path = "/redirectView", method = RequestMethod.GET)
public String redirectView(RedirectAttributes model) {
//设置重定向前的模型属性
 model. addFlashAttribute(" first", "重定向前属性");
// 返回重定向视图, 转发目标是 forwardTargetView
 return " redirect:redirectTargetView";
}
//重定向的目标请求
@RequestMapping( path = "/redirectTargetView", method = RequestMethod.GET)
public String redirectTargetView( Model model) {
//此时的 Model已经有了重定向前的属性了
 model. addAttribute(" second", "重定向后属性");
 return "viewView";
}

访问 localhost:8080/redirectView, 可以看到页面显示了两个参数, 参数 first 为重定向前属性, 参数 second 为重定向后属性, 此时页面的 URL 变为了 localhost:8080/redirectTargetView,该请求被正常重定向, 同时属性也被正常传递了。 

3.模版引擎视图 

模板引擎视图是使用模板引擎实现的视图类型, 模板引擎本身的设计目的就是为了使页面的静态内容与页面的数据动态内容分离, 即为了实现视图的功能而设计的。 SpringMVC提供了强大的扩展功能,我们可以把任意模板引擎嵌入到 SpringMVC 的视图解析中, 而不影响任何其他功能, 这也体现了 MVC 分离的优势。
在 Spring Boot中,官方推荐使用 Thymeleaf作为默认的模板引擎, 用于视图解析。在上面的各种例子中,使用的模板解析也都是 Thymeleaf, 其返回的视图类型是ThymeleafView。
 Thymeleaf语法的最大特点是使用自然的 HTML 标记语言, 在无数据展示时, 仍然可保持页面的完整性,其模板自身就是原始的页面。 Model数据绑定均使用 HTML 中的标签属性,同时使用独立的命名空间, 使得未渲染的页面也可在浏览器中打开并保持设计时的样式。其模板在前面已经看到过了,下面简单地演示其基本语法, 代码如下。 

thymeleafView.html内容如下: 

<!DOCTYPE html>
< html xmlns: th=" http://www.thymeleaf.org ">
 < body>
  <h2 th: text="'姓名: ' + ${ name}"></h2>
  < div>
    < span>性别: </ span>
    < span th: if="${ sex == 0}">女</ span>
    < span th: if="${ sex == 1}">男</ span>
  </ div>
  < div>
    < span>兴趣: </ span>
    < ol>
      < li th: each="h:${ hobbies}" th: text="${h}"></ li>
    </ ol>
  </ div>
 </ body>
</ html>

其中包含了直接获取 Model属性作为标签文本内容的tth:text="${key}"语法, 使用 Model属性进行逻辑判断的th:if=''${condition}",以及遍历 Model 属性的th:each="${key:iterator}"语法, 相应的处理器为: 

@RequestMapping("/thymeleafView")
public String thymeleafView( Model model) {
// 为 Model 添加属性
 model. addAttribute(" name", "康凌峰") ;
 model. addAttribute(" sex", 1);
 List< String> hobbies = new ArrayList<>();
 hobbies. add("计算机");
 hobbies. add("数学");
 hobbies. add("游戏");
// 添加 List 类型的属性
 model. addAttribute(" hobbies", hobbies);
 return "thymeleafView";
}

除了 Thymeleaf模板引擎外, 视图层还支持其他很多类型的模板引擎, 例如FreeMarker,要在 Spring Boot项目中使用FreeMarker模板引擎很简单, 只需要在项目中加入依赖即可。示例代码如下: 

< dependency>
<groupId> org. springframework, boot</groupId>
<artifactId> spring- boot- starter- freemarker</artifactId>
</ dependency>

默认情况下, 把 classpath:/ templates目录下的 ftl文件作为FreeMarker模板解析。 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

康康峰

你的鼓励将是我创作的最大动力

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

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

打赏作者

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

抵扣说明:

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

余额充值