Java - The road to Servlets and MySQL

Continuă discuția de la The growth stages of a programmer:

(offtopic: I really miss the option to add tags to the posts I make…)

Okay, deci (acum ca mi-am pus gandurile in ordine pentru acest inceput de paragraf), pentru un proiect la facultate, a trebuit sa fac o agenda telefonica folosint Java Servlets si o baza de date.

Pentru server, am ales XAMPP (portabil, adica no-install), am conectat Tomcat-ul la Netbeans (thanks, Google&Youtube!). Dupa ce am reusit sa fac primul servlet (care a luat ceva timp) (thanks, Google&Youtube!), am incercat sa fac o baza de date SQLite. Aparent a trebuit sa descarc un .jar si sa-l adaug (librariilor) proiectului. Toate bune si frumoase, pana i-am dat run. Dadea crash la Tomcat (adica la server). Am mai facut modificari, am vazut alte tutoriale (thanks, Google&Youtube!), apoi mi-am dat seama ca, server fiind, ar trebui sa aiba log-uri. Am gasit eroarea si i-am dat pe google. Rezultatul, sqlite-jdbc da crash la server.

Bun, deci SQLite nu merge. Proiectul se reprogrameaza cu doua zile mai tarziu. Perfect, inca o noapte sa termin proiectul !!! Si mai bag un all-nigher. Incerc sa folosesc JSON, trebuie sa folosesc alt plugin, plus ca nu inteleg cum anume prelucreaza datele acel plugin (pare a nu fi intuitiv). NEXT! XML? Nu mai am nevoie de un plugin, dar pare sa fie aceeasi problema. MySQL? Okay, am serverul UwAmp. Pornesc serverul, creez baza de date, incerc sa ma conectez la ea, dar nu merge, orice as incerca,

Vine dimineata cand trebuie sa prezint proiectul (toata noaptea am lucrat la prioiet, thanks coffe!!!). Cu aproximativ o ora inainte de a intra, descoper ca desi metoda functioneaza fara sa dea crash, totusi are erori (le-am ignorat pana acum; imi trebuia ceva care sa functioneze, nu sa nu dea erori), spre deosebire de sqlite-jdbc, mysql-connector-java (links: 1, 2) nu da eroare, dar nu ceva nu merge. Iarasi, google. 20 de minute dupa ce ajung la facultate, imi dau seama ca trebuie sa descarc un .jar. Aparent, Java, pe cat de all-rounded se lauda a fi, nu stie sa se conecteze la vre-o baza de date. GG, Oracle! Thanks for wasting my time!

Okay, with this out of the way, deja am baza de date. Insa nu reusesc sa extrag nimic. Asa ca incerc sa returnez un array de string-uri. Incerc cu String, dar dau de probleme cu null-ul. Incerc cu ArrayList, dar tot am probleme. Pana la urma, extrag un string, toate datele le bag intr-un string, fiecare element returnat pe propria linie, prone to sql-injection, dar macar pot rula un query si afisa rezultatul/rezultatele. Stringului rezultat ii fac explode dupa \n (rand nou), apoi afisez fiecare valoare pe un rand nou.

Apropo, aparent am avut nevoie si de PHP pentru PhpMyAdmin (pentru mysql).

Codul necesar pentru MySQL:

package index;
import static index.debug.getConnection; /* Probabil acel index este de la numele package-ului */
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.sql.*;


    public static Connection getConnection() throws Exception{
        try{
            String driver = "com.mysql.jdbc.Driver";
            String url = "jdbc:mysql://localhost/servletsdb";
            String username = "root";
            String password = "root";
            Class.forName(driver);
            Connection conn = DriverManager.getConnection(url,username,password);
            /*System.out.println("Connected");*/
            return conn;
        } catch(Exception e){System.out.println(e);}
        return null;
    }
    
    public static String sqlGet(PrintWriter out) throws Exception{
        try{
            String returnable = new String("");
            Connection con = getConnection();
            String sql = "select nume from contacts;";
            
            //Statement statement = con.createStatement();
            PreparedStatement statement = con.prepareStatement(sql);
            ResultSet result = statement.executeQuery();
            /*
            Statement statement = con.createStatement();
            ResultSet result = statement.execute(sql);s
            */
            /*
            Statement statement = con.createStatement();
            ResultSet result = statement.executeQuery(sql);
            */
            String temp;
            while(result.next()){
                temp = ""+result.getString("nume");
                //out.println(temp);
                returnable = returnable + temp + "\n";
            }
            //out.println(returnable);
            return returnable;
        } catch(SQLException e){
            out.println(e);
        } catch(Exception e) {
            out.println(e);
        } finally {
            //out.println("Completed sqlGet(\" select name from contacts; \");");
        }
        /*        
        String[] exploded = b.split("\n");
        for (String s: exploded) {
            out.println(s); 
        }
        */
        return null;
    }
    

    public static void createTable() throws Exception{
        try{
            Connection con = getConnection();
            PreparedStatement create = con.prepareStatement(
                " CREATE TABLE IF NOT EXISTS contacts " +
                "(ID INT PRIMARY KEY AUTO_INCREMENT NOT NULL, " +
                " nume         VARCHAR(256)  NOT NULL, " + 
                " prenume      VARCHAR(256)  NOT NULL, " + 
                " mobil        VARCHAR(15)   NOT NULL, " + 
                " fix          VARCHAR(15)           , " + 
                " email        VARCHAR(256)  NOT NULL, " +
                " adresa       VARCHAR(256)          , " +  
                " oras         VARCHAR(64)           , " +
                " judet        VARCHAR(64)           , " +
                " codpostal    VARCHAR(12)           ); "
            );
            create.executeUpdate();
        } catch(Exception e) {
            System.out.println(e);
        } finally {
            System.out.println("Completed");
        }
    }
    

Iar pentru rulare folosesc urmatorul cod:


                String b = sqlGet(out); /* Bad pun not intended,
                                           but welcomed */
                //out.println(b+"<br/>---");
                String[] exploded = b.split("\n");
                for (String s: exploded) {
                    out.println(s); 
                }

Ok, acum ca am ceva functional, back to the tirth project: Retea de reclame multi-site. Macar acum imi merge ceva…


Chiar nu ma gandeam ca Java nu se poate conecta la vre-o baza de date nativ !!!
(Adica fara a include .jar-uri/librarii separate de JDK…)


Intrebarile sunt binevenite. Sper ca asta ajuta pe cineva.

Nu mă pricep la Java dar cred că un manager de pachete ar fi fost bun. Poate Maven?

Pentru doua proiecte? Ok, daca as face minim un part-time sau un hobby din Java development, as mai zice. Dar pentru doua-trei proiecte nu-mi bat capul.

De ce nu? Din cauza principiului mentionat in video-ul recomandat aici drept ‘The Wise Hacker’. Si asa m-am chinuit cu ce-am facut pana acum, chiar nu aveam nevoie de un layer de abstractizare in plus. Nu cand inca mai invat chestii de baza, cel putin. (Da, servlets-urile sunt chestii de baza.) Altfel risc sa cad in capcana prezentata aici:

1 Like
  • Ce ai încercat să faci și nu ți-a ieșit fără pma?
  • Ai avut nevoie de pma sau ai avut nevoie de un GUI? Dacă doar de un GUI, data viitoare încearcă Workbench.
1 Like

Si eu recomand folosirea consolei mysql direct, in special in etapa de invatare. Sau daca nu se vrea CLI, atunci un client desktop, de ex pe mac folosesc MySQLWorkbench / Dbvisualiser pentru ceva DBuri mai deosebite (ambele sunt cross-platform) iar pe windows am folosit multa vreme Sqlyog cu deosebit succes, pe vremea cand era free. Vad ca HeidiSQL se apropie de ce era sqlyog pe vremuri, si e free.

@Sapioit am schitat o diagrama de layere ca sa vezi cum trebuie sa se lege ucrurile. Nici in PHP nu se recomanda sa lucrezi direct cu ce iti da PHPul, d’apoi la Java unde e complet interzis.

1 Like

@Sapioit

De ce nu ti-a mers SQLiteJDBC pe Netbeans? Ai ceva loguri la indemana? Ai folosit jar-ul downloadabil sau ai folosit pluginul meu pt Netbeans? ( https://vox.space/netbeans/30/netbeans-sqlitejdbc / http://plugins.netbeans.org/plugin/16018/sqlite-jdbc-driver ). In ambele variante ar trebui sa mearga fara probleme (ce varianta de NB ai folosit?).

Nu am avut niciodata probleme cu libraria de la Zentus(Xerial).

Adica sa mai instalez un program doar pentru asta? Nu, multumesc!

Am facut asta in liceu… si in facultate, folosesc ceva program gen workbench-ul pomenit de @iamntz, dar pentru Oracle SQL. Nu-mi vine numele in minte.
Multumesc pentru diagrama. Cam asa am inteles si eu ca functioneaza…

Nu e de la netbeans, doar ca are bug-uri sqlite-jdbc-ul… si imi pica serverul, ca sa nu corupa datele. Cel putin asta am gasit, pe net, referitor la eroarea pe care o primeam.

Pai suspectez si eu ca nu e de la Netbeans, iar de la client n-are in mod sigur cum sa fie, libraria SQLiteJDBC de la Zentus e folosita in foarte multe chestii, si daca o librarie client ar crashui o componenta de server … ar fi problema mare.

Ai incercat pluginul ala de Netbeans pe care l-am listat mai sus?

Nu, nu am incercat. Probabil o sa il incerc dupa examene, caci acum nu prea am timp (sau chef) sa imi mai bat capul cu el.