Читать «Java 7 (Наиболее полное руководство)» онлайн - страница 412

Ильдар Шаукатович Хабибуллин

□ разрабатывая метод service(), постоянно имейте в виду, что он будет параллельно выполняться несколькими подпроцессами, и принимайте меры к синхронизации их работы;

□ выносите создание объектов, общих для сервлета, определение параметров, пула соединений с базами данных и удаленными объектами, в поля класса и в метод

init();

□ завершающие действия, такие как закрытие потоков, запись результатов на диск, закрытие соединений, выносите в метод destroy(), выполняющийся при закрытии сервлета.

Класс GenericServlet

Абстрактный класс GenericServlet реализует сразу интерфейсы Servlet и ServletConfig. Кроме реализации методов обоих интерфейсов в него введен пустой метод init () без аргументов. Этот метод выполняется автоматически после метода init(ServletConfig), точнее говоря, последний метод реализован так:

public void init(ServletConfig config) throws ServletException{ this.config = config; log("init"); this.init();

}

Поэтому удобно всю инициализацию записывать в метод init () без аргументов, не заботясь о вызове super. init (config).

Класс GenericServlet оставляет нереализованным только метод service ( ). Удобно создавать сервлеты, расширяя этот класс и переопределяя только метод service ().

Так и сделано в листинге 26.2. Можно записать его проще, не определяя метод init(), а прямо используя реализацию методов интерфейса ServletConfig, сделанную в классе GenericServlet. Этот вариант приведен в листинге 26.3. В него добавлено еще получение контекста сервлета.

Листинг 26.3. Упрощенное чтение начальных параметров сервлета

package myservlets; import java.io.*;

import java.util.*;import javax.servlet.*; public class InfoServlet extends GenericServlet{

@Override

public void service(ServletRequest req, ServletResponse resp) throws ServletException, IOException{

ServletContext cont = getServletContext();

resp.setContentType("text/html; charset=windows-1251");

PrintWriter pw = resp.getWriter();

pw.println("<html><head>");

pw.println("<title>Параметры сервлета</^^е>"); pw.println(,,</head><body><h2>Сведения о сервлете<^2>"); pw.println("HiMq сервлета — " + getServletName() + "<br>");

pw.println(,,Параметры и контекст сервлета: <br>");

Enumeration names = getInitParameterNames();

while (names.hasMoreElements()){

String name = (String)names.nextElement(); pw.print(name + ": ");

pw.println(getInitParameter(name) + "<br>");

}

pw.println("Сервер: " + cont.getServerInfo() +"<br>");

pw.println("</body></html>") ; pw.flush(); pw.close();

}

}

Работа по протоколу HTTP

Большинство запросов к сервлетам происходит по протоколу HTTP, который в настоящее время реализуется по рекомендации RFC 2616. Для удобства работы с этим протоколом интерфейсы ServletRequest и ServletResponse расширены интерфейсами HttpServletRequest и HttpServletResponse соответственно. При расширении интерфейсов в них добавлены методы, характерные для протокола HTTP.