1 / 77

6 . Сървлетен модел на J2EE

6 . Сървлетен модел на J2EE. Лекционен курс “ Езици и среди за програмиране в Интернет ”. доц. д-р Станимир Стоянов катедра “ Компютърни системи ”. Съдържание. 6.1. Обслужване на статичен HTML 6.2. Сървлетен контейнер 6.3. Сървлетни API 6.4 . Пример.

baird
Download Presentation

6 . Сървлетен модел на J2EE

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. 6. Сървлетен модел на J2EE Лекционен курс “Езици и среди за програмиране в Интернет” доц. д-р Станимир Стоянов катедра “Компютърни системи”

  2. Съдържание 6.1. Обслужване на статичен HTML 6.2. Сървлетен контейнер 6.3. Сървлетни API 6.4. Пример

  3. 6.1. Обслужване на статичен HTML Web servers са разработени за доставяне HTML за web browsers: • HTML се чете от текстови файлове от сървъра и се изпраща към клиента посредством HTTP • Web server не модифицира HTML • Нарича се static HTML serving Server Machine Client Machine HTML doGet or doPost HTML Web Browser Web Server Web Page on disk HTML

  4. Проблеми със Static HTML • Съвременното използване на web старниците често изисква тези страници да бъдат динамично генерирани • Напр. - chat system показва всяко съобщение всеки път когато се активира refresh. Това означава, че съответната страница трябва да бъде модифицирана всеки път, когато се добави ново съобщвние • Със статичен HTML това не е толкова лесно • web browsers не могат да презаписват web страници • web browsers не поддържат състояния, така те обработват всяка заявка изолирано без референции или памет за предхождащите събития

  5. Защо трябва да генерираме HTML и създаваме потребителски програми на C++ или Java? • Web browsers са свободно налични за повечето платформи и често се използват от потребители, свързани в Интернет • Потребителите могат да разберат лесно как да навигират web страниците, като се има предвид, че много клиентски приложения имат големи и сложни графични потребителски интерфейси • Мрежовата комуникация в C++ или Java изисква работа със сокети, TCP/IP и сериализация • Често скоростта на C++ и подобни езици не е исканата • Трябва да инсталираме езиковата среда и библиотеките върху клиентския компютър • Трябва да имаме начин за разпределяне (и промяна) и инсталиране (и деинсталиране) приложения на клиентския компютър

  6. Възможност (не решение) – модификация на web server • Можем да модифицираме web server, така че той да може динамично да генерира HTML в отговор на заявки от browser • Това обаче изисква модификация на всяко приложение, което искаме да обработим • Не винаги имаме първичния код и средствата за модификация – някои web servers като напр. Microsoft Internet Information Server (IIS) са защитени и не могат да бъдат модифицирани • Допуснатои грешки при модификацията могат да сринат целия web server • Някои промени в приложенията изискват web server да бъде модифициран и рестартиран.

  7. Решение – обработване на външна програма за генериране на HTML • По-добър избор да подредим нещата така, че когато web страниците да могат да комуникират с външна програма, която работи към web server и която генерира HTML => web server трябва да знае как да я обработва и комуникира с нея. • Тази програма е прозрачна (transparent)за web browser. Той само изпраща HTML и без да знае за динамичната генерация => web browser не трябва да бъде модифициран • CGICommon Gateway Interface е една възможност за един web serverда обработва външни приложения. Сървлетите - друга. Server Machine Client Machine Information about the request HTML doGet or doPost Web Browser Web Server External HTML generator HTML HTML

  8. Сървлети (Servlets) – решение за динамично генериране на HTML • Сървлетите са написани на Java програми, които работят върху web server и комуникират използвайки web browser посредством HTTP и HTML • Сървлетите са съвместими с всички web browsers – поради комуникация само посредством HTML и HTTP • Сървлетите се програмират лесно – поради това, че се използва стандартен Java • Повечето от комуникацията се извършва от Servlet class – не е необходимо да работим със сокети, TCP/IP или Java serialisation. • Сървлетите работят само върху server и следователно не е необходимо да бъде инсталиран Java или друг език за програмиране върху клиента • Сървлетите не трябва да бъдат съхраняване или инсталирани върху клиента. CCTM: Course material developed by James King (james.king@londonmet.ac.uk)

  9. 6.2. Обща характеристика на сървлетите Сървлети - едно основнo средствo за разработване на Java-базирани Web-приложения. Те доставят един лесен начин за комуникaкация между сървъра и Web-базирани клиенти.

  10. ServletAPI- доставя един общ модел на сървър (от там идва и наименованието им - малки, специализирани сървъри). Обикновено всеки сървлет е предназначен за извършване на една услуга.

  11. За да се спестят на програмистите грижите за детайли при: • свързване към мрежата • прехващане на заявки • генериране на отговори в коректен формат • тези дейности се извършват от един сървлет-контейнер, познат като сървлет-машина.

  12. Контейнерът транслира заявки от използвания протокол в обекти, разбираеми от сървъра. Освен това предоставя на сървъра един обект, който може да се използва за изпращане на отговор. Контейнерът е отговорен също така за управление на жизнения цикъл на сървлета. Servlet API библиотеката и сървлет-машината са част от Java ServletDevelopment Kit (JSDK).

  13. Преглед • Сървлет • Версия на аплет в сървърната страна • Изпълняват се под контрола на Web Server. • Компилиран Java клас – динамично се зарежда от Web server при заявки от клиента • Получава HTTP заявки от клиентския browser и връща отговор към клиента във формата на HTML документ • Активиран от Web server сървлет работи с два обекта: requestи response • Получава входните данни, свързани със заявката посредством request object. • Резултатите (HTML) се връщат посредством response object parameter

  14. Сървлетен контейнер (сървлетна машина) • Управлява сървлета – може да бъде: • Вграден в Web server или • Добавен към Web server • Може да работи: • В същия процес на Web server • В различни процеси на server host машината • На различна машина • Може да дефинира и обработва ограничения за сигурност по време на изпълнението на сървлетите.

  15. Java сървлети и CGI • Сървлетите могат да бъдат по-бързи от CGI реализациите – сървлетите могат да работят във Web server процеса, отколкото да се създава нов процес за всяко използване • Сървлетите имат директен достъп до голямо множество от JAVA API • Могат да съхраняват статусна информация – продължаващо опериране • Сървлетите наследяват всички достойнства на Java – програмирани са на Java.

  16. 6.3. Сървлетен контейнер Контейнерите на сървлетите отговарят за: • Обработка на клиентските заявки • Предаване на заявките към сървлетите • Връщане на отговорите към клиентите.

  17. Реализацията на контейнерите може да е различна за различните платформи, но интерфейсът между контейнерите и сървлетите е специфициран от ServletAPI. Този интерфейс дефинира: • Методи , които контейнерът ще извиква на сървлета • Класове на обекти, които контейнерът ще предава към сървлета.

  18. Жизнен цикъл на сървлет Server Operations Client (Browser) Requests 1 2 3 Handle 0 - N Client requests Initialize Load Destroy 4

  19. Жизнен цикъл на сървлет: • Контейнерът създава една инстанция на сървлета • Контейнерът извиква init () метода на инстанцията • Ако контейнерът има заявка за сървлета, тогава той извиква service()метода на инстанцията • Преди премахване на инстанцията контейнерът извиква destroy()метода • Инстанцията се деактивира и се маркира за garbage collection.

  20. 6.4. Architecture of a Servlet Http Client HttpServlet doGet() { Process request from Client using Request object; Send response to client via the Response object; } Request Response Session

  21. Webbrowser изпраща една HTTP doPostили doGetзаявка към web server • Webserver разбира, че заявката е за един сървлет – ако сървлетът не е зареден той го зарежда и активира init методът му • Webbrowser предава HTML заявкат към service метода на сървлета • Service методът извиква кореспондиращия doGetили doPostметода • Методът може да изпълни и генерира HTML, който се предава обратно към web browser • Когато web browser реши да се деактивира, тогава сървлетът извиква destroy метода. Server Machine Servlet Java Class Client Machine Init HTML doGet or doPost Web Browser Web Server Service HTML HTML HTML doPost doGet Destroy

  22. Интерфейсът гарантира следното: • Преди да бъде извикан service() методът, ще бъде разрешено на init метода да завърши • Преди да бъде премахнат сървлетът ще бъдеизвикан неговият метод destroy. • По времето, когато един сървлет е заявен, нищо не може да спре неговия контейнер да обработи целия му жизнен цикъл.

  23. На практика има смисъл контейнерът да създаде една инстанция на сървлета (когато се стартира или когато първоначално се извиква сървлета) и да я запази в паметта докато се получат всички заявки. • Контейнерът може да реши по всяко време да премахне инстанцията от паметта - напр. ако сървлетът не се извиква определено време или ако контейнерът завършва работата си.

  24. Ако това се случи, тогава контейнерът може лесно да го направи, доставяйки първо извиквания на метода destroy • Така в един типичен модел контейнерите създават една единствена инстанция за всеки сървлет (въпреки, че няма причини за машината да създава повече инстанции).

  25. Какво става ако методът serviceна сървлета вече работи и неговият контейнер получава друга заявка? • Контейнерът може да почака докато завърши serviceметодът, преди да го извика отново • Може да създаде една нова изпълнима нишка и от нея да извика service метода.

  26. В спецификацията не съществува забрана serviceметодът да се извиква в единмомент само от една нишка. • Когато създаваме сървлети трябва да гарантираме, че нашият код е нишково сигурен.

  27. Пул от нишки • На практика се изключва сървлетният контейнер в общност да създава една нова нишка по всяко време, когато се получи заявка. • Вместо това контейнерът използва един пул от нишки, към които динамично се прикрепват пристигащите заявки. • От гледна точка на сървлетите ефектът е един и същ.

  28. Нишка Контейнер Нишка Създава пул нишки Иницииране сървлет Сървлет HTTP Заявка1 Извикване init() метода Инициализация Извикване service() метода Заявка към нишка HTTP Заявка2 Извикване service() метода Service Заявка към нишка Shutdown иницииран Service Блокиране други заявки HTTP Отговор1 Изчакване завършване активни нишки HTTP Отговор2 Премахване пул нишки Извикване destroy() метода Cleanup Премахване сървлет Премахване контейнер

  29. Java и C/C++ контейнери • Понеже контейнерите комуникират директно със сървлетите, обикновено те се програмират на Java. • За нещастие повечето от значимите Web-сървъри са програмирани на други езици, като С и С++.

  30. Така, докато 100% JavaWeb сървъри, (Sun’s Java Web Server, ServerRunner)имат собственисървлетни контейнери, доставени от JSDK, другите сървъри, (Apache, IIS)се нуждаят от отделна Java програма за да обработват сървлетите. • Единplug-in или модул трябва да обработва комуникацията между самия Web сървъри контейнера.

  31. Специално за Apache Jserv комуникацията се извършва през специален Интернет протокол, наречен AJPv 1.1, чрез който Web-сървъра прави заявки към сървлети и койнтейнерът връща резултатите обратно към сървъра. • В този случай не е задължително контейнерът и Web-сървъра да работят на една исъща машина.

  32. Разширение на сървъра • Понеже сървлетите работят тясно с Web-сървърите, те могат да се използват заразширяване на възможностите на сървърите. • Те могат да доставят по-голяма базова функционалност на сървъра.

  33. 6.5. Сървлетни API • За да можем да разработваме сървлети ние се нуждаем от JSDK. • Той съдържа всички необходими класове и интерфейси, както и един напълно функционален сървлет- контейнер, наречен ServletRunner.

  34. Класовете и интерфейсите образуват два пакета: • java.servlet - доставя базовия интерфейс • java.servlet.http - доставя класове, изведени от генетичния сървлетенинтерфейс, които предлагат специфични средства за обслужване на НТТР заявки.

  35. EE557: Server-Side Development Servlet API • Servlet API defines a standard interface for handling request/response • Composed of two packages: • - javax.servlet contains classes to support generic, protocol-independent servlets • - javax.servlet.http extends javax.servlet to add HTTP-specific functionality • Also, provides classes which deal with HTTP-style cookies and session tracking

  36. Servlet API • Всеки сървлет трябва да имплементира javax.servlet.Servlet interface • Два основни класа, които имплементират servlet interface: • javax.servlet.GenericServlet : сървлетите, които имплементират този клас са независими от протокола. Не поддържат HTTP или други протоколи • javax.servlet.HttpServlet : сървлетите, които разширяват HttpServlet class поддържат HTTP протокола • javax.servlet package специфицира два exception classes • javax.servlet.ServletException – общи изключения за грешки при сървлетите • javax.servlet.UnavailableException – сървлетите не са налични

  37. EE557: Server-Side Development Servlet Life Cycle

  38. Initialization • Servlet Container зарежда сървлети: • по време на активирането на сървъра (pre-loading) или • когато има за първи път обращение към тях (dynamically) • Повечето сървъри позволяват спецификация на сървлетите, които ще бъдат заредени предварително • init(ServletConfig)методът се активира от сървъра когато той създава първата инстанция на сървлета. Гарантира, че този метод ще бъде първи активиран. public void init(ServletConfig config) throws ServletException { super.init(config); } • ServletConfig object доставя на сървлета информация за неговите инициализиращи параметри • super.init(config)се извиква за осигуряване извикване на родителския init() метод.

  39. Service • service() методът обработва всички заявки, изпратени от един клиент (след init()) • Servlet container извиква service() метода за обработка на заявките и създаване на форматиран отговор, който се връща на клиента • Контейнерът конструира един request object от заявката като ServletRequest (generic) или HttpServletRequest (HTTP) • Контейнерът конструира единresponse object за форматиране на отговора като ServletResponse (generic) или HttpServletResponse (HTTP) public void service(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException • Стандартна (Default) имплементация на service() метода кодира автоматично пренасочване на HTTP заявките като GET и POST към методи като doGet() и doPost

  40. EE557: Server-Side Development Service

  41. Destruction • Servlet контейнерът прекратява работата на сървлета посредством извикване на destroy() метода от servlet interface • Можем да препокрием destroy() метода за използване на ресурси като напр. конекции към БД • Всяка постоянна информация може да бъде съхранена посредством този метод – в противен случай тя ще бъде загубена public void destroy()

  42. 6.6. Класова структура на сървлетите • Един сървлет е един Java клас, който работи в Java Virtual Machine и се контролира от web server. • Всички сървлети разширяват директно или индиректно Servletclass. • За обработка на заявките ние обикновено създаваме собствени Java класове, които разширяват един от стандартните servletкласове (обикновено HttpServlet– от своя страна разширява Servlet) • Комуникацията с web server е посредством допълнителни класове – обикновено HttpServletRequestи HttpServletResponse, които разширяват ServletRequestи ServletResponse • Обикновено не е необходимо да създаваме собствени ServletRequestилиServletResponse

  43. Класова структура на една сървлетна програма Your Servlet Code MyServlet Methods: doGet doPost init destroy etc. Http Servlet Layer HttpServlet Methods: Service doGetdoPost init destroy etc. HttpServletRequest HttpServletResponse Basic Servlet Layer Servlet Method: service ServletRequest ServletResponse

  44. 6.7. Създаване на сървлети Обикновено нашите сървлети ще разширяват HttpServlet class, който доставя default реализация на: • init - необходима е препокриване само ако искаме различна инициализация, напр. отваряне на конекция към БД • destroy - необходима е препокриване само ако искаме различно премахване, напр. затваряне на конекция към БД • service – обикновено не се препокривапонеже методът решава кой от doXметодите ще бъде активиран • doGet- HTTP Get е подразбиращият се начин един web browser да направи заявка и това пречинява активиране на doGetметода на сървлета, така че обикнове се препокрива този метод • doPost. – ако не отговаряме на един Post не е необходимо да препокриваме този метод. CCTM: Course material developed by James King (james.king@londonmet.ac.uk)

  45. Задачи на Servlet Classes • Нашият сървлет ще разшириHttpServlet- само трябва да замести методите на HttpServletза заявките, които иска да обработва. • HttpServletкласър разширява сървлета и препокрива неговия service метод. • Този клас има един dummy метод за всеки тип HTTP заявка • service методътопределякаква е заявката - т.е.HTTP get или post – и извиква съответния dummy метод • Допълнителна HTTP информация се предава в HttpServletRequestи HttpServletResponse • service методът на сървлетния клас е създаден за да бъде извикан от web server с детайли за заявката (ServletRequestи ServletResponse) CCTM: Course material developed by James King (james.king@londonmet.ac.uk)

  46. // load the servlet class and setup request, response objects Servlet servlet = … ServletRequest request = … ServletResponse response = … // initialise servlet ServletConfig config = servlet.getServletConfig(); servlet.init(config); // service zero or more requests while ( …more requests… ) // invoke servlet to process request servlet.service(request, service); // cleanup after service servlet.destroy(); Обобщение - управление на Servlet Life Cycle посредством Server и Container Call to methods doGet(), doPost() in the user defined servlet class За разлика от CGI един отделен сървлет може да онслужва повече заявки. В CGI, сървърът извиква отделен процес за всяка заявка. Следователно сървлетите редуцират натоварването

  47. 6.8. HTTP протокол HTTP Get или Post? • Основни разлики между Get и Post: • GET: • Данните се изпращат като низ (query string) • Клиентската заявканапълно се съдържа в URL, изпратен към сървъра • Обемът на заявката обикновено е лимитиран (1KB) • Тази информация се съхранява в реда на заявката • Метод по подразбиране когато активираме href HTML link. • POST: • Данните се изпращат като част от тялото на съобщението • Данните не са видими в URL • Могат да се изпраща голям обем данни към сървъра. CCTM: Course material developed by James King (james.king@londonmet.ac.uk)

  48. ServletdoGet и doPost • doGetи doPostимат идентични сигнатури и получават от service метода два параметъра. • public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException • public void doPut(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException • HttpServletRequestе един обект, съдържащ информация за заявка от web browser, която може да бъде: • login на потребителя и някакви стойности от заглавната част, изпратена от web browser. • Някакви параметри, изпратени като част на заявката • Някакви информационни параметри, поставени от deployment descriptor • Доставя сесии (session) и бисквитки (cookies)

  49. ServletdoGet и doPost • HttpServletResponseе един обект, който позволява • Добавяне на cookies • Header стойности • Пренасочване към нови URL • Създаване на HTTP за web browser • Изпращане на съобщения за грешки.

  50. Взаимодействие Клиент-Сървър • HTTP Request (изпраща заявки към сървъра): • HTTP е един request-response protocol • Когато един клиент изпраща една заявка тя се състои от 3 части: • request line: • HTTP method type (GET or POST) • resource name (URL) • protocol/version напр. POST /im51p/w7.html HTTP/1/1 • header variables: съдържа информация за browser (optional) • message body: при POST методите информацията за заявката се съхранява тук (optional) • HTTP Response (изпраща отговори към клиента): • отговорът, изпратен от сървъра към клиента се състои също така от 3 части: • response line (server protocol и status code) • header variables (информация за сървъра и за отговора) • message body (съдържание на отговора, напр. като HTML)

More Related