650 likes | 760 Views
Сървлети. Борислава Спасова. Светлин Наков. Java Web Developer Acsior Ltd. Национална академия по разработка на софтуер. www.acsior.com. academy.devbg.org. Съдържание. Преглед на технологията на сървлетите Какво е сървлет ? Услуги на сървлетите Защо да използваме сървлети ?
E N D
Сървлети Борислава Спасова Светлин Наков Java Web Developer Acsior Ltd. Национална академия по разработка на софтуер www.acsior.com academy.devbg.org
Съдържание • Преглед на технологията на сървлетите • Какво есървлет? • Услуги на сървлетите • Защо да използваме сървлети? • Time Servlet – Пример • Разгръщане на сървлети с NetBeans IDE • Архитектура на сървлетите • API интерфейсът на сървлетите • Жизнен цикъл на сървлета
Съдържание (2) • Примерни сървлети • Обработка на параметри – Hello Servlet • Image Counter Servlet • Използване на сесии • Какво е сесия? • API интерфейсът за проследяване на сесии • Изтичане на сесия
Съдържание (3) • Примери със сесии • Login / Logout приложение • Проблеми с кеша на браузъра
Сървлети Преглед на технологията
Какво есървлет? • Java сървлетите са: • Технология за генериране надинамични уебстраници (като PHP, ASP, ASP.NET, ...) • Независими от платформата и протокола сървърни компоненти, написани на Java, коиторазширяватстандартнитеуеб сървъри • Java програми, обработващи HTTP заявки • КласътHttpServlet • Предоставя динамично генериране на съдържание (HTML, XML, …)
Какво есървлет? (2) • Сървлети • Предоставят общ framework за услуги базирани на модела заявка-отговор • Преносими на всеки Java приложен сървър • Имат достъп доцялата фамилия от Java и Java EE API интерфейси • JDBC, Persistence, EJB, JMS, JAX-WS, JTA, JTS, RMI, JNDI, JAXP, ... • Основна част от всички Java webapplication технологии (JSP, JSF, ...)
Услуги на сървлетите • Сървлетите предоставятмногополезниуслуги • Предоставят API интерфейси от ниско нивоза изграждане на интернет услуги • Служат като основа за JavaServer Pages (JSP) и JavaServer Faces (JSF) технологиите • Могат дапредоставят разнообразни типове даннизакакъвто и да е клиент • XML, HTML, WML, GIF и т.н. • Могат да служат като “Controller” за JSP/Servlet приложенията
Защо да използваме сървлети? • Преносими • Пишем веднъж, изпълняваме гинавсякъде • Мощни • Могат да се възползват от всички предимства на Java платформата • Елегантни • Леснота дължаща се на абстракцията • Ефективни иустойчиви • Висока скалируемост
Защо да използваме сървлети? • Сигурност • Силно типизирани • Управление на паметта • Интеграция • Сървлетите са тясно свързани със сървъра • Разширяемост и гъвкавост • Сървлетите са проектирани да бъдат лесноразширяеми, и в същото времеоптимизирани за работа с HTTP протокола • Гъвкавоизвикване на сървлети (SSI, servlet-chaining, филтри и т.н.)
Пример – 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>"); } }
Разгръщане на сървлети с NetBeans IDE • Създаваме ново Web приложение
Разгръщане на сървлети с NetBeans IDE (2) • Добавяме нов сървлеткъм Web приложението
Разгръщане на сървлети с NetBeans IDE (3) • Изпълняваме сървлета
Разгръщане на сървлети сNetBeans IDE (4) • Сървлетът в действие
Time Servlet Демонстрация
Сървлети Архитектура
Архитектура на сървлетите • КласътHttpServlet • Обслужва HTTP заявки от клиента • За всеки от HTTP методите GET, POSTи други,е дефинирансъответен метод: • doGet(…) – обработва HTTP GET заявки • doPost(…) – обработва HTTP POST заявки • doPut(…), doHead(…), doDelete(…), doTrace(…), doOptions(…) • Сървлетътобикновено предефинира един от първите дваметода или методаservice(…)
Архитектура на сървлетите(2) • ОбектътHttpServletRequest • Съдържа данните от заявката на клиента • Заглавните части на HTTP заявката • Данни от формии параметри на заявката • Други данни от клиента (бисквитки, пъти т.н.) • ОбектътHttpServletResponse • Капсулира данни изпращани обратно наклиента • Заглавни части на HTTP отговора (content type, бисквитки и други) • Тяло на отговора (катоOutputStream)
Архитектура на сървлетите(3) • HTTP GET методът се използва когато: • Обработката на заявкатане променясъстоянието на сървъра • Количеството данни от формата е малко • Искаме да позволим добавяне на заявката в bookmarks • HTTP POST методът се използва когато: • Обработката на заявкатапроменясъстоянието на сървъра, например запис на данни в база данни • Количеството данни от формата е голямо • Съдържанието на даннитене трябва да е е видимо в URL-то (например пароли)
API интерфейсът на сървлетите • Най-важната функционалност насървлетите: • Получаване на параметри от форми (GET и POST параметри) • Получаване на инициализационни параметри на сървлет • Получаване на информация за заглавната част на заявка HttpServletRequest.getParameter(String) ServletConfig.getInitParameter() HttpServletRequest.getHeader(String)
API интерфейсът на сървлетите (2) • Задаване на header / content type на HTTP отговора • Получаване на текстов поток за отговора • Получаване на двоичен поток за отговора • Пренасочване на HTTP заявка към друг URL HttpServletResponse.setHeader(<name>, <value>) / HttpServletResponse.setContentType(String) HttpServletResponse.getWriter() HttpServletResponse.getOutputStream() HttpServletResponse.sendRedirect()
New Destroyed Running init() destroy() ...() service() doGet() doDelete() doPost() doPut() Жизнен цикъл на сървлет • Можем да предефинираме тези методив класовете наследници наHttpServlet,за дауправляваме инстанцията на сървлета и ресурсите, от които зависи • Уеб контейнерътуправлява жизнения цикъл на инстанциите на сървлетите • Методите от този цикълне трябва да се извикват от нашия код
Методът init() • Извиква сеот уеб контейнеракогато сървлетът се създава за първи път • Спецификацията на сървлетите гарантира, че сървлетът няма да обработва заявки преди завършването на метода init(). • Предефинирайтеметода init()когато: • Трябва да създадете специфични за сървлета ресурси, които са необходими за обработкана потребителските заявки • Имате нужда от инициализация на състоянието на сървлета
Методът service() • Извиква се от уеб контейнера, за да обработи всяка потребителска заявка • Извиква методитеdoGet(…), doPost(…) и т.н. в зависимост от метода на HTTP заявката (GET, POST и т.н.) • Изпращарезултата като отговор • Обикновено няма нужда да предефинираме този метод
Методът destroy() • Извиква се от уеб контейнера когато се премахва инстанцията на сървлета • Спецификацията на сървлетите гарантира, че всички заявки ще бъдат обработенипреди извикването на този метод • Предефинирайтеметода destroy()когато : • Трябва да освободите специфични за сървлета ресурси, които сте заделили в методаinit() • Трябва да запазите състоянието на сървлета
Java сървлети Примери
Обработка на параметри – 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");
Пример – 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 {
Пример – 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>"); }
Създаване на формата с NetBeans IDE • Създаване на нова HTML форма
Създаване на нов сървлет с NetBeans IDE • Създаване на нов сървлет
Hello Servlet Демонстрация
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
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>
Image Counter Servlet • Искаме да създадем сървлет, който показва брояч във вид на изображение (изображение в JPEG формат) • Сървлетът трябва да поддържа вътрешен брояч • Можем да гоинициализираме вметодаinit()ида го увеличаваме вметодаdoGet() • Резултатът трябва да е изображение (в JPEG формат) • За стойност на content type трябва да зададем "image/jpeg"
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) { ... }
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 } }
Image Counter Servlet Демонстрация
Какво е сесия? • Сесията е състояние,свързано сопределен потребител, което се поддържа от страна на сървъра • Сесиите се запазват между HTTP заявките • Сесиите ни позволяват да създаваме приложения, които зависят от лични потребителски данни. Например: • Login / logout функционалност • Wizard страници • Колички за пазаруване • Запазване на потребителски настройки
Проследяване на сесии в сървлети • Сървлетите предоставят вграден API интерфейс за проследяване на сесии • Сесиите се поддържат автоматично, без писане на допълнителен код • Уеб контейнерътасоциирауникаленHttpSessionобект с всеки отделен клиент • Различните клиенти иматразлични сесийни обекти насървъра • Заявките от даден клиент имат един и същ сесиен обект • Сесиите могат дасъхраняват данни
API интерфейсът за проследяване на сесии • . API интерфейсът позволява • Получаване наHttpSessionобект отHTTPServletRequestобект • Извличане на данни отсесийния обект асоцииран с клиента • Добавяне на данни към сесийния обект асоцииран с клиента • Извличане на метаинформацияза сесийния обекткато напримеркога е създадена сесията
Получаване на сесиен обект • За да получимсесийния обект използваме метода HttpServletRequest.getSession() • Например: • Ако сесията вече е създадена, то се връща съществуващата сесия • Ако сесията не съществува, то се създава и връща нова сесия • Можем да проверим дали сесията е нова като извикаме метода isNew() HttpSession session = request.getSession();
Зад кулисите • Когато извикамеgetSession()с всеки потребител автоматично се свързва уникалноSession ID • Как това Session ID стига допотребителя? • Вариант 1: Акобраузърът поддържабисквитки, сървлетът автоматично създавабисквиткаи запазва session ID в нея. • В Tomcat, бисквиткатасе наричаJSESSIONID • Вариант 2: Ако браузърът не поддържабисквитки, сървлетът ще опита да извлече session ID от URL-то
Извличане на данни от сесията • Сесийният обект работи като HashMap • Позволява съхранение на всякакъв тип Java обекти • Обектите се съхраняват по ключ (като в хеш таблица) • Извличане на съществуващ обект: • Извличане на списък от всички “ключове”асоциирани със сесията Integer accessCount = (Integer)session.getAttribute("accessCount"); Enumeration attributes = request.getAttributeNames();
Запазване на данни в сесията • Можем да запазим данни в сесийния обект и да ги използваме по-късно • Можем да премахнем обекти от сесията, ако повече не са ни нужни HttpSession session = request.getSession(); session.setAttribute("name", "Svetlin Nakov"); session.removeAttribute("name");
Допълнителнаинформация за сесията • Получаване наидентификатора на сесията,асоцииранс потребителя, напр.gj9xswvw9p • Проверка дали сесиятае току що създадена • Проверка кога е била създадена сесията • Проверкакогапоследно е била активна сесията public String getId(); public boolean isNew(); public long getCreationTime(); public long getLastAccessedTime();