如何用Java Servlet处理HTML模板index.tpl并返回至浏览器?
用Java Servlet处理HTML模板并返回填充后的页面
1. 配置Servlet映射
先让访问/index.tpl的请求触发你的Servlet,直接在Servlet类上添加注解@WebServlet("/index.tpl")即可,不用修改web.xml配置文件。
2. 模板文件存放建议
把index.tpl放在项目的WEB-INF/templates目录下(这个目录无法通过浏览器直接访问,安全性更高),内容保持你提供的原样:
<html> <body> <h1> Pet profile - {pet.name} </h1> <p> age {pet.age} </p> etc. </body> </html>
3. 完整Servlet代码实现
下面是包含读取模板、获取数据、替换变量、输出响应的核心代码:
import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.nio.charset.StandardCharsets; @WebServlet("/index.tpl") public class PetTemplateServlet extends HttpServlet { // 模拟宠物数据结构,实际项目可替换为数据库查询逻辑 private static class Pet { private String name; private int age; public Pet(String name, int age) { this.name = name; this.age = age; } public String getName() { return name; } public int getAge() { return age; } } @Override protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // 1. 获取请求参数中的宠物ID String petId = request.getParameter("id"); Pet pet = getPetById(petId); // 2. 读取模板文件内容 String templateContent = readTemplateFile("/WEB-INF/templates/index.tpl"); // 3. 替换模板中的变量占位符 String filledHtml = templateContent .replace("{pet.name}", pet.getName()) .replace("{pet.age}", String.valueOf(pet.getAge())); // 4. 设置响应格式并输出处理后的HTML response.setContentType("text/html;charset=UTF-8"); response.getWriter().write(filledHtml); } // 根据ID获取宠物数据,这里是模拟实现 private Pet getPetById(String petId) { if ("1".equals(petId)) { return new Pet("旺财", 3); } else { // 默认返回示例宠物 return new Pet("小白", 2); } } // 读取模板文件并转换为字符串 private String readTemplateFile(String filePath) throws IOException { InputStream inputStream = getServletContext().getResourceAsStream(filePath); if (inputStream == null) { throw new IOException("模板文件不存在:" + filePath); } StringBuilder contentBuilder = new StringBuilder(); try (BufferedReader reader = new BufferedReader( new InputStreamReader(inputStream, StandardCharsets.UTF_8))) { String line; while ((line = reader.readLine()) != null) { contentBuilder.append(line).append("\n"); } } return contentBuilder.toString(); } }
4. 关键逻辑说明
- 模板读取:通过
getServletContext().getResourceAsStream()获取模板文件输入流,能稳定读取WEB-INF目录下的文件,避免路径错误。 - 变量替换:这里用简单的
String.replace()实现,适合变量较少的场景。如果后续模板复杂度提升,可以考虑引入Freemarker、Thymeleaf等专业模板引擎,不过新手先从基础实现入手更易理解。 - 响应编码:必须设置
Content-Type为text/html;charset=UTF-8,防止页面出现乱码。
5. 测试验证
启动Web应用后,访问http://localhost:8080/你的项目名/index.tpl?id=1,就能看到填充了宠物名称和年龄的完整页面。
内容的提问来源于stack exchange,提问作者Gustavo Morais
相关产品推荐
相关产品推荐

