2016-06-02 18 views
0

Ich habe eine Webanwendung basierend auf JSP/Servlet. Datenbank ist MySQL. In Web-App gibt es insertForm.jsp, die Servlet aufruft, die ins Methode in Java-Klasse aufruft.Unterschiedliches Verhalten hängt von der Ausnahme in der Datenbank ab

imports ... 

public class DBaddData extends HttpServlet {   

    @Override 
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { 
     ... 
     some code 
     ... 
     //create an instanse of a class responsible for insert 
     DBInsertRows dbir = new DBInsertRows(); 
     try { 
     //call the inssert method 
      dbir.ins(dbObj); 
     } catch (ClassNotFoundException ex) { 
      Logger.getLogger(DBaddData.class.getName()).log(Level.SEVERE, null, ex); 
     } 
     ... 
     RequestDispatcher ... 
    } 

} 

Klasse, die mit ins Methode:

public class DBInsertRows { 
    public void ins(DBObjBaseStd dbObject) throws ClassNotFoundException 
{ 
     Connection con = null; 
     Statement stmt = null;  
     String query = "INSERT INTO bla-bla-bla ...";  
     try { 
      ... 
      create con object 
      ...  
      stmt = con.createStatement();  
      stmt.executeUpdate(query); 

     } catch (SQLException sqlEx) {  
      sqlEx.printStackTrace(); 
     } 
    } 

} 

Insert Prozess funktioniert gut, aber! Wenn ich versuche, das gleiche Objekt (Zeile) einfügen, so dass ID ist bereits vorhanden in einer Tabelle habe ich eine Ausnahme:
MySQL Text

... Fehlercode: 1062. doppelten Eintrag ...

Apache Tomcat8 Text

com.mysql.jdbc.exceptions.jdbc4.MySQLIntegrityConstraintViolationException: Doppelte Eintrag '' für ...

und das ist völlig in Ordnung. Nicht gut ist, dass ich nicht HTTP-Status 500 habe, daher habe ich keine Ahnung, wie diese Ausnahme bekommen und auf meiner Eine andere Situation mit Delete Idee ist völlig das gleiche: Benutzer klicken Sie auf die Schaltfläche Löschen, JSP ruft Servlet, das für das Löschen verantwortlich ist Klasse mit Löschmethode. aber wenn der Benutzer klicken, ohne Objekt löschen gewählt, ich habe Ausnahme:

java.lang.NumberFormatException: null

Das ist auch in Ordnung. Aber jetzt habe ich auch Throwable Ausnahme oder error-code 500 daher der glückliche Benutzer siehe errorPage.jsp mit entsprechenden Text. Fragen:

  1. Warum gibt es verschiedene Arten von Fehlern?
  2. Wie kann ich den Fehlertext von ins Methode zu meinem errorPage.jsp übergeben?
+0

weil manchmal wollen Sie verschiedene Fehler haben. z.B.Ein Standard-Anwendungsfall besteht darin, nach doppelten Nutzernamen zu suchen. Wenn Sie "auswählen/prüfen/einfügen", gibt es eine Wettlaufbedingung, die ein anderer Prozess hinter Ihrem Rücken einfügen kann. Also machen Sie eine 'Einfügung' und prüfen Sie auf doppelte Schlüsselverletzung. –

+0

nicht sicher, ich verstehe Ihre Frage richtig. Wenn das Problem ist, dass, nachdem Sie eine SQL-Ausnahme in Ihrem catch-Block behandelt haben, gibt es keine 500 Statuscode, nun, das ist, weil Sie die Ausnahme abfangen. Sie müssten den Status 500 in der Antwort manuell im catch-Block setzen, indem Sie response.setStatus (500) aufrufen und den gewünschten Text schreiben, indem Sie response.getWriter() aufrufen. Print ("....") (auch übergeben eine HTTP-Antwort an das Servlet). – aiguy

+0

Es gibt kein Antwortobjekt in der Klasse mit der Methode "ins". Es ist nur Java-Klasse. ** Servlet ** ruft innerhalb dieser Methode die 'ins'- und error-catches auf, nicht in ** Servlet **. Also, was ist besser Ansatz, um die Informationen über den Fehler ** Servlet ** zu senden? Meine Idee für den Moment ist es, den Rückgabewert zu implementieren, aber ist das eine gute Idee? –

Antwort

0

Ich bin immer noch nicht sicher, ob es ein guter Ansatz, aber ich hinzugefügt throw in einem catch Block. Jetzt ist der Code:

try { 
      Class.forName(...driver...); 
      con = DriverManager.getConnection(... connection info...); 
      stmt = con.createStatement(); 
      stmt.executeUpdate(query); 
     } catch (SQLException sqlEx) { 
      throw new IllegalArgumentException("class DBInsertRows caught SQLException -> "+sqlEx);  
     } 

Nun, wenn der Benutzer versucht, zum Beispiel Informationen oder, zu vervielfältigen, die Variable ist länger als das Feld in der Tabelle er errorPage.jsp bekommen, weil sqlEx jetzt Throwable und <exception-type>java.lang.Throwable</exception-type> Ergebnis in errorPage.jsp ist

Sie verursachte eine java.lang.IllegalArgumentException: Klasse DBInsertRows SQLException gefangen -> com.mysql.jdbc.exceptions.jdbc4.MySQLIntegrityConstraintViolationException: doppelter Eintrag '' für Schlüssel 'TankName_UNIQUE' auf dem Server.

Verwandte Themen