HTTP状态码405 - HTTP方法POST不受此URL Java Servlet支持。

26

我遇到了使页面正常工作的问题。我的表单方法设置为post,我的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>

这个servlet:

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>

编辑:移除了 doGet(request,response);


2
在servet的init()方法中打开数据库连接不是一个好主意。打开和关闭应该放在同一个try-finally块中,就像执行查询一样。 - BalusC
5个回答

25

这是因为您在没有实现doGet()的情况下调用了它。默认实现的doGet()会抛出错误,表明不支持该方法。


我刚刚删除了 doGet(request,response);但是我仍然得到相同的错误。 - sutoL
你确定你没有使用旧的.class文件或其他什么东西吗?doGet()调用可以完全解释问题。我无法发现代码中的其他问题... - Martin Algesten
是的,我已经删除了编译好的类文件并重新编译它们,以确保得到新的编译后的类,然后替换了WEB-INF/classes/core目录中的那些类文件。 - sutoL
那我就不知道了。它看起来肯定没问题。你使用的是Java > 1.5吗?如果是的话,你能否在doPost()方法上添加一个@Override注释,以确保它覆盖了父类的默认实现。如果没有覆盖成功,javac应该会抛出一个错误。 - Martin Algesten
11
为什么如果对同一个答案的最后评论是“那我就不知道了,看起来肯定没问题。”,这个答案还被标记为“已采纳”? - linuxatico

12

如果你正在使用Tomcat,你可以尝试这个方法。

<servlet-mapping>

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

</servlet-mapping>

除了 <servlet-name><url-mapping> 之外


3

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


1
这可能发生在 method="post" action="/something" 的情况下。因此,调用的不是您的servlet,而是默认的servlet或welcome-file-list中的JSP。 - weberjn

3

当我遇到以下情况时:

  • 即使我的servlet只有“doPost”方法
  • 表单使用的是“POST”方法

  • 我试图直接使用URL访问操作,而不使用表单提交。由于URL的默认方法是doGet方法,因此当您不使用表单提交时,您将在控制台上看到http 405错误。

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


0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接