2011-03-20 18 views
18

मैं निम्नलिखित सर्वलेट है:HTTP स्थिति 405 - HTTP विधि प्राप्त इस URL द्वारा समर्थित नहीं है

public class MyServlet extends HttpServlet { 

    private static final long serialVersionUID = 16252534; 
    private static int ping = 3000; 
    private Thread t; 
    private static boolean shouldStop = false; 

    @Override 
    public void init() throws ServletException { 
     super.init(); 

     t = new Thread(new Runnable() { 
      @Override 
      public void run() { 
       while(!shouldStop) { 
        System.out.println("Now:" + System.currentTimeMillis()); 
        try { 
         Thread.sleep(ping); 
        } catch (InterruptedException e) { 
         e.printStackTrace(); 
        } 
       } 
      } 
     }); 
     t.start(); 

    } 
    @Override 
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) 
    throws ServletException, IOException { 
     super.doGet(req, resp); 
     System.out.println("doGet"); 
     PrintWriter out = resp.getWriter(); 
     out.println("<html><h1>It works!!</h1></html>"); 
    } 

    @Override 
    public void service(ServletRequest req, ServletResponse resp) throws ServletException, IOException { 
     super.service(req, resp); 
     System.out.println("service"); 

    } 

    @Override 
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { 
     super.doPost(req, resp); 
     System.out.println("doPost"); 

    } 

    @Override 
    public void destroy() { 
     super.destroy(); 
     System.out.println("Destroy servlet"); 
     shouldStop = true; 
    } 
} 

मेरी web.xml में इस प्रकार है कौन सा मैप किया गया है:

<display-name>MyServer</display-name> 
<welcome-file-list> 
    <welcome-file>index.jsp</welcome-file> 
</welcome-file-list> 

<servlet> 
    <servlet-name>MyServlet</servlet-name> 
    <servlet-class>com.myserver.MyServlet</servlet-class> 
    <load-on-startup>1</load-on-startup> 
</servlet>  
    <servlet-mapping> 
    <servlet-name>MyServlet</servlet-name> 
    <url-pattern>/MyServlet</url-pattern> 
</servlet-mapping> 

जब मैं खोलने के अपने ब्राउज़र (क्रोम) http://localhost:8080/MyServer/MyServlet पर, तो मुझे doService() से कंसोल पर लॉग इन होने पर "सेवा" दिखाई देती है और मेरा धागा सही तरीके से काम करता है, हालांकि मुझे doGet() से "यह काम करता है" दिखाई नहीं देता है और मुझे ब्राउज़र में निम्न त्रुटि मिलती है:

HTTP विधि प्राप्त इस URL

द्वारा समर्थित नहीं है यह कैसे के कारण होता है और मैं इसे कैसे हल कर सकते हैं?

उत्तर

54

यह HttpServlet#doGet() के डिफ़ॉल्ट कार्यान्वयन की डिफ़ॉल्ट प्रतिक्रिया है। इसका मतलब है कि doGet() विधि ठीक से @Override एन नहीं है, या इसे स्पष्ट रूप से बुलाया जा रहा है।

आपने @OverridedoGet() विधि ठीक से किया है, लेकिन आप अभी भी स्पष्ट रूप से अस्पष्ट कारण के लिए डिफ़ॉल्ट कार्यान्वयन को बुला रहे हैं।

super.doGet(req, resp); 

इस लाइन से छुटकारा पाएं और यह समस्या गायब हो जाएगी।

HttpServlet मूल रूप से template method pattern का पालन करता है जहां सभी गैर-ओवरराइड HTTP विधियां इस HTTP 405 त्रुटि "विधि समर्थित नहीं है" लौटाती हैं। जब आप इस तरह की विधि को ओवरराइड करते हैं, तो आपको super विधि पर कॉल करना चाहिए, क्योंकि आपको अन्यथा अभी भी HTTP 405 त्रुटि मिल जाएगी। आपकी doPost() विधि के लिए एक ही कहानी चल रही है।

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

super.init(); भी अनावश्यक है। यह केवल तभी जरूरी है जब आप init(ServletConfig) ओवरराइड करें, अन्यथा ServletConfig सेट नहीं किया जाएगा। यह भीjavadoc में उल्लिखित है। यह एकमात्र तरीका है जिसके लिए super कॉल की आवश्यकता होती है।


असंबंधित ठोस समस्या के लिए, इस तरह एक सर्वलेट में एक धागा उत्पन्न करने वाला एक बुरा विचार है। सही दृष्टिकोण के लिए, How to run a background task in a servlet based web application?

+0

आपको बहुत बहुत धन्यवाद। मैंने ServletContextListener का उपयोग किया है। एक प्रश्न: सर्वलेट में थ्रेड का उपयोग क्यों करना एक बुरा विचार है? – CeccoCQ

+1

यह आवश्यक नहीं है, लेकिन जिस तरह से आपने लिखा है, कोड 100% CPU संसाधनों का हमेशा उपभोग करता है। आपको लिंक किए गए उत्तर में उल्लिखित थ्रेडपूल और शेड्यूलर का उपयोग करना चाहिए। और वेबपैप स्टार्टअप और शटडाउन के दौरान वैश्विक प्रारंभिकरण और सफाई करने के लिए 'ServletContextListener' बस सही जगह है। – BalusC

+0

ठीक है, मैं समझता हूँ। धन्यवाद ;) – CeccoCQ

0

पर आपने service विधि को ओवरराइड किया है जो कॉल या डॉटपोस्ट को कॉल करने के लिए जिम्मेदार है। see this for more details
प्रत्येक विधि से super.doxxx (..) कॉल से छुटकारा पाएं। service विधि को ओवरराइड न करें और आपको डूगेट से "यह काम करता है" देखना चाहिए।

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