1 / 65

Сървлети

Сървлети. Борислава Спасова. Светлин Наков. Java Web Developer Acsior Ltd. Национална академия по разработка на софтуер. www.acsior.com. academy.devbg.org. Съдържание. Преглед на технологията на сървлетите Какво е сървлет ? Услуги на сървлетите Защо да използваме сървлети ?

Download Presentation

Сървлети

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. Сървлети Борислава Спасова Светлин Наков Java Web Developer Acsior Ltd. Национална академия по разработка на софтуер www.acsior.com academy.devbg.org

  2. Съдържание • Преглед на технологията на сървлетите • Какво есървлет? • Услуги на сървлетите • Защо да използваме сървлети? • Time Servlet – Пример • Разгръщане на сървлети с NetBeans IDE • Архитектура на сървлетите • API интерфейсът на сървлетите • Жизнен цикъл на сървлета

  3. Съдържание (2) • Примерни сървлети • Обработка на параметри – Hello Servlet • Image Counter Servlet • Използване на сесии • Какво е сесия? • API интерфейсът за проследяване на сесии • Изтичане на сесия

  4. Съдържание (3) • Примери със сесии • Login / Logout приложение • Проблеми с кеша на браузъра

  5. Сървлети Преглед на технологията

  6. Какво есървлет? • Java сървлетите са: • Технология за генериране надинамични уебстраници (като PHP, ASP, ASP.NET, ...) • Независими от платформата и протокола сървърни компоненти, написани на Java, коиторазширяватстандартнитеуеб сървъри • Java програми, обработващи HTTP заявки • КласътHttpServlet • Предоставя динамично генериране на съдържание (HTML, XML, …)

  7. Какво есървлет? (2) • Сървлети • Предоставят общ framework за услуги базирани на модела заявка-отговор • Преносими на всеки Java приложен сървър • Имат достъп доцялата фамилия от Java и Java EE API интерфейси • JDBC, Persistence, EJB, JMS, JAX-WS, JTA, JTS, RMI, JNDI, JAXP, ... • Основна част от всички Java webapplication технологии (JSP, JSF, ...)

  8. Услуги на сървлетите • Сървлетите предоставятмногополезниуслуги • Предоставят API интерфейси от ниско нивоза изграждане на интернет услуги • Служат като основа за JavaServer Pages (JSP) и JavaServer Faces (JSF) технологиите • Могат дапредоставят разнообразни типове даннизакакъвто и да е клиент • XML, HTML, WML, GIF и т.н. • Могат да служат като “Controller” за JSP/Servlet приложенията

  9. Защо да използваме сървлети? • Преносими • Пишем веднъж, изпълняваме гинавсякъде • Мощни • Могат да се възползват от всички предимства на Java платформата • Елегантни • Леснота дължаща се на абстракцията • Ефективни иустойчиви • Висока скалируемост

  10. Защо да използваме сървлети? • Сигурност • Силно типизирани • Управление на паметта • Интеграция • Сървлетите са тясно свързани със сървъра • Разширяемост и гъвкавост • Сървлетите са проектирани да бъдат лесноразширяеми, и в същото времеоптимизирани за работа с HTTP протокола • Гъвкавоизвикване на сървлети (SSI, servlet-chaining, филтри и т.н.)

  11. Пример – Time Servlet import java.io.*; import javax.servlet.*; import javax.servlet.http.*; public class TimeServlet extends HttpServlet { public void doGet(HttpServletRequest aRequest, HttpServletResponse aResponse) throws ServletException, IOException { PrintWriter out = aResponse.getWriter(); out.println("<HTML>"); out.println("The time is: " + new java.util.Date()); out.println("</HTML>"); } }

  12. Разгръщане на сървлети с NetBeans IDE • Създаваме ново Web приложение

  13. Разгръщане на сървлети с NetBeans IDE (2) • Добавяме нов сървлеткъм Web приложението

  14. Разгръщане на сървлети с NetBeans IDE (3) • Изпълняваме сървлета

  15. Разгръщане на сървлети сNetBeans IDE (4) • Сървлетът в действие

  16. Time Servlet Демонстрация

  17. Сървлети Архитектура

  18. Архитектура на сървлетите • КласътHttpServlet • Обслужва HTTP заявки от клиента • За всеки от HTTP методите GET, POSTи други,е дефинирансъответен метод: • doGet(…) – обработва HTTP GET заявки • doPost(…) – обработва HTTP POST заявки • doPut(…), doHead(…), doDelete(…), doTrace(…), doOptions(…) • Сървлетътобикновено предефинира един от първите дваметода или методаservice(…)

  19. Архитектура на сървлетите(2) • ОбектътHttpServletRequest • Съдържа данните от заявката на клиента • Заглавните части на HTTP заявката • Данни от формии параметри на заявката • Други данни от клиента (бисквитки, пъти т.н.) • ОбектътHttpServletResponse • Капсулира данни изпращани обратно наклиента • Заглавни части на HTTP отговора (content type, бисквитки и други) • Тяло на отговора (катоOutputStream)

  20. Архитектура на сървлетите(3) • HTTP GET методът се използва когато: • Обработката на заявкатане променясъстоянието на сървъра • Количеството данни от формата е малко • Искаме да позволим добавяне на заявката в bookmarks • HTTP POST методът се използва когато: • Обработката на заявкатапроменясъстоянието на сървъра, например запис на данни в база данни • Количеството данни от формата е голямо • Съдържанието на даннитене трябва да е е видимо в URL-то (например пароли)

  21. API интерфейсът на сървлетите • Най-важната функционалност насървлетите: • Получаване на параметри от форми (GET и POST параметри) • Получаване на инициализационни параметри на сървлет • Получаване на информация за заглавната част на заявка HttpServletRequest.getParameter(String) ServletConfig.getInitParameter() HttpServletRequest.getHeader(String)

  22. API интерфейсът на сървлетите (2) • Задаване на header / content type на HTTP отговора • Получаване на текстов поток за отговора • Получаване на двоичен поток за отговора • Пренасочване на HTTP заявка към друг URL HttpServletResponse.setHeader(<name>, <value>) / HttpServletResponse.setContentType(String) HttpServletResponse.getWriter() HttpServletResponse.getOutputStream() HttpServletResponse.sendRedirect()

  23. New Destroyed Running init() destroy() ...() service() doGet() doDelete() doPost() doPut() Жизнен цикъл на сървлет • Можем да предефинираме тези методив класовете наследници наHttpServlet,за дауправляваме инстанцията на сървлета и ресурсите, от които зависи • Уеб контейнерътуправлява жизнения цикъл на инстанциите на сървлетите • Методите от този цикълне трябва да се извикват от нашия код

  24. Методът init() • Извиква сеот уеб контейнеракогато сървлетът се създава за първи път • Спецификацията на сървлетите гарантира, че сървлетът няма да обработва заявки преди завършването на метода init(). • Предефинирайтеметода init()когато: • Трябва да създадете специфични за сървлета ресурси, които са необходими за обработкана потребителските заявки • Имате нужда от инициализация на състоянието на сървлета

  25. Методът service() • Извиква се от уеб контейнера, за да обработи всяка потребителска заявка • Извиква методитеdoGet(…), doPost(…) и т.н. в зависимост от метода на HTTP заявката (GET, POST и т.н.) • Изпращарезултата като отговор • Обикновено няма нужда да предефинираме този метод

  26. Методът destroy() • Извиква се от уеб контейнера когато се премахва инстанцията на сървлета • Спецификацията на сървлетите гарантира, че всички заявки ще бъдат обработенипреди извикването на този метод • Предефинирайтеметода destroy()когато : • Трябва да освободите специфични за сървлета ресурси, които сте заделили в методаinit() • Трябва да запазите състоянието на сървлета

  27. Java сървлети Примери

  28. Обработка на параметри – Hello Servlet • Искаме да създадем сървлет, който приема за параметърпотребителско име и казва "Hello, <потребителско_име>" • Нуждаем се от HTML формастекстово поле • По късно сървлетът може да извлечестойносттавъведена в полето <form method="GET or POST" action="the servlet"> <input type="text" name="user_name"> </form> String name =request.getParameter("user_name");

  29. Пример – Hello Servlet HelloForm.html <html><body> <form method="GET" action="HelloServlet"> Please enter your name: <input type="text" name="user_name"> <input type="submit" value="OK"> </form> </body></html> HelloServlet.java import java.io.*; import javax.servlet.*; import javax.servlet.http.*; public class HelloServlet extends HttpServlet {

  30. Пример – Hello Servlet HelloServlet.java public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.setContentType("text/html"); ServletOutputStream out = response.getOutputStream(); String userName = request.getParameter("user_name"); out.println("<html><head>"); out.println("\t<title>Hello Servlet</title>"); out.println("</head><body>"); out.println("\t<h1>Hello, " + userName + "</h1>"); out.println("</body></html>"); }

  31. Създаване на формата с NetBeans IDE • Създаване на нова HTML форма

  32. Създаване на нов сървлет с NetBeans IDE • Създаване на нов сървлет

  33. Hello Servlet в действие

  34. Hello Servlet Демонстрация

  35. Hello Servlet –HTTP Заявка • Какво се случва когатопотребителятвъведеимето си? • Internet Explorer (IE) изпраща следната HTTP заявка към Tomcat GET /FirstWebApp/HelloServlet?user_name=NakovHTTP/1.1 Accept: image/gif, image/x-xbitmap, image/jpeg,image/pjpeg, application/vnd.ms-excel,application/vnd.ms-powerpoint, application/msword,application/x-shockwave-flash, */* Accept-Language: bg Accept-Encoding: gzip, deflate User-Agent: Mozilla/4.0 (compatible; MSIE 6.0;Windows NT 5.1; Q312461) Host: nakov:8084 Connection: Keep-Alive

  36. Hello Servlet –HTTP Отговор • Какво се случвакогато Tomcat получи иобработи HTTP заявката • Tomcat изпраща следния HTTP отговор към Internet Explorer HTTP/1.1 200 OK Content-Length: 100 Date: Fri, 26 Mar 2006 10:06:28 GMT Server: Apache-Coyote/1.1 <html><head> <title>Hello Servlet</title> </head><body> <h1>Hello, Nakov</h1> </body></html>

  37. Image Counter Servlet • Искаме да създадем сървлет, който показва брояч във вид на изображение (изображение в JPEG формат) • Сървлетът трябва да поддържа вътрешен брояч • Можем да гоинициализираме вметодаinit()ида го увеличаваме вметодаdoGet() • Резултатът трябва да е изображение (в JPEG формат) • За стойност на content type трябва да зададем "image/jpeg"

  38. Image Counter Servlet (2) import javax.servlet.*; import javax.servlet.http.*; ... public class ImageCounterServlet extends HttpServlet { private String mStartDate; private int mVisitCounter; public void init() { mStartDate = (new Date()).toString(); mVisitCounter = 0; } public BufferedImage createImage(String msg) { ... }

  39. Image Counter Servlet (3) public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException { String msg; synchronized(this) { mVisitCounter++; msg = "" + mVisitCounter + " visits since " + mStartDate; } BufferedImage image = createImage(msg); response.setContentType("image/jpeg"); OutputStream out = response.getOutputStream(); // Encode the image in JPEG format and // write the image to the output stream } }

  40. Image Counter Servlet в действие

  41. Image Counter Servlet Демонстрация

  42. Проследяване на сесии

  43. Какво е сесия? • Сесията е състояние,свързано сопределен потребител, което се поддържа от страна на сървъра • Сесиите се запазват между HTTP заявките • Сесиите ни позволяват да създаваме приложения, които зависят от лични потребителски данни. Например: • Login / logout функционалност • Wizard страници • Колички за пазаруване • Запазване на потребителски настройки

  44. Проследяване на сесии в сървлети • Сървлетите предоставят вграден API интерфейс за проследяване на сесии • Сесиите се поддържат автоматично, без писане на допълнителен код • Уеб контейнерътасоциирауникаленHttpSessionобект с всеки отделен клиент • Различните клиенти иматразлични сесийни обекти насървъра • Заявките от даден клиент имат един и същ сесиен обект • Сесиите могат дасъхраняват данни

  45. API интерфейсът за проследяване на сесии • . API интерфейсът позволява • Получаване наHttpSessionобект отHTTPServletRequestобект • Извличане на данни отсесийния обект асоцииран с клиента • Добавяне на данни към сесийния обект асоцииран с клиента • Извличане на метаинформацияза сесийния обекткато напримеркога е създадена сесията

  46. Получаване на сесиен обект • За да получимсесийния обект използваме метода HttpServletRequest.getSession() • Например: • Ако сесията вече е създадена, то се връща съществуващата сесия • Ако сесията не съществува, то се създава и връща нова сесия • Можем да проверим дали сесията е нова като извикаме метода isNew() HttpSession session = request.getSession();

  47. Зад кулисите • Когато извикамеgetSession()с всеки потребител автоматично се свързва уникалноSession ID • Как това Session ID стига допотребителя? • Вариант 1: Акобраузърът поддържабисквитки, сървлетът автоматично създавабисквиткаи запазва session ID в нея. • В Tomcat, бисквиткатасе наричаJSESSIONID • Вариант 2: Ако браузърът не поддържабисквитки, сървлетът ще опита да извлече session ID от URL-то

  48. Извличане на данни от сесията • Сесийният обект работи като HashMap • Позволява съхранение на всякакъв тип Java обекти • Обектите се съхраняват по ключ (като в хеш таблица) • Извличане на съществуващ обект: • Извличане на списък от всички “ключове”асоциирани със сесията Integer accessCount = (Integer)session.getAttribute("accessCount"); Enumeration attributes = request.getAttributeNames();

  49. Запазване на данни в сесията • Можем да запазим данни в сесийния обект и да ги използваме по-късно • Можем да премахнем обекти от сесията, ако повече не са ни нужни HttpSession session = request.getSession(); session.setAttribute("name", "Svetlin Nakov"); session.removeAttribute("name");

  50. Допълнителнаинформация за сесията • Получаване наидентификатора на сесията,асоцииранс потребителя, напр.gj9xswvw9p • Проверка дали сесиятае току що създадена • Проверка кога е била създадена сесията • Проверкакогапоследно е била активна сесията public String getId(); public boolean isNew(); public long getCreationTime(); public long getLastAccessedTime();

More Related