1 / 81

J2EE - Servlets Java Server Pages ,EJB

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)

uma
Download Presentation

J2EE - Servlets Java Server Pages ,EJB

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. J2EE - ServletsJava Server Pages,EJB Lumír Návrat.katedra informatiky FEI VŠB-TUO A-1018 / 597 323 252 lumir.navrat@vsb.cz

  2. 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

  3. Architektura Java EE

  4. 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)

  5. Architektura Java EE

  6. 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/...

  7. 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

  8. 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

  9. 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

  10. 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)

  11. 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)

  12. 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.*

  13. 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

  14. Reprezentace odpovědi ServletResponse contentTypewriteroutputStream HttpServletResponse header(name)addCookie(cookie)addHeader(name, value)sendError(sc, msg)

  15. <?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>

  16. Ú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

  17. 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

  18. 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” %>

  19. 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>

  20. 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)); } %>

  21. 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    } %>

  22. Ú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.

  23. Předdefinované proměnné • HttpServletRequest request • <%= request.getRemoteHost() %> • HttpServletResponse response • HttpSession session • PrintWriter out • ServlerContext application • ServletConfig config • PageContext pageContext • page (= this)

  24. 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)

  25. 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(); } }

  26. 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=“*” />

  27. 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

  28. Ú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

  29. 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>

  30. 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; } }

  31. 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>

  32. Příklad – tags.jsp <%@ taglib uri="/WEB-INF/tis-taglib.tld" prefix=“tis" %> Dnes je <tis:datum/>

  33. Ú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.

  34. 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)}

  35. 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>

  36. Úkol 5 • V rámci JSP stránky implementujte logiku pro stránkování kolekce. Pro řešení použijte značky JSTL.

  37. Java Database ConnectivityJDBC

  38. 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

  39. Architektura JDBC Aplikační kód JDBC API java.sql.*javax.sql.* Ovladač JDBC DB API Databáze

  40. Architektura JDBC ResultSet ResultSet ResultSet Statement PreparedStatement CallableStatement Connection Aplikace DriverManager Oracle driver JDBC-ODBC bridge Sybase driver ODBC driver

  41. 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

  42. 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

  43. 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 }

  44. 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

  45. 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

  46. 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”);

  47. 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();

  48. 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(); } }

  49. Parametrizované příkazy • Možnost předkompilace – opakované provedení příkazu • Parametry • označené znakem ? • indexované od 1 INSERT INTO uzivatel(login,jmeno)VALUES(?, ?)

  50. Parametrizované příkazy PreparedStatement pstmt = con.prepareStatement( “INSERT … VALUES(?,?)”); pstmt.clearParameters(); pstmt.setString(1, ”wal007”); pstmt.setNull(2, Types.VARCHAR);

More Related