Spring Boot(二)之web综合开发

Spring Boot(二)之web综合开发

在本篇文章中,我们将介绍如何使用Spring Boot进行Web开发的综合性攻略。具体来说,将包含以下内容:

  1. Spring Boot中MVC的概念以及使用方法;
  2. 整合Thymeleaf和Bootstrap实现前端页面渲染;
  3. 利用Spring Boot提供的数据持久化机制与数据库进行交互;

Spring Boot中MVC的概念以及使用方法

Spring Boot中提供了基于MVC的Web开发框架。MVC的全称是Model-View-Controller,是一种常见的Web应用程序架构。在该架构中,模型(Model)表示应用程序的数据和业务逻辑,视图(View)负责渲染模型数据并显示给用户,控制器(Controller)负责处理用户请求,调用适当的模型和视图组件来完成请求处理。

在Spring Boot中,MVC与它的兄弟Spring MVC使用方法基本相同。MVC中最重要的概念是控制器(Controller),它负责接收请求并返回适当的响应。以下是一个简单的Controller示例:

@RestController
public class HelloController {

    @GetMapping("/hello")
    public String hello() {
        return "Hello, Spring Boot!";
    }
}

在这个示例中,顶部的注解@RestController表示这是一个Controller类。该类中使用了@GetMapping注解,表示它将处理HTTP GET请求,而/hello指定了请求的URL路径。在方法体中,返回了一个String,表示响应内容。

在Spring Boot中提供了多个和控制器相关的注解,比如@PostMapping、@PutMapping和@DeleteMapping,分别表示处理HTTP POST、PUT和DELETE请求。控制器中也可以使用其他注解,比如@RequestParam和@PathVariable,来获取请求中的参数。

整合Thymeleaf和Bootstrap实现前端页面渲染

Thymeleaf是一种流行的Java服务器端模板引擎,可以完成多种场景下的模板渲染。Bootstrap是一个广泛使用的前端UI框架,包含了多种UI组件和工具,可以轻松地快速构建美观、响应式的Web界面。

在Spring Boot中,Thymeleaf的使用非常简单。在pom.xml中添加Thymeleaf和Spring Boot自动配置的依赖后,就可以在Controller中使用Thymeleaf作为视图层模板引擎。以下是一个示例Controller:

@Controller
public class UserController {

    @Autowired
    UserService userService;

    @GetMapping("/users")
    public String userList(Model model) {
        model.addAttribute("users", userService.getAllUsers());
        return "user/list";
    }
}

在这个示例中,使用了@Controller注解表示这是一个Controller类。在userList方法中,将查询所有用户的结果添加到Model对象中,并返回了一个字符串user/list,表示使用名为list的模板进行渲染。在模板中,可以利用Thymeleaf的表达式语言和Bootstrap的CSS和JS组件进行界面渲染。

利用Spring Boot提供的数据持久化机制与数据库进行交互

Spring Boot中的数据持久层主要由两个部分组成:JPA和Spring Data。JPA是Java Persistence API的缩写,是Java EE5规范中的一部分。它为Java提供了一种标准化的对象-关系映射(ORM)技术,使得数据层的访问更加便捷、高效。而Spring Data则是Spring提供的基于JPA的数据持久层框架,可以帮助开发者快速构建数据访问层。

以下是一个使用Spring Data JPA进行用户数据持久化的示例:

@Repository
public interface UserRepository extends JpaRepository<User, Long> {

}

在这个示例中,使用了@Repository注解表示该类是一个数据访问层的接口,而继承自JpaRepository的接口则提供了几种基本的数据持久操作方法,比如findAll和save。

在使用Spring Data时,我们通常还需要配置数据源和JPA实体管理器。在Spring Boot中,可以在application.properties中添加以下配置项:

# 数据源配置
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.url=jdbc:mysql://localhost:3306/mydb?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=false&serverTimezone=UTC
spring.datasource.username=root
spring.datasource.password=123456

# JPA配置
spring.jpa.hibernate.ddl-auto=update
spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.MySQL8Dialect

以上配置项可以指定数据源的相关信息,以及JPA的相关配置,比如生成数据表时是否自动更新,以及数据库方言等。

示例1:实现一个简单的TODO列表

针对前面章节的内容,我们可以实现一个简单的TODO列表。首先定义一个待办事项的实体类:

@Entity
@Table(name = "todo_item")
public class TodoItem {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    private String content;
    private boolean finished;
}

在这个实体类中,使用了@Entity和@Table注解表示它是一个JPA实体类,并指定表名为todo_item。其中@Id注解表示它是主键,@GeneratedValue指定主键生成策略为自增长。

接着定义一个对待办事项进行CRUD操作的数据访问层接口:

@Repository
public interface TodoItemRepository extends JpaRepository<TodoItem, Long>{

}

在定义了数据访问层后,我们可以编写一个TODO列表的Controller,用于处理增删改查等操作。以下是一个示例:

@Controller
public class TodoController {

    @Autowired
    TodoItemRepository todoItemRepository;

    @GetMapping("/todo")
    public String todoList(Model model) {
        model.addAttribute("items", todoItemRepository.findAll());
        return "todo/list";
    }

    @GetMapping("/todo/new")
    public String todoForm(Model model) {
        model.addAttribute("item", new TodoItem());
        return "todo/form";
    }

    @PostMapping("/todo/new")
    public String todoFormSubmit(@Valid TodoItem todoItem, BindingResult result) {
        if (result.hasErrors()) {
            return "todo/form";
        }
        todoItemRepository.save(todoItem);
        return "redirect:/todo";
    }

    @GetMapping("/todo/{id}/edit")
    public String todoEditForm(@PathVariable Long id, Model model) {
        TodoItem todoItem = todoItemRepository.findById(id)
                .orElseThrow(() -> new IllegalArgumentException("Invalid todo item id:" + id));
        model.addAttribute("item", todoItem);
        return "todo/form";
    }

    @PostMapping("/todo/{id}/edit")
    public String todoEditSubmit(@PathVariable Long id, @Valid TodoItem todoItem, BindingResult result) {
        if (result.hasErrors()) {
            return "todo/form";
        }
        todoItem.setId(id);
        todoItemRepository.save(todoItem);
        return "redirect:/todo";
    }

    @GetMapping("/todo/{id}/delete")
    public String todoDelete(@PathVariable Long id) {
        todoItemRepository.deleteById(id);
        return "redirect:/todo";
    }
}

在这个示例中,我们使用了@GetMapping和@PostMapping注解分别处理HTTP GET和POST请求。在todoList方法中,查询了所有待办事项的数据,并将其添加到Model对象中传递到视图层。在todoForm和todoEditForm方法中,创建了新的待办事项并传递到视图层,供用户输入和编辑。而在todoFormSubmit和todoEditSubmit方法中,则分别处理了新增和编辑待办事项的逻辑,保存到数据库中。另外还提供了一个用于删除待办事项的方法。

在视图层中,我们创建了一个表格,用于展示待办事项,同时提供了添加、编辑和删除操作的入口。以下是一个示例模板:

<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head>
    <meta charset="UTF-8">
    <title>TODO List</title>
    <link rel="stylesheet" th:href="@{/webjars/bootstrap/5.1.0/css/bootstrap.min.css}">
</head>
<body>

<div class="container">
    <div class="row my-3">
        <h1>TODO List</h1>
    </div>
    <div class="row">
        <button type="button" class="btn btn-primary"
                onclick="window.location.href='/todo/new';">Add New</button>
    </div>
    <div class="row my-3">
        <table class="table table-striped">
            <thead>
            <tr>
                <th>ID</th>
                <th>Content</th>
                <th>Status</th>
                <th>Action</th>
            </tr>
            </thead>
            <tbody>
            <tr th:each="item : ${items}">
                <td th:text="${item.id}"></td>
                <td th:text="${item.content}"></td>
                <td>
                    <span th:if="${item.finished}" class="badge bg-success">Finished</span>
                    <span th:unless="${item.finished}" class="badge bg-danger">Pending</span>
                </td>
                <td>
                    <a th:href="@{/todo/{id}/edit(id=${item.id})}" class="btn btn-secondary btn-sm">Edit</a>
                    <a th:href="@{/todo/{id}/delete(id=${item.id})}" class="btn btn-danger btn-sm" onclick="return confirm('Are you sure to delete?');">Delete</a>
                </td>
            </tr>
            </tbody>
        </table>
    </div>
</div>

</body>
</html>

在这个模板中,我们使用了Bootstrap提供的CSS样式和组件,使得页面看起来更加美观和易用。其中用到了Thymeleaf的表达式语言,比如${items}、${item.id}、${item.content}等,用于显示数据。同时也使用了Thymeleaf提供的渲染指令,如th:if和th:unless,用于根据运行时的数据决定要渲染的内容。

示例2:实现一个简单的RESTful风格的API

在Spring Boot中,使用MVC框架来开发RESTful风格的API也非常简单。只需要定义一些标准的HTTP方法,然后按照约定提供接口即可。以下是一个示例:

@RestController
@RequestMapping("/api/todo")
public class TodoRestController {

    @Autowired
    TodoItemRepository todoItemRepository;

    @GetMapping("")
    public List<TodoItem> getTodoItems() {
        return todoItemRepository.findAll();
    }

    @PostMapping("")
    public TodoItem addTodoItem(@RequestBody TodoItem todoItem) {
        todoItem.setId(null);
        return todoItemRepository.save(todoItem);
    }

    @PutMapping("/{id}")
    public TodoItem updateTodoItem(@PathVariable Long id, @RequestBody TodoItem todoItem) {
        if (todoItemRepository.existsById(id)) {
            todoItem.setId(id);
            return todoItemRepository.save(todoItem);
        }
        throw new IllegalArgumentException("Invalid todo item id:" + id);
    }

    @DeleteMapping("/{id}")
    public void deleteTodoItem(@PathVariable Long id) {
        todoItemRepository.deleteById(id);
    }
}

在这个示例中,我们使用了@RestController注解表示这是一个Controller类,用于处理RESTful请求。通过@RequestMapping注解,指定了请求路径为/api/todo。然后分别使用了@GetMapping、@PostMapping、@PutMapping和@DeleteMapping注解分别表示HTTP GET、POST、PUT和DELETE请求,以及传递数据的方式@RequestBody。

在视图层中,我们可以使用jQuery、Vue.js等JavaScript框架进行前端的渲染,也可以直接使用浏览器进行测试。以下是一个简单的测试例子:

  1. 查询所有待办事项:

发送HTTP GET请求,请求路径为:/api/todo

响应示例:

[
    {
        "id": 1,
        "content": "Learn Spring",
        "finished": false
    },
    {
        "id": 2,
        "content": "Learn Spring Boot",
        "finished": true
    }
]
  1. 添加一个待办事项:

发送HTTP POST请求,请求路径为:/api/todo,请求体为:

{
    "content": "Learn Hibernate",
    "finished": false
}

响应示例:

{
    "id": 3,
    "content": "Learn Hibernate",
    "finished": false
}
  1. 修改一个待办事项:

发送HTTP PUT请求,请求路径为:/api/todo/3,请求体为:

{
    "id": 3,
    "content": "Learn JPA",
    "finished": true
}

响应示例:

{
    "id": 3,
    "content": "Learn JPA",
    "finished": true
}
  1. 删除一个待办事项:

发送HTTP DELETE请求,请求路径为:/api/todo/3

响应示例:

HTTP状态码为204 No Content。

综上所述,Spring Boot提供了非常便捷的Web开发框架,可以轻松构建各种类型的Web应用程序,尤其是RESTful API和前端单页应用(SPA)。当然,这只是冰山一角,更多的特性和细节还需要在实践中去掌握。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Spring Boot(二)之web综合开发 - Python技术站

(0)
上一篇 2023年6月15日
下一篇 2023年6月15日

相关文章

  • Nacos源码之注册中心的实现详解

    Nacos源码之注册中心的实现详解 Nacos 是一个开源的分布式系统服务发现、配置管理和服务管理平台,具有高度可扩展性和强一致性。 在 Nacos 中,注册中心是其核心组件之一,本文将详细讲解 Nacos 的注册中心实现原理及其源码解析。 注册中心的作用 在分布式系统中,服务提供者需要将自己的服务注册到注册中心,以便服务消费者可以通过注册中心获取服务提供者…

    Java 2023年6月15日
    00
  • java自定义日志输出文件(log4j日志文件输出多个自定义日志文件)

    以下是详细的java自定义日志输出文件(log4j日志文件输出多个自定义日志文件)的攻略: 1.安装log4j 我们在进行自定义日志输出文件之前,需要先安装一个java非常常用的日志库—log4j,安装的步骤如下:1. 前往Apache Log4j官网(https://logging.apache.org/log4j/2.x/)下载最新版的log4j。2. …

    Java 2023年5月26日
    00
  • Spring Data JPA 实体类中常用注解说明

    下面开始为您讲解 Spring Data JPA 实体类中常用注解的说明,请注意文末有示例代码供参考。 1. @Entity @Entity 注解用于声明当前类是一个实体类(Entity),必须使用此注解标记实体类,也可以自定义表名或指定 catalog 或 schema。 2. @Table @Table 注解可以指定当前实体类要映射到的数据库表名,可以自…

    Java 2023年5月20日
    00
  • SpringMVC请求数据详解讲解

    下面我将详细讲解“SpringMVC请求数据详解讲解”的完整攻略。 1. SpringMVC请求数据的概述 在Web开发中,一个请求的处理需要有数据的输入和输出。SpringMVC框架中,请求数据主要包含路由参数、请求参数和请求体三种形式。 路由参数为请求路径包含的参数,如对于路径 /user/{id},其中 {id} 就是路由参数。 请求参数为请求的Que…

    Java 2023年6月15日
    00
  • 基于SpringBoot 使用 Flink 收发Kafka消息的示例详解

    下面是关于“基于SpringBoot使用Flink收发Kafka消息的示例详解”的攻略。本攻略将包含两个示例主要是为了演示如何使用SpringBoot和Flink收发Kafka消息。其中,例子一是演示如何使用Flink从Kafka主题读取消息,而例子二是演示如何使用SpringBoot将消息发送到Kafka主题。 示例1:使用Flink从Kafka读取消息 …

    Java 2023年5月20日
    00
  • 一句话木马入侵EASYNEWS新闻管理系统

    作为网站作者,我们需要了解什么是一句话木马,以及如何防御它。一句话木马是一种非常常见的网络攻击手段,通常通过在网站中注入一段可执行代码来实现盗取敏感信息、控制网站等恶意行为。在这里,我们谈一下针对EASYNEWS新闻管理系统的一句话木马入侵攻略。 1.准备工作 首先,我们需要了解EASYNEWS的工作原理和数据结构,以便更好地注入恶意代码。其次,我们需要寻找…

    Java 2023年6月15日
    00
  • Sprint Boot @Max使用方法详解

    @Max是Spring Boot中的一个注解,用于标记一个字段或方法参数的值必须小于或等于指定的最大值。在本文中,我们将详细介绍@Max注解的作用和使用方法,并提供两个示例。 @Max注解的作用 @Max注解用于标记一个字段或方法参数的值必须小于或等于指定的最大值。当使用@Max注解标记一个字段或方法参数时,如果该字段或方法参数的值大于指定的最大值,则会抛出…

    Java 2023年5月5日
    00
  • 关于Java如何正确地实现方法重载详解

    关于Java如何正确地实现方法重载详解 什么是方法重载? 方法重载(Method Overloading)指的是在一个类中定义多个同名方法,但它们的形式参数列表不同。 方法重载的目的是为了让同名方法能够接收不同类型或者不同数量的参数而有不同的行为,实现更加灵活和通用的功能。 什么条件下才能进行方法重载? 方法名称相同; 参数个数或者类型不同; 方法返回值可以…

    Java 2023年5月19日
    00
合作推广
合作推广
分享本页
返回顶部