8

我们使用 tomcat urlrewrite 插件来重写出站 URL 以及入站 URL。为此,您需要使用 JSTL 标记。

这对于干净的 url 和 i18n 非常有用,但是它会产生丑陋的代码,包括标签内的标签,如下所示:

<link href='<c:url value="/content/bootstrap/css/bootstrap.css" />' rel="stylesheet" />

或者:

<a href='<c:url value="/nextPage.jsp"/>' />Next Page</a>

一种替代方法是使用变量,如下所示:

<c:url value="/nextPage.jsp" var="nextPageUrl"/>
<a href='${nextPageUrl}' />Next Page</a>

这真的很干净,但很冗长。

有没有一种表达语言友好的方式来做到这一点?

我有点希望像这样:

<a href='${url "/nextPage.jsp}' />Next Page</a>

谢谢。

4

3 回答 3

2

没有什么是开箱即用的,但没有什么能阻止您编写自己的 EL 函数,因此可以使用类似的东西:

<a href='${myFn:url("/nextPage.jsp")}' />Next Page</a>

我不觉得它比标准的 c:url 标签更具可读性,但如果它必须接受参数名称和值,那就更糟了。

有关如何定义和使用 EL 函数的信息,请参阅http://docs.oracle.com/javaee/1.4/tutorial/doc/JSIntro7.html 。

于 2012-05-31T19:56:48.557 回答
1

哪里有几种方法。

1)将基础绑定到公共片段中的变量

common.jspf

<%@tag language="java" pageEncoding="UTF-8"%>
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<c:url value="/" var="base"/>

或喜欢:

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

在每个页面中包含片段

<%@include file="base.jspf"%>
<script src="${base}/js/jquery.js"></script>
<link href="${base}/css/bootstrap.css" rel="stylesheet" type="text/css">
<a href="${base}/index.html">Home</a>

2) ${pageContext.request.contextPath}到处使用:

<script src="${pageContext.request.contextPath}/js/jquery.js"></script>
<link href="${pageContext.request.contextPath}/css/bootstrap.css" rel="stylesheet" type="text/css">
<a href="${pageContext.request.contextPath}/index.html">Home</a>

3)是我最喜欢的:添加包含属性基础的过滤器

/src/java/company/project/web/filter/BaseFilter.java

import java.io.IOException;
import javax.servlet.*;

/**
 * Make sane JSP, instead of:
 *   <pre>&lt;a href="&lt;c:url value='/my/path/${id}.html'/&gt;"&gt;Title&lt;/a&gt;</pre>
 * allow to use:
 *   <pre>&lt;a href="${ctx}/my/path/${id}.html"&gt;Title&lt;/a&gt;</pre>
 */
public class BaseFilter implements Filter {

    @Override
    public void init(FilterConfig fc) {
    }

    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
        request.setAttribute("base", request.getServletContext().getContextPath());
        chain.doFilter(request, response);
    }

    @Override
    public void destroy() { }

}

并在以下位置注册该过滤web.xml

<filter>
    <filter-name>BaseFilter</filter-name>
    <filter-class>company.project.web.filter.BaseFilter</filter-class>
</filter>
<filter-mapping>
    <filter-name>BaseFilter</filter-name>
    <url-pattern>*.htm</url-pattern>
    <url-pattern>*.json</url-pattern>
</filter-mapping>

并使用干净的语法(如上但不需要包含样板片段):

<script src="${base}/js/jquery.js"></script>
<link href="${base}/css/bootstrap.css" rel="stylesheet" type="text/css">
<a href="${base}/index.html">Home</a>

注意我在该过滤器中设置了其他属性,例如在 CSS/JS 的开发版本和缩小版本之间切换:

private String min;

@Override
public void init(FilterConfig fc) {
    min = fc.getServletContext().getInitParameter("min");
    if (min == null)
        min = fc.getInitParameter("min");
    if (min == null)
        min = "min";
}

@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
    request.setAttribute("ctx", request.getServletContext().getContextPath());
    request.setAttribute("min", min);
    chain.doFilter(request, response);
}

和对应的JSP代码:

<script src="${base}/js/jquery.${min}.js"></script>
<link href="${base}/css/bootstrap.${min}.css" rel="stylesheet" type="text/css">

初始参数min可以设置为contex 部署描述符中的 WAR 文件dev或在外部设置,如果未设置,则回退到缩小版本。min

4)使用脚本

<a href="<%=request.getContextPath()%>/index.html">Home</a>
于 2015-10-26T21:33:11.853 回答
0

我最终想出的解决方案是使用自定义标签来解决 CSS 和 JS 的问题。当然,类似的解决方案也可以应用于标签,尽管我还没有需要。

<my:csslink url="/css/custom.css" />
<my:script url="/script/myscript.js" />

CSS 标记看起来像这样,Javascript 的标记显然非常相似:

<%@tag language="java" pageEncoding="UTF-8"%>
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>

<%@attribute name="url" required="true" type="java.lang.String" description="the absolute (to the webapp) path of the css file"%>
<c:url var="encUrl" value='${url}' />
<link href='${encUrl}' rel='stylesheet' />

不要忘记在你的jsp中导入标签:

<%@ taglib prefix="my" tagdir="/WEB-INF/tags" %>

在某些情况下,自定义 EL 解决方案会更简洁,但如果您想添加对其他参数或属性的支持,标签可能是要走的路。

于 2012-12-21T16:18:20.017 回答