実際にはスクリプトレットなしで完全に実行できることを自分の目で見ると、さらに役立つと思います。
これは、 JSTL(ドロップjstl-1.2.jar
インするだけ/WEB-INF/lib
)コアと関数taglibを使用した1対1の書き直しです。
<%@ 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
再利用のために式の結果を「キャッシュ」していたことと<base>
、すべてのリンクにコンテキストパスを配置しないようにHTMLタグを使用していることに注意してください(Webページ内のすべての相対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>
アプリケーションスコープ内のテキストやリンクテキストなどの「ハードコードされた」値をすべて収集し、各JSTLの下でタブを表示するために使用すると、events
実際people
にはさらに最適化できます。Map
<c:forEach>
実際の質問に関しては、webappのに次のエントリを追加することで、スクリプトレットを無効にすることができます(そしてスクリプトレットの使用に関するランタイムエラーが発生します) web.xml
。監視されているスクリプトレットを見つけるのに役立つ場合があります。
<jsp-config>
<jsp-property-group>
<url-pattern>*.jsp</url-pattern>
<scripting-invalid>true</scripting-invalid>
</jsp-property-group>
</jsp-config>
ELの詳細については、JavaEEチュートリアルパートIIの第5章を確認してください。ここで${pageContext}
説明するような暗黙のELオブジェクト。JSTLの詳細については、JavaEEチュートリアルパートIIの第7章を確認してください。JSTLとELは2つの別個のものであることに注意してください。JSTLは標準のtaglibであり、ELはプログラムでバックエンドデータにアクセスできるようにするだけです。通常、JSTLなどのtaglibで使用されますが、テンプレートテキストでスタンドアロンで使用することもできます。