Creo que ayuda más si se ve con su propio Ojos que en realidad se puede hacer por completo sin scriptlets.
Aquí es una reescritura 1 a 1 con ayuda de, entre otros JSTL (simplemente introduce jstl-1.2.jar
en /WEB-INF/lib
) core y 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>
Aquí es una reescritura más optimizada, tenga en cuenta que he usado c:set
a "caché" resultados de expresión para reutilizar y que utilizo la etiqueta HTML <base>
para evitar poner la ruta de contexto en cada enlace (basta con hacer todas las direcciones URL relativas en su página web sin la barra inclinada):
<%@ 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>
En realidad, se puede optimizar más si recoja todos esos valores "codificados" como events
y people
y vincular los textos en un Map
en el ámbito de la aplicación y el uso de cada uno bajo la JSTL <c:forEach>
para mostrar las fichas.
En cuanto a su pregunta real , se puede desactivar scriptles (y obtener los errores de ejecución acerca de su uso), añadiendo la siguiente entrada en aplicación web de web.xml
. Puede ayudar a detectar los scriptlets supervisados.
<jsp-config>
<jsp-property-group>
<url-pattern>*.jsp</url-pattern>
<scripting-invalid>true</scripting-invalid>
</jsp-property-group>
</jsp-config>
Para obtener más información sobre EL, comprobar el Java EE tutorial part II chapter 5. Los objetos EL implícitos, como ${pageContext}
se describen here. Para obtener más información sobre JSTL, consulte el Java EE tutorial part II chapter 7. Tenga en cuenta que JSTL y EL son dos cosas separadas. JSTL es taglib estándar y EL solo permite acceder a los datos de back-end mediante programación. Aunque normalmente se usa en taglibs como JSTL, también se puede usar de forma independiente en el texto de la plantilla.
Como un aparte, es '<% = request.getContextPath()%>' un uso aceptable de scriptlets que no está mal visto tanto? – Chris
Deberías comenzar a usar facelets para crear plantillas. Te obliga a codificar correctamente. –
¿Estás diciendo usar facelets en lugar de sitemesh? – Chris