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”。