0

0

标题:Java Servlet 动态渲染 HTML 模板教程(基于占位符替换)

霞舞

霞舞

发布时间:2026-01-08 20:51:03

|

675人浏览过

|

来源于php中文网

原创

标题:Java Servlet 动态渲染 HTML 模板教程(基于占位符替换)

本文介绍如何使用 java servlet 读取 `.tpl` 模板文件,解析 url 参数(如 `id`),查询数据对象(如 pet),执行简单占位符替换(如 `{pet.name}`),并返回渲染后的 html 响应。无需第三方模板引擎,适合初学者快速上手。

要实现基于 .tpl 文件的轻量级服务端模板渲染,核心思路是:读取静态模板 → 提取请求参数 → 加载业务数据 → 替换占位符 → 输出 HTML 响应。下面以 index.tpl 为例,逐步构建一个完整、可运行的 Servlet 示例。

✅ 步骤一:准备模板文件与项目结构

将 index.tpl 放置于 Web 应用的 WEB-INF/templates/ 目录下(推荐,确保不被直接访问):



  
    

Pet profile - {pet.name}

Age: {pet.age}

Type: {pet.type}

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

⚠️ 注意:切勿将模板放在 webapp/ 根目录下(如 webapp/index.tpl),否则用户可绕过 Servlet 直接访问原始模板,造成信息泄露或 XSS 风险。

✅ 步骤二:编写 Servlet(支持路径匹配与占位符替换)

假设你使用注解方式映射 /index.tpl 请求(Servlet 3.0+):

PodLM
PodLM

PodLM是一款强大的AI播客生成工具

下载
@WebServlet("/index.tpl")
public class TemplateServlet extends HttpServlet {
    private static final String TEMPLATE_BASE_PATH = "/WEB-INF/templates/";

    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {

        // 1. 解析请求参数
        String idParam = request.getParameter("id");
        if (idParam == null || idParam.trim().isEmpty()) {
            response.sendError(HttpServletResponse.SC_BAD_REQUEST, "Missing 'id' parameter");
            return;
        }

        long petId;
        try {
            petId = Long.parseLong(idParam.trim());
        } catch (NumberFormatException e) {
            response.sendError(HttpServletResponse.SC_BAD_REQUEST, "Invalid 'id'");
            return;
        }

        // 2. 查询宠物数据(此处模拟数据库查询)
        Pet pet = findPetById(petId);
        if (pet == null) {
            response.sendError(HttpServletResponse.SC_NOT_FOUND, "Pet not found");
            return;
        }

        // 3. 读取模板内容(使用 ServletContext 获取资源流,更安全可靠)
        ServletContext ctx = getServletContext();
        InputStream is = ctx.getResourceAsStream(TEMPLATE_BASE_PATH + "index.tpl");
        if (is == null) {
            throw new ServletException("Template not found: index.tpl");
        }
        String templateContent;
        try (Reader reader = new InputStreamReader(is, StandardCharsets.UTF_8)) {
            templateContent = IOUtils.toString(reader); // 使用 Apache Commons IO(推荐)
            // 若不用第三方库,可用 StringBuilder + BufferedReader 手动读取
        }

        // 4. 占位符替换(注意:生产环境建议用正则或专用模板引擎)
        String renderedHtml = templateContent
                .replace("{pet.name}", escapeHtml(pet.getName()))
                .replace("{pet.age}", String.valueOf(pet.getAge()))
                .replace("{pet.type}", escapeHtml(pet.getType()));

        // 5. 设置响应头并输出
        response.setContentType("text/html;charset=UTF-8");
        response.setCharacterEncoding("UTF-8");
        response.setStatus(HttpServletResponse.SC_OK);
        response.getWriter().write(renderedHtml);
        response.getWriter().flush();
    }

    // 模拟数据查询(实际中应调用 DAO 或 Service)
    private Pet findPetById(long id) {
        // 示例:返回硬编码数据,可根据需要对接数据库
        if (id == 1) return new Pet("Buddy", 3, "Dog");
        if (id == 2) return new Pet("Luna", 2, "Cat");
        return null;
    }

    // 简单 HTML 转义(防御 XSS)
    private String escapeHtml(String input) {
        if (input == null) return "";
        return input.replace("&", "&")
                    .replace("<", "zuojiankuohaophpcn")
                    .replace(">", "youjiankuohaophpcn")
                    .replace("\"", """)
                    .replace("'", "'");
    }
}

? 关键说明

  • 使用 ServletContext.getResourceAsStream() 比 Files.readAllBytes(Paths.get(...)) 更规范,能正确处理 WAR 包内路径;
  • IOUtils.toString() 来自 commons-io(Maven 依赖 commons-iocommons-io2.11.0),若不想引入依赖,可用标准 BufferedReader 替代;
  • 所有动态插入的字段必须进行 HTML 转义(如 escapeHtml()),否则用户输入 将导致 XSS 漏洞;
  • 当前为线性字符串替换,仅适用于简单场景;复杂逻辑(条件、循环)请升级至 ThymeleafFreemarkerJSP

✅ 步骤三:定义 Pet 模型类(Java Bean)

public class Pet {
    private final String name;
    private final int age;
    private final String type;

    public Pet(String name, int age, String type) {
        this.name = name;
        this.age = age;
        this.type = type;
    }

    // getters only
    public String getName() { return name; }
    public int getAge() { return age; }
    public String getType() { return type; }
}

✅ 最终效果

访问:http://localhost:8080/your-app/index.tpl?id=1
→ Servlet 加载 index.tpl,查得 Pet("Buddy", 3, "Dog"),渲染后返回:


  
    

Pet profile - Buddy

Age: 3

Type: Dog

✅ 总结:本方案以最小依赖实现模板驱动的动态页面,兼顾安全性(路径隔离 + HTML 转义)与可维护性。随着业务增长,建议平滑迁移至成熟模板引擎——但对学习 Servlet 生命周期与基础 I/O 处理而言,这是极佳的入门实践。

相关专题

更多
java
java

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

829

2023.06.15

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

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

733

2023.07.05

java自学难吗
java自学难吗

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

733

2023.07.31

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

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

396

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

Golang 分布式缓存与高可用架构
Golang 分布式缓存与高可用架构

本专题系统讲解 Golang 在分布式缓存与高可用系统中的应用,涵盖缓存设计原理、Redis/Etcd集成、数据一致性与过期策略、分布式锁、缓存穿透/雪崩/击穿解决方案,以及高可用架构设计。通过实战案例,帮助开发者掌握 如何使用 Go 构建稳定、高性能的分布式缓存系统,提升大型系统的响应速度与可靠性。

60

2026.01.09

热门下载

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

精品课程

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

共23课时 | 2.4万人学习

C# 教程
C# 教程

共94课时 | 6.3万人学习

Java 教程
Java 教程

共578课时 | 43.8万人学习

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

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