HTTP状态405 – Servlet中此URL不支持HTTP方法GET

为什么我得到HTTP状态405-HTTP方法本程序中的URL错误不支持 GET.Well我在此之前完成了3个程序,它们运行正常,但这显示错误。

package com.aamir; import java.io.IOException; import java.io.PrintWriter; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; public class Servlet4 extends HttpServlet { protected void service(HttpServletResponse res, HttpServletRequest req) throws IOException, ServletException { PrintWriter out = res.getWriter(); res.setContentType("text/html"); out.println("through out"); System.out.println("through SOP"); } } 

web.xml中

   Servlet4 com.aamir.Servlet4   Servlet4 /Servlet4  

这里,

 protected void service(HttpServletResponse res, HttpServletRequest req) throws IOException, ServletException { // ... } 

你交换了HttpServletResponseHttpServletRequest ,因此它与接口方法不匹配,因此它永远不会被容器调用。 容器仍将调用HttpServlet模板类的原始service()方法,该方法又调用HttpServlet模板类的原始doGet()方法,该方法又返回HTTP 405错误。

将它们交换回正确的位置并添加@Override注释:

 @Override protected void service(HttpServletRequest req, HttpServletResponse res) throws IOException, ServletException { // ... } 

这样容器实际上会调用overriden service()方法。 正确使用@Override注释将导致错误方法签名上的编译错误。

也就是说,你不应该需要覆盖service()方法,除非你打算再生成另一个MVC控制器(除非出于业余爱好/学习目的,否则这也是有问题的 – 参见Design Patterns基于Web的应用程序 )。