我有以下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)时,我看到doService()
的“服务”正在登录控制台,并且我的线程正常工作,但是我看不到doGet()
的“它有效”登录,并且在浏览器中出现以下错误:
此URL不支持HTTP方法GET
这是怎么引起的,我该如何解决?
这是HttpServlet#doXxx()
方法(doGet()
,doPost()
,doHead()
,doPut()
等)的默认实现的默认响应。这意味着,当doXxx()
方法在servlet类中未正确地为@Override
n时,或者通过super
显式调用时,您将遇到HTTP 405“不允许使用方法”错误。
因此,您需要确保正确声明了符合API的doXxx()
方法,包括@Override
批注只是为了确保您没有输入任何错字。例如:
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// ...
}
而且您还需要确保不要在servlet方法中调用super.doXxx()
:
super.doGet(request, response);
您的servlet有这个。只需摆脱这条线,您的问题就会消失。
HttpServlet
基本上跟在template method pattern之后,其中所有未覆盖的HTTP方法都返回此HTTP 405错误“ Method not support”。覆盖此类方法时,应not调用super
方法,因为否则您仍然会收到HTTP 405错误。您的doPost()
方法也是如此。
顺便说一下,这也适用于service()
,但是从技术上讲,在此构造中不会造成损害,因为您需要让默认实现执行正确的方法。实际上,不需要整个service()
方法,您只需从servlet中删除整个方法即可。
Unrelatedsuper.init();
也是不必要的。仅当您覆盖init(ServletConfig)
时才有必要,因为否则将不会设置ServletConfig
。在javadoc中也提到了[[明确]]。这是唯一需要super
调用的方法。
service
方法,该方法负责将调用委派给doGet或doPost。see this for more details还要摆脱每种方法的super.doxxx(..)调用。不要覆盖service
方法,您应该在doGet中看到“它有效”。