Stáhnout prezentaci
Prezentace se nahrává, počkejte prosím
1
VÝVOJ PODNIKOVÝCH APLIKACÍ NA PLATFORMĚ JAVA - CVIČENÍ
Zbyněk Šlajchrt Část 4.
2
Program Diskuse nad domácím úkolem Refaktoring e-mail klienta
Podle vzoru Model-View-Contoller Práce s posluchači Využití posluchače HttpSessionAttributeListener k inicializaci vlastností modelu
3
Bean Stav a funkcionalitu ového klienta přesuneme do beanu Bean Vytvořte třídu Bean s atributy to, subject, body a user typu String vytvořte příslušné gettery a settery Vytvořte metodu send její obsah se přesune ze servletu MailServlet z metody sendMail public class Bean implements Serializable { private String subject; private String to; private String user; private String body; } return user; public String getUser() { this.user = user; public void setUser(String user) { return to; public String getTo() { this.to = to; public void setTo(String to) { return subject; public String getSubject() { this.subject = subject; public void setSubject(String subject) { return body; public String getBody() { this.body = message; public void setBody(String message) { /** * serializovatelnosti být tento atribut transientní. Při aktivaci * session uloženu jako hodnotu atributu, musel by kvůli * Schválně předáváme mail session jako parametr. Kdybychom měli MessagingException mailSession * během migrace by tak bylo komplikované získat session zpět. // Vytvoříme objekt zprávy public void send(Session mailSession) throws MessagingException { */ Message message = new MimeMessage(mailSession); // z konfigurace serveru // Zatím nenastavujeme From, použije se default InternetAddress.parse(to, false)); message.setRecipients(Message.RecipientType.TO, //message.setFrom(); message.setSubject(subject); // Nastavíme předmět message.setText(body); // Vložíme text zprávy message.setHeader("X-Mailer", "My Mailer"); // Nastavíme hlavičku indikující mailového klienta // Nastavíme datum odeslání message.setSentDate(timeStamp); Date timeStamp = new Date(); Transport.send(message); // Odešleme zprávu
4
MVC – varianta Service To Worker
10: redirect Form.jsp (view) 1, 11: čtení dat z beanu 2: akce send (POST) Bean (model) MailServlet (controller) resume.jsp (view) 6: čtení dat z beanu 7: akce new (POST) 5: redirect 3, 8: aktualizace vlastností beanu 4, 9: volání business metod na beanu
5
Úprava MailServlet Zrušte metodu sendMail Přeřiďte metodu doGet
@Override protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // Lazy inicializace beanu Bean Bean = ( Bean) request.getSession().getAttribute(" Bean"); if ( Bean == null) { // bean není v session, vytvoříme jej tedy create Bean(request, response); } else { // Pokud je bean v session, přesměrováváme // na Form.jsp. response.sendRedirect(" Form.jsp"); }
6
Metoda createEmailBean
/** * Akce, která vytvoří nový bean a vloží jej * do session jako atribut. */ private void create Bean(HttpServletRequest request, HttpServletResponse response) throws IOException { Bean Bean = new Bean(); request.getSession().setAttribute(" Bean", Bean); // Atribut 'user' v dotazu nastavuje // autentizační filtr (FrontControllerFilter) String user = (String) request.getAttribute("user"); Bean.setUser(user); // přesměrujeme na formulář response.sendRedirect(" Form.jsp"); }
7
Metoda doPost @Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // Při HTTP metodě POST se očekává, že je v session // k dispozici bean. Bean Bean = ( Bean) request.getSession().getAttribute(" Bean"); if ( Bean == null) { throw new ServletException("No session"); } try { // odešleme doSend( Bean, request, response); } catch (MessagingException e) { throw new ServletException(e);
8
Metoda doSend /** * Akce, která odesílá email voláním business metody
* na beanu. */ private void doSend( Bean Bean, HttpServletRequest request, HttpServletResponse response) throws IOException, MessagingException, ServletException { // Přečteme si parametry z formuláře String to = request.getParameter("to"); String subject = request.getParameter("subject"); String message = request.getParameter("message"); // Nastavíme vlastnosti beanu Bean.setTo(to); Bean.setSubject(subject); Bean.setBody(message); // odešleme Bean.send(mailSession); // přesměrujeme na resumé response.sendRedirect("resume.jsp"); }
9
Změna uvítací stránky Volbu zobrazované stránky má na starosti kontroler MailServlet V MVC se na stránky obvykle neodkazuje přímo, ale nepřímo přes kontroler Uvítací stránka bude také směrována na kontroler Je třeba změnit nastavení ve WEB-INF/web.xml <welcome-file>sendMail</welcome-file> <% response.sendRedirect("sendMail"); %>
10
Úprava JSP stránek Upravte Form.jsp a resume.jsp tak, aby načítaly hodnoty z beanu Deklarace proměnné beanu <jsp:useBean id=" Bean" class="cz.vse.javaee.cviceni4. Bean" scope="session"/> Výpis vlastností beanu ${ Bean.user} nebo <jsp:getProperty name=" Bean" property="user"/> Form.jsp <jsp:useBean id=" Bean" class="cz.vse.javaee.cviceni4. Bean" scope="session"/> <h1>Formulář pro </h1> <h2>Uživatel: ${ Bean.user}</h2> resume.jsp <h5>Nick: ${ Bean.user}</h5> Komu: ${ Bean.to}<br> Předmět: ${ Bean.subject}<br> Zpráva: ${ Bean.body}<br>
11
Sestavení a deploy
12
Akce pro nový email Zaveďte tlačítko Nový email do stránky resume.jsp
Ve formuláři tlačítka uveďte skrytý parametr action s hodnotou new Do formuláře pro odesílání u na stránce Form.jsp také přidejte skrytý parametr action s hodnotou send resume.jsp <form action="sendMail" method="post"> <input type="hidden" name="action" value="new"> <input type="submit" value="Nový "> </form> Form.jsp <input type="hidden" name="action" value="send">
13
Zpracování událostí v MailServlet
@Override protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // Při HTTP metodě POST se očekává, že je v session // k dispozici bean. Bean Bean = ( Bean) request.getSession().getAttribute(" Bean"); if ( Bean == null) { throw new ServletException("No session"); } try { // Přečteme se akci String action = request.getParameter("action"); if ("send".equals(action)) { doSend( Bean, request, response); } else if ("new".equals(action)) { create Bean(request, response); } else { throw new ServletException("No action specified"); } catch (MessagingException e) { throw new ServletException(e);
14
Důsledky refaktoringu
MailServlet se zbavil závislosti na JavaMail API Bean se zbavil závislosti na Servlet API velmi flexibilní snadné přidávání funkcionality – akcí
15
Diagram tříd v MVC Controller 1..N View Volba pohledu 1(..N)
Vyvolávání akce 0..N Aktualizace modelu v důsledku zpracování akce Čtení dat pro zobrazení 1 1 Notifikace pohledům o změnách v modelu (spíše v desktopových aplikacích) Model
16
Posluchač atributů v HTTP session
Motivace: nelíbí se nám, že MailServlet nastavuje uživatele do beanu MailServlet se má starat o správu ů, nikoliv o uživatele Každá nadbytečná znalost komplikuje kód komponenty Indicie – na izolovaném místě kódu třídy se pracuje s pojmem (uživatel), který se ve zbytku třídy nepoužívá Řešení – nastavení uživatele (a případně dalších souvisejících vlastností) bude řešit specializovaná komponenta Posluchač HttpSessionAttributeListener
17
Problematické místo v MailServlet
18
Třída posluchače package cz.vse.javaee.cviceni4;
import javax.servlet.http.HttpSession; import javax.servlet.http.HttpSessionAttributeListener; import javax.servlet.http.HttpSessionBindingEvent; /** * Spojovací článek mezi ovou agendou a identifikací uživatele. */ public class UserSetterFor Bean implements HttpSessionAttributeListener { * Odchytává událost vytvoření nového beanu. V takovém * případě nastavuje beanu aktuálního uživatele. public void attributeAdded(HttpSessionBindingEvent event) { if (" Bean".equals(event.getName())) { // Byl založen nový bean. Bean Bean = ( Bean) event.getValue(); adjustUser(event, Bean); } private void adjustUser(HttpSessionBindingEvent event, Bean Bean) { String user = (String)event.getSession().getAttribute("user"); Bean.setUser(user); public void attributeReplaced(HttpSessionBindingEvent event) { HttpSession session = event.getSession(); if ("user".equals(event.getName())) { // Při změně uživatele odstraníme starý bean. Jeho // nová instance se vytvoří až v okamžiku potřeby (např. // <jsp:useBean> v Form.jsp nebo doGet v MailServlet). session.removeAttribute(" Bean"); } else // Byl založen nový bean nahrazující starý. Novému // je třeba nastavit uživatele. Bean new Bean = ( Bean) session.getAttribute(" Bean"); adjustUser(event, new Bean); @Override public void attributeRemoved(HttpSessionBindingEvent event) {
19
Třída posluchače - pokračování
20
Registrace posluchače
Do WEB-INF/web.xml <listener> <description> Nastavuje uživatele do beanu. </description> <listener-class> cz.vse.javaee.cviceni4.UserSetterFor Bean </listener-class> </listener>
21
Úpravy V MailServlet odstraňte kód v metodě create Bean, který nastavuje uživatele FrontControllerFilter momentálně nastavuje jméno uživatele jako atribut do dotazu Posluchač má ale přístup pouze do session Ve FrontControllerFilter v metodě noAction nastavte jméno uživatele do session atributu user, místo do atributu dotazu // Nastavíme nick uživatele jako atribut session. HttpSession session = request.getSession(); String nickName = cookie.getValue(); // Nastavení pouze pokud ještě není v session. if (!nickName.equals(session.getAttribute("user"))) { session.setAttribute("user", nickName); }
22
Úpravy Ve FrontControllerFilter v metodě doLogout
před voláním forwardToLogin zrušte session HttpSession session = request.getSession(false); if (session != null) { session.invalidate(); }
23
Domácí úkol Do stránky Form.jsp přidejte dvě tlačítka pro akce store a restore. Akce store uloží rozepsanou zprávu do souboru nazvaného podle jména uživatele. Po vykonání akce lze pokračovat v editaci zprávy a případně ji odeslat Adresář pro ukládání souborů bude konfigurovatelný pomocí parametru ve WEB-INF/web.xml Akce restore vyplní políčka formuláře podle údajů uložených posledním voláním akce store. Logika akcí bude v metodách třídy Bean
Podobné prezentace
© 2024 SlidePlayer.cz Inc.
All rights reserved.