首先,将HTML存储在数据库中并不是一个好主意。但是...
至于具体的问题,您可以定义一个HTML <base>
标签,使文档中的所有相对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();
您可以按以下方式格式化来自数据库的 HTML 内容:
String html = getItSomehow();
String formatted = MessageFormat.format(html, base);
然后在JSP中显示它。您甚至可以将其包装在自定义EL函数中。更重要的是,一些MVC框架(如JSF)也有使用MessageFormat
的标记。例如:
<h:outputFormat value="#{bean.html}" escape="false">
<f:param value="#{bean.base}" />
</h:outputFormat>