HTTP状态405 – 这个URL不支持HTTP方法GET

我有以下的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 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上打开我的浏览器(Chrome)时,然后从控制台上logging了doService() “service”,并且我的线程正常工作,但是我没有看到“It Works “从doGet()被logging,我得到在浏览器中的以下错误:

HTTP方法GET不受此URL支持

这是如何造成的,我该如何解决?

这是HttpServlet#doGet()的默认实现的默认响应。 这意味着doGet()方法不正确地被@Override n,或明确被调用。

你做了正确的@Override doGet()方法,但你仍然明确地调用默认的实现,原因不明。

 super.doGet(req, resp); 

摆脱这条线,这个问题将消失。

HttpServlet基本上遵循模板方法模式 ,其中所有未覆盖的HTTP方法返回此HTTP 405错误“方法不支持”。 当你重写这样一个方法时,你不应该调用super方法,因为否则你将会得到HTTP 405错误。 doPost()方法也是如此。

这也适用于service()方式,但这在技术上不会伤害这个构造,因为你需要它让默认实现执行正确的方法。 实际上,整个service()方法对你来说是不必要的,你可以从你的servlet中移除整个方法。

super.init(); 也是不必要的。 只有当你覆盖init(ServletConfig)时才有必要,否则ServletConfig将不会被设置。 这也是在javadoc中 明确提到的。 这是需要super通话的唯一方法。


具体问题无关 ,像这样在servlet中产生一个线程是一个坏主意。 要获得正确的方法,请转到如何在基于servlet的Web应用程序中运行后台任务?

您已经重写了负责将调用委托给doGet或doPost的service方法。 看到这个更多的细节
也摆脱每个方法super.doxxx(..)调用。 不要覆盖service方法,你应该从doGet中看到“It Works”。