2009-11-13 14 views
11

मैं जिस वेब ऐप का निर्माण कर रहा हूं उसमें जेएसपी और सर्वलेट्स को इंटरमीक्स कर रहा हूं और मुझे लगता है कि मेरे अधिक जटिल जेएसपी में बहुत सारे कोड हैं, जो सभी एमवीसी पाठों के सामने उड़ते हैं मुझे बढ़ा दिया गया है। मुझे पता है कि मैं बस जेएसपी को अग्रेषित करके ऐसा कर सकता हूं, लेकिन यह एक बेवकूफ हैक की तरह लगता है।क्या एक जेएसपी को सर्वलेट के लिए टेम्पलेट के रूप में उपयोग करना संभव है?

मैं क्या करना चाहता हूं प्रसंस्करण करने के लिए एक सर्वलेट का उपयोग करना है और फिर HTML को प्रस्तुत करने और प्रतिक्रिया वापस करने के लिए जेएसपी को मानों का एक सेट भेजना है। की तर्ज पर कुछ:

public class MyServlet extends HttpServlet { 
public void doGet(HttpServletRequest req, HttpServletResponse resp) 
    throws IOException { 

     // ... Do some processing 

     resp.getWriter.print(renderJSP("mypage.jsp", values)); 

    } 

} 

मैं सूर्य के प्रलेखन के आसपास poking किया गया है और पाया इस: http://java.sun.com/developer/technicalArticles/javaserverpages/servlets_jsp/ यह JSP मॉडल 2 वास्तुकला की तरह लगता है है कि वास्तव में क्या मैं लागू करना चाहते हैं, लेकिन मैं का एक उदाहरण नहीं मिल सकता है यह कैसे सेट कर सकता है। तकनीकी कारणों से, मैं स्ट्रैट्स जैसे अधिक उन्नत टेम्पलेट ढांचे का उपयोग नहीं कर सकता।

क्या यह संभव है या खो गया कारण है?

+2

"तकनीकी कारणों से, मैं स्ट्रैट्स जैसे अधिक उन्नत टेम्पलेट ढांचे का उपयोग नहीं कर सकता।" - तो आप इसे अपने ऐप के लिए मूल रूप से फिर से कार्यान्वित करने जा रहे हैं ... – Nate

+0

मुझे पता है कि यह एक बेवकूफ बयान है, लेकिन यह वास्तव में ऐसा नहीं लगता है कि मैं एक संपूर्ण ढांचे को पुनर्निर्मित कर रहा हूं। मैं सिर्फ दो मौजूदा प्रौद्योगिकियों को एक साथ जोड़ने का एक तरीका ढूंढ रहा हूं, मेरे दिमाग में, एक बहुत ही स्पष्ट उपयोग केस है। –

उत्तर

9

अनुरोध में ऑब्जेक्ट रखें, jsp पेज पर अनुरोध अग्रेषित करें और फिर प्रतिक्रिया प्रस्तुत करने के लिए jsp में ऑब्जेक्ट का उपयोग करें।

अपने सर्वलेट में,

MyObject obj = ... //build somehow 
request.setAttribute("myObject", obj); 
RequestDispatcher rd = request.getRequestDispatcher("WEB-INF/jsp/my.jsp"); 
rd.forward(request, response); 

अपने परिणाम JSP एक यूआरएल आप वेब INF निर्देशिका जहां यह केवल आगे के निर्देश के माध्यम से पहुँचा जा सकता है अंदर इसे छिपाने चाहिए से सीधे नहीं पहुँचा जा चाहिए।

फिर अपने jsp पर आप हो सकता है,

<% MyObject obj = (MyObject) request.getAttribute("myObject"); %> 

वस्तु पुनः प्राप्त करने और इसका इस्तेमाल रूप में की जरूरत के लिए।

जैसा कि अन्य ने सुझाव दिया है, अंततः JSTL और Spring MVC जैसे एमवीसी फ्रेमवर्क का उपयोग करना सीखना एक अच्छा विचार होगा। ट्यूटोरियल here पाया जा सकता है।

+0

क्या rd.forward क्लाइंट को 302 वापस भेजता है या क्या यह सर्वर सर्वर पर इसे संभालता है? मैं बस अपनी शब्दावली उलझन में हो सकता है। –

+0

@ सेन लिंच - आगे की निर्देशिका सर्वर की तरफ है। यही कारण है कि आप इसका उपयोग कर वेब-आईएनएफ निर्देशिका के अंदर जेएसपी पृष्ठों तक पहुंच सकते हैं। –

4

आप जेएसपी को एक हैक के रूप में अग्रेषित करने का वर्णन करते हैं, लेकिन वास्तव में, एमवीसी फ्रेमवर्क (स्प्रिंग एमवीसी और स्ट्रैट्स, कम से कम) वास्तव में यही है।

"मॉडल" अनुरोध गुण है, जो सर्वलेट पॉप्युलेट करता है; तो जेएसपी बस उन्हें दिखाने के लिए पुनर्प्राप्त करता है। आप स्प्रिंग एमवीसी की तरह "मॉडल एंड व्यू" में लपेट सकते हैं, लेकिन यह वास्तव में इसके बारे में है।

आप जेएसपी पर निश्चित रूप से पार्सिंग अनुरोध पैरामीटर, सत्र विशेषताओं या सर्वलेट संदर्भ ("वैश्विक") विशेषताओं को अधिक परिष्कृत कर सकते हैं। मैंने पाया है कि, सामान्य रूप से, यह क्लीनर/सर्वलेट मार्शल को उन सभी को विशेष गुणों में रखने के लिए क्लीनर है और पृष्ठ केवल उनसे खींचता है। यदि आप जेएसटीएल का उपयोग कर रहे हैं, तो अनुरोध और सत्र के बीच का अंतर भी धुंधला हो सकता है।

+0

बिल्कुल सच है। मैंने वसंत के साथ लगभग 4 सभ्य आकार के वेब ऐप्स किए हैं, और यह निश्चित रूप से एक हैक नहीं है, सर्वलेट (या वसंत, नियंत्रक में) दृश्य के लिए सभी डेटा सेट अप करता है, और जेएसपी में प्रदान किए गए डेटा को प्रदर्शित करने के लिए केवल तर्क शामिल है यह नियंत्रक द्वारा। यह बहुत अच्छा काम करता है, और इसे बनाए रखना वास्तव में आसान है, आप निश्चित रूप से इस मार्ग पर जाना चाहते हैं, यह एक हैक नहीं है। – Zoidberg

5

Request/Response/Session में डाल जावा वस्तुओं और अपने सर्वलेट में एक javax.servlet.RequestDispatcher उपयोग करते हैं, ऐसा ही कुछ:

RequestDispatcher dispatcher = request.getRequestDispatcher("/test.jsp"); 
dispatcher.forward(request,response); 

एक आगे सर्वर साइड और लक्ष्य सर्वलेट है/JSP ही प्राप्त करता है मूल सर्वलेट/जेएसपी के रूप में अनुरोध/प्रतिक्रिया वस्तुओं। इसलिए, आप request.setAttribute() का उपयोग कर उनके बीच डेटा पास कर सकते हैं।

अन्य विकल्प response.sendRedirect(String location) उपयोग करने के लिए जो क्लाइंट साइड है (इस विधि ग्राहक के लिए एक अस्थायी रीडायरेक्ट प्रतिक्रिया भेजता है) इसलिए स्थान यूआरएल ग्राहक से एक नया अनुरोध है, और एक ही तरीका है डेटा है पारित करने के लिए प्राप्त करता है सत्र के माध्यम से या वेब पैरामीटर के साथ (url? name = value)।

यह मूल रूप से एमवीसी फ्रेमवर्क करता है (और नहीं, यह एक हैक नहीं है)।

+0

क्या dispatcher.forward() वास्तव में क्लाइंट को 302 भेजता है या क्या यह सभी सर्वर पक्ष को संभालता है? मुझे लगता है कि मुझे अपना एचटीएमएल शब्दावली अधिभारित हो रही है। –

+0

@ सेन, सभी सर्वर की तरफ। –

+0

मैंने दोनों केस (सर्वर-साइड और क्लाइंट-साइड) को कवर करने के लिए अपना जवाब अपडेट किया है –

संबंधित मुद्दे