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

Posted

技术标签:

【中文标题】HTTP 状态 405 - 此 URL java servlet 不支持 HTTP 方法 POST [重复]【英文标题】:HTTP Status 405 - HTTP method POST is not supported by this URL java servlet [duplicate] 【发布时间】:2011-05-16 20:55:58 【问题描述】:

我无法让页面正常工作。我有我要发布的表单方法,我的 servlet 实现了doPost()。但是,它一直显示我不支持 POST 方法。

我只是想做一个简单的网站并将值插入到我的 mysql 数据库中。

*type Status report
message HTTP method POST is not supported by this URL
description The specified HTTP method is not allowed for the requested resource (HTTP method POST is not supported by this URL).*

静态页面:

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE html PUBLIC "-//WAPFORUM//DTD XHTML Mobile 1.0//EN"
        "http://www.wapforum.org/DTD/xhtml-mobile10.dtd" >

<html xmlns="http://www.w3.org/1999/xhtml">
    <head>
        <title>XHTML Mobile Profile Document</title>
        <!-- 
            Change href="style.css" below to the file name and
            relative path or URL of your external style sheet.
          --> 
        <link rel="stylesheet" href="index.css" type="text/css"/>
        <!-- 
        <style> document-wide styles would go here </style>
        -->
    </head>
    <body>

        <h1> Register Here </h1>
       <form action="regSuccess.do" method = "POST">
         UserName: <input type="text" name="txtregUsername" size="15" maxlength="15">
                   <br/>
         Password: <input type="password" name="txtregPassword" size="15" 
                    maxlength="15"><br/>
         Name: <input type="text" name="txtregName" size="20" maxlength="30"><br/>
         Email: <input type="text" name="txtregEmail" size="20" maxlength="30">
                <br/><br/> 
               <input type="submit" name="btnRegister" value="Register Me"/>
        </form>
    </body>
</html>

小服务程序:

package core;

import java.io.*;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.servlet.*;
import javax.servlet.http.*;
import java.sql.*;

public class handlingReg extends HttpServlet 

    //database parameters
    private static final String db_server = "localhost/";
    private static final String db_name ="bus_guide";
    private Connection con = null;

    //init of connection to dabatase
    public void init(ServletConfig config) throws ServletException 
    try 
        Class.forName("com.mysql.jdbc.Driver").newInstance();
        
    catch (Exception e) 
        System.out.println("Exception in init(): unable to load JDBC DriverA");
        
    try 
    con = DriverManager.getConnection("jdbc:mysql://"+ db_server + db_name , "root" , "");
        System.out.println("conn: "+con);
        
    catch (Exception e) 
        System.out.println(e.getMessage());
        
    
    //end init()

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

       response.setContentType("text/html");
       PrintWriter out = response.getWriter();

       //handling request
       String enteredUsername = request.getParameter("txtregUsername");
       String enteredPw = request.getParameter("txtregPassword");
       String enteredName = request.getParameter("txtregName");
       String enteredEmail = request.getParameter("txtregEmail");

        //inserting values into database
        try 
            Statement stmnt = con.createStatement();
            stmnt.executeUpdate("INSERT INTO regUsers VALUES('"+enteredUsername+"','"+enteredPw+"','"+enteredName+"','"+enteredEmail+"')");
         catch (SQLException ex) 
            System.out.println(ex.getMessage());
        

       //output html out.println("");
       out.println("<?xml version = \"1.0\" encoding =\"utf-8\"?>");
       out.println("<!DOCTYPE html PUBLIC \"-//WAPFORUM/DTD XHTML Mobile 1.0//EN\"");
       out.println("    \"http://www.wapforum.org/DTD/xhtml-mobile10.dtd\">");
       out.println("<html xmlns=\"http://www.w3.org/1000/xhtml\">");

       out.println("<head>");
       out.println("<title></title>");
       out.println("</head>");
       out.println("<body>");
       out.println("Register Success!");
       out.println("<a href = \"index.xhtml\"> Click here to go back to main page. 
                    </a>");
       out.println("</body>");
       out.println("</html>");
    


web.xml:

<?xml version="1.0" encoding="ISO-8859-1"?>
<web-app xmlns="http://java.sun.com/xml/ns/j2ee"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"
    version="2.4">

 <!--Self declared servlet mapping starts here-->
 <servlet>
  <servlet-name>handleRegister</servlet-name>
  <servlet-class>core.handlingReg</servlet-class>
 </servlet>

 <servlet-mapping>
  <servlet-name>handleRegister</servlet-name>
  <url-pattern>/regSuccess.do</url-pattern>
 </servlet-mapping>

 <!--Self declared servlet mapping ends here-->  
 <servlet-mapping>
  <servlet-name>invoker</servlet-name>
  <url-pattern>/servlet/*</url-pattern>
 </servlet-mapping>
 <mime-mapping>
  <extension>xhtml</extension>
  <mime-type>text/html</mime-type>
 </mime-mapping>
 <mime-mapping>
  <extension>jad</extension>
  <mime-type>text/vnd.sun.j2me.app-descriptor</mime-type>
 </mime-mapping>
 <mime-mapping>
  <extension>jar</extension>
  <mime-type>application/java-archive</mime-type>
 </mime-mapping>
</web-app>

edit:removed doGet(request,response);

【问题讨论】:

在 servlet 的init() 中打开数据库连接是一个非常糟糕的主意。执行查询时,打开和关闭应该在同一个 try-finally 块中。 【参考方案1】:

这是因为您在调用 doGet() 时并未实际实现 doGet()。这是 doGet() 的默认实现,它会抛出错误,指出该方法不受支持。

【讨论】:

我刚刚删除了 doGet(request,response);但是我仍然遇到同样的错误。 你 110% 确定你没有使用旧的 .class 文件吗? doGet() 调用将完全解释问题。我无法发现代码有任何其他问题... 是的,我已经删除了我编译的类并重新编译它们以确保我得到一个新的编译类然后我替换了我的 WEB-INF/classes/core 中的类 那我就不知所措了。它看起来肯定没问题。您使用的是 java > 1.5 吗?在这种情况下,您是否可以在 doPost() 方法中添加 @Override 注释 - 只是为了确保它覆盖了父默认实现。如果没有,javac 应该会抛出错误。 为什么这个答案被标记为“已接受”,如果对同一答案的最后评论以“那么我很茫然。看起来肯定没问题。” ?【参考方案2】:

如果你使用的是tomcat,你可以试试这个

<servlet-mapping>

    <http-method>POST</http-method>

</servlet-mapping>

除了&lt;servlet-name&gt;&lt;url-mapping&gt;

【讨论】:

【参考方案3】:

它说“不支持 POST”,因此请求没有调用您的 servlet。如果我是你,我会向你发出 POST 请求的确切 URL 发出 GET(例如使用浏览器访问),然后看看你得到了什么。我敢打赌你会看到一些意想不到的东西。

【讨论】:

method="post" action="/something" 可能会发生这种情况,所以调用的不是您的 servlet,而是welcome-file-list 中的默认 servlet 或 JSP。【参考方案4】:

这发生在我身上的时候:

即使我的 servlet 只有“doPost”方法

还有form method="POST"

我尝试直接使用 URL 访问操作,而不使用表单提交。由于 URL 的默认方法是 doGet 方法,所以当你不使用表单提交时,你会看到@你的控制台出现 http 405 错误。

解决方案:仅使用您映射到 servlet 操作的表单按钮。

【讨论】:

【参考方案5】:

如果您在将 doGet() 替换为 doPost() 并更改表单 method="post" 后仍然遇到此问题。尝试清除浏览器的缓存或在另一个浏览器或隐身/私人模式中点击 URL。它可能有效!

有关最佳做法,请点击此链接。 https://www.oracle.com/technetwork/articles/javase/servlets-jsp-140445.html

【讨论】:

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

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

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

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

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

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

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