Я думаю, это поможет больше, если вы увидите своими глазами, что на самом деле это можно сделать полностью без скриптлетов.
Вот перезапись 1 на 1 с помощью, среди прочего, 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.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, такие как ${pageContext}
, описаны здесь .Чтобы узнать больше о JSTL, ознакомьтесь с учебником по Java EE, часть II, глава 7 .Обратите внимание, что JSTL и EL - две разные вещи.JSTL - это стандартная библиотека тегов , а EL просто позволяет программно получать доступ к внутренним данным.Хотя он обычно используется в taglibs, таких как JSTL, он также может использоваться автономно в тексте шаблона.