Serwlet interfejsu 1.1
Dzisiaj zaczynamy nowy i ciekawy temat - serwlety . Dopiero dodanie serwletów do Javy sprawiło, że Java stała się de facto standardem dla dużych aplikacji serwerowych. 80% całego oprogramowania korporacyjnego na świecie jest napisane w Javie. A w Chinach wszystko jest na 100%. Czym więc są serwlety?
Serwlet jest dokładnie tym, co zamienia program Java w usługę sieciową i umożliwia mu przetwarzanie żądań od klientów. A było tak...
W latach 90., zaraz po pojawieniu się sieci World Wide Web, pojawiły się klienty sieciowe (przeglądarki) i serwery sieciowe. Serwery sieciowe zwykle po prostu dystrybuowały przez Internet przechowywane przez siebie pliki: strony HTML, skrypty, obrazy itp.
W pewnym momencie wszyscy doszli do wniosku, że konieczne będzie uczynienie obu stron mądrzejszymi. Do stron HTML dodano JavaScript, a do serwerów dodano wtyczki - specjalne skrypty, które były wywoływane w odpowiedzi na określone żądania i czyniły zachowanie serwera bardziej elastycznym i inteligentniejszym.
Tak więc serwlet jest taką wtyczką Java , która została wbudowana Java веб-serwer
i pozwalała na wykonywanie kodu Java na żądanie dla niektórych stron. I już ten kod Java, reprezentowany przez klasę odziedziczoną z klasy Servlet, zrobił to, co zamierzali jego twórcy.
A jak już wiesz, najpopularniejszym serwerem internetowym Java jest Tomcat . Nawiasem mówiąc, nazwany na cześć kota Toma z kreskówki „Tom i Jerry”.
Jak Tomcat współdziała z serwletami? W rzeczywistości proces ten jest ustandaryzowany i nazywany jest cyklem życia serwletu . W nim aplet jest ładowalnym obiektem, a serwer WWW jest kontenerem serwletu .
Jeśli aplet nie został jeszcze załadowany , to:
- Klasa serwletu jest ładowana przez kontener.
- Kontener tworzy instancję klasy (obiektu) serwletu.
- Kontener wywołuje metodę
init()
na obiekcie serwletu. Metoda jest wywoływana tylko raz.
Standardowy cykl pracy - obsługa zgłoszenia klienta :
- Każde żądanie jest przetwarzane w osobnym wątku.
- Kontener wywołuje metodę
service()
serwletu i przekazuje tam obiekty ServletRequest i ServletResponse. destroy()
Aby zakończyć działanie serwletu, na obiekcie serwletu wywoływana jest metoda . Nazywa się to tylko raz.
Może być wiele powodów, dla których aplet kończy działanie:
- Programista restartuje serwer WWW, konieczne jest płynne zamknięcie wszystkich serwletów.
- Programista ładuje nową wersję serwletu, stara musi zostać poprawnie rozładowana.
- I tak dalej.
Pamiętaj o najważniejszej rzeczy: serwer WWW i jego serwlety powinny działać bez awarii i restartów przez miesiące, obsługując tysiące żądań na minutę. Dlatego kod służący zarówno do ładowania, działania, jak i usuwania serwletu powinien być zawsze napisany bardzo wysokiej jakości.
1.2 Klasa HttpServlet
Klasa Servlet istnieje w celu ujednolicenia działania serwletu i kontenera. Programiści nie pracują bezpośrednio z tą klasą. Cóż, rzadko działają. Najczęściej używana klasa HttpServlet
jest dziedziczona z Servletu.
Ta klasa ma kilka metod, które będą dla nas przydatne. Będziesz ich często używać:
metoda | Opis | |
---|---|---|
1 | init() |
Wywoływana raz, gdy serwlet jest ładowany |
2 | destroy() |
Wywoływany raz, gdy aplet jest rozładowywany |
3 | service(HttpRequest, HttpResponse) |
Wywoływana przy każdym nowym żądaniu do serwletu |
4 | doGet(HttpRequest, HttpResponse) |
Wywoływana przy każdym nowym żądaniu GET do serwletu |
5 | doPost(HttpRequest, HttpResponse) |
Wywoływana przy każdym nowym żądaniu POST do serwletu |
6 | doHead(HttpRequest, HttpResponse) |
Wywoływana przy każdym nowym żądaniu HEAD do serwletu |
7 | doDelete(HttpRequest, HttpResponse) |
Wywoływana przy każdym nowym żądaniu DELETE do serwletu |
8 | doPut(HttpRequest, HttpResponse) |
Wywoływana przy każdym nowym żądaniu PUT do serwletu |
Metody init()
i destroy()
są dziedziczone z klasy Servlet. Dlatego, jeśli zdecydujesz się nadpisać je w swoim serwlecie, będziesz musiał również wywołać ich implementację z klasy bazowej. Służy do tego polecenie super.nazwa metody()
.
Przykład serwletu:
public class FirstHttpServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// Pobieranie parametru “secret” od prośby
String secret = request.getParameter("secret");
// Кладем параметр “secret” в Http-сессию
HttpSession session = request.getSession(true);
session.setAttribute("secret", secret);
// Печатаем HTML в качестве ответа для браузера
response.setContentType("text/html;charset=UTF-8");
PrintWriter out = response.getWriter();
try {
out.println("<html>");
out.println("<head>");
out.println("<title>Заголовок</title>");
out.println("</head>");
out.println("<body>");
out.println("<h1>Пример сервлета "+ secret +"</h1>");
out.println("</body>");
out.println("</html>");
} finally {
out.close();
}
}
}
1.3 metoda usługi (HttpServletRequest, HttpServletResponse)
Jeśli spojrzysz na przetwarzanie żądania klienta z punktu widzenia serwletu, to wygląda to mniej więcej tak.
Dla każdego żądania klienta kontener (serwer WWW) tworzy obiekty HttpServletRequest
i HttpServletResponse
, a następnie wywołuje metodę service(HttpServletRequest request, HttpServletResponse response)
odpowiedniego serwletu. Obiekty te są do niej przekazywane, aby metoda mogła pobrać niezbędne dane request’а
i umieścić wynik pracy w pliku response
.
Metoda service()
ma domyślną implementację. Jeśli nie zostanie ponownie zdefiniowany, zostanie wykonany. To właśnie robi.
Metoda service()
określa typ metody HTTP z żądania (GET, POST, ...) i wywołuje metodę odpowiadającą żądaniu.
metoda | Opis | |
---|---|---|
1 | service(HttpRequest, HttpResponse) |
Wywoływana przy każdym nowym żądaniu do serwletu |
2 | doGet(HttpRequest, HttpResponse) |
Wywoływana przy każdym nowym żądaniu GET do serwletu |
3 | doPost(HttpRequest, HttpResponse) |
Wywoływana przy każdym nowym żądaniu POST do serwletu |
4 | doHead(HttpRequest, HttpResponse) |
Wywoływana przy każdym nowym żądaniu HEAD do serwletu |
5 | doDelete(HttpRequest, HttpResponse) |
Wywoływana przy każdym nowym żądaniu DELETE do serwletu |
6 | doPut(HttpRequest, HttpResponse) |
Wywoływana przy każdym nowym żądaniu PUT do serwletu |
W swojej klasie możesz albo przedefiniować jedną metodę service()
, albo zostawić ją w spokoju, ale potem przedefiniować metody doGet()
, doPost()
, ... w razie potrzeby.
GO TO FULL VERSION