1. Общ преглед
В тази статия ще разгледаме основния аспект на уеб разработката в Java - Servlets.
2. Сервлетът и контейнерът
Най-просто казано, Servlet е клас, който обработва заявките, обработва ги и отговаря с отговор.
Например, можем да използваме Servlet, за да събираме входни данни от потребител чрез HTML форма, да запитваме записи от база данни и да създаваме динамично уеб страници.
Сервлетите са под контрола на друго Java приложение, наречено Servlet Container. Когато приложение, работещо в уеб сървър, получи заявка , сървърът подава заявката до контейнера на сървлети - който от своя страна я предава на целевия сървлет.
3. Зависимости на Maven
За да добавите поддръжка на Servlet в нашето уеб приложение, javax . изисква се зависимост от servlet-api :
javax.servlet javax.servlet-api 3.1.0
Най-новата зависимост от maven можете да намерите тук.
Разбира се, ще трябва да конфигурираме и контейнер на Servlet, за да разполагаме приложението ни; това е добро място да започнете как да разположите WAR на Tomcat.
4. Жизнен цикъл на сървлета
Нека да разгледаме набора от методи, които определят жизнения цикъл на сървлета.
4.1. в него()
Методът init е проектиран да бъде извикан само веднъж. Ако екземпляр на сървлета не съществува, уеб контейнерът:
- Зарежда класа на сървлета
- Създава екземпляр на класа на сървлета
- Инициализира го чрез извикване на метода init
Методът на init трябва да завърши успешно, преди сървлетът да може да получава каквито и да било заявки. Контейнерът на сървлета не може да пусне сървлета в експлоатация, ако методът на init хвърля ServletException или не се връща в рамките на период от време, определен от уеб сървъра.
public void init() throws ServletException { // Initialization code like set up database etc.... }
4.2. обслужване()
Този метод се извиква само след успешно завършване на метода init () на сървлета .
Контейнерът извиква метода service () за обработка на заявки, идващи от клиента, интерпретира типа HTTP заявка ( GET , POST , PUT , DELETE и др.) И извиква методите doGet , doPost , doPut , doDelete и др., Както е подходящо.
public void service(ServletRequest request, ServletResponse response) throws ServletException, IOException { // ... }
4.3. унищожи ()
Извикан от контейнера на Servlet, за да изведе Servlet от употреба.
Този метод се извиква само след като всички нишки в метода за обслужване на сървлета са излезли или след изтичане на период на изчакване. След като контейнерът извика този метод, той няма да извика отново метода на услугата на Servlet.
public void destroy() { // }
5. Примерен сървлет
Нека сега настроим пълен пример за работа с информация с помощта на формуляр.
За да започнем, нека дефинираме сървлет с картографиране / CalcuServlet, който ще улови информацията, публикувана от формуляра и ще върне резултата с помощта на RequestDispatcher:
@WebServlet(name = "FormServlet", urlPatterns = "/calculateServlet") public class FormServlet extends HttpServlet { @Override protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { String height = request.getParameter("height"); String weight = request.getParameter("weight"); try { double bmi = calculateBMI( Double.parseDouble(weight), Double.parseDouble(height)); request.setAttribute("bmi", bmi); response.setHeader("Test", "Success"); response.setHeader("BMI", String.valueOf(bmi)); RequestDispatcher dispatcher = request.getRequestDispatcher("index.jsp"); dispatcher.forward(request, response); } catch (Exception e) { response.sendRedirect("index.jsp"); } } private Double calculateBMI(Double weight, Double height) { return weight / (height * height); } }
Както е показано по-горе, класовете, анотирани с @WebServlet, трябва да разширяват класа javax.servlet.http.HttpServlet . Важно е да се отбележи, че анотацията @WebServlet е достъпна само от Java EE 6 нататък.
В @WebServlet анотацията се обработва от контейнера при разгръщане на времето, и съответния сървлет на разположение в определеното модели URL. Струва си да се отбележи, че като използваме анотацията за дефиниране на шаблони на URL, можем да избегнем използването на дескриптор за разполагане на XML с име web.xml за нашето картографиране на Servlet.
Ако искаме да картографираме Servlet без анотация, вместо това можем да използваме традиционния web.xml :
FormServlet com.root.FormServlet FormServlet /calculateServlet
След това нека създадем основна HTML форма :
Your Weight (kg) :
Your Height (m) :
${bmi}
И накрая - за да сме сигурни, че всичко работи както се очаква, нека напишем и бърз тест:
public class FormServletLiveTest { @Test public void whenPostRequestUsingHttpClient_thenCorrect() throws Exception { HttpClient client = new DefaultHttpClient(); HttpPost method = new HttpPost( "//localhost:8080/calculateServlet"); List nvps = new ArrayList(); nvps.add(new BasicNameValuePair("height", String.valueOf(2))); nvps.add(new BasicNameValuePair("weight", String.valueOf(80))); method.setEntity(new UrlEncodedFormEntity(nvps)); HttpResponse httpResponse = client.execute(method); assertEquals("Success", httpResponse .getHeaders("Test")[0].getValue()); assertEquals("20.0", httpResponse .getHeaders("BMI")[0].getValue()); } }
6. Servlet, HttpServlet и JSP
Важно е да се разбере, че технологията Servlet не се ограничава до HTTP протокола.
На практика почти винаги е така, но Servlet е общ интерфейс и HttpServlet е разширение на този интерфейс - добавяне на специфична HTTP поддръжка - като doGet и doPost и т.н.
И накрая, технологията Servlet е и основният двигател на редица други уеб технологии като JSP - JavaServer Pages, Spring MVC и др.
7. Заключение
В тази бърза статия представихме основите на Servlets в уеб приложение на Java.
Примерният проект може да бъде изтеглен и стартиран, както е като проект на GitHub.