HTTP Status 405-la méthode HTTP GET N'est pas supportée par cette URL

j'ai le servlet suivant:

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;
    }
}

qui est mappé comme suit dans mon 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>

quand j'ouvre mon navigateur (Chrome) sur http://localhost:8080/MyServer/MyServlet , puis je vois "service" de doService() être connecté sur console et mon thread fonctionne correctement, mais je ne vois pas "It Works" de doGet() être connecté et je reçois l'erreur suivante dans le navigateur:

méthode HTTP GET n'est pas supporté par cette URL

comment cela est-il causé et comment puis-je le résoudre?

19
demandé sur BalusC 2011-03-20 21:52:31

2 réponses

C'est la réponse par défaut de l'implémentation par défaut de HttpServlet#doGet() . Cela signifie que la méthode doGet() n'est pas correctement être @Override n, ou il est explicitement appelé.

vous avez fait correctement @Override la méthode doGet() , mais vous appelez encore explicitement l'implémentation par défaut pour une raison obscure.

super.doGet(req, resp);

débarrassez-vous de cette ligne et ce problème disparaîtra.

le HttpServlet suit fondamentalement le modèle de méthode de template où toutes les méthodes HTTP non-overridden renvoient cette erreur HTTP 405 "Méthode non supportée". Lorsque vous outrepassez une telle méthode, vous devriez et non appeler super méthode, parce que sinon vous obtiendriez toujours L'erreur HTTP 405. La même histoire se répète pour votre méthode doPost() .

cela s'applique également sur service() soit dit en passant, mais que ne pas nuire techniquement dans cette construction puisque vous besoin il pour laisser l'implémentation par défaut exécuter les méthodes appropriées. En fait, toute la méthode service() est inutile pour vous, vous pouvez simplement supprimer la méthode entière de votre servlet.

le super.init(); est également inutile. Il n'est nécessaire que lorsque vous outrepassez le init(ServletConfig) , parce que sinon le ServletConfig ne serait pas défini. C'est aussi explicitement mentionné dans le javadoc . C'est la seule méthode qui nécessite un super appel.


sans rapport avec le problème du béton, c'est une mauvaise idée de créer un fil dans un servlet comme celui-ci. Pour l'approche correcte, dirigez-vous vers comment exécuter une tâche de fond dans une application web basée sur servlet?

55
répondu BalusC 2017-05-23 12:25:54

vous avez dépassé la méthode service qui est responsable de déléguer l'appel à doGet ou doPost. voir cette pour plus de détails

Aussi se débarrasser de super.doxxx(..) des appels de chaque méthode. Ne surchargez pas la méthode service et vous devriez voir, "ça marche" de doGet.

0
répondu Premraj 2011-03-20 19:13:22