Cec*_*oCQ 22 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 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;
}
}
Run Code Online (Sandbox Code Playgroud)
在我的映射如下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>
Run Code Online (Sandbox Code Playgroud)
当我打开我的浏览器(Chrome)http://localhost:8080/MyServer/MyServlet,然后我看到"服务"从doService()登录控制台和我的线程正常工作,但我没有看到"It Works" doGet()被记录,我在浏览器中收到以下错误:
此URL不支持HTTP方法GET
这是怎么造成的,我该如何解决?
Bal*_*usC 60
这是默认实现的默认响应HttpServlet#doGet().这意味着该doGet()方法没有正确地为@Overriden,或者它被明确地调用.
您正确地执行@Override了该doGet()方法,但您仍然明确地调用默认实现,原因不明.
super.doGet(req, resp);
Run Code Online (Sandbox Code Playgroud)
摆脱这条线,这个问题就会消失.
在HttpServlet基本遵循模板方法模式,所有非重写HTTP方法返回此HTTP 405错误"不支持方法".当你重写这样的方法,你应该不调用super方法,因为否则你将仍然得到HTTP 405错误.你的doPost()方法也有同样的故事.
这也适用于service()顺便说一句,但这在技术上并没有在这个构造中造成伤害,因为你需要它让默认实现执行正确的方法.实际上,整个service()方法对您来说是不必要的,您可以从servlet中删除整个方法.
这super.init();也是不必要的.只有在覆盖时才需要它init(ServletConfig),因为否则ServletConfig将不会设置.这也在javadoc中明确提到.这是唯一需要通话的方法.super
与具体问题无关,在这样的servlet中生成一个线程是一个坏主意.要获得正确的方法,请转到如何在基于servlet的Web应用程序中运行后台任务?
| 归档时间: |
|
| 查看次数: |
32774 次 |
| 最近记录: |