首先,将 HTML 存储在数据库中并不是一个好主意。但是,唉。
至于具体问题,你可以只定义一个 HTML <base> 标签,它会使文档中的所有相对 URL 都成为它的相对 URL。
<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %>
...
<head>
<c:set var="r" value="${pageContext.request}" />
<base href="${fn:replace(r.requestURL, r.requestURI, '')}${r.contextPath}/" />
</head>
这样你就可以使用
<table><tr><td><img src="images/car.png" /></td></tr></table>
<table><tr><td><img src="doc?id=123456"/></td></tr></table>
如果没有基础,您将依赖于上下文路径。
如果你真的想要参数化它们,那么我会使用java.text.MessageFormat。您可以使用{0}、{1}、{2} 等作为第一个、第二个、第三个等参数的占位符。
<table><tr><td><img src="{0}/images/car.png" /></td></tr></table>
<table><tr><td><img src="{0}/doc?id=123456"/></td></tr></table>
您可以从HttpServletRequest 获取当前主机/端口(和上下文!),如下所示:
HttpServletRequest r = getItSomehow();
String base = r.getRequestURL().toString().replace(r.getRequestURI(), "") + r.getContextPath();
您可以按如下方式从 DB 中格式化 HTML:
String html = getItSomehow();
String formatted = MessageFormat.format(html, base);
然后在 JSP 中显示。您甚至可以将其包装在自定义 EL 函数中。更重要的是,像 JSF 这样的一些 MVC 框架也有使用 MessageFormat 的标签。例如
<h:outputFormat value="#{bean.html}" escape="false">
<f:param value="#{bean.base}" />
</h:outputFormat>