# Servlet läuft in Eclipse, aber nicht im Browser



## Dimax (28. Jun 2018)

Leute ich habe ein jsp Servlet mit multipart/form-data und post Methode.Das Programm soll aus dem textfile verschiedene Programme in die Datenbank eintragen.Das funktioniert einwandfrei unter Eclipse auf tomcat 8.5 Server.Wenn ich aber dieses Programm im Browser ausführe (deployed auch auf dem tomcat 8.5) reagiert das irgendwie nicht.Das Programm öffnet sich ,ein Textfile lässt sich auswählen wenn ich aber auf hinzufügen drücke reagiert das nicht.Es gibt keine Fehlermeldung und ich sehe dass irgendwas gesendet wird,aber dann bleibt es so wie es war.Habe auch mit glassfish 5 ausprobiert,ist dasselbe.Woran kann es wohl liegen?.Danke im voraus.


----------



## Flown (28. Jun 2018)

Da hilft nur Profiling und Debugging. Wenn beide Server das nicht machen, liegts mit ziemlicher Sicherheit an deiner Implementierung.


----------



## Dimax (28. Jun 2018)

tomcat 8.5 in eclipse integrierter server macht aber alles was man braucht nur über den browser will er nicht..wo ist den unterschied?


----------



## Flown (28. Jun 2018)

Was soll ich jetzt, deiner Meinung nach, dazu sagen? Ich kann dir nur eine generische Lösung zu deinem generischen Problem liefern.


----------



## Dimax (28. Jun 2018)

hm..im Microsoft Edge Browser steht auf Antwort von localhost wird gewartet..


----------



## Dimax (28. Jun 2018)

Es ist zum Lachen))) Das Programm lief..nur halt zu lange..man sollte abwarten)))..ok hat sich erledigt..danke


----------



## Dimax (28. Jun 2018)

Der Unterschied war :Eclipse hat die Consolen Ausgabe..Der Browser nur die out,,naja 602 Programme einzulesen dauert halt..aber Fazit Microsoft Edge Browser hat es um einiges schneller gemacht)


----------



## stg (28. Jun 2018)

Logging macht froh.


----------



## mihe7 (1. Jul 2018)

Dimax hat gesagt.:


> Der Unterschied war :Eclipse hat die Consolen Ausgabe..Der Browser nur die out,,naja 602 Programme einzulesen dauert halt..aber Fazit Microsoft Edge Browser hat es um einiges schneller gemacht)



Ich weiß zwar nicht, welche Datenmengen Du da einliest, aber 602 Datensätze hören sich für mich jetzt nicht danach an, dass man darauf warten müsste.


----------



## mrBrown (2. Jul 2018)

Vor allem sollte da Edge nichts um einiges schneller machen?


----------



## Dimax (2. Jul 2018)

Es geht nicht um Datensätze,es geht um 602 Programme mit 150000 Datensätzen ungefähr


----------



## Dimax (2. Jul 2018)

Leute,ich habe so eine Aussage gefunden:"Zu beachten ist jetzt lediglich, dass die Verarbeitung von sehr großen Strings in Java ineffektiv sein kann, insbesondere wenn Sie mit String-Konkatenationen arbeiten werden. Wenn Performance wichtig ist, kann es nachteilig sein, eine Datei in einen String zu lesen"-was gibts da sonst für Alternativen?


----------



## Dimax (2. Jul 2018)

```
<td width=40%><h2>SAS Base Code Analyse</h2></td>
<td width=30%><img src="../images/cth_logo.png" align="right" height="75px"></td></tr>
</table></div>
<br /><br /><br /><br />
<p align=center><b><span style="font-size:11pt; font-weight:bold;">W&auml;hlen Sie eine Datei mit Programmen aus</span></b><br></p>
<FORM ENCTYPE="multipart/form-data" ACTION="Programmehinzufuegen.jsp"
    METHOD=POST>

    <table border="0" align="center" rules="groups" cellspacing="11">
        <tbody>

            <tr>
                <td align="right">Source-Datei: </td>
                <td align="left"><INPUT NAME="file" TYPE="file" class="file"></td>
            </tr>
            <tr><td></td></tr>
            <tr><td></td></tr>
            <tr>
                <td align="right">Projekt ID: </td>
                <td align="left"><select name="SelectDropDown" size=1 class="standard">
                        <option value=''></option>
                        <%
                            String[][] Projekte2 = AuswahlAusMYSQL.ErmittlungDerProjekte();
                            String[] Projekt_IDs = new String[Projekte2.length];
                            for (int i = 0; i < Projekte2.length;) {
                                ++i;
                                out.print("<option value=\"" + i + "\">" + Projekte2[i - 1][1] + " " + Projekte2[i - 1][0]
                                        + "</option>");
                                Projekt_IDs[i - 1] = Projekte2[i - 1][1];

                            }
                        %>

                </select></td>
            </tr>
            <tr><td></td></tr>
            <tr><td></td></tr>
            <tr>
                <td></td>
                <td align="left"><b><INPUT TYPE="submit" VALUE="hinzuf&uuml;gen"></b></td>
                <td></td>
                <td></td>
            </tr>
           
            <tr>
                <td></td>
                <td align="right"><a href="Projektorganisation.jsp"><b><input type="button" name="zurueck" value="Zur&uuml;ck"></input></b></a>
                <td></td>
        </tbody>
    </table>



</FORM>
<div class="footer"></div>

<%

    String contentType = request.getContentType();

    if ((contentType != null)
            && (contentType.indexOf("multipart/form-data") >= 0)) {
       
       
           
       
        DataInputStream in = new DataInputStream(
                request.getInputStream());
       
        int formDataLength = request.getContentLength();
        byte dataBytes[] = new byte[formDataLength];
        int byteRead = 0;
        int totalBytesRead = 0;

        while (totalBytesRead < formDataLength) {
            byteRead = in.read(dataBytes, totalBytesRead,
                    formDataLength);
            totalBytesRead += byteRead;
        }
         
        String Projekt_ID = null;
        String file = new String(dataBytes);
        int projekt_id_int = 0;
        int programm_id_int = 0;
        String ProgrammBeschreibung = "";
        String ProjektBeschreibung = "";
        String textfile = "";
       
       
       
        //System.out.println("file.indexOf(\"name=\"SelectDropDown\") = "
        //        + file.indexOf("name=\"SelectDropDown\""));

       
        if (file.indexOf("name=\"SelectDropDown\"") != -1) {
            String Ausgewaehlt = file.substring(
                    file.indexOf("name=\"SelectDropDown\"") + 22,
                    file.indexOf("name=\"SelectDropDown\"") + 26);

            /*System.out.println("Projekt Ausgewaehlt = |" + Ausgewaehlt
                    + "|");*/

            Projekt_ID = Projekte2[Integer.parseInt(Ausgewaehlt.trim()) - 1][1];
            ProjektBeschreibung = Projekte2[Integer.parseInt(Ausgewaehlt.trim()) - 1][0];
            projekt_id_int = Integer.parseInt(Projekt_ID.trim());
            /* */
       
            int PROGname = file.indexOf("name=\"file\"");
           
            String progName=file.substring(PROGname+23,file.indexOf("\"",PROGname+23));
            System.out.println(progName);
           
                       
                        String FlagImProgramm="ADD ";
                        String Datei="";
                        String FileName="";
                        int flagCounter=0;
                        try {                       
                            String data =new String (dataBytes)    ;                       
                           
                                 System.out.println("Halo "+data.length());
                               
                                        for(int b=0;b<=(data.length()-4);b++){
                                       
                                            String     tempFlag=data.substring(b,b+4); // Zusammengefügtes String zum Vergleich
                                           
                                                if(tempFlag.equals(FlagImProgramm)){
                                                   
                                                    flagCounter++;
                                                
                                                   
                                                    String tempData=data.substring(0,b); //Zwwieschenspeichern eines Programmabschnittes
                                                    data=data.substring(b, data.length());//Ausschneiden gefundene Programme aus Datei
                                                   
                                                    try {       
                                                        if (tempData.startsWith(FlagImProgramm)) {
                                                       
                                                        FileName=tempData.substring(11,19)+".txt";
                                                        ProgrammBeschreibung=tempData.substring(11,19);
                                                        File fileT=new File(FileName);
                                                        FileWriter fw=new FileWriter(fileT);
                                                        fw.write(tempData);
                                                        fw.close();
                                                                                                       
                                                        String sDbDrv = MYSQLparameter.getDriver();
                                                        String sDbUrl = MYSQLparameter.getURL();
                                                        String sUsr = MYSQLparameter.getUser();
                                                        String sPwd = MYSQLparameter.getPassword();
                                                        Connection myConnection = null;
                                                        PreparedStatement myStatement = null;
                                       
                                           
                                                        String sSql = "SELECT max(programm_id) + 1 FROM sasco.programm";
                                                        Connection cn = null;
                                                        Statement st = null;
                                                        ResultSet rs = null;
                                                       
                                                        try {
                                                                Class.forName(sDbDrv);
                                                                cn = DriverManager.getConnection(sDbUrl, sUsr, sPwd);
                                                                st = cn.createStatement();
                                                                rs = st.executeQuery(sSql);
                                                                programm_id_int = 1;
                                                            while (rs.next()) {
                                                                programm_id_int = Integer.parseInt(rs.getString(1).trim());
                                                            }cn.close();myConnection.close();
                                                        } catch (Exception ex) {/* ok */}
                           
                                    }

                                        String Datenbank = "sasco";       

                                        if (projekt_id_int != 0 && programm_id_int != 0 ) {
                                           
                                            //System.out.println("========== Analyse der Text-Datei (SAS Source Code) =========");
                                            boolean GesamtErgebniss = true;
                                            boolean Ergebniss = false;
                                            Ergebniss = SpeicherungInMYSQL.SpeicherungDesProgramms(Datenbank,
                                                    projekt_id_int, programm_id_int, ProgrammBeschreibung);
                                            if (Ergebniss == false){
                                                out.println("ACHTUNG: Fehler beim Speichern des Programms: "+ ProgrammBeschreibung);
                                                GesamtErgebniss = false;
                                                }

                                            String[][] Werte = Analyse.ZeilenBestimmen(tempData);

                                            String OHNEKom1 = Analyse.EntferneKommentarTyp1(tempData);

                                            Ergebniss=SpeicherungInMYSQL.SpeicherungDerZeilen(Datenbank,
                                                    projekt_id_int, programm_id_int, Werte);
                                            if (Ergebniss == false){
                                                out.println("ACHTUNG: Fehler beim Speichern der Zeilen: " + ProgrammBeschreibung);
                                                GesamtErgebniss = false;
                                                }
                                            else {
                                                String[][] OHNEKom2 = Analyse
                                                        .EntfernungVonKommentarVomTyp2(OHNEKom1, Werte);
                                   
                                                int AnzahlDerStatements = Werte.length;
                                   
                                                Ergebniss=SpeicherungInMYSQL.SpeicherungVonStatements(Datenbank,
                                                        projekt_id_int, programm_id_int, OHNEKom2);
                                                if (Ergebniss == false){
                                                    out.println("ACHTUNG: Fehler beim Speichern der Statements: "+ProgrammBeschreibung );
                                                    GesamtErgebniss = false;
                                                    }
                                                else {
                                   
                                                    String[][] KommentarVonTyp1 = Analyse.EntferneCodeUndTyp2(
                                                            tempData, Werte);
                                                   
                                                    Ergebniss=SpeicherungInMYSQL.SpeicherungKommentarVonTyp1(Datenbank,
                                                            projekt_id_int, programm_id_int, KommentarVonTyp1);
                                                    if (Ergebniss == false){
                                                        out.println("ACHTUNG: Fehler beim Speichern der Kommentare vom Typ 1: "+ProgrammBeschreibung );
                                                        GesamtErgebniss = false;
                                                        }
                                       
                                                    String[][] KommentarVonTyp2 = Analyse
                                                            .ErmittlungderKommentareVomTyp2(OHNEKom1, Werte);
                                       
                                                    Ergebniss=SpeicherungInMYSQL.SpeicherungKommentarVonTyp2(Datenbank,
                                                            projekt_id_int, programm_id_int, KommentarVonTyp2);
                                                    if (Ergebniss == false){
                                                        out.println("ACHTUNG: Fehler beim Speichern der Kommentare vom Typ 2: " +ProgrammBeschreibung);
                                                        GesamtErgebniss = false;
                                                        }
                /*************************************************************************************************************/                                   
                                                    try{
                                                    String[][] tokenstabelle = Analyse.BildungderTokens(
                                                            OHNEKom1, Werte);
                                                    Ergebniss=SpeicherungInMYSQL.SpeicherungDerTokens(Datenbank,
                                                            projekt_id_int, programm_id_int, tokenstabelle);
                                                    }catch(ArrayIndexOutOfBoundsException e){e.getLocalizedMessage();}
                                                   
                                                    if (Ergebniss == false){
                                                        out.println("ACHTUNG: Fehler beim Speichern der Token: " +ProgrammBeschreibung);
                                                        GesamtErgebniss = false;
                                                        }
                                                    else {
                                                        Ergebniss=SpeicherungInMYSQL.AufrufenderProzeduren(Datenbank,
                                                                projekt_id_int, programm_id_int);
                                                        if (Ergebniss == false){
                                                            out.println("ACHTUNG: Fehler beim Ausführen der Prozeduren:" +ProgrammBeschreibung);
                                                            GesamtErgebniss = false;
                                                            }
                                                    }
                                                }
                                            }
                                       
                                            /*if (GesamtErgebniss == true){
                                                out.println("Das Programm '" + ProgrammBeschreibung
                                                            + "' wurde dem Projekt '" + ProjektBeschreibung + "' hinzugef&uuml;gt" );
                                               
                                           
                                                }*/
                                                        System.out.println("Erstellt-----"+FileName);
                                                        b=0;
                                                        tempData="";
                                               
                                                   
                                                        }
                                                    } catch(StringIndexOutOfBoundsException e){System.out.println("Datei zu klein: "+ProgrammBeschreibung);}                           
                                                }
                                            }
                                        // Zum Schlüss gebliebene Inhalte Speichern
                                            FileName=data.substring(11, 19)+".txt";
                                            ProgrammBeschreibung=data.substring(11,19);
                                            File lastFile=new File(FileName);
                                            FileWriter fw=new FileWriter(lastFile);
                                            fw.write(data);
                                            fw.close();   
                                           
                                            String sDbDrv = MYSQLparameter.getDriver();
                                            String sDbUrl = MYSQLparameter.getURL();
                                            String sUsr = MYSQLparameter.getUser();
                                            String sPwd = MYSQLparameter.getPassword();
                                            Connection myConnection = null;
                                            PreparedStatement myStatement = null;
                           
                               
                                            String sSql = "SELECT max(programm_id) + 1 FROM sasco.programm";
                                            Connection cn = null;
                                            Statement st = null;
                                            ResultSet rs = null;
                                           
                                            try {
                                                    Class.forName(sDbDrv);
                                                    cn = DriverManager.getConnection(sDbUrl, sUsr, sPwd);
                                                    st = cn.createStatement();
                                                    rs = st.executeQuery(sSql);
                                                    programm_id_int = 1;
                                                while (rs.next()) {
                                                    programm_id_int = Integer.parseInt(rs.getString(1).trim());
                                                }myConnection.close();
                                                cn.close();
                                            } catch (Exception ex) {/* ok */}
                                                /*System.out.println("ProgrammID = |"
                                                    + programm_id_int + "|");*/
                            String Datenbank = "sasco";       

                            if (projekt_id_int != 0 && programm_id_int != 0 ) {
                               
                                //System.out.println("========== Analyse der Text-Datei (SAS Source Code) =========");
                                boolean GesamtErgebniss = true;
                                boolean Ergebniss = false;
                                Ergebniss = SpeicherungInMYSQL.SpeicherungDesProgramms(Datenbank,
                                        projekt_id_int, programm_id_int, ProgrammBeschreibung);
                                if (Ergebniss == false){
                                    System.out.println("ACHTUNG: Fehler beim Speichern des Programms: " +ProgrammBeschreibung);
                                    GesamtErgebniss = false;
                                    }

                                String[][] Werte = Analyse.ZeilenBestimmen(data);

                                String OHNEKom1 = Analyse.EntferneKommentarTyp1(data);

                                Ergebniss=SpeicherungInMYSQL.SpeicherungDerZeilen(Datenbank,
                                        projekt_id_int, programm_id_int, Werte);
                                if (Ergebniss == false){
                                    System.out.println("ACHTUNG: Fehler beim Speichern der Zeilen: " +ProgrammBeschreibung);
                                    GesamtErgebniss = false;
                                    }
                                else {
                                    String[][] OHNEKom2 = Analyse
                                            .EntfernungVonKommentarVomTyp2(OHNEKom1, Werte);
                       
                                    int AnzahlDerStatements = Werte.length;
                       
                                    Ergebniss=SpeicherungInMYSQL.SpeicherungVonStatements(Datenbank,
                                            projekt_id_int, programm_id_int, OHNEKom2);
                                    if (Ergebniss == false){
                                        System.out.println("ACHTUNG: Fehler beim Speichern der Statements: "+ProgrammBeschreibung );
                                        GesamtErgebniss = false;
                                        }
                                    else {
                       
                                        String[][] KommentarVonTyp1 = Analyse.EntferneCodeUndTyp2(
                                                data, Werte);
                                       
                                        Ergebniss=SpeicherungInMYSQL.SpeicherungKommentarVonTyp1(Datenbank,
                                                projekt_id_int, programm_id_int, KommentarVonTyp1);
                                        if (Ergebniss == false){
                                            System.out.println("ACHTUNG: Fehler beim Speichern der Kommentare vom Typ 1: "+ProgrammBeschreibung );
                                            GesamtErgebniss = false;
                                            }
                           
                                        String[][] KommentarVonTyp2 = Analyse
                                                .ErmittlungderKommentareVomTyp2(OHNEKom1, Werte);
                           
                                        Ergebniss=SpeicherungInMYSQL.SpeicherungKommentarVonTyp2(Datenbank,
                                                projekt_id_int, programm_id_int, KommentarVonTyp2);
                                        if (Ergebniss == false){
                                            System.out.println("ACHTUNG: Fehler beim Speichern der Kommentare vom Typ 2: "+ProgrammBeschreibung );
                                            GesamtErgebniss = false;
                                            }
                                        String[][] tokenstabelle = Analyse.BildungderTokens(
                                                OHNEKom1, Werte);
                                        Ergebniss=SpeicherungInMYSQL.SpeicherungDerTokens(Datenbank,
                                                projekt_id_int, programm_id_int, tokenstabelle);
                                        if (Ergebniss == false){
                                            System.out.println("ACHTUNG: Fehler beim Speichern der Token: "+ProgrammBeschreibung );
                                            GesamtErgebniss = false;
                                            }
                                        else {
                                            Ergebniss=SpeicherungInMYSQL.AufrufenderProzeduren(Datenbank,
                                                    projekt_id_int, programm_id_int);
                                            if (Ergebniss == false){
                                                System.out.println("ACHTUNG: Fehler beim Ausführen der Prozeduren: " +ProgrammBeschreibung);
                                                GesamtErgebniss = false;
                                                }
                                        }
                                    }
                                }
                           
                                /*if (GesamtErgebniss == true){
                                    out.println("Das Programm '" + ProgrammBeschreibung
                                                + "' wurde dem Projekt '" + ProjektBeschreibung + "' hinzugef&uuml;gt" );
                                   
                               
                                    }*/System.out.println("Erstellt-letztes----"+FileName);data="";   
                                }
                            }catch(IOException e) {System.out.println(e.getMessage());}
        }
}
       
       
    //}
%>
</body>
</html>
```


----------



## mrBrown (2. Jul 2018)

Kommt drauf an, was du machen willst...#
String-Konkatenationen kannst du mit StringBuilder ersetzten.


----------



## Dimax (2. Jul 2018)

Das ist meine jsp zum Hinzufügen sas-Programmen in eine Datenbank..Kann man da irgendwas verbessern?


----------



## mihe7 (2. Jul 2018)

Dimax hat gesagt.:


> Kann man da irgendwas verbessern?



Die Frage wäre eher: kann man da irgendwas so lassen?  SCNR.

Ich würe den Code erstmal aus der JSP rausnehmen, rein in wenigstens ein Klasse und mit Methoden strukturieren. BTW: Variablenbezeichner und Methodennamen schreibt man in Java per Konvention klein.

Unabhängig davon: wenn ich es richtig sehe, "suchst" Du für jedes Programm die DB-Treiber-Klasse, öffnest eine Connection, lässt jedesmal ein SQL-Statement übersetzen usw. Mach das vor der Schleife (PreparedStatement). 

Falls das Einfügen von Programmen bzw. ihren Zeilen parallel funktionieren soll (z. B. mehr als ein Upload gleichzeitig), kannst Du das mit "SELECT max" vergessen, um die nächste ID zu ermitteln. 

Du unterdrückst an manchen Stellen Exceptions komplett "{}" -> keine gute Idee. Du solltest Dir wenigstens den Stack-Trace ausgeben lassen. Im catch-Block nur "e.getLocalizedMessage();" zu schreiben, bringt es auch nicht wirklich. Du musst die Message schon auch irgendwo ausgeben. Warum Du eine ArrayIndexOutOfBoundsException abfängst, weiß ich auch nicht. Wenn die auftritt, deutet das in der Regel auf einen Bug hin. Der wird nicht dadurch gefixt, dass man die Exception abfängt ;-)

Zum Thema "if (Ergebniss == false)" zwei Dinge: das Ergebnis ist bereits ein boolescher Ausdruck, d. h. Du willst "if (!Ergebniss)" und zweitens sollte das Ergebnis ja nur ausnahmsweise false sein, oder? Dann bieten sich Exceptions an und Du sparst Dir die ewigen if-Abfragen. 

Zum Thema Performance: es gibt die Möglichkeit von Batch-Inserts (PreparedStatement#addBatch). Es würde sich anbieten, die ca. 300 Zeilen/Programm in einem Rutsch einzufügen.

Sollte für's erste genügen.


----------



## mihe7 (2. Jul 2018)

Was ich noch vergessen habe, dazu zu schreiben: schalte autocommit ab. Du kannst den commit z. B. nach jedem (x.) Programm ausführen.


----------



## Dimax (2. Jul 2018)

Danke mihe7 für deine Tipps.Jetzt habe ich was zu Tun)).Melde mich mit upgedrehtem Code zurück.
Zu Browsern Problemmen hab rausgefunden das manche von dennen Problemme mit
String data =new String (Files.readAllBytes(Paths.get(progName))) haben.


----------



## Dimax (2. Jul 2018)

Ich meine dass ich progName aus dem request auslese und das wird wahrscheinlich unterschiedlich aufgebaut.Wenn ich es richtig verstehe.


----------



## mihe7 (2. Jul 2018)

Ja. Wenn ich mich recht erinnere, dann gibt IE den kompletten Pfad mit, während andere nur den Dateinamen übermitteln.


----------



## Dimax (5. Nov 2018)

Wie oben versprochen hab mein code ein wenig modifiziert.D.h Kritik wird erwünscht)

```
<p align=center><b><span style="font-size:11pt; font-weight:bold;">W&auml;hlen Sie eine Datei mit Programmen aus</span></b><br></p>
<FORM ENCTYPE="multipart/form-data" ACTION="Programmehinzufuegen.jsp"
    METHOD=POST>
    <table border="0" align="center" rules="groups" cellspacing="11">
        <tbody>
            <tr>
                <td align="right">Source-Datei: </td>
                <td align="left"><INPUT NAME="file" TYPE="file" class="file"></td>
            </tr>
            <tr><td></td></tr>
            <tr><td></td></tr>
            <tr>
                <td align="right">Projekt ID: </td>
                <td align="left"><select name="SelectDropDown" size=1 class="standard">
                        <option value=''></option>
                        <%
                            String[][] Projekte2 = AuswahlAusMYSQL.ErmittlungDerProjekte();
                            String[] Projekt_IDs = new String[Projekte2.length];
                            for (int i = 0; i < Projekte2.length;) {
                                ++i;
                                out.print("<option value=\"" + i + "\">" + Projekte2[i - 1][1] + " " + Projekte2[i - 1][0]
                                        + "</option>");
                                Projekt_IDs[i - 1] = Projekte2[i - 1][1];
                            }
                        %>
                </select></td>
            </tr>
            <tr><td></td></tr>
            <tr><td></td></tr>
            <tr>
                <td></td>
                <td align="left"><b><INPUT TYPE="submit" VALUE="hinzuf&uuml;gen"></b></td>
                <td></td>
                <td></td>
            </tr>           
            <tr>
                <td></td>
                <td align="right"><a href="Projektorganisation.jsp"><b><input type="button" name="zurueck" value="Zur&uuml;ck"></input></b></a>
                <td></td>
            </tr>
        </tbody>
    </table>
</FORM>

<%
    String contentType = request.getContentType();

    if ((contentType != null)
            && (contentType.indexOf("multipart/form-data") >= 0)) {

        DataInputStream in = new DataInputStream(
                request.getInputStream());     
        int formDataLength = request.getContentLength();
        byte dataBytes[] = new byte[formDataLength];
        int byteRead = 0;
        int totalBytesRead = 0;

        while (totalBytesRead < formDataLength) {
            byteRead = in.read(dataBytes, totalBytesRead,
                    formDataLength);
            totalBytesRead += byteRead;
        }in.close();
        boolean GesamtErgebniss = true;
        int projekt_id_int = 0;
        int programm_id_int = 0;
        String Projekt_ID = null;
        String file = new String(dataBytes);
        String ProgrammBeschreibung = "";
        String ProjektBeschreibung = "";
        String textfile = "";
        String Datenbank = "sasco";   
       
        Statement st = null;
        Statement st1 =null;
        ResultSet rs = null;
        ResultSet rs1 =null;
       
        if (file.indexOf("name=\"SelectDropDown\"") != -1) {
            String Ausgewaehlt = file.substring(
                    file.indexOf("name=\"SelectDropDown\"") + 22,
                    file.indexOf("name=\"SelectDropDown\"") + 26);

            Projekt_ID = Projekte2[Integer.parseInt(Ausgewaehlt.trim()) - 1][1];
            ProjektBeschreibung = Projekte2[Integer.parseInt(Ausgewaehlt.trim()) - 1][0];
            projekt_id_int = Integer.parseInt(Projekt_ID.trim());
            int PROGname = file.indexOf("name=\"file\"");
            String progName=file.substring(PROGname+23,file.indexOf("\"",PROGname+23));
            System.out.println(progName);                                   
            String FlagImProgramm="ADD ";
            String Datei="";
            String FileName="";
            String sSql = "SELECT max(programm_id) + 1 FROM sasco.programm";
                        try (Connection cn=MYSQLparameter.eureVerbindungMeinHerr();){
                           
                            String data =new String (dataBytes)    ;
                            String tempData=new String("");
                            System.out.println("Datei enthält "+data.length()+" Zeichen");
   
                                        for(int b=0;b<(data.length()-7);b++){
                                           
                                            String     tempFlag=data.substring(b,b+4);
               
                                                if(tempFlag.equals(FlagImProgramm)){                                                                                                   
                                                    if(data.indexOf("ADD ",b+4)!=-1){
                                                        tempData=data.substring(data.indexOf("ADD ",b),data.indexOf("ADD ",b+4));
                                                       
                                                        b=data.indexOf("ADD ",b+4)-6;
                                                       
                                                    }
                                                    else if(data.lastIndexOf("%MEND")!=-1){
                                                       
                                                        tempData=data.substring(data.indexOf("ADD ",b),data.lastIndexOf("%MEND")+7);
                                                       
                                                      }
                                                        else{
                                                           
                                                            tempData=data.substring(data.indexOf("ADD "),data.lastIndexOf("RUN;")+6);
                                                           
                                                        }
                                                    try {       
                                                                                                                                           
                                                        FileName=tempData.substring(11,19)+".txt";
                                                        ProgrammBeschreibung=tempData.substring(11,19);
                                                        File fileT=new File(FileName);
                                                        FileWriter fw=new FileWriter(fileT);
                                                        fw.write(tempData);
                                                        fw.close();                                                                                                                                                                                                                                                              
                                                        try {                                                               
                                                                st = cn.createStatement();
                                                                rs = st.executeQuery(sSql);
                                                                programm_id_int = 1;
                                                            while (rs.next()) {
                                                                programm_id_int = Integer.parseInt(rs.getString(1).trim());
                                                            }
                                                        } catch (Exception ex) {ex.getStackTrace();}                           
                                                                           
                                        if (projekt_id_int != 0 && programm_id_int != 0 ) {
                                                                                                               
                                            boolean Ergebniss = false;                                                                                   
                                                   
                                            Ergebniss = SpeicherungInMYSQL.SpeicherungDesProgramms(Datenbank,
                                                    projekt_id_int, programm_id_int, ProgrammBeschreibung);
                                            if (Ergebniss == false){
                                                out.println("ACHTUNG: Fehler beim Speichern des Programms: "+ ProgrammBeschreibung);
                                                GesamtErgebniss = false;
                                                }
                                           
                                            String[][] Werte = Analyse.ZeilenBestimmen(tempData);
                                            String OHNEKom1 = Analyse.EntferneKommentarTyp1(tempData);
                                            Ergebniss=SpeicherungInMYSQL.SpeicherungDerZeilen(Datenbank,
                                                    projekt_id_int, programm_id_int, Werte);
                                            if (Ergebniss == false){
                                                out.println("ACHTUNG: Fehler beim Speichern der Zeilen: " + ProgrammBeschreibung);
                                                GesamtErgebniss = false;
                                                }
                                            else {
                                                String[][] OHNEKom2 = Analyse
                                                        .EntfernungVonKommentarVomTyp2(OHNEKom1, Werte);
                                   
                                                int AnzahlDerStatements = Werte.length;
                                   
                                                Ergebniss=SpeicherungInMYSQL.SpeicherungVonStatements(Datenbank,
                                                        projekt_id_int, programm_id_int, OHNEKom2);
                                                if (Ergebniss == false){
                                                    out.println("ACHTUNG: Fehler beim Speichern der Statements: "+ProgrammBeschreibung );
                                                    GesamtErgebniss = false;
                                                    }
                                                else {
                                   
                                                    String[][] KommentarVonTyp1 = Analyse.EntferneCodeUndTyp2(
                                                            tempData, Werte);                                           
                                                    Ergebniss=SpeicherungInMYSQL.SpeicherungKommentarVonTyp1(Datenbank,
                                                            projekt_id_int, programm_id_int, KommentarVonTyp1);
                                                   
                                                    if (Ergebniss == false){
                                                        out.println("ACHTUNG: Fehler beim Speichern der Kommentare vom Typ 1: "+ProgrammBeschreibung );
                                                        GesamtErgebniss = false;
                                                        }
                                       
                                                    String[][] KommentarVonTyp2 = Analyse
                                                            .ErmittlungderKommentareVomTyp2(OHNEKom1, Werte);                                       
                                                    Ergebniss=SpeicherungInMYSQL.SpeicherungKommentarVonTyp2(Datenbank,
                                                            projekt_id_int, programm_id_int, KommentarVonTyp2);
                                                   
                                                    if (Ergebniss == false){
                                                        out.println("ACHTUNG: Fehler beim Speichern der Kommentare vom Typ 2: " +ProgrammBeschreibung);
                                                        GesamtErgebniss = false;
                                                    }                               
                                                    try{
                                                    String[][] tokenstabelle = Analyse.BildungderTokens(
                                                            OHNEKom1, Werte);
                                                    Ergebniss=SpeicherungInMYSQL.SpeicherungDerTokens(Datenbank,
                                                            projekt_id_int, programm_id_int, tokenstabelle);
                                                    }catch(ArrayIndexOutOfBoundsException e){e.getStackTrace();}
                                                   
                                                    if (Ergebniss == false){
                                                        out.println("ACHTUNG: Fehler beim Speichern der Token: " +ProgrammBeschreibung);
                                                        GesamtErgebniss = false;
                                                        }
                                                    else {
                                                        Ergebniss=SpeicherungInMYSQL.AufrufenderProzeduren(Datenbank,
                                                                projekt_id_int, programm_id_int);
                                                        if (Ergebniss == false){
                                                            out.println("ACHTUNG: Fehler beim Ausführen der Prozeduren:" +ProgrammBeschreibung);
                                                            GesamtErgebniss = false;                                                       
                                                        }
                                                    }
                                                }
                                            }
                                            Ergebniss=SpeicherungInMYSQL.SpeichernSteps(tempData,programm_id_int,projekt_id_int);
                                            if(Ergebniss==false){
                                                System.out.println("Fehler beim SpeichernSteps "+programm_id_int);
                                            }
                                            else{
                                                //System.out.println("SpeichernSteps ist ok "+programm_id_int);
                                            }
                                            Ergebniss=SpeicherungInMYSQL.SpeichernMacroDaten(projekt_id_int, programm_id_int, tempData);
                                           
                                            if(Ergebniss==false){System.out.println("Fehler beim SpeichernMacroDaten");}
                                            else{//System.out.println("Speichern MacroDaten ist ok");
                                            }                       
                                                        System.out.println("Erstellt-----"+FileName);                                                       
                                                        tempData="";                                                                                                   
                                                        }
                                                    } catch(Exception e){e.printStackTrace();System.out.println(ProgrammBeschreibung);}                           
                                                }
                                            }       
                            cn.close();
                        }catch(Exception e) {System.out.println(e.getMessage()+"hinzufüg");}
        }
}       
%>
</body>
<div class="footer"></div>
</html>
```


----------



## mrBrown (5. Nov 2018)

Das gilt immer noch: 





mihe7 hat gesagt.:


> Ich würe den Code erstmal aus der JSP rausnehmen, rein in wenigstens ein Klasse und mit Methoden strukturieren.




Und wenn die Einrückung so aussieht:

```
//code
```
Sollte man da ganz schnell was ändern...


----------



## Dimax (5. Nov 2018)

Ja dass stimmt,da kann man ein paar Zeilen auslagern aber nicht viel,weil eigentlich ist diese Seite dafür gedacht um
mögliche Fehler bei Datenverarbeitung aufzulisten und deswegen 20 Zeilen auslagern in eine separate Klasse um die dann wieder einholen lohnt sich nicht.Gebe zu ist auch keine Profi Lösung..mit der Zeit wird es aber).


----------



## mrBrown (5. Nov 2018)

Das klingt jetzt echt hart, aber der Code ist wirklich schlecht.

Das Auslagern in eine Klasse wäre ein zwingend nötiger Schritt, damit man da irgendwas dran verbessern kann.


----------



## mihe7 (5. Nov 2018)

Dimax hat gesagt.:


> Ja dass stimmt,da kann man ein paar Zeilen auslagern aber nicht viel,weil eigentlich ist diese Seite dafür gedacht um
> mögliche Fehler bei Datenverarbeitung aufzulisten und deswegen 20 Zeilen auslagern in eine separate Klasse um die dann wieder einholen lohnt sich nicht



20 Zeilen?!? Du hast etwa 200 Zeilen Java-Code in der JSP, die alles mögliche machen, vom Request einlesen bis zur DB-Abfrage.
Das lohnt sich schon deswegen, weil es die Lesbarkeit drastisch erhöht.



Dimax hat gesagt.:


> FROM sasco.programm


Da ist ein Tippfehler, das muss fiasco.programm heißen


----------



## Dimax (5. Nov 2018)

Ja Ja..gibs noch bessere Vorschläge für Programm Nammen? ))


----------



## mihe7 (5. Nov 2018)

Nein, die sonst passen würden klingen alle nicht so gut (https://synonyme.woxikon.de/synonyme/fiasko.php)

Um nochmal zum Thema zurück zu kommen: ich würde z. B. den unteren Teil in ein Servlet verschieben, dann kannst Du per @MultipartConfig annotieren und einfach auf die Parts bzw. Parameter zugreifen: https://docs.oracle.com/javaee/6/tutorial/doc/glraq.html

Nach getaner Arbeit kannst Du das Ergebnis in Form von Attributen in den Request legen und diesen an das JSP weiterleiten. 

Der Rest wäre natürlich weiter zu strukturieren, da stellt es einem wirklich die Zehennägel auf.


----------



## Dimax (6. Nov 2018)

Wenn das hier nicht Provozieren würde(Bild)


----------



## mihe7 (6. Nov 2018)

Was soll das sein bzw. werden?


----------



## Dimax (6. Nov 2018)

ist noch in der Entwicklung im Moment sieht so aus

```
%>   
<br><br><div >
<iframe width=49% height="500" align="left" frameborder="1" src="<!--kommt noch etwas rein-->"></iframe> 
       
<iframe width=49% height="500" align="right" frameborder="1" src="DatenbankStatistik.jsp"></iframe>
        </div>
       
<%
```
bin immer noch bei dem Bilder senden und empfangen(


----------



## Dimax (13. Dez 2018)

Weiteres Versuch diesen Dreck zu verbessern.
Habe ein Servlet geschrieben und da läuft jetzt alles
Vom Code in jsp ist nur das geblieben:

```
</table></div>
<br /><br /><br /><br />
<p align=center><b><span style="font-size:11pt; font-weight:bold;">W&auml;hlen Sie eine Datei mit Programmen aus</span></b><br></p>
<FORM ENCTYPE="multipart/form-data" ACTION="/sasco/daten.einlesen/FilesReader"
    METHOD=POST>
    <table border="0" align="center" rules="groups" cellspacing="11">
        <tbody>
            <tr>
                <td align="right">Source-Datei: </td>
                <td align="left"><INPUT NAME="file" TYPE="file" class="file"></td>
            </tr>
            <tr><td></td></tr>
            <tr><td></td></tr>
            <tr>
                <td align="right">Projekt ID: </td>
                <td align="left"><select name="SelectDropDown" size=1 class="standard">
                        <option value=''></option>
                        <%
                            String[][] Projekte2 = AuswahlAusMYSQL.ErmittlungDerProjekte();
                            String[] Projekt_IDs = new String[Projekte2.length];
                            for (int i = 0; i < Projekte2.length;) {
                                ++i;
                                out.print("<option value=\"" + i + "\">" + Projekte2[i - 1][1] + " " + Projekte2[i - 1][0]
                                        + "</option>");
                                Projekt_IDs[i - 1] = Projekte2[i - 1][1];
                            }
                        %>
                </select></td>
            </tr>
            <tr><td></td></tr>
            <tr><td></td></tr>
            <tr>
                <td></td>
                <td align="left"><b><INPUT TYPE="submit" VALUE="hinzuf&uuml;gen"></b></td>
                <td></td>
                <td></td>
            </tr>           
            <tr>
                <td></td>
                <td align="right"><a href="Projektorganisation.jsp"><b><input type="button" name="zurueck" value="Zur&uuml;ck"></input></b></a>
                <td></td>
            </tr>
        </tbody>
    </table>
</FORM>

</body>
<div class="footer"></div>
</html>
```

im servlet ist der Rest:

```
@WebServlet("/daten.einlesen/FilesReader")

public class FilesReader extends HttpServlet{

    private static final long serialVersionUID = 1L;
    @Override
    protected void doGet(HttpServletRequest anfrage, HttpServletResponse antwort) throws ServletException, IOException {
        doPost(anfrage,antwort);
    }
    protected void doPost(HttpServletRequest anfrage, HttpServletResponse antwort) throws ServletException, IOException {
       
        String contentType = anfrage.getContentType();
        System.out.println(contentType);
            if ((contentType != null)
                    && (contentType.indexOf("multipart/form-data") >= 0)) {
               
                DataInputStream in = new DataInputStream(
                        anfrage.getInputStream());.....usw
```
Alles leuft aber ein wenig langsammer als direkt von JSP aus. Früher 5 min jetzt 10 min mit gleicher Datei.
Und am Ende kommt blanko Seite wie kann man nach dem Einlesen zurück auf die jsp umleiten die den Servlet  aufgerufen hat?
Danke für jede Hilfe.


----------



## Dimax (14. Dez 2018)

Hat sich erledigt.Danke an alle die mir geholfen haben.


----------



## mihe7 (14. Dez 2018)

Dimax hat gesagt.:


> Alles leuft aber ein wenig langsammer als direkt von JSP aus. Früher 5 min jetzt 10 min mit gleicher Datei.


Das kann nicht sein. Der einzige Overhead besteht im Erzeugen eines Objekts und dem Aufruf einer Methode. Das alleine ist zeitlich kaum messbar.


----------



## Dimax (14. Dez 2018)

Auch bei 150 000 Zeilen? Ich weiß es nicht warum aber Fakt ist Fakt,oder hab wieder was Falsch gebaut?


----------



## mrBrown (14. Dez 2018)

Die 150_000 Zeilen sind die verarbeitete Datei?

Ja, dann ist es völlig egal ob JSP oder Servlet. 
Irgendwas anderes machst du falsch, vermutlich zwei mal Hochladen und/oder Auslesen.


----------



## mihe7 (14. Dez 2018)

Dimax hat gesagt.:


> Auch bei 150 000 Zeilen?


Ja, wobei ich mich vorhin vertan habe: ich hatte eine Bean im Kopf, die im JSP instantiiert und verwendet wird. Du richtest aber den Request direkt an Dein Servlet, somit gibt es überhaupt keinen Overhead. 

Wenn Du eine Bean verwendet hättest, dann würdest Du - egal wie viele Zeilen Du einliest - nur ein einziges Mal ein Objekt erzeugen und eben die Methode aufrufen. Die Objekterzeugung und der Methodenaufruf sind so schnell, dass man einiges an Anstrengungen unternehmen muss, um das wirklich messen zu können (wenn Dich das interessiert: https://openjdk.java.net/projects/code-tools/jmh)

Ansonsten kannst Du mal überlegen, dass ein Methodenaufruf selbst für jede Zeile überhaupt nicht ins Gewicht fallen würde, weil die DB eine Ewigkeit länger braucht.


----------



## Dimax (17. Dez 2018)

Der Opfer meldet sich zurück)..Ich habe mit dem RequestDispatcher herumgespielt.

```
RequestDispatcher r=anfrage.getRequestDispatcher("../Projektorganisation/Projektorganisation.jsp");
                        r.forward(anfrage, antwort);
```
und nach dem Einlesen öffnet er zwar die Projektorganisation.jsp aber weitere Navigation macht er von der Servlett Adresse und nicht von Projektorganisation.jsp ,also er macht 
`/daten.einlesen/Projektorganisation.jsp` 
statt
`/fantastico/Projektorganisation/Projektorganisation.jsp`
was mache ich falsch?


----------



## mihe7 (17. Dez 2018)

Dimax hat gesagt.:


> Der Opfer meldet sich zurück


Das Opfer sind hier ja wohl andere 



Dimax hat gesagt.:


> was mache ich falsch?


Naja, Du gibst halt den Pfad relativ zur Servlet-Adresse zurück.


----------



## Dimax (18. Dez 2018)

mihe7 hat gesagt.:


> Du gibst halt den Pfad relativ zur Servlet-Adresse zurück.


ist es möglich das der Dispatcher zurückleitet und nicht Vorwarts?


----------



## mihe7 (18. Dez 2018)

Für den Anfang würde ich das neue Ziel einfach mal fest einbauen.


----------



## Dimax (18. Dez 2018)

also ohne Dispatcher? Hab auch so gemacht mit dem PrintWriter neue Seite ausgegeben mit dem button ahref Zielseite) aber ist nicht gut denke ich.Eigentlich werde ich Später versuchen irgendein Statusbalken zu erstellen der das Einlesevorschritt zeigt..aber das ist erst mal ein Traum.


----------



## Dimax (18. Dez 2018)

mihe7?


----------



## mihe7 (18. Dez 2018)

Dimax hat gesagt.:


> also ohne Dispatcher?


Mit Dispatcher aber weiterleiten auf feste URL.


----------



## Dimax (18. Dez 2018)

mihe7 hat gesagt.:


> @MultipartConfig annotieren und einfach auf die Parts bzw. Parameter zugreifen


Also so einfach ist es nicht))https://www.java-forum.org/thema/string-eingabe-pruefen.183529/


----------



## mihe7 (18. Dez 2018)

Du sprichst in Rätseln.


----------



## Dimax (19. Dez 2018)

Habe mich Gestern mit Multipart beschäftigt  und mein Servlet modifiziert.
Wenn ich aber versuche ein Part initialisieren bekomme ich endlose Schleife.

```
@WebServlet("/daten.einlesen/FileReader")
@MultipartConfig
public class FileReader extends HttpServlet {
    private static final long serialVersionUID = 1L;

    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        String contentType = request.getContentType();
   
    final Part partName=request.getPart("progra_name");//Alles leuft perfekt wenn ich diesen Satz schreibe,dann 
//leuft die while schleife endlos und nach einiger Zeit spuckt eine blanke Seite aus, ohne Fehlermeldungen

        final PrintWriter out=response.getWriter();
        String[][] Projekte2 = AuswahlAusMYSQL.ErmittlungDerProjekte();
       
        if ((contentType != null)
                && (contentType.indexOf("multipart/form-data") >= 0)) {
           
            DataInputStream in = new DataInputStream(
                    request.getInputStream());
           
            int formDataLength = request.getContentLength();
            byte dataBytes[] = new byte[formDataLength];
            int byteRead = 0;
            int totalBytesRead = 0;

            while (totalBytesRead < formDataLength) {
                byteRead = in.read(dataBytes, totalBytesRead,
                        formDataLength);
                totalBytesRead += byteRead;
            }
```


----------



## mihe7 (19. Dez 2018)

Schau Dir mal https://docs.oracle.com/javaee/6/tutorial/doc/glraq.html an.


----------



## Dimax (19. Dez 2018)

mihe7   ich verstehe nicht
Hab dein link analysiert->fruher`DataInputStream in = new DataInputStream(               request.getInputStream());`
wenn ich aber versuche irgendwas mit Parts zu machen muss ich auf so was umschreiben?->
`DataInputStream in = new DataInputStream(  Part.getInputStream());`


----------



## mihe7 (19. Dez 2018)

Richtig. Vorher bestand ein Request nur aus einem Teil, dessen Inhalt konntest Du mit request.getInputStream() einlesen. Jetzt besteht ein Request aus mehreren Teilen und jeder Teil hat seinen eigenen Inhalt.


----------



## Dimax (19. Dez 2018)

Ein Servlet habe ich modifiziert,eins muss ich noch,es bleiben aber ein paar Fragen offen.
1.)Mein request besteht aus 3 Parts,die Eigentlich nur die Strings enthalten aber werden mit input Stream übertragen?
2)Um daraus String zu basteln muss ich erst in ein byte Array einlesen und dann String str=new String(byte[]);?
3)Ist Punkt 2 Vollfunktionsfähig ?und gibt es vielleicht bessere Methoden? (Servlet anfang sihe code)Also in diesem Zustand leuft alles.

```
import java.io.DataInputStream;
import java.io.IOException;
import java.io.PrintWriter;
import java.sql.*;
import javax.servlet.ServletException;
import javax.servlet.annotation.MultipartConfig;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.Part;
import methoden.ComboPoole;
import methoden.*;

@WebServlet("/daten.einlesen/FileReader")
@MultipartConfig
public class FileReader extends HttpServlet {
    private static final long serialVersionUID = 1L;

    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
      
        final Part partFile=request.getPart("file");
        final Part partProg=request.getPart("progra_name");
        final Part partProj=request.getPart("SelectDropDown");
        long sizeFile=partFile.getSize();
        long sizeProg=partProg.getSize();
        long sizeProj=partProj.getSize();
        final PrintWriter out=response.getWriter();

        if ((sizeFile >0)&& (sizeProg > 0)&&(sizeProj>0)) {
            DataInputStream in = new DataInputStream(
                    partFile.getInputStream());
            System.out.println(sizeFile+" | "+sizeProg+" | "+sizeProj);
            byte dataBytes[] = new byte[(int)sizeFile];
            int byteRead = 0;
            int totalBytesRead = 0;
            while (totalBytesRead < sizeFile) {
                byteRead = in.read(dataBytes, totalBytesRead,
                        (int)sizeFile);
                totalBytesRead += byteRead;
            }
            String files =new String(dataBytes);
            byteRead = 0;
            totalBytesRead = 0;
          
            in=new DataInputStream(partProj.getInputStream());
            byte proj[] = new byte[(int)sizeProj];
            while (totalBytesRead < sizeProj) {
                byteRead = in.read(proj, totalBytesRead,
                        (int)sizeProj);
                totalBytesRead += byteRead;
            }
            String Projekt_ID =new String(proj);
            byteRead = 0;
            totalBytesRead = 0;
            in=new DataInputStream(partProg.getInputStream());
            byte prog[] = new byte[(int)sizeProg];
            while (totalBytesRead < sizeProg) {
                byteRead = in.read(prog, totalBytesRead,
                        (int)sizeProg);
                totalBytesRead += byteRead;
            }
            int projekt_id_int = 0;
            int programm_id_int = 0;
            String ProgrammBeschreibung =new String(prog);
            projekt_id_int = Integer.parseInt(Projekt_ID);
            //System.out.println(Projekt_ID+" | "+ProgrammBeschreibung+" | "+files);
                String sSql = "SELECT max(programm_id) FROM fantastico.programm";
                Connection cn=ComboPoole.getInstance().getConnection();....usw
```


----------



## mihe7 (19. Dez 2018)

Dimax hat gesagt.:


> Mein request besteht aus 3 Parts,die Eigentlich nur die Strings enthalten aber werden mit input Stream übertragen?


Das steht doch alles in dem Link, den ich Dir vorhin geschickt habe: auf die Formularfelder greifst Du über request.getParameter zu, den file-Part liest Du über InputStream aus.

Deine restlichen Fragen sollten sich damit erübrigt haben.


----------



## Dimax (19. Dez 2018)

Danke mihe7 für 


mihe7 hat gesagt.:


> auf die Formularfelder greifst Du über request.getParameter zu


in dem link wollte ich so was nicht ,nur um programmnahme zu ermitteln
	
	
	
	





```
private String getFileName(final Part part) {
   final String partHeader = part.getHeader("content-disposition");
   LOGGER.log(Level.INFO, "Part Header = {0}", partHeader);
   for (String content : part.getHeader("content-disposition").split(";")) {
       if (content.trim().startsWith("filename")) {
           return content.substring(
                   content.indexOf('=') + 1).trim().replace("\"", "");
       }
   }
   return null;
```
 Typisch Oraclisch ,machen so damit die anderen 20 Zeilen Code 3 Stunden studieren.
Durch dein Hinweis habe 30 Zeilen Code gespart und jetzt sieht es so aus

```
@WebServlet("/daten.einlesen/FileReader")
@MultipartConfig
public class FileReader extends HttpServlet {
    private static final long serialVersionUID = 1L;

    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
       
        final Part partFile=request.getPart("file");
        final Part partProg=request.getPart("progra_name");
        final Part partProj=request.getPart("SelectDropDown");
        long sizeFile=partFile.getSize();
        long sizeProg=partProg.getSize();
        long sizeProj=partProj.getSize();
        final PrintWriter out=response.getWriter();

        if ((sizeFile >0)&& (sizeProg > 0)&&(sizeProj>0)) {
            DataInputStream in = new DataInputStream(
                    partFile.getInputStream());
           
            byte dataBytes[] = new byte[(int)sizeFile];
            int byteRead = 0;
            int totalBytesRead = 0;
            while (totalBytesRead < sizeFile) {
                byteRead = in.read(dataBytes, totalBytesRead,
                        (int)sizeFile);
                totalBytesRead += byteRead;
            }
            String files =new String(dataBytes);
            String Projekt_ID =request.getParameter("SelectDropDown");
            int projekt_id_int = 0;
            int programm_id_int = 0;
            String ProgrammBeschreibung =new String(request.getParameter("progra_name"));
            projekt_id_int = Integer.parseInt(Projekt_ID);
            //System.out.println(Projekt_ID+" | "+ProgrammBeschreibung+" | "+files);
                String sSql = "SELECT max(programm_id) FROM fantastico.programm";
                Connection cn=ComboPoole.getInstance().getConnection();
```


----------



## mrBrown (19. Dez 2018)

Dimax hat gesagt.:


> Typisch Oraclisch ,machen so damit die anderen 20 Zeilen Code 3 Stunden studieren.


Äh, was?

Das Code-Stück ist nun wirklich nichts besonderes, sondern der übliche Weg, den Dateinamen rauszubekommen...


----------



## mihe7 (19. Dez 2018)

OMG, vergib @Dimax, denn er wusste nicht, was er tat. 

Der Browser gibt beim Request den Dateinamen mit. Diesen kannst Du mit dem Stück Code, das Du weggelassen hast, auslesen. Wenn Dich der nicht interessiert, dann kannst Du natürlich auf den Code verzichten.

Übrigens: die Zeilen

```
final Part partProg=request.getPart("progra_name");
        final Part partProj=request.getPart("SelectDropDown");
        long sizeProg=partProg.getSize();
        long sizeProj=partProj.getSize();
```
kannst Du Dir sparen. Und räum' Deinen Code mal auf (das ist ja wie bei Kindern mit dem Zimmer ).


----------



## Dimax (20. Dez 2018)

mihe7 hat gesagt.:


> kannst Du Dir sparen


Das darf nicht gespart werden ich muss ja prüfen ob die Felder gefüllt sind.Oder in einer Zeile alles zusammen schreiben?


----------



## mihe7 (20. Dez 2018)

Dimax hat gesagt.:


> Das darf nicht gespart werden


Du kannst oben gleich die Parameter auslesen, auf Gültigkeit prüfen und unten wiederverwenden.

Zum Beispiel:

```
String programName = request.getParameter("progra_name");
if (programName == null || programName.isEmpty()) {
    return;
}
```

Du kannst Dir auch für die Parameter ein Helferlein schreiben, das bestimmte Umwandlungen macht.


----------



## Dimax (20. Dez 2018)

Alles falsch gemacht )).Den ganzen Tag gesessen um ein Bug zu reparieren((
Falls ein Projekt gelöscht wird ,dann der nächste bekommt max+1 Id in DB 
und wenn ich ein Programm speichern möchte und wähle dafür `Integer.parseInt(anfrage.getParameter("SelectDropDown")`
dann wird dem Programm nur die Folgenummer vom select mitgegeben und nicht die Id aus der DB.
also habe erst alle Projekte ermittelt und dann aus dem Array die ID anhande der Folgenummer ermittelt.

```
String[][] Projekte2 = AuswahlAusMYSQL.ErmittlungDerProjekte();
String Projekt_ID=Projekte2[Integer.parseInt(anfrage.getParameter("SelectDropDown"))-1][1];
```
Jetzt bin ich stolz auf mich ,darf Feierabend machen)


----------



## mrBrown (20. Dez 2018)

Dimax hat gesagt.:


> Falls ein Projekt gelöscht wird ,dann der nächste bekommt max+1 Id in DB


Warum musst du die nächste ID wissen, lass das doch die DB selbst regeln?
mit max+1 kannst du Probleme bekommen, wenn man Projekte löscht - u.U. werden dann IDs mehrmals vergeben



Dimax hat gesagt.:


> SelectDropDown


Hältst du das wirklich für einen sinnvollen Parameter-Namen? 



Dimax hat gesagt.:


> dann wird dem Programm nur die Folgenummer vom select mitgegeben und nicht die Id aus der DB.


Was ist für dich eine "Folgenummer vom select"?



Dimax hat gesagt.:


> also habe erst alle Projekte ermittelt und dann aus dem Array die ID anhande der Folgenummer ermittelt.


Nur um die ID zu bekommen ist das aber etwas umständlich, warum nicht einfach nur die letzte ID selecten?


----------



## mihe7 (20. Dez 2018)

@mrBrown Ich ahne Böses. Wenn ich es richtig verstehe, erhält er von "SelectDropDown" praktisch einen Array-Index und jetzt versucht er, über diesen die Verknüpfung zum Projekt herzustellen... @Dimax sollte das so sein, dann hast Du keinen Bug behoben, sondern den nächsten eingebaut.


----------



## Dimax (21. Dez 2018)

mrBrown hat gesagt.:


> Warum musst du die nächste ID wissen, lass das doch die DB selbst regeln?


Wenn ich neues Projekt einlege gibt die DB mit autoincrement die nachste freie und nicht die erste freie.


mrBrown hat gesagt.:


> Hältst du das wirklich für einen sinnvollen Parameter-Namen?


 für mich ist es ok. So weiß ich das ich die Projekt ID aus der jsp ,wo select im formular ist,bekomme.


mrBrown hat gesagt.:


> Was ist für dich eine "Folgenummer vom select"?


Wenn ich ein Projekt auswähle wo ich ein Programm speichern möchte ,wird mir mit dem form die Reihenfolge Nummer vom select  mit dem Parameter "SelctDropDown" über gegeben.


mrBrown hat gesagt.:


> warum nicht einfach nur die letzte ID selecten?


Weil wenn ich ein Programm in DB speichern möchte ,kann ich beliebige Projekt id wählen und nicht immer die letzte.


----------



## Dimax (21. Dez 2018)

mihe7 hat gesagt.:


> erhält er von "SelectDropDown" praktisch einen Array-Index


Ich habe hier mein Code vom select schon mal gezeigt ,im select werden alle Projekte aufgelistet und zur Auswahl gestellt,wo man sein Programm "rein stellen" möchte,und so bekomme ich mit, die Folge Nummer ,so wie die Projekt IDs in der DB auch stehen.Habe lange überlegt wie ich die ID her kriege,kann sein das ich es falsch mache,wenn du was besseres raten würdest wäre super.


----------



## thecain (21. Dez 2018)

Dimax hat gesagt.:


> Wenn ich neues Projekt einlege gibt die DB mit autoincrement die nachste freie und nicht die erste freie.


Willst du Nummern sparen oder was ist da die Idee? Weil viel Sinn ausser unnötigem Aufwand und Fehleranfälligkeit hat das nicht


----------



## Dimax (21. Dez 2018)

thecain hat gesagt.:


> was ist da die Idee?


Die Idee ist ,dass man in der DatenBank die (sas)Programme ,die aus einem Textfile ausgelesen werden,speichern kann,und die auch einem bestimmten Projekt zuordnen kann.


----------



## mrBrown (21. Dez 2018)

Dimax hat gesagt.:


> Wenn ich neues Projekt einlege gibt die DB mit autoincrement die nachste freie und nicht die erste freie.


Na und? Wenn das für die DB die passende ID ist, warum sollte man dann reinpfuschen? (Nächste freie und erste freie sind für mich identisch, meinst du erste und zweite freie?)



Dimax hat gesagt.:


> für mich ist es ok. So weiß ich das ich die Projekt ID aus der jsp ,wo select im formular ist,bekomme.


Und glaubst du, in ein paar Wochen hast du noch die geringste Ahnung, was das meint?  oder der nächste, der an dem Projekt arbeitet, hat irgendeine Ahnung davon?



Dimax hat gesagt.:


> Wenn ich ein Projekt auswähle wo ich ein Programm speichern möchte ,wird mir mit dem form die Reihenfolge Nummer vom select mit dem Parameter "SelctDropDown" über gegeben.
> Weil wenn ich ein Programm in DB speichern möchte ,kann ich beliebige Projekt id wählen und nicht immer die letzte


Mir schwant böses...das Dropdown gibt dir den Index des Projekts zurück?

Bitte nicht! Das sollte nichts anderes als die ID zurück liefern, wenn da was anderes bei rauskommt, solltest du das dringend ändern!

(Man sollte sich vorm Posten auch die letzte Seite anzeigen lassen -.- ...)


----------



## mrBrown (21. Dez 2018)

Dann zeig doch dein aktuelles Dropdown mal.
In dem hier irgendwo gezeigten benutzt für die ID bereits, der Code ist aber (untertrieben) ziemlich hässlich und hoffentlich nicht mehr so im Projekt.


----------



## Dimax (21. Dez 2018)

mrBrown hat gesagt.:


> Nächste freie und erste freie sind für mich identisch


Genau das ist ja das Problem,wenn ich Projekt_id 1 lösche aber noch Projekt_id 2 usw drin habe dann erste freie ist id=1 und nächste freie id=3 so mach die DB nächstes Projekt automatisch zu ID=3 und nicht zu Id 1,deswegen beim Auswahl listet DropDown Reihenfolge nach alle IDs aber die Reihenfolge Nummer und ID Nummer stimmen nicht überein.

```
<FORM ENCTYPE="multipart/form-data" ACTION="ProjStatistik.jsp"
    METHOD=GET>
    <table border="0" align="center" rules="groups" cellspacing="11">
        <tbody>
            <tr><td></td></tr>
            <tr><td></td></tr>
            <tr>
                <td align="right">Projekt ID: </td>
                <td align="left"><select name="SelectDropDown" size=1 class="standard">
                        <option value=''></option>
                        <%
                            String[][] Projekte2 = AuswahlAusMYSQL.ErmittlungDerProjekte();
                            String[] Projekt_IDs = new String[Projekte2.length];
                            for (int i = 0; i < Projekte2.length;) {
                                ++i;
                                out.print("<option value=\"" + i + "\">" + Projekte2[i - 1][1] + " " + Projekte2[i - 1][0]
                                        + "</option>");
                                Projekt_IDs[i - 1] = Projekte2[i - 1][1];
                            }
                        %>
                </select><b><font color="red"> Falls kein Projekt zur Auswahl steht mussen sie einen erstellen!</font></b>
                </td></tr><tr><td></td></tr><tr><td></td></tr><tr>
                <td></td></tr><tr><td></td><td align="left"><b><INPUT TYPE="submit" VALUE="Auswerten"></b></td></tr>
                </tbody></table>
                </FORM>
```


----------



## mihe7 (21. Dez 2018)

Wenn der Anwender ein Objekt Deiner Anwendung auswählen, also identifizieren, soll, braucht er dazu die ID. Folglich gibst Du als value der Option einfach die ID aus und das Thema ist erledigt.


----------



## Dimax (21. Dez 2018)

Genau so mache ich,gebe zu der Code 


mrBrown hat gesagt.:


> ist aber (untertrieben) ziemlich hässlich


der läuft erst mal und dass ist wichtig,optimieren mache ich später.


----------



## mihe7 (21. Dez 2018)

Dimax hat gesagt.:


> Genau so mache ich


Nein, Du gibst hier

```
out.print("<option value=\"" + i + "\">"
```
als Value einfach den Array-Index aus. An der Stelle musst Du die ID des Projekts ausgeben. Dann kannst Du mit dieser ID in Deinem Servlet einfach weiterarbeiten.



Dimax hat gesagt.:


> der läuft erst mal


Nein, der läuft nur situationsbedingt.


----------



## Dimax (21. Dez 2018)

mihe7 muss es so sein 2 Stunden vom Urlaub?))


----------



## mihe7 (21. Dez 2018)

Kommt darauf an, wie ruhig Du Deinen Urlaub verbringen willst


----------



## Dimax (21. Dez 2018)

Nach deinen Kommentaren bleibt man auch im Urlaub beunruhigt).


----------



## mrBrown (21. Dez 2018)

Dimax hat gesagt.:


> Genau das ist ja das Problem,wenn ich Projekt_id 1 lösche aber noch Projekt_id 2 usw drin habe dann erste freie ist id=1 und nächste freie id=3 so mach die DB nächstes Projekt automatisch zu ID=3 und nicht zu Id 1,deswegen beim Auswahl listet DropDown Reihenfolge nach alle IDs aber die Reihenfolge Nummer und ID Nummer stimmen nicht überein.


Trenn dich von der Vorstellung, das IDs mehrmals vergeben werden können, diese irgendetwas mit einer reihenfolge zu tun haben oder überhaupt Zahlen sind.
Du solltest IDs einfach nur als beliebige, einmalige Werte ansehen.

Das die bei dir grad Zahlen sind, die hochgezählt werden, ist reines Implementierungsdetail, auf das du absolut nicht vertrauen kannst.


----------



## Dimax (21. Dez 2018)

Danke Jungs für gute Ratschläge,ich mache erst mal Urlaub.Wünsche euch allen schöne Feiertage und freue neues Jahr!


----------



## mihe7 (21. Dez 2018)

Danke, gleichfalls. Und so lange Dein Programm noch nicht eingesetzt wird, kannst Du auch ruhig schlafen


----------

