Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Lection_servlets.doc
Скачиваний:
30
Добавлен:
23.02.2016
Размер:
356.35 Кб
Скачать

Метод service

Коли сервер отримує запит до сервлету, він породжує новий потік і викликає метод service(). Він перевіряє тип HTTP-запиту (GET, POST, PUT, DELETE і т.д.) і, відповідно , викликає метод doGet(), doPost(), doPut(), doDelete()і т.д.

Не рекомендується перевизначати метод service() у сервлетах.

Інтерфейс SingleThreadModel

Звичайно система створює єдиний екземпляр сервлета, а потім породжує новий потік для кожного запиту користувача. Якщо новий запит поступає у той час, коли виконується попередній, то одночасно існує декілька потоків. Це означає, що методи doGet()і doPost() повинні мати ретельно синхронізований доступ до полів та інших сумісно використовуваних даних. Для запобігання одночасного доступу з боку декількох потоків, реалізація сервлета повинна мати інтерфейс SingleThreadModel:

public class YourServlet extends HttpServlet implements SingleThreadModel {

// код сервлету

}

При цьомусистема гарантує, що тільки один потік запиту отримуватиме доступ до єдиного екземпляра сервлету. Однак все-таки необхідно синхронізувати доступ до змінних класу (static) або сумісно використовуваним даним, що знаходяться поза сервлетом.

Метод destroy

Сервер може видалити раніше завантажений екземпляр сервлету або за командою адміністратора, або через те, що сервлет не працює протягом довгого періоду часу. Перед вивантаженням сервлету викликається його метод destroy(). Цей метод надає сервлету можливість закрити з’єднання з базою даних, зупинити фонові потоки, зберегти списки cookie або лічильники відвідувань і т.д.

Обробка клієнтських запитів

Найбільш загальним способом передачі інформації з web-сторінки в серверну програму є використання даних форм (form data або query data). Дані форми додаються в кінець URL адреси, якщо це GET-запити, або надсилаються серверу в окремому рядку, якщо це POST-запити, наприклад:

http://host/path?user=Michael+Jackson&origin=USA&color=white

Сервлети автоматично виконують синтаксичний аналіз даних форми. Для цього необхідно викликати метод getParameter() класу HTTPServletRequest, задавши ім’я параметру (чуттєве до регістру) у якості аргументу. Метод повертає значення типу String, в якому знаходиться значення першої появи цього імені параметра після декодування URL. Якщо параметр існує, але не має значення, то повертається порожній рядок. Якщо такого параметру не існує, повертається null.

Якщо параметр потенційно може мати більше одного значення, необхідно викликати метод getParameterValues(), який повертає масив рядків.

Коли необхідно отримати повний список параметрів, використовується метод getParameterNames(), який повертає його у виді об’єкту класу Enumeration, кожен з елементів якого може бути приведений до типу String і використаний у виклику getParameter() або getParameterValues().

У наступному прикладі сервлет отримує два параметри: ім’я (name)іпрізвище (surname) та виводить їх у вихідний документ.

import java.io.*;

import java.util.*;

import javax.servlet.*;

import javax.servlet.http.*;

public class Greeting extends HttpServlet {

public void doGet (HttpServletRequest request, HttpServletResponse response)

throws ServletException, IOException {

response.setContentType("text/html");

PrintWriter out = response.getWriter();

String name = request.getParameter("name");

String surname = request.getParameter("surname");

out.println("<HTML>\n"+

"<HEAD><TITLE>Greeting Page</TITLE></HEAD>\n"+

"<BODY>\n"+

"<P align=center>Hi, "+name+" "+surname+”!</P>\n"+

"</BODY></HTML>");

}

}

HTML-код форми, з якої викликається сервлет:

<html>

<head>

<title>Registration Page</title>

</head>

<body bgcolor=”#FDF5E6”>

<h1 align=”center”>Enter your name</h1>

<form action=”/servlet/Greeting”>

Name: <input type=”text” name=”name”><br>

Surname: <input type=”text” name=”surname”><br>

<input type=”submit”>

</form>

</body>

</html>

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]