2010-11-28 78 views
16

Tengo problemas para hacer que la página funcione. Tengo mi método de formulario para publicar y mi servlet implementa doPost(). Sin embargo, sigue mostrándome que no estoy apoyando el POST método.HTTP Status 405 - HTTP POST no es compatible con este servlet java de URL

Estoy tratando de hacer un sitio web simple e insertar valores en mi base de datos 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).* 

la página estática:

<?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> 

el 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> 

edit: eliminado doGet (solicitud, respuesta);

+2

Abrir una conexión de base de datos en 'init()' de un servlet es, por cierto, una muy mala idea. La apertura y el cierre deberían ir en el mismo bloque try-finally al ejecutar la consulta. – BalusC

Respuesta

22

Es porque está llamando al doGet() sin implementar realmente doGet(). Es la implementación predeterminada de doGet() que arroja el error diciendo que el método no es compatible.

+0

Acabo de eliminar el doGet (solicitud, respuesta); , sin embargo, sigo recibiendo el mismo error. – sutoL

+0

¿Estás seguro al 110% de que no estás utilizando el viejo archivo .class o algo así? La llamada doGet() explicaría completamente el problema. No puedo detectar ningún otro problema con el código ... –

+0

sí, he eliminado mis clases compiladas y las recompuse para asegurarme de obtener una nueva clase compilada y luego reemplacé la de mi WEB-INF/classes/core – sutoL

3

Dice "POST no compatible", por lo que la solicitud no está llamando a su servlet. Si yo fuera usted, emitiré un GET (por ejemplo, acceso mediante un navegador) a la URL exacta que está emitiendo su solicitud POST, y veré qué obtiene. Apuesto a que verás algo inesperado.

+0

Esto puede suceder para method = "post" action = "/ something" Por lo tanto, no es su servlet el que se llama sino un servlet predeterminado o un JSP en welcome-file-list. – weberjn

9

si está utilizando Tomcat puede probar este

<servlet-mapping> 

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

</servlet-mapping> 

además de <servlet-name> y <url-mapping>

1

Esto me sucedió cuando:

  • Incluso con mi servlet que tiene solamente el método "doPost"
  • Y el método de forma = "POST"

  • He intentado acceder a la acción utilizando la URL directamente, sin utilizar el formulario submitt. Dado que el método predeterminado para la URL es el método doGet, cuando no utiliza el formulario enviado, verá @ su consola el error http 405.

Solución: Utilice solo el botón de formulario que asignó a su acción de servlet.