我有以下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()
的"service“,我的线程工作正常,但是我没有看到来自doGet()
的"It Works”,并且我在浏览器中得到以下错误:
此URL不支持
HTTP方法GET
这是如何引起的,我如何解决它?
发布于 2011-03-21 03:06:48
这是HttpServlet#doXxx()
方法(doGet()
、doPost()
、doHead()
、doPut()
等)默认实现的默认响应。这意味着,当servlet类中的doXxx()
方法没有正确地作为@Override
n,或者当它通过super
显式调用时,您将面临HTTP405 "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
基本上遵循template method pattern,其中所有未覆盖的HTTP方法都返回此HTTP405错误"Method not supported“。当您覆盖这样的方法时,您应该调用 super
方法,因为否则您仍然会得到HTTP405错误。同样的故事也适用于您的doPost()
方法。
顺便说一句,这也适用于service()
,但从技术上讲,这在这个构造中没有坏处,因为您需要它来让默认实现执行适当的方法。实际上,整个service()
方法对您来说是不必要的,您只需从servlet中删除整个方法即可。
super.init();
也是不必要的。只有在覆盖init(ServletConfig)
时才需要,否则不会设置ServletConfig
。javadoc中也明确提到了这一点。它是唯一需要super
调用的方法。
与无关的servlet对于具体的问题来说,在这样的servlet中产生线程是一个糟糕的想法。要获得正确的方法,请访问How to run a background task in a servlet based web application?
发布于 2011-03-21 03:07:27
您已经覆盖了负责将调用委托给doGet或doPost的service
方法。see this for more details
还要去掉super.doxxx(..)来自每个方法的调用。不要重写service
方法,您应该在doGet中看到"It Works“。
https://stackoverflow.com/questions/5370633
复制相似问题