Я думаю, что больше помогает, если вы своими глазами увидите, что на самом деле это можно сделать полностью без скриптлетов.
Вот перезапись один на один с помощью, среди прочего, JSTL (просто вставьте jstl-1.2.jar
в /WEB-INF/lib
) ядро и функции 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
webapp. Это может помочь обнаружить контролируемые скриптлеты.
<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 просто позволяет программно получить доступ к внутренним данным. Хотя он обычно используется в библиотеках тегов, таких как JSTL, его также можно использовать отдельно в тексте шаблона.
person
BalusC
schedule
03.02.2010