Читать «Java 7 (Наиболее полное руководство)» онлайн - страница 412
Ильдар Шаукатович Хабибуллин
□ разрабатывая метод service(), постоянно имейте в виду, что он будет параллельно выполняться несколькими подпроцессами, и принимайте меры к синхронизации их работы;
□ выносите создание объектов, общих для сервлета, определение параметров, пула соединений с базами данных и удаленными объектами, в поля класса и в метод
init();
□ завершающие действия, такие как закрытие потоков, запись результатов на диск, закрытие соединений, выносите в метод destroy(), выполняющийся при закрытии сервлета.
Класс
Абстрактный класс 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.