我认为,如果你亲眼看到它可以完全没有脚本片段就能实现,这会更有帮助。
以下是通过使用JSTL等工具(只需将jstl-1.2.jar
放入/WEB-INF/lib
)进行的一对一重写。使用了core和functions taglib:
<%@ 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>
这里是一个更加优化的重写版本,注意我使用了c:set
来“缓存”表达式结果以便重复使用,并且我使用HTML <base>
标签来避免在每个链接中都加入上下文路径(只需将网页中所有相对URL与其相关联即可-不含前导斜杠!):
<%@ 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>
如果你将所有那些像 events
和 people
这样的“硬编码”值,以及链接文本都收集到应用程序范围内的一个Map
中,并在每个值下使用 JSTL 的 <c:forEach>
来显示选项卡,它实际上可以进行更多优化。
至于你的实际问题,你可以通过在 web 应用程序的 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教程第二部分第5章。隐式EL对象,例如${pageContext}
在这里描述。如果您想要了解更多关于JSTL的内容,请查看Java EE教程第二部分第7章。请注意,JSTL和EL是两个不同的东西。JSTL是一个标准的标签库,而EL仅仅是使得程序能够访问后端数据。虽然它通常用于像JSTL这样的标签库中,但它也可以单独用于模板文本。