Spring Boot 底层级探索系列 04 - Web 开发(1)

简介: Spring Boot 底层级探索系列 04 - Web 开发(1)

江帅帅,奈学教育,擅长系统架构设计,大数据,运维等技术领域;对大中后台技术有丰富经验(交易平台、基础服务、智能客服、基础架构、智能运维、数据库、安全、IT 等方向);曾担任怀致科技 CTO,并还在东软集团、中国移动、多迪集团等企业中任职过相关技术负责人。

1、Web 开发的支持

使用 Spring Boot 实现 Web 开发更加便捷了,因为直接依赖 spring-boot-starter-web 模块即可支持 Web 开发,此模块预定义了 Web 开发中常用的依赖包,还有内嵌的 Tomcat 作为默认 Web 容器。

2、Thymeleaf 模板引擎

目前,多数企业级应用开发中都支持前后端分离,但还有少数离不开视图层技术,Spring Boot 提供了很多模板引擎来支持视图层技术,比如 Thymeleaf、Freemarker、Velocity。

Thymeleaf 是官方推荐使用的新一代 Java 模板引擎,并支持 HTML 原型,模板表达式在脱离运行环境下不污染 HTML 结构,能让前端直接通过浏览器查看基本样式,也能让后端使用真实数据查看展示效果。

3、整合使用 Thymeleaf 模板

3.1. 创建工程

创建一个 Spring Boot 工程,编辑 pom.xml 文件,添加 web 和 thymeleaf 依赖。另外,App 启动类与之前一致。

<dependencies>
    <!-- 指定 web 依赖模块 -->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
    <!-- 指定 thymeleaf 模板-->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-thymeleaf</artifactId>
    </dependency>
</dependencies>

3.2. 添加视图文件

在 src/main/resources/templates 目录下,新建 nicebook.html 文件。

<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
    <head>
        <meta charset="UTF-8">
        <title>良心好书</title>
    </head>
    <body>
        <table border="1">
            <tr>
                <td>序号</td>
                <td>好书</td>
                <td>作者</td>
            </tr>
            <tr th:each="book:${books}">
                <td th:text="${book.id}"></td>
                <td th:text="${book.name}"></td>
                <td th:text="${book.author}"></td>
            </tr>
        </table>
    </body>
</html>

3.3. 配置 Thymeleaf

如果想自定义 Thymeleaf 配置参数,可以在 application.properties 文件中进行配置,常见的配置选项如下:

# 模板文件存放位置
spring.thymeleaf.prefix=classpath:/templates/
# 是否开启缓存,默认为 true,开发时可设置为 false
spring.thymeleaf.cache=true
# 检查模板位置是否存在,默认为 true
spring.thymeleaf.check-template-location=true
# 检查模板是否存在,默认为 true
spring.thymeleaf.check-template=true
# 模板文件后缀设置
spring.thymeleaf.suffix=.html
# 模板文件编码设置
spring.thymeleaf.encoding=UTF-8
# Content-Type 配置
spring.thymeleaf.servlet.content-type=text/html

3.4. 创建 POJO

public class Book {
    private Integer id;
    private String name;
    private String author;
    // getter 和 setter 方法
}

3.5. 创建 BookController 控制器

@Controller
public class BookController {
    @GetMapping("/books")
    public ModelAndView books() {
        List<Book> bookList = new ArrayList<>()
        Book book1 = new Book();
        book1.setId(1);
        book1.setName("《码农翻身:用故事给技术加点料》");
        book1.setAuthor("刘欣");
        Book book2 = new Book();
        book2.setId(2);
        book2.setName("《漫画算法:小灰的算法之旅(全彩)》");
        book2.setAuthor("魏梦舒");
        bookList.add(book1);
        bookList.add(book2);
        ModelAndView mv = new ModelAndView();
        mv.addObject("bookList");
        mv.setViewName("nicebook");
        return mv;
    }
}

3.6. 运行测试

浏览器中访问:http://localhost:8080/books,即可看到如下页面。

4、Thymeleaf 的支持

Spring Boot 通过 org.springframework.boot.autoconfigure.thymeleaf 包为 Thymeleaf 提供了自动配置,涉及到的类如下:

其中 ThymeleafAutoConfiguration 和 ThymeleafProperties 类是比较重要的,前者对集成所需要的 Bean 进行自动配置,后者主要读取 application.properties 配置文件,可自定义 Thymeleaf 的属性和默认配置。

ThymeleafProperties 类部分源码如下:

@ConfigurationProperties(
    prefix = "spring.thymeleaf"
)
public class ThymeleafProperties {
    private static final Charset DEFAULT_ENCODING;
    public static final String DEFAULT_PREFIX = "classpath:/templates/";
    public static final String DEFAULT_SUFFIX = ".html";
    private boolean checkTemplate = true;
    private boolean checkTemplateLocation = true;
    private String prefix = "classpath:/templates/";
    private String suffix = ".html";
    private String mode = "HTML";
    private Charset encoding;
    private boolean cache;
    private Integer templateResolverOrder;
    private String[] viewNames;
    private String[] excludedViewNames;
    private boolean enableSpringElCompiler;
    private boolean renderHiddenMarkersBeforeCheckboxes;
    private boolean enabled;
    private final ThymeleafProperties.Servlet servlet;
    private final ThymeleafProperties.Reactive reactive;
  
    ...   
}

5、拓展:Thymeleaf 常用语法

5.1. 使用 URL

通过 @{…} 来处理常见 URL。

<!-- 绝对路径 -->
<a th:href="@{http://www.naixuejiaoyu.com}">奈学教育</a>
<!-- 相对路径 -->
<a th:href="@{/}">奈学教育</a>
<!-- content 路径 -->
<a th:href="@{books/java/one.png}">奈学教育</a>

5.2. 使用表达式

主要用来从模板中的 WebContext 获取param、request、session 和 application 中的属性。使用 ${x} 即可返回存储在 Thymeleaf 上下文中的变量 x 或作为 request 作用域中的属性。

${param.x} 能够返回名为 x 的请求参数;
${session.x} 能够返回名为 x 的 HttpSession 作用域中的属性;
${application.x} 能够返回名为 x 的 ServletContext 作用域中的属性。

5.3. 使用字符串

如果需要对一段文字中的某一处进行替换,可以使用 |…| 这种便捷方式,但不能包含其他常量、条件表达式,只能包含变量表达式 ${…},有一定局限性。

<span th:text="|hello, ${userName}|"></span>

5.4. 使用运算符

平时看到的算术运算符和逻辑运算符都可以使用。

5.5. 使用条件判断

可以使用 th:if 和 th:unless 属性进行条件判断,前者条件成立时显示,后者不成立时才显示。也可以使用 Switch 结构,默认选项使用 * 来表示。

<a th:href="index.html" th:if=${name != null}>奈学教育</a>
<div th:switch="${books}">
    <p th:case="'Java'">Java 从入门到逃难</p>
    <p th:case="'Python'">Python 从入门到逃难</p>
</div>

5.6. 使用循环

使用 th:each 即可实现循环。

<tr th:each="book : ${bookList}">
    <td th:text="${book.id}"></td>
    <td th:text="${book.name}"></td>
    <td th:text="${book.author}"></td>
</tr>

5.7. 使用内置对象

通过 # 可以直接访问 Thymeleaf 的内置对象。

#dates:日期
#calendars:日历
#numbers:数值格式化
#strings:字符串格式化
#objects:对象
#maps:Map 操作工具
#aggregates:操作数组或集合的工具
#bools:布尔
#sets:Set 操作工具
#messages:消息
#arrays:Array 操作工具
#lists:List 操作工具

未完待续……

目录
相关文章
|
1月前
|
Java API 数据库
构建RESTful API已经成为现代Web开发的标准做法之一。Spring Boot框架因其简洁的配置、快速的启动特性及丰富的功能集而备受开发者青睐。
【10月更文挑战第11天】本文介绍如何使用Spring Boot构建在线图书管理系统的RESTful API。通过创建Spring Boot项目,定义`Book`实体类、`BookRepository`接口和`BookService`服务类,最后实现`BookController`控制器来处理HTTP请求,展示了从基础环境搭建到API测试的完整过程。
42 4
|
1月前
|
XML JSON API
ServiceStack:不仅仅是一个高性能Web API和微服务框架,更是一站式解决方案——深入解析其多协议支持及简便开发流程,带您体验前所未有的.NET开发效率革命
【10月更文挑战第9天】ServiceStack 是一个高性能的 Web API 和微服务框架,支持 JSON、XML、CSV 等多种数据格式。它简化了 .NET 应用的开发流程,提供了直观的 RESTful 服务构建方式。ServiceStack 支持高并发请求和复杂业务逻辑,安装简单,通过 NuGet 包管理器即可快速集成。示例代码展示了如何创建一个返回当前日期的简单服务,包括定义请求和响应 DTO、实现服务逻辑、配置路由和宿主。ServiceStack 还支持 WebSocket、SignalR 等实时通信协议,具备自动验证、自动过滤器等丰富功能,适合快速搭建高性能、可扩展的服务端应用。
100 3
|
16天前
|
设计模式 前端开发 数据库
Python Web开发:Django框架下的全栈开发实战
【10月更文挑战第27天】本文介绍了Django框架在Python Web开发中的应用,涵盖了Django与Flask等框架的比较、项目结构、模型、视图、模板和URL配置等内容,并展示了实际代码示例,帮助读者快速掌握Django全栈开发的核心技术。
102 44
|
5天前
|
存储 运维 安全
Spring运维之boot项目多环境(yaml 多文件 proerties)及分组管理与开发控制
通过以上措施,可以保证Spring Boot项目的配置管理在专业水准上,并且易于维护和管理,符合搜索引擎收录标准。
17 2
|
11天前
|
前端开发 API 开发者
Python Web开发者必看!AJAX、Fetch API实战技巧,让前后端交互如丝般顺滑!
在Web开发中,前后端的高效交互是提升用户体验的关键。本文通过一个基于Flask框架的博客系统实战案例,详细介绍了如何使用AJAX和Fetch API实现不刷新页面查看评论的功能。从后端路由设置到前端请求处理,全面展示了这两种技术的应用技巧,帮助Python Web开发者提升项目质量和开发效率。
26 1
|
14天前
|
XML 安全 PHP
PHP与SOAP Web服务开发:基础与进阶教程
本文介绍了PHP与SOAP Web服务的基础和进阶知识,涵盖SOAP的基本概念、PHP中的SoapServer和SoapClient类的使用方法,以及服务端和客户端的开发示例。此外,还探讨了安全性、性能优化等高级主题,帮助开发者掌握更高效的Web服务开发技巧。
|
17天前
|
安全 数据库 开发者
Python Web开发:Django框架下的全栈开发实战
【10月更文挑战第26天】本文详细介绍了如何在Django框架下进行全栈开发,包括环境安装与配置、创建项目和应用、定义模型类、运行数据库迁移、创建视图和URL映射、编写模板以及启动开发服务器等步骤,并通过示例代码展示了具体实现过程。
29 2
|
25天前
|
XML Java 数据格式
提升效率!Spring Boot 开发中的常见失误轻松规避
本文深入探讨了在 Spring Boot 开发中常见的失误,包括不当使用注解、不良异常处理、低效日志记录等,提供了有效的规避策略,帮助开发者提升代码质量和系统性能,构建更健壮、高效的应用程序。
|
10天前
|
安全 Java 测试技术
Java开发必读,谈谈对Spring IOC与AOP的理解
Spring的IOC和AOP机制通过依赖注入和横切关注点的分离,大大提高了代码的模块化和可维护性。IOC使得对象的创建和管理变得灵活可控,降低了对象之间的耦合度;AOP则通过动态代理机制实现了横切关注点的集中管理,减少了重复代码。理解和掌握这两个核心概念,是高效使用Spring框架的关键。希望本文对你深入理解Spring的IOC和AOP有所帮助。
22 0
WK
|
17天前
|
安全 Java 编译器
C++和Java哪个更适合开发web网站
在Web开发领域,C++和Java各具优势。C++以其高性能、低级控制和跨平台性著称,适用于需要高吞吐量和低延迟的场景,如实时交易系统和在线游戏服务器。Java则凭借其跨平台性、丰富的生态系统和强大的安全性,广泛应用于企业级Web开发,如企业管理系统和电子商务平台。选择时需根据项目需求和技术储备综合考虑。
WK
20 0