You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Servlet/JSP中提取并替换HTML文本内容(非JS方式)

解决方案:Servlet + JSP 实现数据库驱动的文本替换(无JS)

要实现把HTML中的硬编码文本替换为数据库里的翻译内容,且不依赖前端JS,我们可以通过**后端渲染(Servlet + JSP)**的方式完成,核心思路是:后端从数据库加载翻译数据,再传递给JSP页面动态渲染文本。以下是分步实现方案:


1. 重构HTML为JSP页面

把原HTML文件重命名为index.jsp,将所有硬编码文本替换为JSP EL表达式占位符,示例如下:

<!DOCTYPE html>
<html>
<head>
    <meta charset="ISO-8859-1">
    <title id="title1">${translations.Amazon_Home}</title>
</head>
<body>
    <p id="p1">${translations.Hello_World}</p>
    <form action="Translate" method="post">
        <label id="l1">${translations.UserName}</label>
        <input type="text" name="uid"><br><br>
        <label id="l2">${translations.Password}</label>
        <input type="password" name="pwd"><br><br>
        <input type="submit" value="${translations.submit}" id="sub">
    </form>
    <p id="p2">${translations.Some_Text_Here ?: 'Some text here'}</p>
</body>
</html>

注:?:是EL的默认值运算符,如果数据库中没有对应键的翻译,会显示后面的默认文本


2. 编写Servlet加载数据库翻译数据

创建一个Servlet(比如TranslationLoaderServlet),负责连接数据库、查询所有翻译数据,并将数据传递给JSP页面。这里使用基础JDBC示例:

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.IOException;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.HashMap;
import java.util.Map;

@WebServlet("/loadHome")
public class TranslationLoaderServlet extends HttpServlet {
    // 数据库连接配置(建议放到外部配置文件,这里为示例简化写法)
    private static final String DB_URL = "jdbc:mysql://localhost:3306/your_db_name";
    private static final String DB_USER = "your_db_username";
    private static final String DB_PASS = "your_db_password";

    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        Map<String, String> translations = new HashMap<>();

        try (Connection conn = DriverManager.getConnection(DB_URL, DB_USER, DB_PASS)) {
            String query = "SELECT f_key, f_value FROM translations";
            try (PreparedStatement stmt = conn.prepareStatement(query);
                 ResultSet rs = stmt.executeQuery()) {
                while (rs.next()) {
                    translations.put(rs.getString("f_key"), rs.getString("f_value"));
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
            // 异常降级:加载默认文本避免页面空值
            translations.put("Amazon_Home", "Amazon Home");
            translations.put("Hello_World", "Hello World");
            translations.put("UserName", "UserName");
            translations.put("Password", "Password");
            translations.put("submit", "submit");
        }

        // 将翻译数据存入请求属性,传递给JSP
        request.setAttribute("translations", translations);
        // 转发到JSP页面完成渲染
        request.getRequestDispatcher("/index.jsp").forward(request, response);
    }
}

3. 配置访问路径

用户访问/loadHome路径时,Servlet会自动加载数据库翻译数据并渲染JSP页面。如果想让这个页面作为网站首页,可以修改web.xml设置欢迎页指向该Servlet,或者给Servlet添加loadOnStartup = 1属性让它在容器启动时就加载。


4. 优化建议

  • 使用数据库连接池:不要每次请求都创建新连接,改用HikariCP等连接池提升性能和稳定性。
  • 缓存翻译数据:如果翻译内容不经常变动,可以把数据缓存到ServletContext或Redis中,避免重复查询数据库。
  • XSS防护:用JSTL的<c:out>标签替代直接EL输出,比如<c:out value="${translations.Hello_World}" />,防止恶意脚本注入。
  • 多语言扩展:如果需要支持多语言,可以给数据库表加language字段,Servlet根据请求的Locale参数查询对应语言的翻译。

内容的提问来源于stack exchange,提问作者Sai

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 03:52:03