2

我发现这段代码非常难看:

<a href="<c:url value='/my/path/${id}.html'/>">Title</a>

在:

href="<c:url value=

和:

'/>">

部分。JSP EL 是否有任何可用的标准函数,其工作与 JSTL c:out相同,但看起来像:

<a href="${f:context('/my/path/'.concat(id).concat('.html'))">Title</a>

或更好:

<a href="${f:context}/my/path/${id}.html">Title</a>
4

3 回答 3

2

你可以做:

<c:url value='/my/path/${id}.html' var="myUrl"/>
<a href="${myUrl}">My Url</a>

这会将 URL 存储在变量中myUrl,该变量可以用作a标签中的表达式。

于 2013-07-04T10:55:59.333 回答
2

或更好:

<a href="${f:context}/my/path/${id}.html">Title</a>

这个有可能:

<a href="${pageContext.request.contextPath}/my/path/${id}.html">Title</a>

如果您发现它很长,只需<c:set>在主模板顶部的其他位置使用别名,如下所示

<c:set var="ctx" value="${pageContext.request.contextPath}" scope="request" />

这样您就可以在其他任何地方使用它

<a href="${ctx}/my/path/${id}.html">Title</a>

也可以看看:

于 2013-07-04T11:55:55.763 回答
1

我对该领域的研究表明,我可以将ctx参数放在web.xml中自己的 EE 过滤器中:

<filter>
    <filter-name>ctxFilter</filter-name>
    <filter-class>org.my.web.filter.CtxFilter</filter-class>
</filter>
<filter-mapping>
    <filter-name>ctxFilter</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>

和:

public class CtxFilter implements Filter {
    @Override
    public void init(FilterConfig filterConfig) { }
    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
        request.setAttribute("CTX", request.getServletContext().getContextPath());
        chain.doFilter(request, response);
    }
    @Override
    public void destroy() { }
}

或在 Spring 拦截器中(基于我的项目框架堆栈)。这也可以通过以下方式完成:

<spring:url value="/" var="ctx" htmlEncoding="true"/>
<a href="${ctx}/path/...">...</a>

或作为:

<c:url value="/" var="ctx"/>
<a href="${ctx}/path/...">...</a>

但是这些示例的第一行必须跨 JSP 文件重复。

最后,您可以使用适当的函数WEB-INF/tlds/ctx.tld实现 TDL 文件:

<function>
    <name>ctx</name>
    <function-class>org.my.web.Ctx</function-class>
    <function-signature>java.lang.String getCtx()</function-signature>
</function>

参考:

于 2013-07-04T11:01:01.727 回答