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?
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?
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.