810 likes | 1.01k Views
J2EE - Servlets Java Server Pages ,EJB. Lum ír Návrat. katedra informatiky FEI VŠB-TUO A-1018 / 597 323 252 lumir.navrat @vsb.cz. Obsah. Architektura Java EE Struktura webov é aplikace Java Servlet s Java Server Pages Použití JavaBeans Uživatelské značky Knihovny značek (JSTL)
E N D
J2EE - ServletsJava Server Pages,EJB Lumír Návrat.katedra informatiky FEI VŠB-TUO A-1018 / 597 323 252 lumir.navrat@vsb.cz
Obsah • Architektura Java EE • Struktura webové aplikace • Java Servlets • Java Server Pages • Použití JavaBeans • Uživatelské značky • Knihovny značek (JSTL) • JDBC • Enterprise JavaBeans
Součásti Java EE • Servlets + JSP – webové komponenty a UI • JDBC – práce s databázemi • EJB – distribuované komponenty • JAXP – práce s XML, zasílání zpráv • JNDI – jmenné a adresářové služby • RMI – volání vzdálených metod • JavaIDL – distribuované objekty CORBA • JMS– asynchronní zpracování zpráv • JavaMail – zasílání zpráv e-mailem • JTA – distribuované transakce • JCA – připojení k jiným systémům (např. SAP) • JPA - Java Persistent Api (novinka v Java 5 EE)
Struktura webové aplikace http://www.lib.com/catalog • Servlety • .class • Statický obsah • .html, .jpg, .gif, … • JSP • .jsp • Knihovny tříd • .jar WEB-INF classes lib jsp web.xml images … index.jsp http://www.lib.com/catalog/WEB-INF/...
Konfigurační soubor – web.xml • Základní konfigurace webové aplikace • Definuje • Servlety, filtry • Zabezpečení adresářů a metody přístupu k aplikaci • Reference na JNDI zdroje
Java Servlets • Standardní metoda rozšiřování webových serverů o dynamické generování obsahu • Základní rozhraní pro aplikace s tenkým klientem (webový prohlížeč) WebBrowser Java Servlet Container Servlet Servlet
Výhody servletů • Perzistence mezi voláními – rychlejší odezva na požadavky, sdílení dat • CGI – opakované zavádění • Přístup k celému Java API • JDBC – databáze • JAXP – práce s XML • JNDI – adresářové služby
Servletový kontejner • Zajišťuje běh servletu • JVM • Správa sezení • Udržování kontextu • Konfigurační informace • Perzistence • Různí dodavatelé – standardizace • Java Servlet API 2.5 (aktuální revize)
Typy servletových kontejnerů • Rozšíření WWW serveru • Apache/JServ • S vestavěným WWW serverem • Jetty (Mortbay.com) • Apache Tomcat – referenční implementace • Samostatné aplikační servery • Sun Application Server /Glassfish • JBoss • WebSphere (IBM)
Java Servlet API GenericServlet servletInfoinit()service(request, response)destroy() ServletConfig servletName getInitParameter(n) servletConfig 1 1 * servletContext 1 ServletContext attribute(n) getInitParameter(n) HttpServlet lastModifieddoGet()doPost() … javax.servlet.*javax.servlet.http.*
Reprezentace požadavku ServletRequest remoteHost, …parameter(name) reader http://www.lib.com/catalog - context path HttpServletRequest contextPathheader(name)cookies[] HttpSession attribute(n) removeAttribute(n)invalidate() session * 1
Reprezentace odpovědi ServletResponse contentTypewriteroutputStream HttpServletResponse header(name)addCookie(cookie)addHeader(name, value)sendError(sc, msg)
<?xml version="1.0" encoding="UTF-8"?> • <web-app version="2.4" xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee • http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"> • <display-name>Cvičení 2</display-name> • <description>Příklady pro cvičení 2 - servlety a JSP.</description> • <filter> • <filter-name>encoding</filter-name> • <filter-class>cviceni2.RequestEncodingFilter</filter-class> • <init-param> • <param-name>encoding</param-name><param-value>UTF-8</param-value> • </init-param> • </filter> • <servlet> • <servlet-name>ukol1</servlet-name><servlet-class>ctc.Ukol1Servlet</servlet-class> • </servlet> • <servlet-mapping> • <servlet-name>ukol1</servlet-name><url-pattern>/hello</url-pattern> • </servlet-mapping> • <filter-mapping> • <filter-name>encoding</filter-name><url-pattern>/*</url-pattern> • </filter-mapping> • </web-app>
Úkol 1 - Vytvoření Servletu • Vytvořte novou webovou aplikaci • V rámci této webové aplikace vytvořte servlet, který bude zobrazovat HTML text
Java Server Pages • Oddělení prezentace od aplikační logiky • Zjednodušení realizace stránek • Servlety na všechno • Statický obsah HTML + servlety pro akce • Dynamický obsah v rámci statického • Možnost editace HTML editory • Kompilace na Java servlet • Při prvním požadavku, kontrolují se změny
Prvky JSP • Direktivy • <%@page contentType=“text/html” %> • Vložený úsek programu (skriplet) • <% out.println(“x : “ + x); %> • Výraz • x : <%= x %> • Statický kód • <%! public String sayHello() {…} %> • Poznámka • <%-- Tento kód se neprovede a nezobrazí ani v HTML stránce --%> • Vestavěné značky akcí • <jsp:include page=“/headers/header.jsp” /> • Uživatelem definované značky • <my:Date /> • <% @ tagliburi=http://lib.com/tags prefix=“my” %>
Příklad 1 <%@ page contentType=“text/html; charset=UTF-8” %> <%@ page import=“java.util.*” %> <html> <head> <title>První pokus</title> </head> <body> <h1>Vítejte na mé stránce</h1> <p>Dnešní datum je<%= new Date().toString() %></p> </body>
Příklad 2 <%@ page contentType="application/vnd.ms-excel" %> <% out.println("x\tx^2"); for(int i = 1; i <= 10; i++) { out.println(I + "\t“ + (i * i)); } %>
Příklad 3 <% Iterator i = cart.getItems().iterator(); while (i.hasNext()) { ShoppingCartItem item = (ShoppingCartItem)i.next(); BookDetails bd = (BookDetails)item.getItem(); %> <tr> <td align="right” bgcolor="#ffffff"> <%=item.getQuantity()%> </td><td bgcolor="#ffffaa"> <strong><a href="<%=request.getContextPath()%> /bookdetails?bookId=${bd.getBookId()}"> ${bd.getTitle()}</a></strong> </td> ... <% // End of while } %>
Úkol 2 • Vytvořte JSP stránku, která bude vypisovat tabulku s druhými mocninami čísel do 10. Použijte nejenscriplet, ale rovněž výraz.
Předdefinované proměnné • HttpServletRequest request • <%= request.getRemoteHost() %> • HttpServletResponse response • HttpSession session • PrintWriter out • ServlerContext application • ServletConfig config • PageContext pageContext • page (= this)
Komponenty Java Beans - opakování • Konstruktor • public StringBean() {} • Vlastnosti (properties) • private String msg = “Nic”; • public String getMsg() { return msg; } • public void setMsg(String m) { msg=m; } • Metody • public void clear() { msg = “Nic”; } • Události (events)
Příklad package ctc; import java.util.Hashtable; import java.util.Collection; public class SeznamUzivatelu { private Hashtable tabulka = new Hashtable(); public void uloz(Uzivatel u) { tabulka.put(u.getLogin(), u); } public Uzivatel hledej(String login) { return (Uzivatel)tabulka.get(login); } public Collection getSeznam() { return tabulka.values(); } }
Použití JavaBeans v JSP • Zavedení komponenty • <jsp:useBean id=“sb” class=“StringBean“ /> • Přístup k vlastnostem • <jsp:getProperty name=“sb” property=“msg” /> • Nastavení vlastnosti • <jsp:setProperty name=“sb” property=“msg” value=“Ahoj” /> • <jsp:setProperty name=“sb” property=“msg” param=“message” /> • <jsp:setProperty name=“sb” property=“*” />
Sdílení komponent <jsp:useBean id=“…” class=“…” scope=“…”/> • scope=“page” (implic. hodnota) • v objektu PageContext • viditelná pouze v rámci stránky • scope=“request” • v objektu ServletRequest • viditelná v rámci požadavku (požadavek může být zpracován více stránkami!) • scope=“session” • v objektu HttpSession • sdílená mezi různými požadavky v rámci sezení jednoho uživatele • scope=“application” • v objektu ServletContext • sdílí se všemi servlety ve stejné aplikaci
Úkol 3 • Upravte předchozí JSP tak, že budete z jiného souboru předávat hodnotu parametru který bude určovat maximální hodnotu pro kterou se budou druhé mocniny počítat
Uživatelské značky • Třída obslužného programu (handler) • rozhraní javax.servlet.jsp.tagext.Tag • metody doStartTag(), doEndTag(),… – od J2EE 1.3 • metoda doTag() – od J2EE 1.4 • Deskriptor knihovny značek • soubor xxx.tld ve formátu XML • Soubor JSP používající značky • <%@ taglib uri=“xxx.tld” prefix=“xxx”%> • <xxx:znacka param=“…”> … </xxx:znacka>
Příklad – DatumTag.java packagectc.tags; import javax.servlet.jsp.*; import javax.servlet.jsp.tagext.*; public class DatumTag extends SimpleTagSupport{ public intdoTag() { JspWriter out=getJspContext().getOut(); try { //kód před tělem JspFragment f=getJspBody(); if (f != null) f.invoke(out); //kód za tělem } catch( java.io.IOException e ) {…} return SKIP_BODY; } }
Příklad – tis-taglib.tld <?xml version="1.0" encoding=“iso-8859-2” ?> <taglib xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-jsptaglibrary_2_0.xsd" version="2.0"> <tlibversion>1.0</tlibversion> <shortname>tis</shortname> <uri>/ctc/datum</uri> <info>Knihovna značek pro CTC</info> <name>DatumTag</name> <tag-class>ctc.tags.DatumTag</tag-class> <body-content>empty</body-content> <attribute> <name>format</name> <type>java.lang.String</type> </attribute> </tag></taglib>
Příklad – tags.jsp <%@ taglib uri="/WEB-INF/tis-taglib.tld" prefix=“tis" %> Dnes je <tis:datum/>
Úkol 4 • Vytvořte stránku, ve které budete ukládat do session jméno uživatele, které zadá do formuláře. • Následně vytvořte uživatelskou značku, která bude toto jméno načítat z této proměnné a zobrazovat. Pokud nebude zadáno, tak vypíše místo toho nějakou náhradní hodnotu.
JSTL – JavaServer Standard Tag Library • Core • výrazy <c:out value=“…”/> • tok řízení<c:forEach var=“…“items=“…">…</c:forEach> • práce s URL<c:url var=“…” value=“…”/> • XML • analýza<x:parse …/> • transformace<x:transform xslt=“…” xml=“…”/> • I18n (Internationalization) • formátování textů<fmt:message key=“…”/> • formátování čísel a data/času<fmt:formatDate …/> • Database • volba zdroje dat<sql:setDataSourcedataSource=“…”/> • SQL dotazy a transakce<sql:queryvar=“…>…</sql:query> • Function (prefix: fn) • –velikost kolekce, manipulace s řetězci ${fn:length(items)}
Příklad <%@ page contentType="text/html; encoding=UTF-8" %> <%@ taglib uri="/WEB-INF/c.tld" prefix="c" %> <jsp:useBean id="uzivatele" class=„ctc.SeznamUzivatelu" scope="session"> <% uzivatele.uloz(new Uzivatel("wal314", "Johnny", "Walker"));%> </jsp:useBean> <html> <body> <h2>Seznam uživatelů</h2> <table border="1"> <c:forEach var="uziv" varStatus="st" items="${uzivatele.seznam}"> <tr> <td><c:out value="${st.count}"/></td> <td><c:out value="${uziv.login}"/></td> <td>${uziv.jmeno}"/> <c:out value="${uziv.prijmeni}"/></td> </tr> </c:forEach> </table> </body> </html>
Úkol 5 • V rámci JSP stránky implementujte logiku pro stránkování kolekce. Pro řešení použijte značky JSTL.
JDBC • rozhraní pro unifikovaný přístup k datům • použití i mimo databáze – data ve formě tabulek (CSV, XLS, ...) • ovladače jsou k dispozici pro většinu databázových systémů • inspirováno rozhraním ODBC • objektové rozhraní • možnost spolupráce s ODBC
Architektura JDBC Aplikační kód JDBC API java.sql.*javax.sql.* Ovladač JDBC DB API Databáze
Architektura JDBC ResultSet ResultSet ResultSet Statement PreparedStatement CallableStatement Connection Aplikace DriverManager Oracle driver JDBC-ODBC bridge Sybase driver ODBC driver
JDBC ovladač • zprostředkování komunikace aplikaces konkrétním typem databáze • implementován obvykle výrobcem databáze • dotazovací jazyk – SQL • předá se databázi • ovladač vyhodnotí přímo • reprezentován specifickou třídou • sun.jdbc.odbc.JdbcOdbcDriver • org.gjt.mm.mysql.Driver
Typy JDBC ovladačů • Typ 1: • využívá ODBC (přes JDBC-ODBC bridge) • obtížně konfigurovatelné • Typ 2: • komunikace s nativním ovladačem • Typ 3: • komunikuje s centrálním serverem (Network Server) síťovým protokolem • pro rozsáhlé heterogenní systémy • Typ 4: • založen čistě na jazyce Java • přímý přístup do databáze
Registrace ovladače • konkrétní ovladač je pevně spojen s aplikací new com.mysql.Driver() • výběr ovladače za běhu aplikace String driverName = “com.mysql.Driver”; try{ Class.forName(driverName); } catch( ClassNotFoundException e) { // obsluha výjimky }
Identifikace spojení jdbc:driver:database jdbc:odbc:datasource;Attr=Value;… Příklad: jdbc:mysql://localhost/dais3?user=dais3&password=dais3&useUnicode=true&characterEncoding=iso-8859-2 Datová vrstva informačního systému
Připojení k databázi Connection con = DriverManager.getConnection( “url”, “uživatel”, “heslo”) • DriverManager se dotáže všech registrovaných ovladačů • Rozpozná-li ovladač své url, vrátí objekt Connection
Objekt Statement • Reprezentuje SQL příkaz: • Statement • PreparedStatement • CallableStatement • Vytvoření instance příkazu: Statement stmt = con.createStatement(); • Provedení příkazu ResultSet rs = stmt.executeQuery( “SELECT * FROM t”); int num = stmt.executeUpdate( “DELETE * FROM t”);
Objekt ResultSet • Reprezentuje výsledek dotazu SELECT Statement stmt = con.createStatement(); ResultSet rs = stmt.executeQuery( “SELECT * FROM uzivatel”); while( rs.next() ) { String login = rs.getString(“login”); String jmeno = rs.getString(“jmeno”); } rs.close(); stmt.close();
Ošetření chyb • public class SQLException extends Exception try{ … } catch( SQLException e) { while( e != null ) { System.out.println(e.getMessage()); System.out.println(e.getSQLState()); System.out.println(e.getErrorCode()); e = e.getNextException(); } }
Parametrizované příkazy • Možnost předkompilace – opakované provedení příkazu • Parametry • označené znakem ? • indexované od 1 INSERT INTO uzivatel(login,jmeno)VALUES(?, ?)
Parametrizované příkazy PreparedStatement pstmt = con.prepareStatement( “INSERT … VALUES(?,?)”); pstmt.clearParameters(); pstmt.setString(1, ”wal007”); pstmt.setNull(2, Types.VARCHAR);