SpringBoot中web模板渲染的实现

 更新时间:2022年02月08日 15:38:14   作者:起床oO  
本文主要介绍了SpringBoot中web模板渲染的实现,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

模板

开发Web站点的本质,其实就是根据浏览器发起的请求(输入),生成HTML代码返回给浏览器(输出)。在之前的学习中,我们已经通过文件的形式存储起来而不是直接在Java代码中生成HTML代码。另一方面,博客站点是动态的,即不同的请求返回的内容可能不同。但是对于同一类请求,例如访问id分别为1和2的两篇文章,对应的URL分别为/blogs/1和/blogs/2,他们返回的HTML代码片段的结构几乎是一样的:

<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml"
      xmlns:th="http://www.thymeleaf.org">
<div class="col-sm-8">
  <div class="page-header">
    <h2 th:text="${title}">Cum sociis(博客标题)</h2>
    <p class="blog-post-meta"><span th:text="${createdTime}">2015年2月3日</span> 标签:<a href="#" rel="external nofollow"  rel="external nofollow"  rel="external nofollow" >Web开发</a></p>
  </div>

  <div class="blog-post-content" th:text="${content}">
    ...
    (这里是博客内容)
  </div>
</div>
</html>

th:text="${title}"就是告诉模板引擎,用title变量作为<h2>标签的内容(createdTime,content也是一样)。

注意为了显示博客创建时间,我们将时间放入了一个<span>标签中,用于和其他文字区分开。

Model

为了让模板引擎知道这些变量的值,我们需要再@Controller做一些工作:

@RequestMapping("/index/{id}")
    public String getIndex(@PathVariable("id") int id ,Model model) {
//        return "index";
        //这里模拟一些数据
        model.addAttribute("title","This is a blog with id = " + id);
        model.addAttribute("CreatedTime","2017-11-13");
        model.addAttribute("content","This is content");
        return "index";
    }

在上面的代码中,index()方法增加了一个Model类型的参数。通过Spring MVC框架提供的Model,可以调用其addAttribute方法,这样Thymeleaf可以访问Model中的变量从而进行模板渲染。上述例子中可以看到,title变量的值是根据URL中的@PathVariable来确定的,虽然简单,但是这已经是一个动态页面了。

在Servlet编程中,如果希望在页面中动态渲染信息,一般需要往HTTPRequest中添加属性,然后再JSP中获取。其实Model的属性实际上也是放在HttpRequest的属性中,但是Spring MVC提供了更高层的抽象,帮你屏蔽了HttpRequest,你看到的只有直接以MVC中M(即Model)

如果你依然希望使用HttpRequest,HttpResponse和HttpSession等原生的Servlet API对象,往Controller方法中增加对应类型的参数即可,你在方法中就能直接使用了,Spring MVC会传递给你正确的对象。

运行结果:

Model中添加对象

在上面的例子中,我们已经将单篇文章的页面动态化,但是这个动态化只是一个例子,当我们真正拥有数百篇博文时,并且还会添加(或者删除,更新)。显然不能够直接在@Controller方法中这样来填充Model,另外如果需要渲染文章列表,那么这种方法显然也是不行的。

为了解决这个问题,我们需要使用参考代码JAR包中提供的Blog类:

package Entity;

import java.util.Date;

public class Blog {
    private int id;
    private String title;
    private String content;
    private Date createdTime;
    public int getId() {
        return id;
    }
    public void setId(int id) {
        this.id = id;
    }
    public String getTitle() {
        return title;
    }
    public void setTitle(String title) {
        this.title = title;
    }
    public String getContent() {
        return content;
    }
    public void setContent(String content) {
        this.content = content;
    }
    public Date getCreatedTime() {
        return createdTime;
    }
    public void setCreatedTime(Date createdTime) {
        this.createdTime = createdTime;
    }
    
}

在单篇文章页面里,对于每一个属性,都需要调用一次Model.addAttribute()方法,属性如果很多就会很不方便。现在我们有了Blog对象,可以将它放入Model:

@RequestMapping("/index/{id}")
    public String getIndex(@PathVariable("id") int id ,Model model) {
//        return "index";
        //这里模拟一些数据
//        model.addAttribute("title","This is a blog with id = " + id);
//        model.addAttribute("CreatedTime","2017-11-13");
//        model.addAttribute("content","This is content");
        Blog blog = new Blog();
        blog.setId(1);
        blog.setTitle("This is a blog with id = " + id);
        blog.setContent("This is content");
        blog.setCreatedTime(new Date());
        model.addAttribute("blog",blog);
        return "index";
    }

根据URL中的id获取对应的Blog对象,然后交给模板引擎渲染blog,相应的在模板中的变量表达式也要发生变化:

<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml"
      xmlns:th="http://www.thymeleaf.org">
<div class="col-sm-8">
  <div class="page-header">
    <h2 th:text="${blog.title}">Cum sociis(博客标题)</h2>
    <p class="blog-post-meta"><span th:text="${blog.createdTime}">2015年2月3日</span> 标签:<a href="#" rel="external nofollow"  rel="external nofollow"  rel="external nofollow" >Web开发</a></p>
  </div>

  <div class="blog-post-content" th:text="${blog.content}">
    ...
    (这里是博客内容)
  </div>
</div>
</html>

运行结果:

提高:往Model中添加对象有两种方式:

  1. model.addAttribute("blog",blog);
  2. model.addAttribute(blog);

使用第二种时,对象在Model中的命名默认为类名的首字母小写形式,任何时候对于同一种类型,只可能存在一个这样的“匿名”对象。

日期格式化

文章页面经过模板渲染处理后,还存在一个小问题:日期格式。现在对于${blog.createdTime}的渲染结果是Mon Nov 13 16:18:08 GMT+08:00 2017 ,这是因为${blog.createdTime}是一个Date对象,模板引擎在渲染的时候直接调用它的toString()方法。格式化日期是一个非常常见的任务,为此Thymeleaf提供了内置的支持:

<p><span th:text="${#dates.format(blog.createdTime,'yyy-MM-dd')}">2015年2月3日</span> 标签:<a href="#" rel="external nofollow"  rel="external nofollow"  rel="external nofollow" >Web开发</a></p>

#dates是Thymeleaf内置的一个工具类,format()方法可以指定日期的格式。

运行结果:

 到此这篇关于SpringBoot中web模板渲染的实现的文章就介绍到这了,更多相关SpringBoot 模板渲染内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Mybatis逆向工程笔记小结

    Mybatis逆向工程笔记小结

    MyBatis官方为我们提供了一个逆向工程,通过这个逆向工程,只需要建立好数据表,MyBatis就会根据这个表自动生成pojo类、mapper接口、sql映射文件,本文主要介绍了Mybatis逆向工程笔记小结,具有一定的参考价值,感兴趣的可以了解一下
    2024-05-05
  • Java中Socket实现数据通信的示例代码

    Java中Socket实现数据通信的示例代码

    本文主要介绍了Java中Socket实现数据通信的示例代码,Socket可以建立起客户端和服务器之间的连接,实现数据的传输和交互,感兴趣的可以了解一下
    2023-09-09
  • springmvc多事务提交和回滚问题

    springmvc多事务提交和回滚问题

    本文介绍了Spring MVC中如何配置和使用多事务管理及回滚,重点内容包括配置jdbc.properties文件,使用Spring Framework 5.3版本新增的CompositeTransactionManager,以及如何在相关方法上添加@Transactional注解
    2024-09-09
  • SpringBoot+JUnit5+MockMvc+Mockito单元测试的实现

    SpringBoot+JUnit5+MockMvc+Mockito单元测试的实现

    今天聊聊如何在 SpringBoot 中集成 Junit5、MockMvc、Mocktio。Junit5 是在 Java 栈中应用最广的测试框架,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-09-09
  • Java源码解析之TypeVariable详解

    Java源码解析之TypeVariable详解

    这篇文章主要介绍了Java源码解析之TypeVariable详解,具有一定参考价值,需要的朋友可以了解下。
    2017-10-10
  • 详解Spring Boot Admin监控服务上下线邮件通知

    详解Spring Boot Admin监控服务上下线邮件通知

    本篇文章主要介绍了详解Spring Boot Admin监控服务上下线邮件通知,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-12-12
  • Java文件过滤器实现按条件筛选文件

    Java文件过滤器实现按条件筛选文件

    本文主要介绍了Java文件过滤器实现按条件筛选文件,文件过滤器是在文件处理中起到重要作用的工具,它可以用来筛选文件并根据特定的条件进行过滤,下面就来介绍一下
    2024-04-04
  • 深入理解Java中的Lambda表达式

    深入理解Java中的Lambda表达式

    这篇文章主要介绍了深入理解Java中的Lambda表达式,Lambda在各编程语言中都是非常重要的特性,而Java中则加入得有些太晚...需要的朋友可以参考下
    2015-07-07
  • Java 读取外部资源的方法详解及实例代码

    Java 读取外部资源的方法详解及实例代码

    这篇文章主要介绍了Java 读取外部资源的方法详解及实例代码的相关资料,经常有读取外部资源的要求,如配置文件等等需要读取,需要的朋友可以参考下
    2017-03-03
  • java 获取mac地址的两种方法(推荐)

    java 获取mac地址的两种方法(推荐)

    下面小编就为大家带来一篇java 获取mac地址的两种方法(推荐)。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2016-10-10

最新评论