के बीच कोई अंतर मैं इसे और अधिक मदद करता है यदि आप अपने स्वयं के साथ देख लगता है कि देखने के लिए असफल आंखें कि यह वास्तव में पूरी तरह से स्क्रिप्टलेट के बिना पूरी तरह से किया जा सकता है।
यहाँ दूसरों के बीच की मदद से एक 1 पर 1 पुनर्लेखन JSTL (बस छोड़ /WEB-INF/lib
में jstl-1.2.jar
) 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
करने के लिए "कैश" का इस्तेमाल किया पुन: उपयोग के लिए अभिव्यक्ति के परिणाम और मैं प्रत्येक लिंक में संदर्भ पथ डालने से बचने के लिए एचटीएमएल <base>
टैग का उपयोग करता हूं (केवल सभी संबंधित यूआरएल को इसके संबंधित वेबपेज में - प्रमुख स्लैश के बिना बनाएं):
<%@ 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>
यह वास्तव में अधिक अनुकूलित किया जा सकता है अगर आप आवेदन दायरे में एक Map
में events
और people
और लिंक ग्रंथों की तरह उन सभी "हार्डकोडेड" मूल्यों को इकट्ठा करने और प्रत्येक JSTL <c:forEach>
के तहत का उपयोग टैब प्रदर्शित करने के लिए।
अपने वास्तविक प्रश्न के रूप में, आप कर सकते हैं अक्षम scriptlets (और यह उपयोग करने के बारे क्रम त्रुटियों मिल) वेब ऐप्लिकेशन की web.xml
में निम्नलिखित प्रविष्टि जोड़कर। यह विदेशी लिपियों को खोजने में मदद कर सकता है।
<jsp-config>
<jsp-property-group>
<url-pattern>*.jsp</url-pattern>
<scripting-invalid>true</scripting-invalid>
</jsp-property-group>
</jsp-config>
ईएल के बारे में अधिक जानने के लिए, Java EE tutorial part II chapter 5 देखें। लागू ईएल ऑब्जेक्ट्स, जैसे ${pageContext}
को here वर्णित किया गया है। जेएसटीएल के बारे में और जानने के लिए, Java EE tutorial part II chapter 7 देखें। ध्यान दें कि जेएसटीएल और ईएल दो अलग-अलग चीजें हैं। जेएसटीएल मानक टैगलिब है और ईएल बस बैकएंड डेटा को प्रोग्रामेटिक रूप से एक्सेस करने में सक्षम बनाता है। यद्यपि यह आमतौर पर जेएसटीएल जैसे टैगलिब्स में प्रयोग किया जाता है, लेकिन इसका उपयोग टेम्पलेट टेक्स्ट में स्टैंडअलोन भी किया जा सकता है।
एक तरफ के रूप में, '<% = request.getContextPath()%>' उन स्क्रिप्टलेट्स का स्वीकार्य उपयोग है जो इतने पर फंसे नहीं हैं? – Chris
आपको टेम्पलेटिंग के लिए फेसलेट का उपयोग शुरू करना चाहिए। आपको सही ढंग से कोड करने के लिए मजबूर करता है। –
क्या आप साइटमैश के बजाय चेहरे का उपयोग कर रहे हैं? – Chris