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 3.
2
Program Doplění e-mail klienta o identifikaci uživatele
Základní práce s filtry Přesměrování dotazu forward, include, redirect zabránění znovuodeslání formuláře problematika tlačítka Zpět prohlížeče Tvorba jednoduchých JSP stránek využití EL 2.0 Řízení vyrovnávací paměti prohlížeče Cache-Control: public, max-age, no-cache, no-store
3
Příprava projektu Stáhněte si kostru projektu Otevřete projekt v IDE
Otevřete projekt v IDE
4
Filter FrontControllerFilter
Vytvořte třídu FrontControllerFilter Deklarujte implementaci javax.servlet.Filter Implementujte všechny metody init a destroy nechte prázdné doFilter bude obsahovat logiku kontroleru
5
Metoda doFilter @Override /**
* Směruje zpracování akcí do příslušných privátních metod. */ public void doFilter(ServletRequest request, ServletResponse response, FilterChain filterChain) throws IOException, ServletException { // Přetypujeme na HTTP objekty HttpServletRequest httpRequest = (HttpServletRequest) request; HttpServletResponse httpResponse = (HttpServletResponse) response; // sdělíme kontejneru, v jakém kódování // očekáváme data od klienta request.setCharacterEncoding("UTF-8"); // Větvení podle akce. String action = httpRequest.getParameter("action"); if (action != null && action.equals("doLogin")) { doLogin(httpRequest, httpResponse); } else if (action != null && action.equals("doLogout")) { doLogout(httpRequest, httpResponse); } else { noAction(httpRequest, httpResponse, filterChain); }
6
Metoda doLogin /** * Reaguje na akci doLogin. Z dotazu zjistí nick. Pokud * není přítomen, vrátí řízení na login.jsp. Jinak * vytvoří cookie a nastaví do něj nick z dotazu. Každý * další dotaz by měl nést toto cookie. Přítomnost cookie * v dotazu se chápe jako identifikace aktuálního uživatele. */ private void doLogin(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException { // login.jsp předává parametr nick String nickname = request.getParameter("nick"); if ("".equals(nickname)) { forwardToLogin(request, response); return; } // Název cookie je cookieNick, hodnota je vlastní nick Cookie cookie = new Cookie("cookieNick", nickname); // Nastavíme 24 hodin platnost. //cookie.setMaxAge(60 * 60 * 24); // Hodnota -1 by způsobila, že cookie platí pouze // do zavření prohlížeče. cookie.setMaxAge(-1); response.addCookie(cookie); // Přesměrujeme aktuální dotaz na ový formulář response.sendRedirect("mailForm.jsp");
7
Metoda forwardToLogin
/** * Předává řízení na <code>login.jsp</code>. */ private void forwardToLogin(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // Získáme dispečera stránky RequestDispatcher loginDispatcher = request.getRequestDispatcher("login.jsp"); loginDispatcher.forward(request, response); }
8
Metoda doLogout /** * Odhlašuje uživatele smazáním cookie v prohlížeči. */ private void doLogout(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // Zkusíme najít cookie, které chceme smazat Cookie cookie = findNickCookie(request); if (cookie != null) { // Nastavení maxAge na 0 vede ke smazání cookie cookie.setMaxAge(0); response.addCookie(cookie); } // Předáme řízení login.jsp forwardToLogin(request, response);
9
Metoda findNickCookie
/** * Hledá cookie s názvem <code>cookieNick</code> * request dotaz cookie nebo null */ private Cookie findNickCookie(HttpServletRequest request) { Cookie[] cookies = request.getCookies(); if (cookies != null) { for (Cookie cookie : cookies) { if ("cookieNick".equals(cookie.getName())) { return cookie; } return null;
10
Metoda noAction /** * Voláno pokud v dotazu není specifikovaná akce */
private void noAction(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws IOException, ServletException { // Zkusíme najít cookie 'cookieNick' Cookie cookie = findNickCookie(request); if (cookie != null) { // Cookie přišlo -> uživatel je přihlášen. // Nastavíme nick uživatele jako atribut dotazu, // aby jej šlo vypisovat na stránkách. request.setAttribute("user", cookie.getValue()); // Předáme řízení standardním způsobem filterChain.doFilter(request, response); } else { // Cookie se nenašlo -> uživatel není přihlášen. // Předáme řízení na login stránku. forwardToLogin(request, response); }
11
Registrace filtru Otevřete soubor WEB-INF/web.xml
Doplňte prvek deklarace filtru Doplňte prvek pro mapování filtru filtr bude mapován na všechna URI /* <filter> <filter-name>FronControllerFilter</filter-name> <filter-class> cz.vse.javaee.cviceni3.FrontControllerFilter </filter-class> <async-supported>true</async-supported> </filter> <filter-mapping> <url-pattern>/*</url-pattern> </filter-mapping>
12
Formulář pro přihlašování
Vytvořte JSP stránku login.jsp page contentType="text/html;charset=UTF-8" language="java" %> <html> <head><title>Login</title></head> <body> <h1>Login</h1> <form action="login" method="post"> <label for="nick">Nickname:</label><br/> <input id="nick" name="nick" type="text"/><br/> <input name="action" type="hidden" value="doLogin"/><br/> <input type="submit" value="Log in"/> </form> </body> </html>
13
Úprava formuláře pro odesílání
Vypíšeme identifikovaného uživatele na stránku ${expression} – Expression Language (EL2) Sestavování výrazů nad hodnotami a beany v parametrech dotazu - ${param['nameParam']} atributech - ${requestScope['nameParam']} requestScope, sessionScope, applicationScope proměnných - ${variable} Výpis vlastností beanu ${userBean.address.city}
14
Úprava formuláře pro odesílání
Do stránky mailForm.jsp přidáme tlačítko pro odhlášení uživatele Akce logout je pouze formální Všechny dotazu jdou přes FrontControllerServlet Ten se orientuje pomocí parametru action Pokud je action=logout tak provede logout a přesměruje na login.jsp <form action="logout" method="post"> <input type="hidden" name="action" value="doLogout"/> <input type="submit" value="Logout"/> </form>
15
Deploy (manuálně) Spustit glassfish http://localhost:4848
Applications/Deploy Launch
16
Problém č. 1 Refresh stránky způsobí nové odeslání zprávy
Příčina: Stránka resumé je asociována s URI pro odesílání u. Prohlížeč si drží data dotazu, která byla odeslána pro získání aktuální stránky a která použije při obnově Řešení: použije se přesměrování (redirect) Instukce prohlížeči, aby se metodou GET obrátil na nějaké URI
17
Problém č. 1 - řešení V servletu MailServlet přesměrujeme dotaz na sebe Upravte konec metody doPost takto: // zavoláme pomocnou metodu - zatím nedělá nic sendMail(to, subject, message); // Odpověď bude obsahovat resumé HttpSession session = request.getSession(); session.setAttribute("resume.to", to); session.setAttribute("resume.subject", subject); session.setAttribute("resume.message", message); response.sendRedirect(request.getRequestURI()); output.flush();
18
Problém č. 1 - řešení Přesměrování používá metodu GET, dotaz se nám vrátí do MailServlet v metodě doGet @Override protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.setContentType("text/plain"); response.setCharacterEncoding("UTF-8"); PrintWriter output = response.getWriter(); // Odpověď bude obsahovat resumé HttpSession session = request.getSession(); output.println(" odeslán"); output.println("Komu:" + session.getAttribute("resume.to")); output.println("Předmět:" + session.getAttribute("resume.subject")); output.println("Zpráva:" + session.getAttribute("resume.message")); output.flush(); }
19
Problém č. 2 Tlačítko Zpět zobrazí obsah políček ve formuláři Příčina
Kešování stránek na prohlížeči Řešení Je třeba nastavit hlavičku v odpovědi, která ovládá keš Cache-Control: no-store Pozn.: Projeví se až po smazání keše
20
Problém č. 2 – řešení Odesílat formulář akcí onclick
Funkce uvedená v onclick atributu zavolá na objektu formuláře submit() reset() Formulář je třeba pojmenovat: page contentType="text/html;charset=UTF-8" language="java" %> <html> <script language="javascript"> function submitForm() { document.forms["mailForm"].submit(); //first submit document.forms["mailForm"].reset(); //and then reset the form values } </script> <head><title> formulář</title></head> <body> <h1>Formulář pro </h1> <h2>Uživatel: ${requestScope['user']}</h2> <form name="mailForm" action="sendMail" method="post"> <label for="to">Komu:</label><br/> <input id="to" name="to" type="text"/><br/> <label for="subject">Předmět:</label><br/> <input id="subject" name="subject" type="text"/><br/> <label for="message">Zpráva:</label><br/> <textarea id="message" name="message" rows="20" cols="60"> </textarea><br/> <input type="button" value="Odeslat" onclick="submitForm()"/> </form> <form action="logout" method="post"> <input type="hidden" name="action" value="doLogout"/> <input type="submit" value="Logout"/> </body> </html>
21
Domácí úkol Vytvořte JSP stránku pro resumé odeslání zprávy. Stránka bude generovat HTML dokument s těmito údaji: Aktuální uživatel (nickname) Příjemce zprávy Předmět zprávy Zpráva Aktuální datum Stránka bude zobrazena přesměrováním (redirect) po odeslání zprávy servletem MailServlet
22
Linky clear-the-html-form-after-submitting-when-you-hit-browsers- back-button/
Podobné prezentace
© 2024 SlidePlayer.cz Inc.
All rights reserved.