1.1 интерфейс Servlet
Днес започваме нова и интересна тема - сървлетите . Добавянето на сървлети към Java доведе до това, че Java де факто стана стандарт за големи сървърни applications. 80% от целия корпоративен софтуер в света е написан на Java. А в Китай всичко е на 100%. И така, Howво представляват сервлетите?
Сървлетът е точно това, което превръща Java програма в уеб услуга и й позволява да обработва заявки от клиенти. И беше така...
През 90-те години, веднага след появата на World Wide Web, се появяват уеб клиенти (браузъри) и уеб сървъри. Уеб сървърите обикновено просто разпространяват file, който са съхранor в Интернет: html страници, скриптове, снимки и т.н.
В един момент всички стигнаха до извода, че ще е необходимо да направим и двете страни по-умни. Към HTML страниците беше добавен JavaScript, а към сървърите бяха добавени плъгини – специални скриптове, които се извикваха в отговор на определени заявки и правеха поведението на сървъра по-гъвкаво и по-умно.
Така че сървлетът е такъв Java плъгин , който е вграден Java web-server
и му позволява да изпълнява Java code, когато бъде поискан за определени страници. И вече този Java code, представен от клас, наследен от класа Servlet, направи това, което неговите разработчици възнамеряваха.
И Howто вече знаете, най-популярният Java уеб сървър е Tomcat . Наречен, между другото, в чест на котката Том от анимационния филм „Том и Джери“.
Как Tomcat взаимодейства със сървлетите? Всъщност този процес е стандартизиран и се нарича жизнен цикъл на сервлета . В него сървлетът е зареждаем обект, а уеб сървърът е контейнер на сървлет .
Ако сървлетът все още не е зареден , тогава:
- Класът сървлет се зарежда от контейнера.
- Контейнерът създава екземпляр на класа (обекта) на сървлета.
- Контейнерът извиква метод
init()
на обекта на сервлета. Методът се извиква само веднъж.
Стандартен цикъл на работа - обслужване на клиентска заявка :
- Всяка заявка се обработва в отделна нишка.
- Контейнерът извиква метод
service()
на сървлета и предава обектите ServletRequest и ServletResponse там. - За да прекрати сървлета, се извиква метод
destroy()
на обекта на сервлета. Извиква се само веднъж.
Може да има много причини, поради които сервлетът се прекратява:
- Програмистът рестартира уеб сървъра, необходимо е грациозно да изключи всички сървлети.
- Програмистът зарежда нова version на сървлета, старата трябва да бъде разтоварена правилно.
- И така нататък.
Запомнете основното нещо: уеб сървърът и неговите сървлети трябва да работят без повреди и рестартирания в продължение на месеци, обслужвайки хиляди заявки в minutesа. Следователно, codeът Howто за зареждане, така и за работа и разтоварване на сървлет трябва винаги да бъде написан с много високо качество.
1.2 Клас HttpServlet
Класът Servlet съществува, за да стандартизира How работят сървлет и контейнер. Програмистите не работят директно с този клас. Е, те рядко работят. Най-често използваният клас HttpServlet
е наследен от Servlet.
Този клас има няколко метода, които ще ни бъдат полезни. Често ще ги използвате:
Метод | Описание | |
---|---|---|
1 | init() |
Извиква се веднъж при зареждане на сървлета |
2 | destroy() |
Извиква се веднъж, когато сървлетът е разтоварен |
3 | service(HttpRequest, HttpResponse) |
Извиква се за всяка нова заявка към сервлета |
4 | doGet(HttpRequest, HttpResponse) |
Извиква се за всяка нова GET заявка към сървлета |
5 | doPost(HttpRequest, HttpResponse) |
Извиква се за всяка нова POST заявка към сървлета |
6 | doHead(HttpRequest, HttpResponse) |
Извиква се за всяка нова заявка HEAD към сървлета |
7 | doDelete(HttpRequest, HttpResponse) |
Извиква се за всяка нова заявка DELETE към сървлета |
8 | doPut(HttpRequest, HttpResponse) |
Извиква се за всяка нова PUT заявка към сървлета |
Методите init()
и destroy()
са наследени от класа Servlet. Следователно, ако решите да ги замените във вашия сървлет, ще трябва също да извикате тяхната реализация от базовия клас. За това се използва командата super.method name()
.
Пример за сервлет:
public class FirstHttpServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// Getting the parameter “secret” from request
String secret = request.getParameter("secret");
// Put parameter “secret” into Http-session
HttpSession session = request.getSession(true);
session.setAttribute("secret", secret);
// Print HTML as response for browser
response.setContentType("text/html;charset=UTF-8");
PrintWriter out = response.getWriter();
try {
out.println("<html>");
out.println("<head>");
out.println("<title>Header</title>");
out.println("</head>");
out.println("<body>");
out.println("<h1>Servlet example "+ secret +"</h1>");
out.println("</body>");
out.println("</html>");
} finally {
out.close();
}
}
}
1.3 услуга (HttpServletRequest, HttpServletResponse) метод
Ако погледнете обработката на клиентска заявка от гледна точка на сървлет, тогава нещата са нещо подобно.
За всяка клиентска заявка контейнерът (уеб сървър) създава HttpServletRequest
и обекти HttpServletResponse
и след това извиква метод service(HttpServletRequest request, HttpServletResponse response)
на съответния сървлет. Тези обекти се предават на него, така че методът да може да вземе необходимите данни от request
и да постави резултата от работата в response
.
Методът service()
има изпълнение по подразбиране. Ако не бъде предефиниран, тогава ще бъде изпълнен. Това прави той.
Методът service()
определя типа HTTP метод от заявка (GET, POST, ...) и извиква метода, съответстващ на заявката.
Метод | Описание | |
---|---|---|
1 | service(HttpRequest, HttpResponse) |
Извиква се за всяка нова заявка към сервлета |
2 | doGet(HttpRequest, HttpResponse) |
Извиква се за всяка нова GET заявка към сървлета |
3 | doPost(HttpRequest, HttpResponse) |
Извиква се за всяка нова POST заявка към сървлета |
4 | doHead(HttpRequest, HttpResponse) |
Извиква се за всяка нова заявка HEAD към сървлета |
5 | doDelete(HttpRequest, HttpResponse) |
Извиква се за всяка нова заявка DELETE към сървлета |
6 | doPut(HttpRequest, HttpResponse) |
Извиква се за всяка нова PUT заявка към сървлета |
Във вашия клас можете or да предефинирате един метод service()
, or да го оставите сам, но след това предефинирайте методите doGet()
, doPost()
, ... според нуждите.
GO TO FULL VERSION