7. diel - Wicket - Databáza
V tejto časti nadviažeme na predchádzajúce lekciu, kedy sme vytvorili kontaktný formulár. Dáta z formulára budeme ukladať do databázy (v našom prípade PostgreSQL). Pre záujemcov je práca s PostgreSQL podrobnejšie popísaná v sekcii PostgreSQL, my si tu vysvetlíme len minimum potrebné na vytvorenie nášho projektu.
PostgreSQL
Stiahnutie PostgreSQL vrátane pgAdmin (grafické rozhranie): http://www.enterprisedb.com/...g/pgdownload
Inštalácia PostgreSQL je jednoduchá a užívateľsky prívetivá. Spustenie instaleru -> spustí sa setup Microsoft Visual C ++ 2013 (ak nemáte naistalováno). Nasleduje setup PostgreSQL -> nastavenie Installation Directory -> Data Directory -> Password -> Port (defaltně 5432) -> Advanced Options - výber locale -> Ready to Install. Ďalej sa spustí Stack Builder 3.xx pre inštaláciu dodatočného softvéru. Tu nie je potrebné vyberať nič, všetko potrebné je už naistalováno.
Spoločne s postgres sa naistaloval aj pgAdmin, čo je grafické užívateľské rozhranie pre administráciu databázy.
Inštalácia obsahuje jednu databázu (postges) a jednu prihlasovacie rolu (postgres).
Kliknutím na ikonu SQL sa dostanete do Query view, v ktorom je možné zadávať SQL príkazy (F5 vykoná všetky príkazy, ďalšou možnosťou je označiť príkaz a kliknú na ikonu so zelenou šípkou).
Dáta z tabuľky možno získať pomocou selektov v Query view, kliknutím pravého tlačidla myši na tabuľke v Object browsera a voľby View dáta, prípadne označením tabuľky v Object browsera a klávesové skratky Ctrl + D.
DAO návrhový vzor
DAO (Data Access Object) predstavuje rozhranie (interface) pre prístup k databáze. V DAO rozhrania sú definované metódy pre prácu s databázou. Ďalej sa vytvorí implementácia tohto rozhrania, ktorá implementuje danej metódy. Objekty, ktoré potrebujú pracovať s databázou, si vytvoria inštanciu DAO a používajú špecifikované metódy (napr. Saved (), getAllData (), getById (), atď ...). Všetka logika pre prácu s databázou sa nachádza v DAO. Triedy používajúce databázu (prostredníctvom DAO) nevie nič o tom, ako je práca (interakcia) s databázou implementovaná. Iba vytvorí inštanciu DAO a používajú metódy. V prípade zmeny týkajúce sa databázy (napr. Zmena databázy) nedochádza k zmene vlastného kódu aplikácie, len sa zmení DAO implementácie
Ďalej sa potom vytvorí trieda / triedy ktorých inštancie budú predstavovať objekt, ktorý budeme v databáze ukladať, načítať či meniť. V našom prípade budeme pracovať s komentárom, a preto vytvoríme triedu Comment.
Comment.java
import java.sql.Date; import java.sql.Timestamp; public class Comment { private Timestamp createdTime; private String email; private String textOfComment; public Timestamp getCreatedTime() { return createdTime; } public void setCreatedTime(Timestamp createdTime) { this.createdTime = createdTime; } public String getEmail() { return email; } public void setEmail(String email) { this.email = email; } public String getTextOfComment() { return textOfComment; } public void setTextOfComment(String textOfCcomment) { this.textOfComment = textOfCcomment; } }
Iba drobné upozornenie. Date a Timestamp importujeme z balíčka java.sql.
CommentDao.java
import java.util.List; public interface CommentDao { public void saveComment(Comment comment); public List<Comment> getAllComments(); }
Pre prácu s databázou použijeme JDBC.
"Java DataBase Connectivity (JDBC) je API v programovacom jazyku Java, ktoré definuje jednotné rozhranie pre prístup k relačnom databázam [1]. Ide o medzivrstvu medzi Java aplikácií a samotnú komunikáciou s určitou databázou. JDBC umožňuje aplikáciu rovnako pristupovať k rôznym databázam. líšia sa iba JDBC driver, ktorý poskytuje tvorca databázového servera. " Wikipédie
CommentDaoImpl.java
import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; import java.util.ArrayList; import java.util.List; public class CommentDaoImpl implements CommentDao { private final String POSTGRES = "jdbc:postgresql://localhost/nazev_databáze?user=uživatelské_jméno&password=heslo"; static { try { Class.forName("org.postgresql.Driver"); } catch (ClassNotFoundException e) { e.printStackTrace(); } } @Override public void saveComment(Comment comment) { try (Connection con = DriverManager.getConnection(POSTGRES)) { PreparedStatement ps = con.prepareStatement( "insert into comment (created_time, email, text_of_comment) values (?, ?, ?)" ); ps.setTimestamp(1, comment.getCreatedTime()); ps.setString(2, comment.getEmail()); ps.setString(3, comment.getTextOfComment()); ps.executeUpdate(); } catch (SQLException e) { e.printStackTrace(); } } @Override public List<Comment> getAllComments() { List<Comment> comments = new ArrayList<>(); try (Connection con = DriverManager.getConnection(POSTGRES)) { Statement st = con.createStatement(); ResultSet rs = st.executeQuery("select id_comment, created_time, email, text_of_comment from comment"); while (rs.next()) { Comment comment = new Comment(); comment.setCreatedTime(rs.getTimestamp("created_time")); comment.setEmail(rs.getString("email")); comment.setTextOfComment(rs.getString("text_of_comment")); comments.add(comment); } } catch (SQLException e) { e.printStackTrace(); } return comments; } }
String Postgres obsahuje reťazec použitý pre pripojenie k databáze (pre získanie spojenia - connection).
Tento riadok načíta triedu ovládača.
Class.forName("org.postgresql.Driver");
Ďalej je potrebné pridať postgresql jdbc driver ( http://jdbc.postgresql.org/download.html) do lib zložky aplikačného servera (... \ apache-tomcat-7.0.55 \ lib), a tiež do pom.xml pridať závislosť ( dependency) pre postgresql jdbc driver.
<dependency> <groupId>postgresql</groupId> <artifactId>postgresql</artifactId> <version>9.1-901-1.jdbc4</version> </dependency>
Tiež je potrebné v databáze vytvoriť tabuľku comment.
create table comment ( id_comment serial not null, created_time timestamp not null, email character varying (50), text_of_comment character varying, constraint comment_pk primary key (id_comment) );
Teraz otestujeme pripojenie databázy (naši DAO implementáciu) pomocou JUnit testu. V src / test / java vytvoríme balíček cz.mujweb.database a testovacie triedu TestDatabase (pravým tlačidlom na balíček -> New -> Other -> JUnit Test Case -> Next -> ako meno zadajte TestDatabase -> Finish). Vytvorí sa nám trieda s vygenerovanú metódou test ().
@Test public void test() { fail("Not yet implemented"); }
Ak teraz test spustíme (pravým tlačidlom na triedu -> Run As -> JUnit Test), objaví sa nám nová záložka JUnit.
Test nám zlyhá (fail). To nie je nič prekvapujúce, pretože je tak napísaný. Vyskúšali sme si však, že testovanie pomocou JUnit v našom projekte funguje. Možno vás prekvapilo, ako je možné, že nedošlo pri použití JUnit k chybe, keď sme túto knižnicu nepridávali do závislostí v pom.xml. Ak sa do súboru pom.xml pozriete, zistíte, že JUnit závislosť tam už je pridaná.
Vygenerovanú metódu public void test () môžeme teraz zmazať. Vytvoríme si metódu vlastné.
TestDatabase.java
import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertTrue; import java.sql.Timestamp; import java.util.List; import org.junit.Test; public class TestDatabase { @Test public void testCommentSaving() { // vytvoření nového komentáře Comment comment = new Comment(); comment.setCreatedTime(new Timestamp(1_000_000_000L)); comment.setEmail("[email protected]"); comment.setTextOfComment("Text komentáře"); // uložení komentáře do databáze CommentDao dao = new CommentDaoImpl(); dao.saveComment(comment); // získání všech komentářů z databáze List<Comment> comments = dao.getAllComments(); assertNotNull(comments); assertTrue(comments.size() > 0); Comment lastComment = comments.get(comments.size() - 1); assertTrue(lastComment.getCreatedTime().getTime() == 1_000_000_000L); } }
Ak test spustíme teraz, mal by prejsť.
Tiež sa môžeme pozrieť do databázy, či je komentár skutočne uložený.
Ešte nám zostáva upraviť metódu onSubmit () tak, aby pri odoslaní formulára uložila dáta do databázy.
ContactForm.java
@Override protected void onSubmit() { Comment comment = new Comment(); comment.setCreatedTime(new Timestamp(new Date().getTime())); comment.setEmail(email); comment.setTextOfComment(text); CommentDao dao = new CommentDaoImpl(); dao.saveComment(comment); setResponsePage(HomePage.class); }
V prvej časti metódy vytvoríme inštanciu komentáre (Comment) a nasetujeme jej dáta získané z formulára (email, text). Do dátumu vytvorenia vložíme aktuálny čas.
new Date() // java.util.date, vytvoří aktuální čas new Date().getTime() // vrátí aktuální čas jako počet milisekund new Timestamp(aktuální_čas) // vytvoří nový java.sql.timestamp s aktuálním časem
V druhej časti metódy vytvoríme CommentDao objekt a zavoláme jeho metódu saveComment (). Na záver voláme metódu setResponsePage () a ako parametra jej odovzdáme triedu stránky, kam chceme, aby bol používateľ presmerovaný.
Priložený súbor obsahuje zdrojový kód vytvorené webové aplikácie.
Ďalšie zdroje:
- Oficiálny web: wicket.apache.org
- Užívateľská príručka a dokumentácia: wicket.apache.org/guide/guide/index.html
Mal si s čímkoľvek problém? Stiahni si vzorovú aplikáciu nižšie a porovnaj ju so svojím projektom, chybu tak ľahko nájdeš.
Stiahnuť
Stiahnutím nasledujúceho súboru súhlasíš s licenčnými podmienkami
Stiahnuté 44x (30.52 kB)
Aplikácia je vrátane zdrojových kódov v jazyku Java