讲师中心 微信公众号

工具推荐

视频效率加速
updream

一键生成高质量推广成片

AniShort
AniShort

AI短剧协同制作平台

立刻MV
立刻MV

低成本歌曲 MV、视频生成

Laper
Laper

剧本策划到成片协作

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

秋宇酱_7919

秋宇酱_7919

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

|

715人浏览过

|

来源于php中文网

原创

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

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

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

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

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

<!-- WEB-INF/templates/index.tpl -->
<html>
  <body>
    <h1>Pet profile - {pet.name}</h1>
    <p>Age: {pet.age}</p>
    <p>Type: {pet.type}</p><p><span>立即学习</span>“<a href="https://pan.quark.cn/s/c1c2c2ed740f" style="text-decoration: underline !important; color: blue; font-weight: bolder;" rel="nofollow" target="_blank">Java免费学习笔记(深入)</a>”;</p><div class="aritcle_card flexRow">
                                                        <div class="artcardd flexRow">
                                                                <a class="aritcle_card_img" href="/xiazai/skill11499" title="cn-json-diff"><img
                                                                                src="https://img.php.cn/upload/skill/001/246/273/6adaf20cf0281539.jpg" alt="cn-json-diff" ></a>
                                                                <div class="aritcle_card_info flexColumn">
                                                                        <a href="/xiazai/skill11499" title="cn-json-diff">cn-json-diff</a>
                                                                        <p>比较两个 JSON 文件并显示差异。支持嵌套结构、数组及值变更。纯 Python 标准库实现,无需 API 密钥。</p>
                                                                </div>
                                                                <a href="/xiazai/skill11499" title="cn-json-diff" class="aritcle_card_btn flexRow flexcenter"><b></b><span>下载</span> </a>
                                                        </div>
                                                </div>
  </body>
</html>
⚠️ 注意:切勿将模板放在 webapp/ 根目录下(如 webapp/index.tpl),否则用户可绕过 Servlet 直接访问原始模板,造成信息泄露或 XSS 风险。

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

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

@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("<", "<")
                    .replace(">", ">")
                    .replace("\"", """)
                    .replace("'", "&#x27;");
    }
}

? 关键说明:

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

✅ 步骤三:定义 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"),渲染后返回:

<html>
  <body>
    <h1>Pet profile - Buddy</h1>
    <p>Age: 3</p>
    <p>Type: Dog</p>
  </body>
</html>

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

相关文章

HTML速学教程(入门课程)
HTML速学教程(入门课程)

HTML怎么学习?HTML怎么入门?HTML在哪学?HTML怎么学才快?不用担心,这里为大家提供了HTML速学教程(入门课程),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热门AI工具

更多
豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

函子Zion

一款支持AI搭建、可视化编辑和多端发布的全栈无代码开发平台。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

蛙蛙写作

一款AI论文写作工具,主要用于超级AI智能写作助手,适合需要提升相关任务效率的用户。

UP简历
UP简历 Hot

一款AI办公效率工具,主要用于基于AI技术的免费在线简历制作工具,适合需要提升相关任务效率的用户。

墨刀AI
墨刀AI Hot

一款AI图像与设计工具,主要用于产品经理的专属智能体,适合需要提升相关任务效率的用户。

Lovart
Lovart Hot

一款面向视觉设计创作的AI设计平台,可通过智能体和画布工作流辅助制作海报、Logo、网页、PPT及其他视觉内容。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

讯飞绘文

讯飞绘文是一款由科大讯飞推出的一站式 AIGC 内容运营平台。

相关专题

更多
Java Maven专题
Java Maven专题

本专题聚焦 Java 主流构建工具 Maven 的学习与应用,系统讲解项目结构、依赖管理、插件使用、生命周期与多模块项目配置。通过企业管理系统、Web 应用与微服务项目实战,帮助学员全面掌握 Maven 在 Java 项目构建与团队协作中的核心技能。

4640

2025.09.15

Java Maven/Gradle 构建与依赖管理合集
Java Maven/Gradle 构建与依赖管理合集

系统讲解 Java 项目构建工具的使用与进阶配置,涵盖 Maven 的 POM 文件结构、生命周期(clean/compile/package/install/deploy)与插件机制、依赖范围(compile/provided/test/runtime)与传递依赖管理、多模块聚合与继承、私有 Nexus 仓库发布,以及 Gradle 的 Groovy / Kotlin DSL 语法、Task 自定义与增量构建、依赖版本目录(Versi

389

2026.05.09

servlet生命周期
servlet生命周期

Servlet生命周期是指Servlet从创建到销毁的整个过程。本专题为大家提供servlet生命周期的各类文章,大家可以免费体验。

1431

2023.08.08

js 字符串转数组
js 字符串转数组

js字符串转数组的方法:1、使用“split()”方法;2、使用“Array.from()”方法;3、使用for循环遍历;4、使用“Array.split()”方法。本专题为大家提供js字符串转数组的相关的文章、下载、课程内容,供大家免费下载体验。

1918

2023.08.03

js截取字符串的方法
js截取字符串的方法

js截取字符串的方法有substring()方法、substr()方法、slice()方法、split()方法和slice()方法。本专题为大家提供字符串相关的文章、下载、课程内容,供大家免费下载体验。

3144

2023.09.04

java基础知识汇总
java基础知识汇总

java基础知识有Java的历史和特点、Java的开发环境、Java的基本数据类型、变量和常量、运算符和表达式、控制语句、数组和字符串等等知识点。想要知道更多关于java基础知识的朋友,请阅读本专题下面的的有关文章,欢迎大家来php中文网学习。

6364

2023.10.24

字符串介绍
字符串介绍

字符串是一种数据类型,它可以是任何文本,包括字母、数字、符号等。字符串可以由不同的字符组成,例如空格、标点符号、数字等。在编程中,字符串通常用引号括起来,如单引号、双引号或反引号。想了解更多字符串的相关内容,可以阅读本专题下面的文章。

6489

2023.11.24

java读取文件转成字符串的方法
java读取文件转成字符串的方法

Java8引入了新的文件I/O API,使用java.nio.file.Files类读取文件内容更加方便。对于较旧版本的Java,可以使用java.io.FileReader和java.io.BufferedReader来读取文件。在这些方法中,你需要将文件路径替换为你的实际文件路径,并且可能需要处理可能的IOException异常。想了解更多java的相关内容,可以阅读本专题下面的文章。

8034

2024.03.22

Postman身份认证怎么配置
Postman身份认证怎么配置

本专题从实际API接口调试场景出发,讲解Postman身份认证的完整配置流程,包括常见认证协议介绍、授权参数设置、访问令牌填写、OAuth 2.0授权及认证失败排查,帮助用户正确完成接口授权与访问验证。

120

2026.11.06

热门下载

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

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
dev.java 官方:Learn Java
dev.java 官方:Learn Java

共0课时 | 0人学习

Java JDBC数据库连接官方教程
Java JDBC数据库连接官方教程

共0课时 | 0人学习

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

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn