JavaServer Pages (JSP) (folytatás) MVC architektúra a Java kiszolgálón Ügyfél (Böngésző) 5 View elküldi az oldal az ügyfélez View (JSP) Ügyfél üzenet küldése a vezérlőnek 1 3 4 Kérelem továbbítása a megjelenítőnek Megjelenítő adatot olvas a modellből Controller (szervlet) 2 Adatok megváltoztatása a modellben Model (JavaBean, EJB, stb.) EIS Példa: online könyvvásárlás Megvalósítandó funkciók Könyvválaszték megjelenítése Megvásárolandó könyv(ek) kiválaszthatósága A kiválasztott könyvek összárának megjelenítése Kiválasztott könyv(ek) lemondása Kiválasztott könyvek megvásárlása http://localhost:8080/konyvesbolt Állapotdiagramm Böngésző Vezérlő modell létrehozása Adatbázis start_view start_model kosarba_view kosarba_model torles_view torles_model adatok_view befejezes_view befejezes_model 1
A vezérlő (ControllerServlet.java) package gal; import java.io.*; import javax.servlet.*; import javax.servlet.http.*; import java.sql.*; public class ControllerServlet extends HttpServlet { public void init() throws ServletException { // Adatmodell létrehozása, a könyvlista beolvasása String driver = "sun.jdbc.odbc.jdbcodbcdriver"; String url = "jdbc:odbc:konyvesbolt"; String query = "SELECT * FROM krimi ORDER BY id"; try { Class.forName(driver); Connection con = DriverManager.getConnection(url,"",""); Statement stmt = con.createstatement(); ResultSet rs = stmt.executequery(query); createdatamodel(rs); rs.close(); stmt.close(); con.close(); catch (Exception ex) { // A könyvlista beírása az application objektumba konyvek attributum névvel private void createdatamodel(resultset rs) throws SQLException { String[][] konyvek = new String[100][3]; int n = 0; while ( rs.next() ) { konyvek[n][0] = rs.getstring(2); konyvek[n][1] = rs.getstring(3); konyvek[n][2] = rs.getstring(4); n++; ServletContext sc = getservletcontext(); sc.setattribute("konyvek",konyvek); sc.setattribute("n",""+n); // Minden egyes kérelem felléptekor végrehajtott metódus public void dopost(httpservletrequest req, HttpServletResponse resp) throws ServletException, IOException { // Objektumok az include és forward számára ServletContext sc = getservletcontext(); RequestDispatcher rd_model; RequestDispatcher rd_view; // A munkafolyamat elindítása req.getsession(true); // A kérelem típusát meghatározó paraméter beolvasása String action = req.getparameter("action"); // A kérelem típusa start, az ennek megfelelő model és view végrehajtása if(action.equals("start")) { sc.getrequestdispatcher("/start_model.jsp"); rd_view = sc.getrequestdispatcher("/start_view.jsp"); // A kérelem típusa kosarba, az ennek megfelelő model és view végrehajtása if(action.equals("kosarba")) { sc.getrequestdispatcher("/kosarba_model.jsp"); rd_view = sc.getrequestdispatcher("/kosarba_view.jsp"); // A kérelem típusa torles, az ennek megfelelő model és view végrehajtása if(action.equals("torles")) { sc.getrequestdispatcher("/torles_model.jsp"); rd_view = sc.getrequestdispatcher("/torles_view.jsp"); 2
// A kérelem típusa adatok, az ennek megfelelő view végrehajtása if(action.equals("adatok")) { rd_view = sc.getrequestdispatcher("/adatok_view.jsp"); // A kérelem típusa befejezes, az ennek megfelelő model és view végrehajtása if(action.equals("befejezes")) { sc.getrequestdispatcher("/befejezes_model.jsp"); rd_view = sc.getrequestdispatcher("/befejezes_view.jsp"); Könyvlista átadása egy szkript tömbnek, s a könyvlistást és egy könyvlistasort megjelenítő metódusok (Keszlet.jsp) Több JSP oldal használja ezeket az include direktívával // Könyvlista beírása kétdimenziós tömbbe String[][] konyvek = (String[][])application.getAttribute("konyvek"); int n = Integer.parseInt((String)application.getAttribute("n")); public void doget(httpservletrequest req, HttpServletResponse resp) throws ServletException, IOException { dopost(req,resp); // A könyvlistát megjelenítő metódus! String konyvekdisplay(string[][] konyvek,int n){ String s = ""; for(int i=0; i<n; i++){ s +="<form method='post' " + "action='/konyvesbolt/controller'>"; s +="<td style='width:30%'>" + konyvek[i][0] + "</td>" + "<td style='width:50%'>" + konyvek[i][1] + "</td>" + "<td style='width:10%'>" + konyvek[i][2] + "</td>" + "<td style='width:10%'><input type=hidden " + "name=konyvselected value=" +i+ " >" + "<input type=hidden name=action value=kosarba>" + "<input type=submit value=igen " + "style='font-size:14;width:100%'></td>"; s +="</form>"; return s; // Egy könyvlistasort megjelenítő metódus String sordisplay(int i, String[][] konyvek){ String s = ""; s += "<form method='post' "+ "action='/konyvesbolt/controller'>"; s += "<td style='width:30%'>" + konyvek[i][0] + "</td>" + "<td style='width:50%'>" + konyvek[i][1] + "</td>" + "<td style='width:10%'>" + konyvek[i][2] + "</td>" + "<td style='width:10%'><input type=hidden " + "name=konyv value=" + i + ">" + "<input type=hidden name=action value=torles>" + "<input type=submit value=igen " + "style='font-size:14;width:100%'></td>"; s += "</form>"; return s; 3
A start megjelenítés (start_view.jsp) @ page import="java.util.*" @ page session="true" // A készlet és a készlet alapján a táblázatot generáló // metódusok beillesztése a JSP oldalba @ include file="keszlet.jsp" @ page contenttype="text/html; charset=iso-8859-2" // A táblázat statikus fejlécének elállítása <html> <center> <h2>könyvlista</h2> <table bgcolor=gray style="width:700; color:white"> <td style="width:30%">szerző</td> <td style="width:48%">cím</td> <td>ár[ft]</td><td>kosárba</td> // A tábálzat görgethető részének generálása // a könyvkészlet alapján <div style="overflow:scroll; height:140; width:700"> <table border=1 style="width:100%"> =konyvekdisplay(konynvek,n) </div> </center></html> A start modell (start_model.jsp) @ page import="java.util.*" // A munkafolyamat elindítása @ page session="true" // A vásárlói kosarat implementáló kosar nevű, Vektor // típusúobjekum létrehozása session hatáskörben Vector v = new Vector(); A kosárba megjelenítés (kosarba_view.jsp) @ page import="java.util.*" @ page session="true" // A készlet és a készlet alapján a táblázatot generáló // metódusok beillesztése a JSP oldalba @ include file="keszlet.jsp" @ page contenttype="text/html; charset=iso-8859-2" // A táblázat statikus fejlécének elállítása <html> <center> <h2>könyvlista</h2> <table bgcolor=gray style="width:700; color:white"> <td style="width:30%">szerző</td> <td style="width:48%">cím</td> <td>ár[ft]</td><td>kosárba</td> <div style="overflow:scroll; height:140; width:700"> <table border=1 style="width:100%"> =konyvekdisplay(konyvek,n) </div> 4
// A kosárban lévő könyvek megjelenítése egy görgethető // táblázatban <h3>könyvek a kosárban</h3> // A táblázat fix fejléce <table bgcolor=gray style="width:700; color:white"> <td style="width:30%">szerző</td> <td style="width:48%">cím</td><td>ár[ft]</td> <td>kiveszi?</td> // A táblázat görgethető része <div style="overflow:scroll; height:140; width:700"> <table border=1 style="width:100%"> // A kosár tartalmának generálása a kosar Vector // tartalma alapján // A kosár kiolvasása a session objektumból // Ha nem üres, akkor a tartalom generálása if(v!=null && (v.size()>0)){ if(v!=null && (v.size()>0)){ int sum = 0; for(int i=0; i<v.size(); i++){ out.print(sordisplay(integer.parseint (((String)v.elementAt(i))),konyvek)); sum += Integer.parseInt(konyvek[Integer.parseInt (((String)v.elementAt(i)))][2]); </div> <form method="post" action="/mvc/controller"> ="A fizetendő összeg = " + sum + "Ft" <input type=hidden name=action value=adatok> <input type=submit value=megrendelem> </form> </center> </html> A kosárba modell (kosarba_model.jsp) @ page import="java.util.*" // A munkafolyamat fenntartása @ page session="true" // A törlendő könyv beolvasása a kérelemből String s = request.getparameter("konyvsected"); // A kosár jelenlegi tartalmának betöltése // Az új könyv hozzáadása a kosár tartalmához v.addelement(s); // A kosár tárolása session hatáskörben A törlés megjelenítés (torles_view.jsp) megegyezik a kosárba megjelenítéssel A törlés modell (torles_model.jsp) @ page import="java.util.*" // A munkafolyamat fenntartása @ page session="true" // A törlendő könyv beolvasása a kérelemből String konyv = request.getparameter("konyv"); // A törlendő könyv indexének előállítása int i = Integer.parseInt(konyv); // A kosár jelenlegi tartalmának betöltése // Az új könyv hozzáadása a kosár tartalához v.removeelement(""+i); // A kosár tárolása session hatáskörben 5
Az adatok megjelenítés (adatok_view.jsp) Megegyezik a start megjenítéssel, azt azonban a megrendelő adatait bekérő, alábbi űrlappal egészíti ki... <h3>a fenti megrendelés megerősítése - adataim</h3> <form method="post" action="/konyvesbolt/controller"> <table> <td>családneve</td> <td><input type=text name=csaladnev size=48></td> <td>keresztneve</td> <td><input type=text name=keresztnev size=48></td> <td>postaciíme</td> <td><input type=text name=cim size=48></td> <td colspan=2> <input type=hidden name=action value=befejezes> <input type=submit value=megrendelem style="width:100%"> </td> </form> Adatok modell-re nem volt szükség A befejezés megjelenítés (befejezes_view.jsp) @ page contenttype="text/html; charset=iso-8859-2" <html> <center> <h4>megrendelését postázzuk, ha kívánja, <a href="/konyvesbolt/index.html">ide kattintva</a> újabb megrendelést készíthet!</h4> </center> </html> A befejezés modell (befejezes_model.jsp) A kosárban lévő könyvek és a megrendelő adatainak beírása egy adatbázisba @ page import="java.util.*" @ page session="true" @ taglib uri="http://java.sun.com/jsp/jstl/sql" prefix="sql" // A könyvek azonosítóinak beírása egy stringe, vesszővel elválasztva // az egyes tételeket String s = ""; for(int i=0; i<v.size(); i++){ s += (String)v.elementAt(i); if(i!= v.size()-1) s +=","; session.setattribute("s",s); 6
// Kapcsolódás az adabázisra <sql:setdatasource driver="sun.jdbc.odbc.jdbcodbcdriver" url="jdbc:odbc:konyvesbolt" user="" password="" /> // A felhasználó adatait és a megrendelt könyveket // tartalmazó string beírása az adatbázis egy rekordjába <sql:update> INSERT INTO megrendelesek(csaladnev,keresztnev,cim,konyvek) VALUES('${param.csaladnev','${param.keresztnev', '${param.cim','${sessionscope.s') </sql:update> v.removeallelements(); 7