0

0

Spring Boot中将特定字段映射到HTML页面:DTO与视图渲染实践

碧海醫心

碧海醫心

发布时间:2025-09-27 11:26:01

|

991人浏览过

|

来源于php中文网

原创

Spring Boot中将特定字段映射到HTML页面:DTO与视图渲染实践

本文将深入探讨如何在Spring Boot应用中,从后端实体中选择性地提取特定字段,并将其高效且安全地渲染到HTML页面。我们将重点介绍数据传输对象(DTO)作为最佳实践,结合Spring MVC控制器和模板引擎(如Thymeleaf),实现数据展示层与业务逻辑的解耦,并讨论其他序列化控制策略。

1. 问题背景与目标

在spring boot开发中,我们经常会遇到这样的场景:后端服务从数据库获取一个包含多个字段的完整实体对象(例如adventureholidays),但前端页面(html)或特定的api接口只需要其中的部分字段(例如title和description)。直接将完整实体暴露给前端可能导致不必要的数据传输、安全隐患,并增加前端解析的复杂性。我们的目标是实现一个spring boot控制器,当被调用时,能够返回一个只包含所需特定字段的html页面。

原始的AdventureHolidays实体定义如下:

@Document("adventureholidays")
public class AdventureHolidays {

    @Id
    private String id;
    private String title;
    private String description;
    private String typeOfAdventureHolidays;

    // Getter方法
    public String getId() { return id; }
    public String getTitle() { return title; }
    public String getDescription() { return description; }
    public String getTypeOfAdventureHolidays() { return typeOfAdventureHolidays; }

    // Setter方法(如果需要)
    public void setId(String id) { this.id = id; }
    public void setTitle(String title) { this.title = title; }
    public void setDescription(String description) { this.description = description; }
    public void setTypeOfAdventureHolidays(String typeOfAdventureHolidays) { this.typeOfAdventureHolidays = typeOfAdventureHolidays; }
}

一个典型的控制器可能返回完整的JSON列表:

@RestController
public class AdventureApiController {
    @Autowired
    private AdventureHolidaysService adventureHolidaysService;

    @GetMapping("/getRandomSummerCamps")
    public List getRandomSummerCamps() {
        return adventureHolidaysService.getRandomSummerCamps();
    }
}

当访问/getRandomSummerCamps时,会得到类似以下包含所有字段的JSON响应:

[{"id":"123","title":"Raquette Lake Camp","description":"Founded in 1916...","typeOfAdventureHolidays":"summerCamps"}]

而我们的目标是,在HTML页面中只显示title和description。

立即学习前端免费学习笔记(深入)”;

2. 核心策略:数据传输对象 (DTO)

数据传输对象(DTO)是解决此类问题的最佳实践。DTO是一个简单的Java对象,其主要目的是在应用程序的不同层之间传输数据。它只包含前端或特定服务所需的数据字段,从而将领域模型与表示层解耦。

DTO的优势:

  • 解耦: 将领域实体与视图层分离,防止不必要的字段暴露。
  • 安全性: 避免敏感数据(如数据库ID、内部状态)泄露到客户端。
  • 性能: 减少传输的数据量,提高网络效率。
  • 灵活性: 可以为不同的视图或API设计不同的DTO,满足多样化的需求。

2.1 创建DTO

针对我们的需求,创建一个只包含title和description的AdventureSummaryDTO:

// src/main/java/com/example/demo/dto/AdventureSummaryDTO.java
package com.example.demo.dto;

public class AdventureSummaryDTO {
    private String title;
    private String description;

    // 构造函数
    public AdventureSummaryDTO(String title, String description) {
        this.title = title;
        this.description = description;
    }

    // Getter 方法
    public String getTitle() {
        return title;
    }

    public String getDescription() {
        return description;
    }

    // Setter 方法 (如果需要,但对于DTO通常不需要)
    public void setTitle(String title) {
        this.title = title;
    }

    public void setDescription(String description) {
        this.description = description;
    }
}

2.2 改造Spring Boot控制器以返回HTML

为了返回HTML页面,我们需要将控制器类型从@RestController改为@Controller,并使用Spring MVC的Model对象将数据传递给视图模板。

// src/main/java/com/example/demo/controller/AdventureWebController.java
package com.example.demo.controller;

import com.example.demo.dto.AdventureSummaryDTO;
import com.example.demo.model.AdventureHolidays;
import com.example.demo.service.AdventureHolidaysService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;

import java.util.List;
import java.util.stream.Collectors;

@Controller // 注意这里是 @Controller,用于返回视图
public class AdventureWebController {

    @Autowired
    private AdventureHolidaysService adventureHolidaysService;

    @GetMapping("/summerCampsHtml") // 定义一个新的URL路径用于HTML页面
    public String getSummerCampsHtml(Model model) {
        // 1. 从服务层获取完整的实体列表
        List summerCamps = adventureHolidaysService.getRandomSummerCamps();

        // 2. 将实体列表转换为DTO列表
        List summaryCamps = summerCamps.stream()
                .map(camp -> new AdventureSummaryDTO(camp.getTitle(), camp.getDescription()))
                .collect(Collectors.toList());

        // 3. 将DTO列表添加到Model中,以便在HTML模板中使用
        model.addAttribute("camps", summaryCamps);

        // 4. 返回视图名称。Spring Boot将根据配置查找对应的HTML模板
        return "summerCampsView"; // 假设存在一个名为 summerCampsView.html 的模板
    }
}

说明:

造好物
造好物

一站式AI造物设计平台

下载
  • @Controller 注解表明这是一个处理Web请求并返回视图的控制器。
  • Model 对象用于在控制器和视图之间传递数据。
  • stream().map().collect() 是Java 8的流式API,用于高效地将AdventureHolidays列表转换为AdventureSummaryDTO列表。
  • return "summerCampsView"; 告诉Spring MVC去渲染名为summerCampsView的视图。如果使用Thymeleaf,它会默认在src/main/resources/templates/目录下查找summerCampsView.html文件。

2.3 创建HTML视图模板 (以Thymeleaf为例)

在src/main/resources/templates/目录下创建summerCampsView.html文件:




    
    夏令营列表
    


    

随机夏令营

没有找到任何夏令营信息。

营地标题占位符

营地描述占位符

说明:

  • xmlns:th="http://www.thymeleaf.org" 声明了Thymeleaf命名空间。
  • th:each="camp : ${camps}" 迭代控制器中通过model.addAttribute("camps", summaryCamps);传递过来的camps列表。
  • th:text="${camp.title}" 和 th:text="${camp.description}" 将每个AdventureSummaryDTO对象的title和description属性值渲染到HTML元素中。

3. 其他序列化控制策略

虽然DTO是处理特定字段展示的最佳实践,但在某些情况下,Spring Boot也提供了其他控制JSON序列化的方法。

3.1 @JsonIgnore 注解

@JsonIgnore 是Jackson库提供的注解,用于在对象序列化为JSON时忽略某个字段。

示例: 如果你希望AdventureHolidays实体在任何JSON输出中都忽略typeOfAdventureHolidays字段,可以在该字段上添加@JsonIgnore:

import com.fasterxml.jackson.annotation.JsonIgnore;
import org.springframework.data.annotation.Id;
import org.springframework.data.mongodb.core.mapping.Document;

@Document("adventureholidays")
public class AdventureHolidays {

    @Id
    private String id;
    private String title;
    private String description;
    @JsonIgnore // 该字段在JSON序列化时将被忽略
    private String typeOfAdventureHolidays;

    // Getter/Setter...
}

注意事项:

  • 全局性忽略: 一旦添加,该字段在所有返回AdventureHolidays对象的JSON响应中都会被忽略。
  • 仅影响JSON: 它只控制JSON序列化,不会直接影响HTML模板渲染。如果控制器返回的是AdventureHolidays对象给HTML模板,模板仍然可以访问被@JsonIgnore标记的字段(因为它仍在Java对象中)。
  • 不适用于动态需求: 如果某些API需要该字段,而另一些不需要,@JsonIgnore就不适用了。

3.2 @JsonView 注解

@JsonView 允许你定义不同的“视图”,并根据请求选择性地序列化实体字段。这适用于同一个实体需要在不同场景下暴露不同字段集合的情况。

示例 (简要介绍):

  1. 定义视图接口:

    public class Views {
        public static class Public {}
        public static class Internal extends Public {}
    }
  2. 在实体字段上标记视图:

    public class AdventureHolidays {
        @JsonView(Views.Public.class)
        private String title;
        @JsonView(Views.Public.class)
        private String description;
        @JsonView(Views.Internal.class) // 只有Internal视图才能看到
        private String typeOfAdventureHolidays;
        // ...
    }
  3. 在控制器方法上指定视图:

    @RestController
    public class AdventureApiController {
        @GetMapping("/publicCamps")
        @JsonView(Views.Public.class)
        public List getPublicCamps() {
            return adventureHolidaysService.getRandomSummerCamps();
        }
    
        @GetMapping("/internalCamps")
        @JsonView(Views.Internal.class)
        public List getInternalCamps() {
            return adventureHolidaysService.getRandomSummerCamps();
        }
    }

    注意事项:

  • @JsonView 主要用于JSON序列化,对于HTML模板渲染同样不直接适用。
  • 它提供了比@JsonIgnore更细粒度的控制,但配置相对复杂。

4. 总结

在Spring Boot中,当需要将后端实体中的特定字段渲染到HTML页面时,使用DTO(数据传输对象)是推荐的最佳实践。它通过将数据模型与视图表示分离,提供了清晰的结构、增强了安全性,并提高了代码的可维护性。

关键步骤:

  1. 创建DTO: 定义一个只包含所需字段的DTO。
  2. 改造控制器:
    • 使用@Controller注解。
    • 从服务层获取完整实体。
    • 将实体映射到DTO。
    • 使用Model对象将DTO列表添加到视图。
    • 返回视图名称。
  3. 创建HTML模板: 使用Thymeleaf等模板引擎迭代DTO列表并显示字段。

对于JSON序列化场景,@JsonIgnore适用于永久性地排除字段,而@JsonView则提供了更灵活的视图管理功能,但它们都与直接渲染HTML页面的需求有所不同。理解这些工具的用途和局限性,有助于开发者根据具体业务需求选择最合适的解决方案。

相关专题

更多
java
java

Java是一个通用术语,用于表示Java软件及其组件,包括“Java运行时环境 (JRE)”、“Java虚拟机 (JVM)”以及“插件”。php中文网还为大家带了Java相关下载资源、相关课程以及相关文章等内容,供大家免费下载使用。

832

2023.06.15

java正则表达式语法
java正则表达式语法

java正则表达式语法是一种模式匹配工具,它非常有用,可以在处理文本和字符串时快速地查找、替换、验证和提取特定的模式和数据。本专题提供java正则表达式语法的相关文章、下载和专题,供大家免费下载体验。

738

2023.07.05

java自学难吗
java自学难吗

Java自学并不难。Java语言相对于其他一些编程语言而言,有着较为简洁和易读的语法,本专题为大家提供java自学难吗相关的文章,大家可以免费体验。

734

2023.07.31

java配置jdk环境变量
java配置jdk环境变量

Java是一种广泛使用的高级编程语言,用于开发各种类型的应用程序。为了能够在计算机上正确运行和编译Java代码,需要正确配置Java Development Kit(JDK)环境变量。php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

397

2023.08.01

java保留两位小数
java保留两位小数

Java是一种广泛应用于编程领域的高级编程语言。在Java中,保留两位小数是指在进行数值计算或输出时,限制小数部分只有两位有效数字,并将多余的位数进行四舍五入或截取。php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

398

2023.08.02

java基本数据类型
java基本数据类型

java基本数据类型有:1、byte;2、short;3、int;4、long;5、float;6、double;7、char;8、boolean。本专题为大家提供java基本数据类型的相关的文章、下载、课程内容,供大家免费下载体验。

446

2023.08.02

java有什么用
java有什么用

java可以开发应用程序、移动应用、Web应用、企业级应用、嵌入式系统等方面。本专题为大家提供java有什么用的相关的文章、下载、课程内容,供大家免费下载体验。

430

2023.08.02

java在线网站
java在线网站

Java在线网站是指提供Java编程学习、实践和交流平台的网络服务。近年来,随着Java语言在软件开发领域的广泛应用,越来越多的人对Java编程感兴趣,并希望能够通过在线网站来学习和提高自己的Java编程技能。php中文网给大家带来了相关的视频、教程以及文章,欢迎大家前来学习阅读和下载。

16925

2023.08.03

Java 桌面应用开发(JavaFX 实战)
Java 桌面应用开发(JavaFX 实战)

本专题系统讲解 Java 在桌面应用开发领域的实战应用,重点围绕 JavaFX 框架,涵盖界面布局、控件使用、事件处理、FXML、样式美化(CSS)、多线程与UI响应优化,以及桌面应用的打包与发布。通过完整示例项目,帮助学习者掌握 使用 Java 构建现代化、跨平台桌面应用程序的核心能力。

36

2026.01.14

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Kotlin 教程
Kotlin 教程

共23课时 | 2.5万人学习

C# 教程
C# 教程

共94课时 | 6.7万人学习

Java 教程
Java 教程

共578课时 | 46.1万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号