我认为,如果你亲眼看到它实际上可以完全在没有脚本的情况下完成,那会更有帮助。
这是一个1对1重写,借助其他JSTL(只需删除jstl-1.2.jar
)核心和函数taglib:/WEB-INF/lib
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %>
<html>
<head>
<title>My Events - <decorator:title /></title>
<link href="${pageContext.request.contextPath}/assets/styles.css" rel="stylesheet" type="text/css" />
</head>
<body>
<div class="tabs">
<a
${fn:contains(pageContext.request.requestURI, '/events/') ? 'class="selected"' : ''}
href="${pageContext.request.contextPath}/events/Listing.action">Events</a>
<a
${fn:contains(pageContext.request.requestURI, '/people/') ? 'class="selected"' : ''}
href="${pageContext.request.contextPath}/people/Listing.action">People</a>
</div>
<div class="submenu">
<c:if test="${fn:contains(pageContext.request.requestURI, '/events/')}">
<a href="Listing.action">List of Events</a>
|<a href="New.action">New Event</a>
</c:if>
<c:if test="${fn:contains(pageContext.request.requestURI, '/people/')}">
<a href="Listing.action">List of People</a>
|<a href="New.action">New Person</a>
</c:if>
</div>
这是一个更优化的重写,请注意,我曾经“缓存”表达式结果以供重用,并且我使用HTML标记来避免将上下文路径放在每个链接中(只需使网页中所有相对URL相对于它 - 没有前导斜杠!c:set
<base>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %>
<c:set var="isEvents" value="${fn:contains(pageContext.request.requestURI, '/events/')}" />
<c:set var="isPeople" value="${fn:contains(pageContext.request.requestURI, '/people/')}" />
<html>
<head>
<title>My Events - <decorator:title /></title>
<base href="${pageContext.request.contextPath}">
<link href="assets/styles.css" rel="stylesheet" type="text/css" />
</head>
<body>
<div class="tabs">
<a ${isEvents ? 'class="selected"' : ''} href="events/Listing.action">Events</a>
<a ${isPeople ? 'class="selected"' : ''} href="people/Listing.action">People</a>
</div>
<div class="submenu">
<c:if test="${isEvents}">
<a href="Listing.action">List of Events</a>|<a href="New.action">New Event</a>
</c:if>
<c:if test="${isPeople}">
<a href="Listing.action">List of People</a>|<a href="New.action">New Person</a>
</c:if>
</div>
如果您收集所有这些“硬编码”值(如和)并在应用程序范围内链接文本并在每个JSTL下使用JSTL来显示选项卡,则实际上可以对其进行更多优化。events
people
Map
<c:forEach>
至于您的实际问题,您可以通过在webapp的.中添加以下条目来禁用脚本(并获得有关使用它的运行时错误)。它可能有助于发现监督的脚本。web.xml
<jsp-config>
<jsp-property-group>
<url-pattern>*.jsp</url-pattern>
<scripting-invalid>true</scripting-invalid>
</jsp-property-group>
</jsp-config>
要了解有关 EL 的更多信息,请查看 Java EE 教程第 II 部分第 5 章。隐式 EL 对象,如此处所述。要了解有关 JSTL 的更多信息,请查看 Java EE 教程第 II 部分第 7 章。请注意,JSTL 和 EL 是两个不同的东西。JSTL是一个标准的taglib,EL只是能够以编程方式访问后端数据。虽然它通常用于像JSTL这样的taglibs中,但它也可以在模板文本中单独使用。${pageContext}