awaria z połączeniem html+servlet+mysql

0

Witam, zaczynam nauke i mam maly problem. Chcialem sobie stworzyc panel logowania. Wyglada to tak ze zrobilem sobie w html input na login i pass oraz button urachamiajacy servlet.
Kod w html:

 <form action="baza1.do">
           <input type="text" name="login"/>
           <input type="text" name="pass"/>
        <input type="submit" value="ok"/>
      
            </form> 

kod servleta:

package package1;

import java.io.IOException;
import java.io.PrintWriter;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
 
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
 
public class baza1 extends HttpServlet {
 
    static final String JDBC_DRIVER = "com.mysql.jdbc.Driver";
    static final String DB_URL = "jdbc:mysql://localhost:3306/hue";
    static final String login = "root";
    static final String pass = "";
    private static final long serialVersionUID = 1L;
 
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse res)
            throws ServletException, IOException {
        Connection conn = null;
        Statement stmt = null;
        String Login = req.getParameter("login");
        String Pass = req.getParameter("pass");
 
        try {
            Class.forName("com.mysql.jdbc.Driver");
            conn = DriverManager.getConnection(DB_URL, login, pass);
            stmt = conn.createStatement();
            String sql = "SELECT login, pass FROM users WHERE login='"+Login+"' and pass='"+Pass+"'";
            ResultSet rs = stmt.executeQuery(sql);
 
            try (PrintWriter pw = res.getWriter()) 
            {
                res.setContentType("text/html");
 
 
                if (Login!=null && Pass!=null)
                {
                
                System.out.println("udalo sie");
                }
                else
                {
                    pw.println("Login Failed...!");
                }
            }
            conn.close();
        } catch (ClassNotFoundException | SQLException e) {
        }
 
    }
  

Problem jest taki że gdy sobie odpale projekt, podam login i haslo i odpale servlet to pojawia mi się komunikat:

HTTP Status 405 - HTTP method GET is not supported by this URL

type Status report

message HTTP method GET is not supported by this URL

description The specified HTTP method is not allowed for the requested resource.

Apache Tomcat/8.0.27 

Oczywiście mam stworzona bazę danych z użytkownikami.
Może problem jest banalny do rozwiązania ale tak jak napisalem dopiero zaczynam, a w sieci na nic nie trafiłem co mogło by mi pomóc.
Z góry dziękuje za pomoc.

0

A gdzie przed serwletem adnotacja:

@WebServlet("baza1.do")
public class baza1 extends HttpServlet

Chyba że konfigurujesz serwlety bez adnotacji?

0

nie daje adnotacji.

1

Nie widzę w klasie baza1 metody doGet.

0

dodalem metode doget:

 protected void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        processRequest(request, response);
    }

teraz pojawia mi sie taki oto komunikat:

 HTTP Status 500 - Not supported yet.

type Exception report

message Not supported yet.

description The server encountered an internal error that prevented it from fulfilling this request.

exception

java.lang.UnsupportedOperationException: Not supported yet.
	package1.baza1.processRequest(baza1.java:68)
	package1.baza1.doGet(baza1.java:64)
	javax.servlet.http.HttpServlet.service(HttpServlet.java:622)
	javax.servlet.http.HttpServlet.service(HttpServlet.java:729)
	org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
note The full stack trace of the root cause is available in the Apache Tomcat/8.0.27 logs.

Apache Tomcat/8.0.27
0

Zdradzisz jak wygląda tenpackage1.baza1.processRequest(baza1.java:68)wiersz?

0
@Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        processRequest(request, response);
    }
 
0

Gdzie jest wiersz - 68 w pliku baza1.java - z metody processRequest?

0

nie ma nic

 
package package1;

import java.io.IOException;
import java.io.PrintWriter;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
 
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;


public class baza1 extends HttpServlet {
 
    static final String JDBC_DRIVER = "com.mysql.jdbc.Driver";
    static final String DB_URL = "jdbc:mysql://localhost:3306/hue";
    static final String login = "root";
    static final String pass = "";
    private static final long serialVersionUID = 1L;

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse res)
            throws ServletException, IOException {
        Connection conn = null;
        Statement stmt = null;
        String Login = req.getParameter("login");
        String Pass = req.getParameter("pass");
 
        try {
            Class.forName("com.mysql.jdbc.Driver");
            conn = DriverManager.getConnection(DB_URL, login, pass);
            stmt = conn.createStatement();
            String sql = "SELECT login, pass FROM users WHERE login='"+Login+"' and pass='"+Pass+"'";
            ResultSet rs = stmt.executeQuery(sql);
 
            try (PrintWriter pw = res.getWriter()) 
            {
                res.setContentType("text/html");
 
 
                if (Login!=null && Pass!=null)
                {
                
                System.out.println("udalo sie");
                }
                else
                {
                    pw.println("Login Failed...!");
                }
            }
            conn.close();
        } catch (ClassNotFoundException | SQLException e) {
        }
 
    }
    
 @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        processRequest(request, response);
    }

   

    @Override
    public String getServletInfo() {
        return "Short description";
    }

    private void processRequest(HttpServletRequest request, HttpServletResponse response) {
        throw new UnsupportedOperationException("Not supported yet.");
    }

}
0

Nic nie ma? A co to

 throw new UnsupportedOperationException("Not supported yet.");

jest? Zażądałeś rzucenia wyjątku i dziwisz się, że wyjątek się pojawił?
Ty cokolwiek rozumiesz z tego co piszesz. Ten kod, który jest w metodzie doPost powinien się znaleźć w metodzie doGet.

0

no to juz jest 78 wiersz, co najlepiej z tym zrobic.

0

Mam wrażenie, że jesteś inteligentny inaczej. Zamieściłeś takie coś.

java.lang.UnsupportedOperationException: Not supported yet.
package1.baza1.processRequest(baza1.java:68)

Tzn. że wtedy to był wiersz 68, wg Ciebie mam się domyślić, że coś dopisałeś i wiersz 68 stał się wierszem 78?

0

nic nie nie dopisywałem i wiersz 68 nie stal sie 78.

0

Skoro nie dopisywałeś, to są dwie możliwości:

  • Apache źle policzył wiersze (w tę możliwość nie wierzę),
  • źle wkleiłeś komunikat o błędzie.
0

po dodaniu metody doGet pojawia się błąd, netbeans sugeruje rozwiązanie i wtedy automatycznie dodaje to:

   private void processRequest(HttpServletRequest request, HttpServletResponse response) {
        throw new UnsupportedOperationException("Not supported yet.");
    } 

wiec ja tego sam osobiście nie dodałem. Jestem naprawdę świeży w temacie, nie posiadam dużego doświadczenia i nie wszystko jest dla mnie zrozumiałe, dlatego zwróciłem się o pomoc. Pozdrawiam.

0

W poście z godziny 16:02 napisałem Ci co masz zrobić. Wprowadziłeś te zmiany?
Są możliwe takie rozwiązania:

public void doPost(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException
{
      processRequest(request,response)
}
public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException
{
      processRequest(request,response)
}
private void processRequest(HttpServletRequest request, HttpServletResponse response) 
{
      //kod z metody doPost z pierwszego postu
}
//lub
public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException
{
      doPost(request,response)
}

Wtedy metoda doPost zostaje bez zmian.

0

tak spróbowałem zmienić:

package package1;
 
import java.io.IOException;
import java.io.PrintWriter;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
 
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
 
 
public class baza1 extends HttpServlet {
 
    static final String JDBC_DRIVER = "com.mysql.jdbc.Driver";
    static final String DB_URL = "jdbc:mysql://localhost:3306/hue";
    static final String login = "root";
    static final String pass = "";
    private static final long serialVersionUID = 1L;
    public void doPost(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException
{
      processRequest(request,response);
}
public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException
{
      processRequest(request,response);
}
private void processRequest(HttpServletRequest request, HttpServletResponse response) 
       throws ServletException, IOException {
        Connection conn = null;
        Statement stmt = null;
        String Login = req.getParameter("login");
        String Pass = req.getParameter("pass");
 
        try {
            Class.forName("com.mysql.jdbc.Driver");
            conn = DriverManager.getConnection(DB_URL, login, pass);
            stmt = conn.createStatement();
            String sql = "SELECT login, pass FROM users WHERE login='"+Login+"' and pass='"+Pass+"'";
            ResultSet rs = stmt.executeQuery(sql);
 
            try (PrintWriter pw = res.getWriter()) 
            {
                res.setContentType("text/html");
 
 
                if (Login!=null && Pass!=null)
                {
 
                System.out.println("udalo sie");
                }
                else
                {
                    pw.println("Login Failed...!");
                }
            }
            conn.close();
        } catch (ClassNotFoundException | SQLException e) {
        }

    
}
 
} 

niestety pojawia sie komunikat:

HTTP Status 500 - Not supported yet.

type Exception report

message Not supported yet.

description The server encountered an internal error that prevented it from fulfilling this request.

exception

java.lang.UnsupportedOperationException: Not supported yet.
	package1.req.getParameter(req.java:15)
	package1.baza1.processRequest(baza1.java:37)
	package1.baza1.doGet(baza1.java:31)
	javax.servlet.http.HttpServlet.service(HttpServlet.java:622)
	javax.servlet.http.HttpServlet.service(HttpServlet.java:729)
	org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
note The full stack trace of the root cause is available in the Apache Tomcat/8.0.27 logs.

Apache Tomcat/8.0.27 

Próbuje jak mogę, chce się tego nauczyć, dziękuję za cierpliwość i pomoc.

0

Zamieszczony kod jest błędny - nie można go skompilować. Używasz niezadeklarowanych zmiennych req i res.

0

ok poprawiłem to, teraz już nie mam żadnego błędu ale tez wyświetla mi się pusta strona.
w kodzie mam ze powinno mi się pojawić ze się udało albo nie.

  try (PrintWriter pw = response.getWriter()) 
            {
                response.setContentType("text/html");
 
 
                if (Login!=null && Pass!=null)
                {
 
                System.out.println("udalo sie");
                }
                else
                {
                    pw.println("Login Failed...!");
                }
            }
0

Komunikatu o powodzeniu nie wyświetlasz na stronie

                if (Login!=null && Pass!=null)
                {
 
                      pw.println("udalo sie");
                }
0

źle to ująłem, gdy podam prawidłowy login i hasło lub podam cokolwiek innego i zostawię puste pole zawsze ukazuje się komunikat ze się udalo:

 
                if (Login!=null && Pass!=null)
                {
 
                pw.println("udalo sie");
                }
                else
                {
                    pw.println("Login Failed...!");
                }
            }

natomiast jak zmienie kod:

   if (Login==null && Pass==null)
                {
 
                pw.println("udalo sie");
                }
                else
                {
                    pw.println("Login Failed...!");
                } 

zawsze pojawia się komunikat "login failed", to tak wygląda jakby nie było żadnego połączenia z baza, mogę sobie wpisywać cokolwiek i tez będzie dobrze.

1

Zmienne Login i Pass odczytujesz tu:

String Login = req.getParameter("login");
String Pass = req.getParameter("pass");

Ich wartość nie ma żadnego związku z tym czy się połączyłeś z bazą czy nie.
P.S. dodaj jakąś sensowną obsługę błędów

        catch (ClassNotFoundException | SQLException e) { }

taka nadaje się tylko na śmietnik.

0

ok dzięki co raz więcej z tego rozumie, jutro będę kombinował dalej dziś niestety nie miałem jak, chce z tego stworzyć prosty panel użytkownika który będzie miał z niego jakieś możliwość np dodanie newsa na stronie głównej. Pozdrawiam.

0

utknąłem na dobre, nie mogę nic znaleźć sensownego do nauki servletow. Mój projekt zakończył się tylko na tym połączeniu zresztą sam nie wiem czy to w ogóle łączy bo nic nie wyświetla. Jak zrobić panel logowania który będzie sprawdzał w bazie czy dane logowania sa poprawne. Z góry dzięki za pomoc.

0

Staraj się nie tworzyć zapytania SQL łącząc parametry za pomocą operatora +. Wykorzystaj do tego PreparedStatement:

import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;
import java.sql.*;

public class LoginServlet extends HttpServlet {

    private static final long serialVersionUID = 1L;

    public void doPost(HttpServletRequest request, HttpServletResponse response) throws IOException {
        String login = request.getParameter("login");
        String password = request.getParameter("pass");

        PrintWriter writer = response.getWriter();
        if(login == null || password == null) {
            writer.println("Nie podano loginu lub hasla");
        } else {
            try {
                Class.forName("com.mysql.jdbc.Driver");
                Connection connection = DriverManager.getConnection(
                        "jdbc:mysql://localhost:3306/test", "root", "");
                PreparedStatement statement = connection.prepareStatement("SELECT * FROM users WHERE login=? AND pass=?");
                statement.setString(1, login);
                statement.setString(1, password);
                ResultSet rs = statement.executeQuery();
                if (rs.next()) {
                    writer.println("Udalo sie zalogowac");
                } else {
                    writer.println("Zle haslo/login");
                }
                connection.close();
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }
}

Twój formularz powinien być ustawiony na metodę POST.

<form action="baza1.do" method="POST">
    <input type="text" name="login"/>
    <input type="text" name="pass"/>
    <input type="submit" value="ok"/>
</form>

Generalnie tworzenie za każdym zapytaniem użytkownika nowego połączenia z bazą nie jest dobrym pomysłem. Spring Security tutaj fajnie by się nadał :).

0

ten kod działa tak jakby nie robił w zasadzie nic, co bym nie wpisał w login i pass to i tak pojawia się pusta strona.
Mam tez drugi problem z kodem, mam aplikacje która po wpisaniu imienia powinna mi z bazy wyciagnac reszte danych tej osoby wiek, nazwisko itp.
kod:

import java.io.*;
import java.util.*;
import javax.servlet.http.*;
import javax.servlet.*;
import java.sql.*;

public class Test extends HttpServlet
{
   public void doPost(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException 
   {                                                                                                        
      res.setContentType("text/html");                                                                      
      PrintWriter pw = res.getWriter();                                                                     
                                                                                                            
      pw.println("<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.0 Transitional//EN\">");                       
      pw.println();                                                                                         
      pw.println("<head>");                                                                                 
      pw.println("<meta http-equiv=\"Content-Type\" content=\"text/html; charset=ISO-8859-1\">");           
      pw.println();                                                                                         
      pw.println("<title>Test</title>");                                                                    
      pw.println("</head>");                                                                                
      pw.println();                                                                                         
      pw.println("<body bgcolor=white>");                                                                   
      pw.println();                                                                                         
      pw.println("<h1>JEST</h1>");                                                                          
      pw.println();                                                                                         
                                                                                                            
      String param=req.getParameter("imie");                                                                
      pw.println(param+"<br>");                                                                             
                                                                                                            
      try                                                                                                   
      {                                                                                                     
                                                                          
         Class.forName("com.mysql.jdbc.Driver").newInstance();                                       
      }                                                                                                     
      catch (Exception e)                                                                                   
      {                                                                                                     
         pw.println("cos nie tak ze sterownikiem:\n"+e);                                                    
      }                                                                                                     
                                                                                                            
      try                                                                                                   
      {                                                                                                     
                                                                   
         Connection c = DriverManager.getConnection("jdbc:mysql://localhost:3306/a1");               
                                                                                                            
                                                                                 
         Statement st = c.createStatement();                                                                
         ResultSet rs = st.executeQuery("SELECT * FROM koledzy WHERE imie LIKE '"+param+"'");               
                                                                                                            
         pw.println("<table border=1>");                                                                    
         while (rs.next())                                                                                  
         {                                                                                                  
            pw.println("<tr><td>"+rs.getString(1)+"</td><td>"+rs.getInt(2)+"</td></tr>");                   
         }                                                                                                  
         pw.println("</table>");                                                                            
                                                                                                            
         rs.close();                                                                                        
         st.close();                                                                                        
         c.close();                                                                                         
      }                                                                                                     
      catch (SQLException e)                                                                                
      {                                                                                                     
         pw.println(e);                                                                                     
      }                                                                                                     
                                                                                                            
      pw.println("</body>");                                                                                
   }                                                                                                        
} 

błąd który się pojawia:

HTTP Status 404 - /Test/servlet/Test

type Status report

message /Test/servlet/Test

description The requested resource is not available.

Apache Tomcat/8.0.27 
0

Ten kod, który zamieściłeś u mnie działa (stworzyłem bazę danych i tabelę 'koledzy').

Przy czym jak łączysz się do bazy danych to musisz jeszcze podać username oraz password (jeśli nie masz ustawionego hasła to zostaw pusty string):

Connection c = DriverManager.getConnection("jdbc:mysql://localhost:3306/a1", "username", "password");

Zaś formularz HTML, który wywołuje powyższy serwlet:

<form action="Test" method="POST">
    <input type="text" name="imie"/>
    <input type="submit" value="ok"/>
</form>

Zatem albo masz zły formularz HTML (np. podana zła ścieżka do serwletu albo brak method="POST") albo masz złą konfigurację mapowania serwletu w pliku web.xml. Zatem pokaż formularz HTML oraz plik web.xml :)

0

html:

 <html>
    <head>
        <title>TODO supply a title</title>
        <meta charset="UTF-8">
        <meta name="viewport" content="width=device-width, initial-scale=1.0">
    </head>
    <body>
        <form action="Test" method="post">
<b>Name </b><br><input type="text" name="imie">
<input type="submit" value="Send">
</form>
    </body>
</html>

web.xml

 <?xml version="1.0" encoding="UTF-8"?>
<web-app version="3.1" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd">
    <servlet>
        <servlet-name>Test</servlet-name>
        <servlet-class>paczka.Test</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>Test</servlet-name>
        <url-pattern>/Test</url-pattern>
    </servlet-mapping>
    <session-config>
        <session-timeout>
            30
        </session-timeout>
    </session-config>
</web-app>

Poprawiłem jeden błąd w form action miałem dane serlvet/test zostawiłem sam test i po połączeniu mi się pojawia coś takiego:

JEST

gosia
cos nie tak ze sterownikiem: java.lang.ClassNotFoundException: com.mysql.jdbc.Driver java.sql.SQLException: No suitable driver found for jdbc:mysql://localhost:3306/a1 
0

Do swojego projektu musisz dodać mysql-connector:
a) jeśli korzystasz z mavena to dodaj:

<dependency>
	<groupId>mysql</groupId>
	<artifactId>mysql-connector-java</artifactId>
	<version>5.1.38</version>
</dependency>

b) jeśli nie korzystasz z mavena to do swojego projektu w opcjach projektu dodaj tę bibliotekę

0

a jest opcja żeby dodawać użytkowników poprzez servlet?

1 użytkowników online, w tym zalogowanych: 0, gości: 1