HTTP状态405-此URL不支持HTTP方法 [英] HTTP Status 405 - HTTP method is not supported by this URL
问题描述
我有以下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
基本遵循模板方法模式,其中所有未覆盖的HTTP方法返回此HTTP 405错误方法不支持".当您覆盖此类方法时,您应该不调用super
方法,因为否则您仍然会收到HTTP 405错误.您的doPost()
方法也是如此.
顺便说一句,这也适用于service()
,但是从技术上讲,这对这种构造没有害处,因为您需要让默认实现执行正确的方法.实际上,整个service()
方法对您来说都是不必要的,您只需从servlet中删除整个方法即可.
super.init();
也是不必要的.仅当您覆盖init(ServletConfig)
时才有必要,因为否则将不会设置ServletConfig
.在如何在基于servlet的Web应用程序中运行后台任务?
I have the following 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;
}
}
Which is mapped as follows in my 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>
When I open my browser (Chrome) on http://localhost:8080/MyServer/MyServlet
, then I see "service" from doService()
being logged on console and my thread works correctly, however I don't see "It Works" from doGet()
being logged and I get the following error in the browser:
HTTP method GET is not supported by this URL
How is this caused and how can I solve it?
This is the default response of the default implementation of HttpServlet#doXxx()
method (doGet()
, doPost()
, doHead()
, doPut()
, etc). This means that when the doXxx()
method is not properly being @Override
n in your servlet class, or when it is explicitly being called via super
, then you will face a HTTP 405 "Method not allowed" error.
So, you need to make sure that you have the doXxx()
method properly declared conform the API, including the @Override
annotation just to ensure that you didn't make any typos. E.g.
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// ...
}
And you also need to make sure that you don't ever call super.doXxx()
in your servlet method:
super.doGet(request, response);
Your servlet has this. Just get rid of this line and your problem shall disappear.
The HttpServlet
basically follows the template method pattern where all non-overridden HTTP methods returns this HTTP 405 error "Method not supported". When you override such a method, you should not call super
method, because you would otherwise still get the HTTP 405 error. The same story goes on for your doPost()
method.
This also applies on service()
by the way, but that does technically not harm in this construct since you need it to let the default implementation execute the proper methods. Actually, the whole service()
method is unnecessary for you, you can just remove the entire method from your servlet.
The super.init();
is also unnecessary. It's is only necessary when you override the init(ServletConfig)
, because otherwise the ServletConfig
wouldn't be set. This is also explicitly mentioned in the javadoc. It's the only method which requires a super
call.
Unrelated to the concrete problem, spawning a thread in a servlet like that is a bad idea. For the correct approach, head to How to run a background task in a servlet based web application?
这篇关于HTTP状态405-此URL不支持HTTP方法的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!