Programování v Javě II Servlety Michal Pobucký michal.pobucky@fpf.slu.cz Ústav informatiky – léto 2020 Servlety • Servlet • Třída, potomek javax.servlet.http.HttpServlet • Obstarává vyřizování požadavků HTTP • Nízkoúrovňový nástroj • Dokáže obsloužit všechny požadavky HTTP • Nevhodný pro generování HTML stránek • Nemůže existovat samostatně, je součástí servletového kontejneru (web container) – ten může být buď samostatně (např. Jetty) anebo součástí aplikačního serveru (Apache Tomcat, GlassFish, JBoss, …) • Protože je volán přímo kontejnerem, neobsahuje metodu main() 2Programování v Javě II - 2 - Michal Pobucký Servlety • Životní cyklus – klasická třída • Načtení třídy servletu – při prvním požadavku servletového kontejneru • Vytvoření instance servletu – kontejner vytvoří instanci, pouze jedna v životním cyklu • Volání metody init() – zde lze nastavit např. spojení s databází • Volání metody service() – samotný požadavek na HTTP, např. doGet, doPost(), doPut(),… • Volání destruktoru destroy() 3Programování v Javě II - 2 - Michal Pobucký Servlety • Naše třída je rozšířením původní třídy HttpServlet – direktiva extends v označení třídy • Výstupní formát lze nastavit pomocí setContentType() • Objekt třídy PrintWriter zajišťuje vypsání textu na stránku 4Programování v Javě II - 2 - Michal Pobucký Servlety • Metody třídy GenericServlet • public void init(ServletConfig config) is used to initialize the servlet. • public abstract void service(ServletRequest request, ServletResponse response) provides service for the incoming request. It is invoked at each time when user requests for a servlet. • public void destroy() is invoked only once throughout the life cycle and indicates that servlet is being destroyed. • public ServletConfig getServletConfig() returns the object of ServletConfig. • public String getServletInfo() returns information about servlet such as writer, copyright, version etc. • public void init() it is a convenient method for the servlet programmers, now there is no need to call super.init(config) • public ServletContext getServletContext() returns the object of ServletContext. • public String getInitParameter(String name) returns the parameter value for the given parameter name. • public Enumeration getInitParameterNames() returns all the parameters defined in the web.xml file. • public String getServletName() returns the name of the servlet object. • public void log(String msg) writes the given message in the servlet log file. • public void log(String msg,Throwable t) writes the explanatory message in the servlet log file and a stack trace. 5Programování v Javě II - 2 - Michal Pobucký Servlety • Metody třídy HttpServlet • public void service(ServletRequest req,ServletResponse res) dispatches the request to the protected service method by converting the request and response object into http type. • protected void service(HttpServletRequest req, HttpServletResponse res) receives the request from the service method, and dispatches the request to the doXXX() method depending on the incoming http request type. • protected void doGet(HttpServletRequest req, HttpServletResponse res) handles the GET request. It is invoked by the web container. • protected void doPost(HttpServletRequest req, HttpServletResponse res) handles the POST request. It is invoked by the web container. • protected void doHead(HttpServletRequest req, HttpServletResponse res) handles the HEAD request. It is invoked by the web container. • protected void doOptions(HttpServletRequest req, HttpServletResponse res) handles the OPTIONS request. It is invoked by the web container. • protected void doPut(HttpServletRequest req, HttpServletResponse res) handles the PUT request. It is invoked by the web container. • protected void doTrace(HttpServletRequest req, HttpServletResponse res) handles the TRACE request. It is invoked by the web container. • protected void doDelete(HttpServletRequest req, HttpServletResponse res) handles the DELETE request. It is invoked by the web container. • protected long getLastModified(HttpServletRequest req) returns the time when HttpServletRequest was last modified since midnight January 1, 1970 GMT. 6Programování v Javě II - 2 - Michal Pobucký Servlety • Mapování servletů – web.xml • - nastavuje informace o názvu servletu a třídě - propojuje konkrétní servlet s umístěním, kde se má aplikovat lze použít dvojím způsobem: • mapování na umístění /mujservlet/* • mapování na příponu *.muj • Mapování lze provést i přímo v kódu – viz řádek 15 @WebServlet("/DemoServlet") 7Programování v Javě II - 2 - Michal Pobucký Servlety 8Programování v Javě II - 2 - Michal Pobucký Servlety • Pravým kliknutím na servlet01 – Servlet Mappings přímo otevřeme web.xml 9Programování v Javě II - 2 - Michal Pobucký Servlety 10Programování v Javě II - 2 - Michal Pobucký Servlety • • Nastavuje soubory, které jsou spuštěny jako první • Stránky jsou načítány v pořadí: • Ty, které jsou uvedeny ve ve web.xml • Index.html • Index.htm • Index.jsp 11Programování v Javě II - 2 - Michal Pobucký Servlety • Nastavíme home.html a default.html jako vstupní soubory a upravíme lokaci použití DemoServletu – řádek 10 • Po vytvoření souboru home.html a spuštění celého webu bude nejprve načtena stránka home.html a na ní bude spuštěn DemoServlet 12Programování v Javě II - 2 - Michal Pobucký Servlety • Soubor WAR • Webová aplikace je tvořena jedním WAR souborem • Je to ZIP obsahující servlety, java třídy, HTML, CSS, obrázky a JSP stránky • Při spuštění aplikace je rozbalen do stejnojmenného adresáře • Jeho obsah odpovídá složce servlet01 – WebContent • Vytvoříme jej v Eclipse – File – Export – Web – WAR file 13Programování v Javě II - 2 - Michal Pobucký Servlety • Propojování webových prostředků • Vložení • RequestDispatcher.include() • Metoda vloží do těla servletu jiný servlet (nebo jiný kód) • Používá se například pro reklamní bannery 14Programování v Javě II - 2 - Michal Pobucký Servlety • Propojování webových prostředků • Předání řízení • RequestDispatcher.forward() • Metoda předá řízení jiné komponentně (například JSP stránce) • Příklad – servlet předá aktuální datum JSP stránce 15Programování v Javě II - 2 - Michal Pobucký Servlet - formulář • Program • Klient se přihlásí uživatelským jménem a heslem • Jméno: Pepa • Heslo: servlet 16Programování v Javě II - 2 - Michal Pobucký Servlet - formulář • Index.html 17Programování v Javě II - 2 - Michal Pobucký Servlet - formulář • Login.java 18Programování v Javě II - 2 - Michal Pobucký Servlet - formulář • WelcomeServlet.java 19Programování v Javě II - 2 - Michal Pobucký Servlet - formulář • Web.xml 20Programování v Javě II - 2 - Michal Pobucký Servlet - formulář 21Programování v Javě II - 2 - Michal Pobucký Servlet - formulář - přesměrování • Metoda sendRedirect 22Programování v Javě II - 2 - Michal Pobucký Servlet - formulář - přesměrování • Program • Klient zadá výraz, který chce vyhledat Googlem 23Programování v Javě II - 2 - Michal Pobucký Servlet - formulář - přesměrování • Index.html 24Programování v Javě II - 2 - Michal Pobucký Servlet - formulář - přesměrování • MySearcher.java 25Programování v Javě II - 2 - Michal Pobucký Servlet - formulář - přesměrování • Web.xml 26Programování v Javě II - 2 - Michal Pobucký Servlet - formulář - přesměrování 27Programování v Javě II - 2 - Michal Pobucký Servlet - formulář - přesměrování • Prostý redirect 28Programování v Javě II - 2 - Michal Pobucký Servlet - formulář - přesměrování • Redirect s jazykovou sadou 29Programování v Javě II - 2 - Michal Pobucký Servlet - session • Session • propojení (permanentní) mezi klientem (prohlížečem) a serverem • Udržováno pomocí cookies • Pokud jsou cookies zakázána klientem, je identifikátor session přidáván do všech generovaných URL 30Programování v Javě II - 2 - Michal Pobucký Servlet - session • Typy cookies • Neperzistentní – platná pro jednu session, po zavření prohlížeče je odstraněno • Perzistentní – platná pro více session, po uzavření prohlížeče zůstává, odstraněno je v momentě odhlášení uživatele (logout) nebo přihlášení (signup) 31Programování v Javě II - 2 - Michal Pobucký Servlet - session • Třída Cookie() • Konstruktor • Metody public void setMaxAge(int expiry) Nastaví maximální životnost cookies v sekundách. public String getName() Vrací jméno cookies, po vytvoření nelze změnit. public String getValue() Vrací hodnotu cookies. public void setName(String name) Nastaví jméno cookies. public void setValue(String value) Změní hodnotu cookies. Cookie() Prázdný konstruktor. Cookie(String name, String value) Konstruktor nastaví jméno a hodnotu cookies. 32Programování v Javě II - 2 - Michal Pobucký Servlet - session • Program • Klient vytváří nové cookies, může je zobrazit a smazat 33Programování v Javě II - 2 - Michal Pobucký Servlet - session • Index.html 34Programování v Javě II - 2 - Michal Pobucký Servlet - session • SaveServlet.java 35Programování v Javě II - 2 - Michal Pobucký Servlet - session • LoadServlet.java 36Programování v Javě II - 2 - Michal Pobucký Servlet - session • DeleteServlet.java 37Programování v Javě II - 2 - Michal Pobucký Servlet - session • Web.xml 38Programování v Javě II - 2 - Michal Pobucký Servlet - session 39Programování v Javě II - 2 - Michal Pobucký Servlet - login a logout • Program • Klient se přihlásí a odhlásí, informace o session zůstává v cookies • Heslo: admin • Po zavření okna v prohlížeči a znovu otevření jsme stále přihlášeni • Po zavření celého prohlížeče a znovu spuštění již nejsme přihlášeni 40Programování v Javě II - 2 - Michal Pobucký Servlet - login a logout • Index.html 41Programování v Javě II - 2 - Michal Pobucký Servlet - login a logout • Link.html 42Programování v Javě II - 2 - Michal Pobucký Servlet - login a logout • Login.html 43Programování v Javě II - 2 - Michal Pobucký Servlet - login a logout • LoginForm.java 44Programování v Javě II - 2 - Michal Pobucký Servlet - login a logout • LoginServlet.java 45Programování v Javě II - 2 - Michal Pobucký Servlet - login a logout • LogoutServlet.java 46Programování v Javě II - 2 - Michal Pobucký Servlet - login a logout • ProfileServlet.java 47Programování v Javě II - 2 - Michal Pobucký Servlet - login a logout • Web.xml 48Programování v Javě II - 2 - Michal Pobucký Servlet - login a logout 49Programování v Javě II - 2 - Michal Pobucký Servlet - login a logout - 2 • Program • Klient se přihlásí a odhlásí, bez cookies, použijeme HttpSession • Heslo: admin • Po zavření okna v prohlížeči a znovu otevření jsme stále přihlášeni • Po zavření celého prohlížeče a znovu spuštění již nejsme přihlášeni 50Programování v Javě II - 2 - Michal Pobucký Servlet - login a logout - 2 • Index.html 51Programování v Javě II - 2 - Michal Pobucký Servlet - login a logout - 2 • Link.html 52Programování v Javě II - 2 - Michal Pobucký Servlet - login a logout - 2 • Login.html 53Programování v Javě II - 2 - Michal Pobucký Servlet - login a logout - 2 • LoginForm.java 54Programování v Javě II - 2 - Michal Pobucký Servlet - login a logout - 2 • LoginServlet.java 55Programování v Javě II - 2 - Michal Pobucký Servlet - login a logout - 2 • LogoutServlet.java 56Programování v Javě II - 2 - Michal Pobucký Servlet - login a logout - 2 • ProfileServlet.java 57Programování v Javě II - 2 - Michal Pobucký Servlet - login a logout - 2 • Web.xml 58Programování v Javě II - 2 - Michal Pobucký Servlet - login a logout 59Programování v Javě II - 2 - Michal Pobucký