Servlets HTTP状态405-此URL不支持HTTP方法
我有以下servlet:Servlets HTTP状态405-此URL不支持HTTP方法,servlets,http-get,http-status-code-405,Servlets,Http Get,Http Status Code 405,我有以下servlet: 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 v
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;
}
}
当我在http://localhost:8080/MyServer/MyServlet
,然后我在控制台上看到从doService()
登录的“服务”,我的线程正常工作,但是我没有看到从doGet()
登录的“服务”,我在浏览器中看到以下错误:
此URL不支持HTTP方法GET
这是如何导致的,我如何解决它?这是
HttpServlet\doXxx()
方法(doGet()
,doPost()
,doHead()
,doPut()
等)的默认实现的默认响应。这意味着,当servlet类中的doXxx()
方法未正确地被@Override
n调用,或者通过super
显式调用时,您将面临HTTP 405“method not allowed”错误
因此,您需要确保在API中正确声明了doXxx()
方法,包括@Override
注释,以确保您没有输入任何错误。例如
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// ...
}
您还需要确保永远不要在servlet方法中调用super.doXxx()
:
super.doGet(request, response);
您的servlet具有以下功能。只要摆脱这条线,你的问题就会消失
HttpServlet的HttpServlet
基本上遵循所有未重写的HTTP方法返回HTTP 405错误“Method not supported”(方法不受支持)。当您重写这样一个方法时,您应该不调用super
方法,否则您仍然会得到HTTP405错误。您的doPost()
方法也是如此
顺便说一句,这也适用于service()
,但这在技术上不会对这个构造造成伤害,因为您需要它来让默认实现执行正确的方法。实际上,整个service()
方法对您来说是不必要的,您可以从servlet中删除整个方法
super.init()代码>也是不必要的。只有在重写init(ServletConfig)
时才需要它,否则将无法设置ServletConfig
。这一点在报告中也有明确提及。这是唯一需要super
调用的方法
与具体问题无关,在servlet中生成这样的线程是个坏主意。要获得正确的方法,请转到您已经覆盖了负责将调用委托给doGet或doPost的服务
方法
还可以从每个方法中去掉super.doxxx(..)调用。
不要覆盖服务
方法,您应该会看到doGet中的“它可以工作”。非常感谢。我使用了ServletContextListener。一个问题:为什么在servlet中使用线程是一个坏主意?这不一定是坏主意,但编写代码的方式永远会消耗100%的CPU资源。您应该使用一个线程池和一个调度程序,如链接答案中所述。而且,ServletContextListener
是在webapp启动和关闭期间执行全局初始化和清理的正确位置。
super.doGet(request, response);