Warning: Constant ABSPATH already defined in /customers/e/7/0/florian-oeser.de/httpd.www/wordpress/wp-config.php on line 28 Warning: Cannot modify header information - headers already sent by (output started at /customers/e/7/0/florian-oeser.de/httpd.www/wordpress/wp-config.php:28) in /customers/e/7/0/florian-oeser.de/httpd.www/wordpress/wp-includes/rest-api/class-wp-rest-server.php on line 1723 Warning: Cannot modify header information - headers already sent by (output started at /customers/e/7/0/florian-oeser.de/httpd.www/wordpress/wp-config.php:28) in /customers/e/7/0/florian-oeser.de/httpd.www/wordpress/wp-includes/rest-api/class-wp-rest-server.php on line 1723 Warning: Cannot modify header information - headers already sent by (output started at /customers/e/7/0/florian-oeser.de/httpd.www/wordpress/wp-config.php:28) in /customers/e/7/0/florian-oeser.de/httpd.www/wordpress/wp-includes/rest-api/class-wp-rest-server.php on line 1723 Warning: Cannot modify header information - headers already sent by (output started at /customers/e/7/0/florian-oeser.de/httpd.www/wordpress/wp-config.php:28) in /customers/e/7/0/florian-oeser.de/httpd.www/wordpress/wp-includes/rest-api/class-wp-rest-server.php on line 1723 Warning: Cannot modify header information - headers already sent by (output started at /customers/e/7/0/florian-oeser.de/httpd.www/wordpress/wp-config.php:28) in /customers/e/7/0/florian-oeser.de/httpd.www/wordpress/wp-includes/rest-api/class-wp-rest-server.php on line 1723 Warning: Cannot modify header information - headers already sent by (output started at /customers/e/7/0/florian-oeser.de/httpd.www/wordpress/wp-config.php:28) in /customers/e/7/0/florian-oeser.de/httpd.www/wordpress/wp-includes/rest-api/class-wp-rest-server.php on line 1723 Warning: Cannot modify header information - headers already sent by (output started at /customers/e/7/0/florian-oeser.de/httpd.www/wordpress/wp-config.php:28) in /customers/e/7/0/florian-oeser.de/httpd.www/wordpress/wp-includes/rest-api/class-wp-rest-server.php on line 1723 Warning: Cannot modify header information - headers already sent by (output started at /customers/e/7/0/florian-oeser.de/httpd.www/wordpress/wp-config.php:28) in /customers/e/7/0/florian-oeser.de/httpd.www/wordpress/wp-includes/rest-api/class-wp-rest-server.php on line 1723 {"id":44,"date":"2008-06-08T13:36:35","date_gmt":"2008-06-08T11:36:35","guid":{"rendered":"http:\/\/www.florian-oeser.de\/?p=44"},"modified":"2008-07-08T13:35:35","modified_gmt":"2008-07-08T11:35:35","slug":"howto-part-2-blazedsfds-tomcat-servlets-mysql","status":"publish","type":"post","link":"http:\/\/www.florian-oeser.de\/2008\/06\/08\/howto-part-2-blazedsfds-tomcat-servlets-mysql\/","title":{"rendered":"HowTo: BlazeDS\/FDS-Tomcat + Servlets + MySQL"},"content":{"rendered":"

Einleitung<\/h4>\n

In dem HowTo-Reihe m\u00f6chte ich euch kurz zeigen wie einfach es ist, Daten mit Hilfe eines Servlets zu lesen und zu schreiben. Ich werde nicht alles in Detail erkl\u00e4ren. Deshalb w\u00e4re es sinnvoll, wenn ihr schonmal mit einem der beiden Server gearbeitet habt, ein Servlet geschrieben habt und ein klein wenig Ahnung von SQL habt \ud83d\ude09<\/p>\n

Als kleines Beispiel haben wir in Anlehnung an Projekt radioSiTY<\/a> eine Datenbank, in der es eine Tabelle User gibt. Ich zeige zuerst wie man die einzelnen Felder ausliest und wie man anschlie\u00dfent einen neuen Benutzer hinzuf\u00fcgt.<\/p>\n

\"servlets_tbluser\"<\/a><\/p>\n

F\u00fcr die Entwicklung der Servlets kann ich \u00fcbrigens Eclipse for JEE<\/a> empfehlen. Dort kann man dann ein Dynamic Web Project<\/em> anlegen und kann direkt Servlets erstellen. Zum Einen hat man so ein fertiges Codeger\u00fcst und zum Anderen braucht man sich nicht mehr um die Servlet jar’s k\u00fcmmern. Und man kann zus\u00e4tzlich Server anlegen auf dennen kompiliert wird.<\/p>\n

Umsetzung<\/h4>\n
Auslesen der Datenbank<\/h5>\n

Um \u00fcberhaupt mit Java bzw. einem Servlet und einer Datenbank zu kommunizieren, sind die sogenannten JDBC Treiber<\/em> erforderlich. Diesen Treiber gibt es f\u00fcr viele Datenbanken egal ob PostgreSQL<\/em>, HSQL<\/em> oder MySQL<\/em>. Die Treiber nennt MySQL<\/em> den Connector\/J.<\/em> Zum Download gibt es den nat\u00fcrlich auf der Homepage<\/a> von MySQL<\/em>. Diese *jar muss jetzt in das JDK Verzeichniss unter jre\/lib\/ext kopiert werden.<\/p>\n

Die Umsetzung ist relativ trivial. Um eine Spalte einer Tabelle auszulesen ist nicht mehr erforderlich als eine Verbindung zur Datenbank aufzubauen, den Query zu \u00fcbergeben und das Ergebnis in einer Schleife auszugeben. Folgendes Servlet realisiert genau das:<\/p>\n

\r\nimport java.io.IOException;\r\nimport javax.servlet.*;\r\nimport java.io.*;\r\nimport java.sql.*;\r\n\r\nimport javax.servlet.*;\r\nimport javax.servlet.http.*;\r\n\r\npublic class FirstExample extends HttpServlet {\r\n\t@Override\r\n\tprotected void doGet(HttpServletRequest req, HttpServletResponse res)\r\n\t\t\tthrows ServletException, IOException {\r\n\r\n\t\tConnection con = null;\r\n\t\tStatement stmt = null;\r\n\t\tResultSet rs = null;\r\n\r\n\t\ttry {\r\n\t\t\tres.setContentType("text\/html");\r\n\t\t\tPrintWriter out = res.getWriter();\r\n\r\n\t\t\tClass.forName("com.mysql.jdbc.Driver").newInstance();\r\n\t\t\tcon = DriverManager.getConnection("jdbc:mysql:\/\/\/radiositiy_db1",\r\n\t\t\t\t\t"root", "root");\r\n\r\n\t\t\tstmt = con.createStatement();\r\n\t\t\trs = stmt.executeQuery("SELECT * FROM tbl_user");\r\n\r\n\t\t\twhile (rs.next()) {\r\n\r\n\t\t\t\tout.println(rs.getString(2) + "<br>");\r\n\r\n\t\t\t}\r\n\t\t\tout.close();\r\n\r\n\t\t\tif (!con.isClosed())\r\n\t\t\t\tSystem.out.println("Successfully connected to "\r\n\t\t\t\t\t\t+ "MySQL server using TCP\/IP...");\r\n\r\n\t\t} catch (Exception e) {\r\n\t\t\tSystem.err.println("Exception: " + e.getMessage());\r\n\t\t} finally {\r\n\t\t\ttry {\r\n\t\t\t\tif (con != null)\r\n\t\t\t\t\tcon.close();\r\n\t\t\t} catch (SQLException e) {\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t}\r\n}\r\n\r\n<\/pre>\n

Um eine Datenbankverbindung herzustellen brauchen wir eine Connection<\/em> und ein Statement<\/em> welches das Query ausf\u00fchrt und in ein Resultset<\/em> zur\u00fcckgibt. Um eine Verbindung aufzubauen sind die Angaben des Treibers, der Datenbank selbst, des Benutzernames und des Passwortes n\u00f6tig. Bis auf Ersteres muss nat\u00fcrlich alles entsprechend angepasst werden.<\/p>\n

Als Query \u00fcbergeben wir ein einfaches SELECT Statement<\/em>. In dem ResultSet<\/em> steht jetzt das komplette Ergebniss der Abfrage. Dieses wird dann in einer Schleife ausgeben. Das Argument bei rs.getString()<\/em> gibt dabei den Spaltenname an. Da der ResultSet<\/em> wie gesagt alles speichert, ist es problemlos m\u00f6glich auch noch zum Beispiel die id sich ausgeben zu lassen. Unabh\u00e4nig davon ob es zu Fehler kam oder nicht, muss nat\u00fcrlich die Verbindung wieder geschlossen werden.<\/p>\n

Noch ein paar Worte zum kompilieren. F\u00fcr den BlazeDS kann man in Eclipse einen neuen Server analog zu einem normalen Tomcat anlegen. Angegeben werden muss hier nur der Tomcat Ordner im BlazeDS Verzeichnis.<\/p>\n

\"servlets_serverconf\"<\/a><\/p>\n

Der FDS-Tomcat hat dieses Verzeichniss nicht und arbeitet aus dem \/bin<\/em> Ordner herraus. Leider erkennt das Eclipse nicht an und kann somit auch nicht f\u00fcr den FDS-Tomcat kompilieren. Alles was ich noch in der Richtung probiert hatte, endete mit mit Fehlern wie das der Server nicht die 2.5 J2EE Module unterst\u00fctzt. Naja vielleicht liegt es auch daran das der FDS nur Version 5.5 benutzt. Oder ich hab mich einfach zu dusselig angestellt \ud83d\ude00 \u00dcber L\u00f6sungen von euch w\u00fcrde ich mich freuen…Es gibt trotzdem eine M\u00f6glichkeit f\u00fcr den FDS-Tomcat zu kompileren. Einfach die gewohnte main() einf\u00fcgen und fertig. So l\u00e4sst sich n\u00e4mlich wieder in der nomalen Java Perspektive von Eclipse kompilieren.<\/p>\n

Nun kopiert ihr das kompilierte Servlet direkt nach WEB-INF\/classes<\/em> auf den Server. Damit der Server wei\u00df wo euer Servlet liegt, gibt es die sogenannte web.xml. In der f\u00fcgen wir einfach folgendes unten an:<\/p>\n

\r\n<servlet>\r\n<servlet-name>FirstExample<\/servlet-name>\r\n<servlet-class>FirstExample<\/servlet-class>\r\n<\/servlet>\r\n<servlet-mapping>\r\n<servlet-name>FirstExample<\/servlet-name>\r\n<url-pattern>\/FirstExample<\/url-pattern>\r\n<\/servlet-mapping>\r\n<\/pre>\n

Nun braucht ihr noch noch den Server zu starten und das Servlet so aufrufen: http:\/\/localhost:8400\/samples\/FirstExample<\/em> . Ich habe mich dabei wie ihr seht f\u00fcr den BlazeDS entschieden und den WEB-INF unter samples benutzt. Wenn alles geklappt hat seht ihr jetzt die Benutznamen in einer Spalte ausgegeben. Im \u00dcbrigen seht ihr jetzt auch in der Konsole das erfolgreich zur MySQL Datenbank verbunden wurde. Alle Ausgaben die \u00fcber System.out<\/em> normalerweise in der IDE-Konsole ausgeben werden, sind jetzt in der Serverkonsole zu sehen.<\/p>\n

So kommen wir zum zweiten Teil. N\u00e4mlich dem Schreiben in die Datenbank. Das ist ebenfalls ziemlich einfach:<\/p>\n

import java.io.IOException;\r\nimport javax.servlet.*;\r\nimport java.io.*;\r\nimport java.sql.*;\r\n\r\n\r\nimport javax.servlet.*;\r\nimport javax.servlet.http.*;\r\n\r\n\r\n\r\npublic class FirstExample extends HttpServlet {\r\n\t\r\n\tprivate String name = new String("second");\r\n\tprivate String username= new String("example");\r\n\tprivate String password = new String("geheim");\r\n\tprivate String mail = new String("test@web.de");\r\n\tprivate String birthdate = new String("1965-01-23");\r\n\t\r\n\t@Override\r\n\tprotected void doGet(HttpServletRequest req, HttpServletResponse res)\r\n\t\t\tthrows ServletException, IOException {\r\n\t\t\r\n\t\tConnection con = null;\r\n\t\tStatement stmt = null;\r\n\t\t\r\n\t\t\r\n\t\ttry {\r\n\t\t\tres.setContentType("text\/html");\r\n\t\t\tPrintWriter out = res.getWriter();\r\n\r\n\t\t\tClass.forName("com.mysql.jdbc.Driver").newInstance();\r\n\t\t\tcon = DriverManager.getConnection("jdbc:mysql:\/\/\/radiositiy_db1", "root",\r\n\t\t\t\t\t"root");\r\n\t\t\t\r\n\t\t\tstmt = con.createStatement();\r\n\t\t\tstmt.execute("INSERT INTO tbl_user (fld_name,fld_username,fld_password,fld_email,fld_birthdate)" +\r\n\t\t\t\t\t" VALUES ('"+name+"','"+username+"','"+password+"','"+mail+"','"+birthdate+"')");\r\n\t\t\t\t\t\t\r\n\r\n\t\t\tif (!con.isClosed())\r\n\t\t\t\tSystem.out.println("Successfully connected to "\r\n\t\t\t\t\t\t+ "MySQL server using TCP\/IP...");\r\n\r\n\t\t} catch (Exception e) {\r\n\t\t\tSystem.err.println("Exception: " + e.getMessage());\r\n\t\t} finally {\r\n\t\t\ttry {\r\n\t\t\t\tif (con != null)\r\n\t\t\t\t\tcon.close();\r\n\t\t\t} catch (SQLException e) {\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t}\r\n}\r\n\r\n<\/pre>\n

Aus Platzgr\u00fcnden hab ich die Imports mal weggelassen. Da wir beim Schreiben logischerweise kein Ergebniss bekommen brauchen wir das ResultSet<\/em> nicht mehr. Ausserdem hei\u00dft die aufzurufende Methode nicht mehr executeQuery<\/em> sondern nur noch execute()<\/em>. Der Rest ist denk ich mal relativ selbsterkl\u00e4rend.<\/p>\n

Conclusion<\/h4>\n

Wir haben gelernt wie einfach es doch ist mit Servlets\/Java Datenbankoperationen durchzuf\u00fchren. Ich denke das war nicht allzuviel und d\u00fcrfte leicht verdaubar sein \ud83d\ude09<\/p>\n

Wenn ich Zeit habe formuliere ich einige Sachen noch aus und werde noch eine kleine Flexapplikation dazu schreiben.<\/p>\n

F\u00fcr Anregungen, Verbesserungen etc. k\u00f6nnt ihr mir gerne mailen oder ein Kommentar hinterlassen!<\/p>\n","protected":false},"excerpt":{"rendered":"

Einleitung In dem HowTo-Reihe m\u00f6chte ich euch kurz zeigen wie einfach es ist, Daten mit Hilfe eines Servlets zu lesen und zu schreiben. Ich werde nicht alles in Detail erkl\u00e4ren. Deshalb w\u00e4re es sinnvoll, wenn ihr schonmal mit einem der beiden Server gearbeitet habt, ein Servlet geschrieben habt und ein klein wenig Ahnung von SQL […]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":[],"categories":[6],"tags":[],"_links":{"self":[{"href":"http:\/\/www.florian-oeser.de\/wp-json\/wp\/v2\/posts\/44"}],"collection":[{"href":"http:\/\/www.florian-oeser.de\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"http:\/\/www.florian-oeser.de\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"http:\/\/www.florian-oeser.de\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"http:\/\/www.florian-oeser.de\/wp-json\/wp\/v2\/comments?post=44"}],"version-history":[{"count":0,"href":"http:\/\/www.florian-oeser.de\/wp-json\/wp\/v2\/posts\/44\/revisions"}],"wp:attachment":[{"href":"http:\/\/www.florian-oeser.de\/wp-json\/wp\/v2\/media?parent=44"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/www.florian-oeser.de\/wp-json\/wp\/v2\/categories?post=44"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/www.florian-oeser.de\/wp-json\/wp\/v2\/tags?post=44"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}