如何在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
相关产品推荐
相关产品推荐

