2011-08-11 14 views
10

मैं servlet और फिल्टर और रैपर के बारे में कुछ पाठ पढ़ने के लिए नया हूँ। मैं फिल्टर समझ सकता हूं लेकिन रैपर के बारे में उलझन में आया। पुस्तक में, लेखक एक उदाहरण देता है:ServletResponse और HttpServletResponseWrapper के बीच मतभेद?

मामले में कोई आवरण:

public void doFilter(ServletRequest request, ServletResponse response, 
      FilterChain chain) 
      throws IOException, ServletException { 

     String name = request.getParameter("name").trim(); 

     try { 
      chain.doFilter(request, response); 
      PrintWriter out = response.getWriter(); 
      if (name.length() == 0) { 
       out.println("Some message"); 
       out.println("</body>"); 
       out.println("</html>"); 
       out.close(); 
      } 
     } catch (Throwable t) { 
     } 
    } 

आवरण के मामले में:

public void doFilter(ServletRequest request, ServletResponse response, 
      FilterChain chain) 
      throws IOException, ServletException { 

     String name = request.getParameter("name").trim(); 

     HttpServletResponse httpRes = (HttpServletResponse) response; 
     HttpServletResponseWrapper resWrapper = new HttpServletResponseWrapper(httpRes); 
     try { 
      chain.doFilter(request, response); 

      PrintWriter out = resWrapper.getWriter(); // why dont we just use response.getWriter(); 
      if (name.length() == 0) { 
       out.println("<h3>Some message"); 
       out.println("</body>"); 
       out.println("</html>"); 
       out.close(); 
      } 
     } catch (Throwable t) { 
     } 
    } 

क्यों हम HttpServletResponseWrapper जरूरत है हम साथ एक ही बात कर सकते हैं, जबकि ServletResponse मामले में 1? क्या कोई मुझे एक स्पष्ट उदाहरण दे सकता है कि हमें ServletResponse के बजाय HttpServletResponseWrapper का उपयोग करना चाहिए? मैंने Google की कोशिश की है लेकिन कोई भाग्य नहीं मिला है।

+0

यह कोड अजीब लग रहा है। सर्वलेट प्रतिक्रिया लपेटने का उद्देश्य इसे आगे पास करना है ('chain.doFilter (अनुरोध, resWrapper); ') और रैपर में चयनित कॉल को रोकें। उदाहरण के लिए, आप विभिन्न प्रतिक्रिया लेखक को वापस कर सकते हैं जो फ्लाई पर सामग्री को बदलता या संपीड़ित करता है और इसे लक्ष्य 'प्रतिक्रिया' पर भेजता है। इस उदाहरण में ज्यादा समझ नहीं है ... क्या आप इसका स्रोत प्रदान कर सकते हैं (पेज, पुस्तक?) –

+0

मुझे खुद को अजीब भी मिला। यह कोड मैंने विश्वविद्यालय व्याख्याता की पावरपॉइंट स्लाइड से लिया था। यदि हम chain.doFilter (अनुरोध, resWrapper) करते हैं तो यह अधिक समझ में आता है; आपके सुझाव के रूप में – ipkiss

उत्तर

8

यह वास्तव में एक बेवकूफ उदाहरण है जो अनुरोध/प्रतिक्रिया रैपर का लाभ नहीं दिखाता है। दरअसल, पूरा फ़िल्टर उदाहरण खराब है। एमिटिंग एचटीएमएल एक जेएसपी या उच्चतम सर्वलेट द्वारा किया जाना चाहिए (लेकिन यह अभी भी खराब है)। हमारे filters wiki page के माध्यम से कुछ विचार प्राप्त करने के लिए जाएं कि फ़िल्टर का उपयोग किस प्रकार किया जा सकता है।

एक प्रतिक्रिया रैपर उपयोगी है यदि आप प्रतिक्रिया के व्यवहार को संशोधित करना चाहते हैं या प्रतिक्रिया के बारे में जानकारी एकत्र करना चाहते हैं, जबकि यह अनुरोध-प्रतिक्रिया श्रृंखला में उपयोग किया गया है। जब भी कुछ servlet या JSP प्रतिक्रिया पर एक निश्चित विधि कॉल करता है तब संशोधित व्यवहार तब होता है। यदि आपने इसे अपने रैपर वर्ग में ओवरराइड कर दिया है, तो इसके बजाय इसे एक कहा जाएगा। आप व्यवहार को बदल सकते हैं या वहां जानकारी एकत्र कर सकते हैं।

यहां स्टैक ओवरफ्लो पर आप उपयोगी HttpServletResponseWrapper कार्यान्वयन के उदाहरण पा सकते हैं।

18

BalusC का जवाब अच्छा है, लेकिन यह कभी अभिभूत हो सकता है अगर आप सिर्फ बाहर शुरू कर रहे हैं।

बस रखें: SerlvetResponse और इसका विस्तार, HttpServletResponse, इंटरफेस आपको बता रहे हैं कि आपको आवश्यक चीजों को करने के लिए कॉल करने के लिए कौन सी विधियां उपलब्ध हैं। फ़िल्टर, सर्वलेट्स, एट अल के साथ काम करने के सामान्य पाठ्यक्रम में, आप अक्सर अपने ऐप को बताने के लिए अनुरोध करते हैं कि अनुरोधों का जवाब कैसे दिया जाए।

HttpServletResponseWrapper एचटीपीएसर्लेट रिस्पॉन्स का एक विशेष कार्यान्वयन है जो आपको इंटरफेस के एक नए नए कार्यान्वयन के बिना अपने स्वयं के कुछ तर्कों के साथ मौजूदा प्रतिक्रिया को लपेटने का एक सुविधाजनक तरीका प्रदान करता है। इसमें बहुत विधियों के हैं, इसलिए यह वाकई अच्छा है। एक मामूली उदाहरण के रूप में, मान लीजिए कि आप response.flushBuffer() पर कॉल अस्वीकृत करना चाहते हैं।इस कोड, HttpServletResponseWrapper का उपयोग कर, कि क्या करेंगे:

class DisallowFlushResponseWrapper extends HttpServletResponseWrapper { 
    public DisallowFlushResponseWrapper(HttpServletResponse response) { 
     super(response); 
    } 

    @Override 
    public void flushBuffer() { 
     throw new UnsupportedOperationException("Don't call this!"); 
    } 
} 

इस तरह के एक आवरण का उपयोग करने के लिए इस तरह एक फिल्टर बनाने के लिए किया जाएगा विशिष्ट तरीका: कि हम लपेट प्रतिक्रिया में आने

class DisallowFlushFilter implements Filter { 
    public void doFilter(ServletRequest request, ServletResponse response, 
      FilterChain chain) { 
     if (response instanceof HttpServletResponse) { 
      HttpServletResponse newResponse = 
       new DisallowFlushResponseWrapper((HttpServletResponse) response); 
      chain.doFilter(request, newResponse); 
     } 
     ... 
    } 
    ... 
} 

नोट अपने स्वयं के आवरण के उदाहरण के साथ फ़िल्टर करें। फिर हम फिल्टर श्रृंखला में अगले आइटम पर रैपर को नीचे रख देते हैं। इस प्रकार इस फ़िल्टर के बाद आने वाली किसी भी चीज को अपवाद मिलेगा यदि यह फ्लशबफर() कहता है क्योंकि यह इसे हमारे रैपर पर कॉल करेगा। रैपर, इसके डिफ़ॉल्ट व्यवहार के कारण, लपेटी प्रतिक्रिया पर किसी भी अन्य कॉल को प्रतिनिधि करेगा, जो असली है, इसलिए उस विधि को कॉल को छोड़कर सब कुछ सामान्य रूप से काम करेगा।

+0

लेकिन मूल प्रश्न अभी भी अनुत्तरित नहीं है, यानी हम इसे मूल HttpServletResponse ऑब्जेक्ट के साथ क्यों नहीं कर सकते हैं? –