HTTP 状态 405 - 此 URL 不支持 HTTP 方法 POST

Posted

技术标签:

【中文标题】HTTP 状态 405 - 此 URL 不支持 HTTP 方法 POST【英文标题】:HTTP Status 405 - HTTP method POST is not supported by this URL 【发布时间】:2011-04-04 09:26:59 【问题描述】:

当我使用以下代码(如下)时,我收到错误 HTTP Status 405 - HTTP method POST is not supported by this URL ...导致问题的行(显然)是 getServletContext().getRequestDispatcher("/EditObject?id="+objId).forward(request, response);

package web.objects;

import java.io.IOException;
import java.sql.SQLException;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import dao.ObjDetailsDao;

@SuppressWarnings("serial")
public class EditObjectText extends HttpServlet 

 public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException 


  int objId = Integer.parseInt(request.getParameter("objId"));
  String text = (String)request.getParameter("description");

  ObjDetailsDao oddao = new ObjDetailsDao();
   try 
oddao.modifyText(text, objId);
 /////////////
    getServletContext().getRequestDispatcher("/EditObject?id="+objId).forward(request, response);
 ////////////
    catch (SQLException e) 
    // TODO Auto-generated catch block
    e.printStackTrace();
    catch (ServletException e) 
    // TODO Auto-generated catch block
    e.printStackTrace();
    catch (IOException e) 
    // TODO Auto-generated catch block
    e.printStackTrace();
        
      

编辑:我按照建议添加了throws ServletException, IOException,但这并没有改变错误。

编辑:EditObject servlet 看起来像这样

 @SuppressWarnings("serial")
public class EditObject extends HttpServlet

    public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException 

        int objId = Integer.parseInt(request.getParameter("id"));
        dispPage(objId, request, response);
    

    private void dispPage(int objId, HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException        

// ... lots of code in here
            getServletContext().getRequestDispatcher("/jsp/objectPageEdit.jsp").forward(request, response);

    

另一个编辑:所以基本上我不能做我正在做的事情。我需要的是,用户提交一个发布请求,然后我将他/她引回一个使用 Get 方法而不是 Post 的 servlet。如何在不收到错误的情况下进行此推荐?提前致谢。

【问题讨论】:

处理 /EditObject 的 servlet 在哪里? @Ankur: 哪个类或 servlet 处理 /EditObject url? 您正试图将一个 POST 方法更改为另一个 GET。你这样做的方式是错误的。请求调度程序不查看查询字符串。 /EditObject 下映射的任何内容都无法处理 POST 方法。 @mohammad ...我添加了一些细节,如果需要可以添加更多。谢谢 @Ankur:您需要将 EditObject 中的 doGet 方法更改为 doPost。不确定它是否会影响您的其余代码。 【参考方案1】:

(抱歉之前发错答案,我删了).


显然 URL /EditObject 映射到另一个没有覆盖 doPost() 方法的 servlet。它也会在RequestDispatcher#forward() 上调用,因为当前运行 HTTP 请求的方法是 POST。 默认 HttpServlet#doPost() 实现将返回 HTTP 405。如果您的实际意图是在其上触发 GET 请求以便调用 doGet() 方法,那么您应该改用 HttpServletResponse#sendRedirect() .

response.sendRedirect("/EditObject?id="+objId);

【讨论】:

同意。需要检查 /EditObject url 处理程序【参考方案2】:

将 doPost() 添加到您的 EditObject 类:

 @SuppressWarnings("serial")
public class EditObject extends HttpServlet

    public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException 
      process(request, response);
    

    public void doPost(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException 
      process(request, response);
    


    public void process(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException     
        int objId = Integer.parseInt(request.getParameter("id"));
        dispPage(objId, request, response);
    

    private void dispPage(int objId, HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException        

// ... lots of code in here
            getServletContext().getRequestDispatcher("/jsp/objectPageEdit.jsp").forward(request, response);

    

【讨论】:

...您应该在任何地方将“id”参数重命名为“objId”以使其正常工作。 不需要重命名参数。它以名称id 传递并以名称id 检索。只有变量名确实与它不一致。然而,我同意摆脱那种类似匈牙利语的符号。太丑了。 谢谢,我知道这也是一个很好的技术。 在原始 POST 请求中,参数名称为“objId”,而 EditObject 类中应为“id”。 getServletContext().getRequestDispatcher("/EditObject?id="+objId) 调用中提供的“id”参数是多余的,因为它不用于执行调度。 getServletContext().getRequestDispatcher("/EditObject") 就够了。

以上是关于HTTP 状态 405 - 此 URL 不支持 HTTP 方法 POST的主要内容,如果未能解决你的问题,请参考以下文章

HTTP 状态 405 - 此 URL 不支持 HTTP 方法 GET [重复]

HTTP 状态 405 - 此 URL 不支持 HTTP 方法 POST

Apache Tomcat HTTP 状态 405 - 此 URL 不支持 HTTP 方法 GET [重复]

HTTP 状态 405 - 此 URL 不支持 HTTP 方法 GET

HTTP 状态 405 - 此 URL 不支持 HTTP 方法 GET - RequestDispatcher 出现错误

Servlet 错误:HTTP 状态 405 - 此 URL 不支持 HTTP 方法 GET [重复]