2008-10-28 33 views
11

क्या कोई शुद्ध-जावा < जेएसपी के बराबर है: आगे पृष्ठ = "..."/> कि मैं <% ...%> ब्लॉक के भीतर उपयोग कर सकता हूं? आगे बदसूरत है और यह मुश्किल पढ़ने के लिए बनाता है: jsp उपयोग करने के लिएजेएसपी: जेएसपी टैग का उपयोग किए बिना जावा में आगे?

<% 
    String errorMessage = SomeClass.getInstance().doSomething(); 
    if (errorMessage != null) { 
     session.setAttribute("error", errorMessage); 
%> 
<jsp:forward page="error.jsp" /> 
<% 
    } else { 
     String url = response.encodeRedirectURL("index.jsp"); 
     response.sendRedirect(url); 
    } 
%> 

<% तोड़ने के लिए होने ...%> ब्लॉक:

उदाहरण के लिए, मैं इस समय इस तरह एक JSP पेज कुछ है इंडेंटेशन के कारण, अन्य चीजों के साथ।

तो, क्या मैं जेएसपी टैग के बिना जावा कोड में आगे बढ़ सकता हूं?

कुछ इस तरह आदर्श होगा:

<% 
    String errorMessage = SomeClass.getInstance().doSomething(); 
    if (errorMessage != null) { 
     session.setAttribute("error", errorMessage); 
     someObject.forward("error.jsp"); 
    } else { 
     String url = response.encodeRedirectURL("index.jsp"); 
     response.sendRedirect(url); 
    } 
%> 
+0

यह कोड के टूटने तक कि unmaintainable scriptlets बनाता है समय के साथ है में अपने त्रुटि पृष्ठ सेट करें। यही कारण है कि पहली बार टैग पुस्तकालयों और जेएसटीएल का उपयोग करने के लिए पुश बनाया गया था। इसे <% for // %> से HTML के समान सब कुछ देखना आसान है <% कुछ%> अन्य टेक्स्ट <% end लूप%> अधिक टेक्स्ट के लिए। – MetroidFan2002

उत्तर

28

someObject आप देख रहे हैं pageContext है।

इस वस्तु परोक्ष JSP में परिभाषित किया गया है, तो आप इस तरह इसका इस्तेमाल कर सकते हैं:

pageContext.forward("<some relative jsp>"); 
+1

अच्छी कॉल! प्रेषक को स्पष्ट रूप से प्राप्त करने से यह साफ है। – erickson

+0

मुझे लगता है कि आपको आगे के बाद «वापसी;» रखना होगा, अन्यथा पृष्ठ चलना जारी रहेगा और त्रुटियां उत्पन्न करेगा (अवैध स्थिति)। मुझे लगता है कि टैग स्वचालित रूप से आपके लिए करता है। – marcus

7

आप वास्तव में कोशिश करते हैं और यदि आप कर सकते हैं scriplets से बचना चाहिए, और अपने मामले में, का एक बहुत कुछ कर रहे हो क्या जेएसटीएल कोड के साथ प्रतिस्थापित किया जा सकता है। आपके उदाहरण के लिए निम्नलिखित प्रतिस्थापन अधिक स्वच्छ है, IMO:

<% 
    // Consider moving to a servlet or controller/action class 
    String errorMessage = SomeClass.getInstance().doSomething(); 
    pageContext.setAttribute("errorMessage", errorMessage); 
%> 
<c:choose> 
    <c:when test="${not empty errorMessage}"> 
    <c:set var="error" scope="session" value="${errorMessage}" /> 
    <jsp:forward page="error.jsp" /> 
    </c:when> 
    <c:otherwise> 
    <c:redirect url="index.jsp" /> 
    </c:otherwise> 
</c:choose> 

आदर्श रूप में, आप error.jsp संशोधित था ताकि त्रुटि संदेश भी सत्र में तय करने की आवश्यकता नहीं है, लेकिन मैंने नहीं किया अपने डिजाइन को बहुत बदलना चाहते हैं।

+0

क्या आप कृपया अपने उत्तर में समझा सकते हैं कि जेएसटीएल को वरीयताओं में लिपियों से क्यों बचा जाना चाहिए? –

+3

यह कभी स्पष्ट नहीं हुआ है कि सादे लिपियों पर जेएसटीएल का क्या फायदा है। मैंने चर्चाएं देखी हैं जो कहती हैं कि इससे गैर-प्रोग्रामर गतिशील वेब पेज बनाने की अनुमति देते हैं क्योंकि आपको जावा को नहीं जानना है। लेकिन वास्तव में, ऊपर दिए गए उदाहरण को देखें: यह "प्रोग्रामिंग" कैसे नहीं है? निश्चित रूप से, यह जावा नहीं है, लेकिन किसी भी तर्कसंगत परिभाषा से यह एक प्रोग्रामिंग भाषा है। तो जावा सीखने और उपयोग करने के बजाय, आप जावा सीख सकते हैं और उपयोग कर सकते हैं और सीख सकते हैं और दूसरी भाषा का उपयोग कर सकते हैं। आपको जो राशि सीखनी है, उसे जोड़ने के अलावा, क्या प्राप्त किया जाता है? – Jay

+0

मैं यहां पटकथा लोगों के साथ हूं। यह कम कोड है, बेकार ' 'वाक्यविन्यास से बचाता है, और तेज़, क्योंकि' जब 'में ईएल अभिव्यक्ति प्रत्येक बार चलने पर स्ट्रिंग के रूप में पार्स की जाती है, जबकि जावा कोड संकलित होता है। – davidsheldon

3

एक साधारण दृष्टिकोण:

<%@page errorPage="Error.jsp" %> 

<% 
String errorMessage = SomeClass.getInstance().doSomething(); 
if (errorMessage != null) { 
     throw new Exception(errorMessage); // Better throw the exception from doSomething() 
} 
pageContext.forward("index.jsp"); 
%> 


Error.jsp 
......... 
<%@ page isErrorPage='true' %> 
<% 
out.print("Error!!!"); 
out.print(exception.getMessage()); 
%> 

बेहतर दृष्टिकोण:

एक सर्वलेट से DoSomething() आह्वान। web.xml

<error-page> 
     <exception-type>java.lang.Exception</exception-type> 
     <location>/WEB-INF/jsp/Error.jsp</location> 
</error-page> 
+0

व्यक्तिगत रूप से - और यह पूरी तरह से व्यक्तिगत प्राथमिकता है, शायद - मुझे लगता है कि जेएसपी में मेरा प्रवाह नियंत्रण करना आसान है जेएसपी, servlets, और web.xml सेटिंग्स के संयोजन के साथ। और कारण उस वाक्य से सचित्र है: यदि मैं इसे जेएसपी में करता हूं, तो यह तीनों की बजाय एक स्थान पर है। – Jay