Je pense que cela aide plus si vous voyez de vos propres yeux que cela peut être fait entièrement. sin scriptlets.
Voici une réécriture 1 sur 1 avec l'aide de plusieurs personnes. JSTL (il suffit de déposer jstl-1.2.jar
sur /WEB-INF/lib
) noyau dur y fonctions 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>
Voici une réécriture plus optimisée, notez que j'ai utilisé c:set
pour "mettre en cache" les résultats d'expression pour les réutiliser et que j'utilise le HTML <base>
pour éviter de mettre le chemin d'accès contextuel dans chaque lien (il suffit de faire en sorte que toutes les URL relatives de votre page Web soient relatives à ce chemin d'accès - sans le slash de tête !)
<%@ 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>
Il peut en fait être optimisé davantage si vous rassemblez toutes ces valeurs "codées en dur" comme events
y people
et de lier les textes dans un Map
dans le champ d'application et l'utilisation sous chaque JSTL <c:forEach>
pour afficher les onglets.
Quant à votre réel question, vous pouvez désactiver (et obtenir des erreurs d'exécution lors de son utilisation) en ajoutant l'entrée suivante dans le fichier de configuration de l'application web web.xml
. Cela peut aider à repérer les scriptlets oubliés.
<jsp-config>
<jsp-property-group>
<url-pattern>*.jsp</url-pattern>
<scripting-invalid>true</scripting-invalid>
</jsp-property-group>
</jsp-config>
Pour en savoir plus sur les EL, consultez le Tutoriel Java EE partie II chapitre 5 . Les objets EL implicites, tels que ${pageContext}
sont décrites aquí . Pour en savoir plus sur JSTL, consultez la section Tutoriel Java EE partie II chapitre 7 . Notez que JSTL et EL sont deux choses distinctes. JSTL est un taglib standard et EL permet simplement d'accéder aux données du backend de manière programmatique. Bien qu'il soit normalement utilisé dans des taglibs comme JSTL, il peut également être utilisé de manière autonome dans le texte des modèles.