Serwlety Java: zagadnienia zaawansowane Data Sources Data Sources Przykład pliku data-sources.xml Obiekt Data Source stanowi logiczną definicję bazy danych programista korzysta z obiektu Data Source serwer aplikacji dokonuje odwzorowania obiektu Data Source na fizyczną bazę danych Aplikacje J2EE wykorzystują obiekty Data Source w następujący sposób: przeszukują serwis nazw przy pomocy JNDI łączą się z bazą danych przy pomocy metod klasy Connection Obiekty Data Source są zarejestrowane w drzewie JNDI <data-source class="com.evermind.sql.drivermanagerdatasource connection-driver="oracle.jdbc.driver.oracledriver" name="oracleds" location="jdbc/oracleds" xa-location="jdbc/xa/oracleds" ejb-location="jdbc/ejb/oracleds" min-connections="5" max-connections="25" username="oe" password="oe" url="jdbc:oracle:thin:@<host>:<port>:<sid>" />
Wykorzystywanie obiektów Data Sources try { Context ic = new InitialContext(); DataSource ds = (DataSource)ic.lookup("jdbc/OracleDS"); Connection conn = ds.getconnection(); catch (SQLException se) { catch (NamingException ne) { Servlet Filters javax.servlet.filter Servlet Filter: przykład Interfejs javax.servlet.filter definiuje trzy metody: void init(filterconfig) void dofilter(servletrequest, ServletResponse, FilterChain) void destroy() Metoda dofilter(): Analizuje nagłówek żądania Modyfikuje nagłówki odpowiedzi, opakowując obiekt request Modyfikuje odpowiedź, opakowując obiekt response Wywołuje kolejny filtr w łańcuchu import javax.servlet.*; import javax.servlet.filter; import java.io.*; public class HelloFilter implements Filter { private FilterConfig filterconfig; public void init(filterconfig filterconfig){ System.out.println("Filter Initialized"); public void dofilter (ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { System.out.println("Hello from Filter"); chain.dofilter(request, response); public void destroy(){
Konfiguracja filtrów: web.xml <filter> <filter-name>hellofilter</filter-name> <filter-class>hellofilter</filter-class> </filter> <filter-mapping> <filter-name>hellofilter</filter-name> <servlet-name>stateservlet</servlet-name> </filter-mapping> HttpSession HttpSession Obiekt HttpSession reprezentuje tożsamość klienta Tworzony przy pomocy metody getsession() obiektu HttpRequest Może być utworzony przez dowolny serwlet obsługujący żądanie klienta Może być współdzielony przez wiele serwletów HttpSession session = req.getsession(true); HttpSession - przykład public void doget( ) { response.setcontenttype("text/html"); PrintWriter out = response.getwriter(); HttpSession session = request.getsession(true); String sessionid = session.getid(); Integer sessioncount = (Integer)session.getAttribute("sessionCount"); if (sessioncount == null) { sessioncount = new Integer(0); else { sessioncount = new Integer(sessionCount.intValue() + 1); session.setattribute("sessioncount", sessioncount); out.println("<p>number of requests for the session with the id of " + "<b>" + sessionid + "</b> is: " + sessioncount);
Czas życia sesji Sesje wygasają automatycznie, lecz istnieje możliwość ich zakończenia Date dayago = new Date( System.currentTimeMillis() - 24*60*60*1000); Date hourago = new Date( ) // an hour ago Date created = new Date( session.getcreationtime()); Date accessed = new Date( ) if (created.before(dayago) accessed.before(hourago)) { session.invalidate(); session = //create new Architektura Model-View-Controller JSP Model 1 JSP Model 1 1 żadanie 4 JSP baza danych Nadchodzące żądania od przeglądarki są przekazywane bezpośrednio do aplikacji JSP, która odpowiada za ich przetwarzanie i generowanie odpowiedzi dla klientów. Architektura dla prostych zastosowań. przeglądarka odpowiedź 2 Java Bean 3
JSP Model 2 JSP Model 2 przeglądarka 1 żądanie 5 odpowiedź Serwlet (Controller) 3 JSP (View) 4 2 tworzenie Java Bean (Model) baza danych Przetwarzanie podzielone pomiędzy komponenty prezentacyjne (View) i komponenty komunikacyjne (Controller) Główna zaleta: komponenty prezentacyjne (View) nie zawierają logiki przetwarzania Pozwala to na rozdział ról programistów Komponent komunikacyjny (Controller) stanowi pojedynczy punkt wejścia do aplikacji, co umożliwia jednorodne zarządzanie stanem aplikacji, bezpieczeństwem oraz formą prezentacji Przykład: JSP Model 1 Formularz HTML
Dokument JSP JavaBean Przykład: JSP Model 2 Formularz HTML
Serwlet (getinfo) JavaBean (getdatabean) JavaBean (getdatabean) c.d. Dokument JSP (showinfo)
Elementy środowiska Struts Środowisko Java Struts Struts Servlet: moduł komunikacyjny (Controller) dla całej aplikacji J2EE Zbiór klas JavaBeans, wykorzystywanych podczas realizacji modułów modelu (Model) Zbiór bibliotek znaczników do wykorzystania przez moduły JSP Plik konfiguracyjny aplikacji: web.xml Plik konfiguracyjny aplikacji: web.xml c.d. <?xml version="1.0" encoding="iso-8859-1"?> <!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.2//EN" "http://java.sun.com/j2ee/dtds/web-app_2_2.dtd"> <web-app> <!-- Standard Action Servlet Configuration (with debugging) --> <servlet> <servlet-name>action</servlet-name> <servlet-class> org.apache.struts.action.actionservlet</servlet-class> <init-param> <param-name>application</param-name> <param-value>applicationresources</param-value> </init-param>... </servlet> Definicja serwletu ActionServlet <servlet-mapping> <servlet-name>action</servlet-name> <url-pattern>*.do</url-pattern> </servlet-mapping> <!-- Struts Tag Library Descriptors --> <taglib> <taglib-uri>/web-inf/struts-bean.tld</taglib-uri> <taglib-location>/web-inf/struts-bean.tld</taglib-location> </taglib>... </web-app> Skojarzenie żądań *.do z serwletem ActionServlet Definicje bibliotek znaczników Struts
Działanie serwletu ActionServlet Serwlet ActionServlet dokona automatycznego przekształcenia otrzymanych parametrów do obiektu JavaBeans, nazywanego ActionForm Serwlet ActionServlet wywoła obiekt klasy Action, który może skorzystać z obiektu Działanie serwletu ActionServlet Odwzorowanie żądania użytkownika (*.do) w konkretne klasy Action i ActionForm odbywa się w oparciu o definicje z pliku struts-config.xml: <struts-config> <form-beans> <form-bean name="submitform" type="submitform"/> </form-beans> <action-mappings> <action path="/submit" type="submitaction" name="submitform" input="/submit.jsp" scope="request"> <forward name="success" path="/submit.jsp"/> <forward name="failure" path="/submit.jsp"/> </action> </action-mappings></struts-config> Elementy struts-config.xml path - nazwa żądania "submit.do", rozszerzenie ".do" należy pominąć type - nazwa klasy Action name - nazwa logiczna elementu ActionForm (form-bean) input - strona wyświetlająca błędy walidacji scope - zasięg obiektu ActionForm (np. "session") Znaczniki "forward" definiują dalszą nawigację w przypadku otrzymania odpowiedzi "success" lub "failure" z obiektu Action Przykład: dokument JSP <%@ page language="java" %> <%@ taglib uri="/web-inf/struts-bean.tld" prefix="bean" %> <%@ taglib uri="/web-inf/struts-html.tld" prefix="html" %> <%@ taglib uri="/web-inf/struts-logic.tld" prefix="logic" %> <html><head><title>submit example</title></head> <body><h3>example Submit Page</h3> <html:errors/><html:form action="submit.do"> Last Name: <html:text property="lastname"/><br> Address: <html:textarea property="address"/><br> Sex: <html:radio property="sex" value="m"/>male <html:radio property="sex" value="f"/>female<br> Married: <html:checkbox property="married"/><br> Age: <html:select property="age"> <html:option value="a">0-19</html:option> <html:option value="b">20-49</html:option> <html:option value="c">50-</html:option> </html:select><br><html:submit/></html:form></body></html>
Przykład: klasa ActionForm Przykład: klasa Action public final class SubmitForm extends ActionForm { /* Last Name */ private String lastname = "Hansen"; // default value public String getlastname() { return (this.lastname); public void setlastname(string lastname) { this.lastname = lastname;... public final class SubmitAction extends Action { public ActionForward perform(actionmapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) { SubmitForm f = (SubmitForm) form; // get the form bean String lastname = f.getlastname(); request.setattribute("lastname", lastname.touppercase()); return (mapping.findforward("success"));