你能用JSTL c:if来测试网址模式吗?

时间:2011-12-05 04:50:27

标签: jsp url jstl el

我正在尝试使用对当前URL进行操作的JSP条件。基本上我想做一些事情,如果URL以/my-suffix结尾,不包括查询字符串等。所以我需要针对中间的url的子字符串进行测试。

<c:if test="url not including query string+ ends with '/my-suffix'">
  do something...
</c:if>

有办法做到这一点吗?

3 个答案:

答案 0 :(得分:13)

结帐JSTL functions taglib。其中一个可用功能是fn:endsWith()。这允许您例如:

<%@taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %>
...
<c:if test="${not fn:endsWith(pageContext.request.requestURI, '/my-suffix')}">
    <p>URL does not end with /my-suffix.</p>
</c:if>

${pageContext.request.requestURI}返回HttpServletRequest#getRequestURI(),其中不包含查询字符串)

或者,如果你已经使用了兼容Servlet 3.0的容器,因此它与EL 2.2一起出现,例如Tomcat 7,Glassfish 3等,那么你也可以直接调用带有参数的方法,例如{{3 }}:

<c:if test="${not pageContext.request.requestURI.endsWith('/my-suffix')}">
    <p>URL does not end with /my-suffix.</p>
</c:if>

答案 1 :(得分:4)

如果您希望在网址中的任意位置匹配字符串,则使用以下内容进一步添加到BalusC的答案也会有效:

<c:if test="${fn:contains(pageContext.request.requestURI, 'my-string')}">
    <p>URL Contains my string</p>
</c:if>

旁注:我们的答案都没有涵盖标题所暗示的内容(模式匹配),但这并不是OP在他的帖子中想要做的事情。这实际上只是涉及但仍然可行(jstl显然没有内置的正则表达式匹配)。如果有人需要这样做,请创建一个单独的帖子并将其链接到我,我会尽力帮助你。

答案 2 :(得分:0)

首先,您需要对网址进行拆分,并使用查询参数,然后检查使用结尾等等...看起来很乱。

您可以检查字符串是否完全在路径中?

要做那个&gt;&gt;

获取路径并为要评估的网址和字符串设置变量:

<c:set var="url" value="${ pageContext.request.requestURI }" />
<c:set var="stringToHunt" value="Your-String-Here" />

现在使用indexOf检查你的字符串是否在路径中(如果找不到字符串,则返回-1):

<c:if test="${ fn:indexOf( url , stringToHunt) ne -1 }">
    This page does not contain your string!
</c:if>

**我是JSTL / EL的新手,我只使用这个逻辑来完成一项相当普通的任务 - 如果它是当前页面,则将一个活动类添加到导航按钮。对于任何商业敏感的东西,我不推荐这种方法! 祝你好运。