JSP 1.2 विनिर्देश से, यह अत्यधिक अनुशंसा की जाती है कि JSP स्क्रिप्ट के लिए आवश्यकता को कम करने में मदद करने के लिए आपके वेब एप्लिकेशन में JSP स्टैंडर्ड टैग लाइब्रेरी (JSTL) का उपयोग किया जाए में आपके पृष्ठों में । JSTL का उपयोग करने वाले पृष्ठ सामान्य रूप से पढ़ने और बनाए रखने में आसान होते हैं।
...
जब भी संभव हो, JSP स्क्रिप्ट से बचें जब भी टैग लाइब्रेरी समान कार्यक्षमता प्रदान करें। यह पृष्ठों को पढ़ने और बनाए रखने में आसान बनाता है, व्यावसायिक तर्क को तर्क तर्क से अलग करने में मदद करता है, और आपके पृष्ठों को जेएसपी 2.0-शैली के पन्नों में विकसित करना आसान बना देगा (जेएसपी 2.0 विनिर्देश समर्थन करता है लेकिन स्क्रिप्ट के उपयोग पर जोर देता है)।
...
व्यापार तर्क से प्रस्तुति स्तरीय के बीच युग्मन को कम करने के लिए मॉडल-व्यू-कंट्रोलर (एमवीसी) डिजाइन पैटर्न को अपनाने की भावना में, जेएसपी स्क्रिप्टलेट का उपयोग व्यावसायिक तर्क लिखने के लिए नहीं किया जाना चाहिए । इसके बजाय, जेएसपी स्क्रिप्टलेट का उपयोग किया जाता है यदि डेटा को बदलने के लिए आवश्यक हो (जिसे "मूल्य ऑब्जेक्ट" भी कहा जाता है) ग्राहक के अनुरोधों को एक उचित क्लाइंट-तैयार प्रारूप में संसाधित करने से लौटा। फिर भी, यह फ्रंट कंट्रोलर सर्वलेट या कस्टम टैग के साथ बेहतर होगा।
यदि आप प्रत्येक अनुरोध पर एक ही जावा कोड लागू करना चाहते हैं, तो अनुरोधित पृष्ठ की परवाह किए बिना कम-या-अधिक, जैसे कि यदि कोई उपयोगकर्ता लॉग इन है, तो जाँच करें और फिर एक फ़िल्टर लागू करें और विधि के अनुसार कोड लिखें । उदाहरण के लिए:doFilter()
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws ServletException, IOException {
if (((HttpServletRequest) request).getSession().getAttribute("user") == null) {
((HttpServletResponse) response).sendRedirect("login"); // Not logged in, redirect to login page.
} else {
chain.doFilter(request, response); // Logged in, just continue request.
}
}
जब <url-pattern>
ब्याज के JSP पृष्ठों को कवर करने के लिए उपयुक्त पर मैप किया जाता है , तो आपको समग्र JSP पृष्ठों के समान कोड को कॉपी करने की आवश्यकता नहीं है।
आप के लिए कुछ जावा कोड आह्वान चाहते हैं preprocess आवश्यक हो तो कुछ क्वेरी पैरामीटर के आधार पर, एक अनुरोध है, जैसे प्रीलोड करना कुछ तालिका में प्रदर्शित करने के लिए एक डेटाबेस से कुछ सूची है, तो एक को लागू सर्वलेट में तदनुसार और लिखने कोड doGet()
विधि। उदाहरण के लिए:
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
try {
List<Product> products = productService.list(); // Obtain all products.
request.setAttribute("products", products); // Store products in request scope.
request.getRequestDispatcher("/WEB-INF/products.jsp").forward(request, response); // Forward to JSP page to display them in a HTML table.
} catch (SQLException e) {
throw new ServletException("Retrieving products failed!", e);
}
}
इस तरह अपवादों से निपटना आसान है। JSP रेंडरिंग के बीच में DB की पहुँच नहीं है, लेकिन JSP के प्रदर्शित होने से पहले। जब भी DB पहुंच एक अपवाद फेंकता है तब भी आपके पास प्रतिक्रिया बदलने की संभावना होती है। उपरोक्त उदाहरण में, डिफ़ॉल्ट त्रुटि 500 पेज तुम वैसे भी एक से अनुकूलित कर सकते हैं जो प्रदर्शित किया जाएगा <error-page>
में web.xml
।
यदि आप किसी अनुरोध को पोस्टप्रॉसेस करने के लिए कुछ जावा कोड मंगाना चाहते हैं, जैसे कि फॉर्म सबमिट करना, तो एक सर्वलेट लागू करें और doPost()
विधि के अनुसार कोड लिखें । उदाहरण के लिए:
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String username = request.getParameter("username");
String password = request.getParameter("password");
User user = userService.find(username, password);
if (user != null) {
request.getSession().setAttribute("user", user); // Login user.
response.sendRedirect("home"); // Redirect to home page.
} else {
request.setAttribute("message", "Unknown username/password. Please retry."); // Store error message in request scope.
request.getRequestDispatcher("/WEB-INF/login.jsp").forward(request, response); // Forward to JSP page to redisplay login form with error.
}
}
इस तरह से विभिन्न परिणाम पृष्ठ गंतव्यों से निपटना आसान है: त्रुटि के मामले में सत्यापन त्रुटियों के साथ फ़ॉर्म को फिर से परिभाषित करना (इस विशेष उदाहरण में आप इसे ईएल${message}
में उपयोग करके फिर से देख सकते हैं ), या बस सफलता के मामले में वांछित लक्ष्य पृष्ठ पर ले जा सकते हैं।
यदि आप निष्पादन योजना और / या अनुरोध और प्रतिक्रिया के गंतव्य को नियंत्रित करने के लिए कुछ जावा कोड को लागू करना चाहते हैं , तो एमवीसी के फ्रंट कंट्रोलर पैटर्न के अनुसार एक सर्वलेट लागू करें । उदाहरण के लिए:
protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
try {
Action action = ActionFactory.getAction(request);
String view = action.execute(request, response);
if (view.equals(request.getPathInfo().substring(1)) {
request.getRequestDispatcher("/WEB-INF/" + view + ".jsp").forward(request, response);
} else {
response.sendRedirect(view);
}
} catch (Exception e) {
throw new ServletException("Executing action failed.", e);
}
}
या जेएसएफ , स्प्रिंग एमवीसी , विकेट , आदि जैसे एमवीसी ढांचे को अपनाएं ताकि आप कस्टम सर्वलेट की आवश्यकता के बिना सिर्फ एक जेएसपी / फेसलेट्स पेज और एक जावाबीन वर्ग के साथ समाप्त हो जाएं।
यदि आप एक JSP पेज के अंदर प्रवाह को नियंत्रित करने के लिए कुछ जावा कोड को लागू करना चाहते हैं , तो आपको JSTL कोर की तरह एक (मौजूदा) प्रवाह नियंत्रण टैगलिब को हथियाने की जरूरत है । जैसे List<Product>
एक तालिका में प्रदर्शित :
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
...
<table>
<c:forEach items="${products}" var="product">
<tr>
<td>${product.name}</td>
<td>${product.description}</td>
<td>${product.price}</td>
</tr>
</c:forEach>
</table>
XML- शैली टैग के साथ जो सभी HTML के बीच अच्छी तरह से फिट होते हैं, कोड विभिन्न पठनीय और समापन ब्रेस के साथ स्क्रिप्ट के एक समूह की तुलना में बेहतर पठनीय (और इस तरह बेहतर बनाए रखने योग्य) होता है ( "जहां इस बंद कंस का संबंध है?" )। एक आसान सहायता यह है कि अपने वेब एप्लिकेशन को एक अपवाद फेंकने के लिए कॉन्फ़िगर करें जब भी स्क्रिप्टलेट का उपयोग निम्नलिखित टुकड़े को जोड़कर किया जाता है web.xml
:
<jsp-config>
<jsp-property-group>
<url-pattern>*.jsp</url-pattern>
<scripting-invalid>true</scripting-invalid>
</jsp-property-group>
</jsp-config>
में Facelets , JSP के उत्तराधिकारी, जो जावा ईई का हिस्सा है MVC ढांचा प्रदान JSF , यह पहले से ही है नहीं संभव उपयोग करने के लिए scriptlets । इस तरह आप चीजों को "सही तरीके से" करने के लिए स्वचालित रूप से मजबूर हो जाते हैं।
यदि आप एक JSP पृष्ठ के अंदर "बैकएंड" डेटा को एक्सेस और प्रदर्शित करने के लिए कुछ जावा कोड को आमंत्रित करना चाहते हैं , तो आपको उन ${}
चीजों में ईएल (एक्सप्रेशन लैंग्वेज) का उपयोग करने की आवश्यकता है । उदाहरण के लिए प्रस्तुत इनपुट मानों को फिर से परिभाषित करना:
<input type="text" name="foo" value="${param.foo}" />
${param.foo}
प्रदर्शित करता है के परिणाम request.getParameter("foo")
।
यदि आप कुछ उपयोगिता जावा कोड को सीधे जेएसपी पेज (आमतौर पर public static
विधियों) में शामिल करना चाहते हैं, तो आपको उन्हें ईएल फ़ंक्शन के रूप में परिभाषित करने की आवश्यकता है। JSTL में एक मानक फ़ंक्शंस टैगलिब है, लेकिन आप आसानी से फ़ंक्शंस भी बना सकते हैं । यहाँ एक उदाहरण है कि कैसे JSTL है fn:escapeXml
को रोकने के लिए उपयोगी है XSS हमलों ।
<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %>
...
<input type="text" name="foo" value="${fn:escapeXml(param.foo)}" />
ध्यान दें कि XSS संवेदनशीलता किसी भी तरह से विशेष रूप से जावा / जेएसपी / जेएसटीएल / ईएल / से संबंधित नहीं है, जो भी हो, इस समस्या को आपके द्वारा विकसित किए जाने वाले प्रत्येक वेब एप्लिकेशन में ध्यान में रखा जाना चाहिए । स्क्रिप्टलेट्स की समस्या यह है कि यह बिलिन की रोकथाम का कोई तरीका नहीं प्रदान करता है, कम से कम मानक जावा एपीआई का उपयोग नहीं करता है। जेएसपी के उत्तराधिकारी फेसलेट्स पहले से ही HTML से बच रहे हैं, इसलिए आपको फेसलेट्स में XSS छेद के बारे में चिंता करने की आवश्यकता नहीं है।