【问题标题】:HTTP Status 405 - HTTP method POST is not supported by this URLHTTP 状态 405 - 此 URL 不支持 HTTP 方法 POST
【发布时间】:2023-03-29 21:20:01
【问题描述】:

当我使用以下代码(如下)时,我收到错误 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。不确定它是否会影响您的其余代码。

标签: java servlets http-status-code-405


【解决方案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") 就够了。
猜你喜欢
  • 2021-05-21
  • 2016-01-03
  • 2015-03-11
  • 2011-07-19
  • 2014-01-16
  • 2012-12-14
  • 2011-05-16
相关资源
最近更新 更多