Работая с интерфейсами прикладных программ (API) сервлетов и JSP-страниц, мы обнаружили, что документация JDK, очень основательная в отношении описания классов, содержит мало полезной функциональной информации. Формальные описания API 2.2 для сервлетов и API 1.1 для JSP-страниц также, на наш взгляд, трудно применить на практике. Цель этого приложения — представить наиболее часто используемые интерфейсы API с функциональной точки зрения, сопровождая их описание рекомендациями по применению.
Мы будем заниматься следующими пакетами:
javax.servlet — базовый обобщенный пакет сервлетов;
javax.servlet.http — специализированные расширения для web-страниц;
javax.sevlet.jsp — классы для создания JSP-страниц;
javax.sevlet. jsp.tagext — специализированные расширения классов JSP- страниц, которые позволяют создавать пользовательские библиотеки тегов.
В интерфейсах API для сервлетов и JSP-страниц параметры рассматриваются как объекты, обладающие определенной областью видимости. Эта область состоит из тех частей системы, в которых применение данного параметра является корректным. Перечислим области видимости в порядке убывания: сервер, приложение, сеанс, запрос и страница.
Сервер. Параметры из этой области могут использоваться во всех приложениях.
Приложение. Sun термином «web-приложение» называет совокупность сервлетов, JSP-страниц и других ресурсов, установленных в определенном адресном пространстве сервера. Класс Servl etContext предназначен для обеспечения возможности совместного использования информации всеми ресурсами, входящими в приложение. Это осуществляется с помощью объектов, которые доступны всем ресурсам приложения и относятся к области видимости приложения. Данная область видимости влияет на интерпретацию относительных URL-адресов.
Сеанс. Как было сказано в главе 3, сервлеты и JSP-страницы могут хранить специфическую для данного пользователя информацию в объекте HttpSession, которым управляет процессор сервлетов. Объекты, хранящиеся таким образом, называются объектами области видимости сеанса.
Запрос. Запрос на самом деле может обрабатываться несколькими страницами с помощью механизма переадресации (метода forward). Запрос (объект Servl etRequest или HttpServl etRequest) может включать в себя дополнительные объекты.
Страница. В сервлетах, созданных процессором JSP-страниц, может иметь место область видимости отдельной страницы. Если запрос обрабатывается с помощью метода forward или include, переменная, имеющая данную область видимости, доступна только на той странице, где она создана.
Поскольку методы сервлета определяются в интерфейсе, а интерфейсы не могут определять конструкторы, инициализация сервлета полностью осуществляется в методе init. Процессор сервлетов непременно вызывает метод init после того, как сервлет разработан, и прежде, чем обработан первый запрос. Методу init, согласно определению интерфейса Servlet, передается объект ServletConfig, который может быть использован для получения параметров инициализации. Между интерфейсами SevletConfig и ServletContext имеют место отличия, которые нужно учитывать.
SevletConfig — объекты, использующие этот интерфейс, содержат информацию, которая требуется во время инициализации сервлета. Причина частых таинственных ошибок времени выполнения в сервлете заключается в том, что перед вызовом метода initO не было вызова метода super.init().
Servl etContext — объекты, использующие этот интерфейс, позволяют сервлету находить информацию о процессоре сервлетов, в котором данный сервлет выполняется, и о его окружении. Вы можете получить интерфейс Servl etContext из объекта Servl etConfig.
Все процессоры сервлетов предусматривают определение параметров инициализации, которые должны быть переданы данному сервлету. Соглашения о том, каким образом администратор сервера устанавливает эти параметры, могут быть различными для разных процессоров, но основная идея остается неизменной. Будем надеяться, что количество производителей, использующих стандартный подход Sun с применением XML, будет увеличиваться.
Имя параметра связывается с текстовым значением. Программисты, знакомые с апплетами Java, могут заметить здесь аналогию с тем, как контейнер апплетов (браузер) передает именованные параметры апплету. Три наиболее распространенных метода объекта Servl etConfig приведены в табл. А1.
Таблица А.1. Методы объекта ServletConfig
Тип возвращаемого значения |
Метод |
Описание |
String |
getlnitParameter (String name) |
Этот метод возвращает строку String, соответствующую имени параметра (Stri ng name), либо null , если такого параметра не обнаружено |
Enumeration |
getInitParameterNames() |
Этот метод возвращает перечисление Enumeration имен всех параметров |
ServletContext |
getServletContext() |
Этот метод получает интерфейс ServletContext, в котором выполняется сервлет |
В табл. А.2 перечислены методы, которые должны быть предусмотрены в вашем пользовательском сервлете, когда он реализует интерфейс Servlet. Пакет javax.servlet также включает класс GenericServlet, который реализует интерфейс Servlet. Этот класс содержит некоторые вспомогательные методы, например вариант метода init без аргументов. Вы можете переопределить его и использовать вместо метода init, которому передается аргумент ServletConfig.
Таблица А.2. Методы интерфейса Servlet
Тип возвращаемого значения |
Метод |
Описание |
void |
init (ServletConfig config) |
Вызывается контейнером сервлетов до того, как начнется обработка запроса пользователя. Не забудьте о вызове метода super.init(config) |
void |
destroy( ) |
Вызывается контейнером сервлетов для указания сервлету, что он должен быть удален |
ServletConfig |
getServletConfig() |
Возвращает объект ServletConfig, который содержит параметры для инициализации и запуска сервлета. Обратите внимание: этот объект буден равен null , если вы забудете вызвать метод super, init (config) в методе init |
Srting |
getServletlnfo() |
Необязательный метод, который возвращает информацию о сервлете, например данные о его авторе, номер версии и сведения об авторских правах |
void |
service(ServletRequestreq, ServletResponseres) |
Вызывается контейнером сервлетов для того, чтобы сервлет получил возможность ответить на запрос |
Класс HttpServl et добавляет методы, которые поддерживают HTTP-запросы. Ваш пользовательский класс сервлета должен переопределить хотя бы один из этих методов, как показано в табл. А.З.
Таблица А.3. Методы класса HttpServlet, которые обычно переопределяются
Переопределяемый метод |
Поддерживаемый запрос |
doGet(ServletRequest req. ServletResponse resp) doPost(ServletRequest req, ServletResponse resp) doPutCServletRequest req, ServletResponse resp) doDelete(ServletRequest req, ServletResponse resp) |
HTTP GET HTTP POST HTTP PUT НTTР DELETE |
Процессор сервлетов создает объект, этот интерфейс ServletContext, и делает его доступным для сервлетов. Это исходный способ связи между сервлетом и его контейнером. В каждом web-приложении может содержаться множество сервлетов и JSP-страниц. Все они будут совместно использовать интерфейс ServletContext. В табл. А.4 приведены методы, с помощью которых объекты и параметры становятся доступными для совместного использования через интерфейс Servl etContext. Остатьные методы перечислены в табл. А.5.
Таблица А.4. Методы интерфейса ServletContext, относящиеся к параметрам и атрибутам
Тип возвращаемого значения |
Метод |
Описание |
Object |
getAttribute(Stnng name) |
Возвращает атрибут контейнера сервлета с заданным именем или null , если атрибут с таким именем не обнаружен |
Enumeration |
getAttn buteNames ( ) |
Перечисление Enumeration содержит перечень имен атрибутов (строк String) объекта класса ServletContext (контекста сервлетов) |
void |
removeAttribute (String name) |
Удаляет атрибут с заданным именем из объекта класса ServletContext (контекста сервлетов) |
void |
setAttribute(String name, Object object) |
Связывает объект с заданным именем атрибута в данном контексте сервлетов |
Srting |
getlnitParameter (String name) |
Возвращает строку String, содержащую значение указанного именованного параметра инициализации в данном контексте, или null, если параметр не существует |
Enumeration |
get InitParameterNames ( ) |
Возвращает имена параметров инициализации объекта ServletContext в виде перечисления (объекта Enumeration) объектов типа String либо пустой объект Enumeration, если параметры инициализации отсутствуют |
Таблица А.5. Остальные методы интерфейса ServletContext
Тип возвращаемого значения |
Метод |
Описание |
Servl etContext |
getContext(String uripath) |
Возвращает объект ServletContext, который соответствует указанному URL-адресу на данном сервере |
String |
getMimeTypeCString file) |
Возвращает тип MIME указанного файла или null , если такой тип MIME не известен |
RequestDispatcher |
getNamedDi spatcher (String name) |
Возвращает объект RequestDispatcher, который выполняет функции оболочки для указанного сервлета |
RequestDispatcher |
getRequestDi spatchet (String path) |
Возвращает объект RequestDispatcher, который выполняет функции оболочки для ресурса, размещенного по указанному адресу |
String |
getRea!Path(String path) |
Возвращает строку String, содержащую фактический путь для указанного виртуального пути |
URL |
getResourcet String path) |
Возвращает URL для ресурса, путь к которому является аргументом данного метода |
InputSrteam |
getResourceAsStream (String path) |
Возвращает ресурс, расположенный по указанному пути, в виде объекта InputStream |
String |
getServerlnfoO |
Возвращает имя и версию контейнера сервлетов, в котором выполняется данный сервлет |
int |
getMajorVersionO |
Возвращает основной номер версии API сервлетов Java, которую поддерживает данный контейнер (например, 2 для версии 2.1) |
int |
getMinorVersionO |
Возвращает дополнительный номер версии API сервлетов Java, которую поддерживает данный контейнер |
Получение информации о запросе
Сервлет получает информацию о запросе пользователя в виде объекта, реализующего интерфейс javax. servlet.ServletRequest или javax. servlet.http. HttpServl etRequest, созданный процессором сервлетов. Сервлеты, которые расширяют интерфейс javax.servlet.GenericServlet или реализуют интерфейс javax.servlet.Servlet, получают объект Servl etRequest (обычно с именем req). JSP-страницы всегда получают объект класса HttpServl etRequest с именем request, поскольку JSP-страницы используются только в контексте HTTP.
Основные методы для получения информации о запросе содержатся в интерфейсе Servl etRequest (табл. А.6), в то время как HttpServl etRequest добавляет некоторые методы для получения информации о протоколе.
Таблица А.6. Получение информации о запросе пользователя из объекта ServletRequest
Тип возвращаемого значения |
Метод |
Описание |
Enumeration |
getParameterNames ( ) |
Имена параметров, выделенные из запроса при его анализе, возвращаются в виде объекта Enumeration (перечисления), а не массива типа String (массива строк), так как пары имя-значение хранятся в хэш-таблице, а объекты Hashtable возвращают список всех своих ключей в виде перечисления |
String |
getParameterCString name) |
Этот метод возвращает значение типа String, соответствующее имени параметра, или null , если это имя не было обнаружено в запросе. Всегда полезно проверять, не равно ли возвращенное значение null. Если в запросе окажется больше одного параметра с одним и тем же именем, то возвращается значение первого из них |
String |
getParameterValues (Srting name) |
Если одному имени может быть сопоставлено более одного значения, следует использовать этот метод. В возвращаемом массиве строк сохраняется исходный порядок следования параметров. Если не существует ни одного параметра с указанным именем, возвращается null |
Методы, добавляемые интерфейсом HttpServletRequest
Интерфейс HttpServletRequest расширяет интерфейс ServletRequest, добавляя некоторое количество полезных методов, как показано в табл. А.7. Большинство из этих методов позволяют получить сведения о заголовках HTTP-запроса или характеризуют способ, которым этот запрос попадает к данному сервлету. Ни один из методов get, который получает данные из заголовка запроса, не чувствителен к регистру.
Таблица А.7. Методы интерфейса HttpServletRequest, характеризующие запрос
Тип возвращаемого значения |
Метод |
Описание |
String |
getContextPath( ) |
Возвращает часть URI запроса, которая идентифицирует контекст запроса |
long |
getDateHeader(String name) |
Возвращает значение указанного заголовка (который является датой), преобразованное к типу long (количество миллисекунд, прошедших с с 00:00:00 01.01.1970) |
String |
getHeader(String name) |
Возвращает значение указанного заголовка запроса. Имя не чувствительно к регистру |
Enumeration |
getHeaderNames( ) |
Возвращает перечень всех имен, содержащихся в заголовке запроса |
Enumeration |
getHeaders(String name) |
Возвращает все значения указанного заголовка запроса в виде перечисления объектов типа String |
int |
get!ntHeader(String name) |
Вспомогательный метод, который пытается преобразовать указанный заголовок запроса в целочисленный формат типа int. Если заголовок не обнаружен, возвращает -1. Если заголовок не может быть преобразован к типу int, вызывает исключение NumberFormatExcepti on |
String |
getMethod( ) |
Возвращает имя метода HTTP, которым выполнен запрос (например, GET, POST или PUT) |
String |
getPathlnfo( ) |
Возвращает часть URI после адреса сервлета. Если эта часть отсутствует, возвращается null |
String |
getPathTranslated( ) |
Преобразует часть URI, расположенную после имени сервлета, но перед строкой запроса (то есть результат выполнения метода getPathlnfo), в физический путь |
String |
getQueryString( ) |
Возвращает строку запроса, содержащуюся в URL запроса после указания пути |
String |
getRequestURI( ) |
Возвращает часть URL запроса, начиная от имени протокола и до строки запроса в первой строке запроса HTTP |
String |
getServletPath( ) |
Возвращает часть URL запроса, которая соответствует данному сервлету |
Методы, связанные с безопасностью
Методы обеспечения безопасности, перечисленные в табл. А.8, могут не поддерживаться более старыми ядрами сервлетов.
Таблица А.8. Методы интерфейса HttpServletRequest, связанные с безопасностью
Тип возвращаемого значения |
Метод |
Описание |
String |
getAuthTypeO |
Возвращает название схемы аутентификации, которая используется для защиты сервлета (например, BASIC или SSL), или null , если сервлет не был защищен |
String |
getRemoteUserO |
Если в сеансе используется проверка прав доступа, возвращает регистрационное имя пользователя или null, если пользователь не прошел проверку |
Principal |
getUserPrincipaK) |
Возвращает объект Java. security. Principal, содержащий имя очередного пользователя, прошедшего проверку прав доступа |
Boolean |
isUserlnRoleCString role) |
Возвращает true, если пользователь, прошедший проверку, включен в класс пользователей, определяемый указанным в качестве параметра «ролевым именем» |
Методы, связанные с сеансами и cookie
Поскольку концепция cookie связана с протоколом HTTP, все методы для работы с cookie и сеансами, относящиеся к запросам, входят в класс HttpServletRequest, как показано в табл. А.9. Такие методы, как getRequestedSessionld, ссылаются на идентификатор id сеанса, который был присоединен к запросу либо как фрагмент cookie, либо путем перезаписи URL. Все эти методы возвращают null, если сеанс не был присоединен к запросу.
Таблица А.9. Методы интерфейса HttpServletRequest, связанные с сеансами и cookie
Тип возвращаемого значения |
Метод |
Описание |
Cookie[ ] |
getCookies( ) |
Возвращает массив, содержащий все объекты cookie, которые клиент прислал с данным запросом |
String |
getRequestSessionld( ) |
Возвращает все идентификаторы id сеанса, указанные клиентом |
HttpSession |
getSession( ) |
Возвращает текущий сеанс, связанный с данным запросом, а если запрос не имеет сеанса, то создает его |
HttpSession |
getSession(boolean create) |
Возвращает текущий объект HttpSession, связанный с данным запросом, а если запрос не имеет сеанса и булев параметр равен true, то создает его |
boolean |
isRequestedSession IdFromCookie( ) |
Возвращает true, если идентификатор (id) требуемого сеанса получен в виде фрагмента cookie (а не путем перезаписи URL) |
bool ean |
isRequestedSession IdFromURL( ) |
Возвращает true, если идентификатор (id) требуемого сеанса получен путем перезаписи URL |
boolean |
isRequestedSessi onldVal id( ) |
Проверяет, является ли запрошенный идентификатор сеанса действительным |
Другие методы интерфейса ServletRequest
В табл. А.10 мы попытались сгруппировать методы в соответствии с их функциями, а не в алфавитном порядке. Если вы предпочитаете алфавитный порядок, используйте стандартную документацию JDK, прилагаемую к Tomcat или к JSDK.
Таблица А.10. Еще несколько методов интерфейса ServletRequest
Тип возвращаемого значения |
Метод |
Описание |
void |
setAttribute (Stringname.Objectobj) |
Используется для сохранения объекта в объекте ServletRequest, который будет передан другому сервлету для обработки |
Object |
getAttribute(Stringname) |
Извлекает указанный объект или возвращает null, если такой объект не существует |
Enumeration |
gettttributeNames( ) |
Возвращает объект Enumeration, который содержит перечень имен всех имеющихся атрибутов |
void |
removeAttribute (Stringname) |
Удаляет атрибут с указанным именем |
ServletlnputStream |
getlnputStream( ) |
Объект для чтения потока двоичных данных из запроса с использованием методов InputSrteam |
BufferReader |
getReader( ) |
BufferReader используется для чтения и синтаксического анализа тела запроса строка за строкой |
Класс HttpSession и классы, связанные с cookie
В этом разделе мы обсудим класс HttpSession и классы, связанные с cookie. Объект HttpSession используется для хранения информации о состоянии в промежутках между соединениями с конкретным пользователем.
HttpSession. Объекты, реализующие этот интерфейс, позволяют программисту хранить информацию о пользователе в промежутках между отдельными посещениями страницы или соединениями. Процессоры сервлетов обеспечивают методы для мониторинга объектов класса HttpSession, используя уникальные идентификаторы (см. примеры в главе 3).
HttpSessionBindingListener. Этот интерфейс аналогичен многим интерфейсам слушателей событий в GUI Java. Программисты могут реализовать этот интерфейс в объекте, которому требуется извещение, когда он присоединяется к объекту HttpSession или отсоединяется от него.
Cookie. Эти объекты используются для манипулирования информацией, содержащейся во фрагментах cookie, которые посылаются сервером браузеру и возвращаются при последующих запросах. Информация cookie, содержащаяся в запросе, преобразуется в объекты Cookie методами класса HttpServletRequst.
HttpUti I s. Статические методы этого класса используются в различных ситуациях.
HttpSessionBindingEvent. Объекты этого типа используются для передачи информации объектам класса HttpSessionBindingListener, когда они присоединяются к объекту HttpSession или отсоединяются от него.
Обратите внимание на аналогию между методами, относящимися к атрибутам (перечисленным в табл. А. 11), и методами, которые используются в интерфейсе SevletRequest. В более ранних интерфейсах API в названиях методов использовалось значение (value) вместо атрибута (attribute), например getValue, но в целях более последовательного именования от этих методов решено было отказаться и теперь они являются устаревшими.
Таблица А. 11. Методы класса HttpSession
Тип возвращаемого значения |
Метод |
Описание |
Object |
getAttribute(String name) |
Возвращает объект, присоединенный к сеансу, с именем name или null , если не найдено объекта с таким именем |
void |
setAttribute(Stnng name, Object obj) |
Добавляет объект obj с именем name к сеансу. Если с этим именем ранее был связан другой объект, то эта связь теряется |
Enumeration |
getAttributeNames( ) |
Возвращает перечисление объектов типа String, содержащее имена всех объектов, присоединенных к сеансу |
void |
removeAttribute (String name) |
Удаляет объект с указанным именем из сеанса |
long |
getCreationTime( ) |
Возвращает системное время (GMT) создания объекта, такое же как в System.currentTimeMillis() |
long |
getLastAccessedTime() |
Возвращает системное время последнего обращения клиента к сеансу. Формат такой же, как в getCreationTime |
int |
getMaxInactivelnterval ( ) |
Возвращает максимальный интервал времени (в секундах), в течение которого контейнер сервлета поддерживает сеанс открытым между обращениями к нему клиента |
void |
setMaxInactivelntarval (int interval) |
Устанавливает интервал времени (в секундах) между обращениями клиента, по истечении которого контейнер сервлетов сделает данный сеанс недействительным |
void |
invalidate( ) |
Делает данный сеанс недействительным и прекращает все связи с объектами |
boolean |
isNew() |
Возвращает true, если клиент еще не знает о сеансе или клиент предпочел не присоединяться к сеансу. Обычно этот метод вызывается сразу после вызова метода getSession объекта HttpServlrtRequest |
String |
getld( ) |
Возвращает уникальный идентификатор, присвоенный данному сеансу |
Методы интерфейса HttpSession Listener
Если объект сохраняется в сеансе и хочет «знать», когда он был присоединен к сеансу и когда он от него будет отсоединен, этот объект должен реализовать интерфейс HttpSessionListener, то есть объект должен реализовать два показанных ниже метода.
valueBouncKHttpSessionBindingEvent event). Объект, который связывается с сеансом. Параметр event содержит идентификатор сеанса и имя, с которым связан объект.
valueUnbound(HttpSessionBindingEvent event). Объект, который отсоединяется от сеанса, возможно, по причине того, что срок сеанса истек.
Конструктор Cookie использует имя типа String и значение того же типа. Заметим, что в имени не могут содержаться произвольные символы, а только те, которые соответствуют требованиям спецификации RFC 2109 (Requests for Comments1). Имена не чувствительны к регистру. В табл. А.12 перечислены некоторые полезные методы класса Cookie.
Таблица А.12. Методы класса Cookie
Тип возвращаемого значения |
Метод |
Описание |
Object |
clone( ) |
Переопределяет стандартный метод Object. clone и возвращает копию этого файла cookie. Обратите внимание, что вы По-прежнему должны привести ссылку к типу Cookie |
String |
getValue( ) |
Возвращает значение cookie |
void |
setValue(String newValue) |
Присваивает файлу cookie новое значение после создания cookie |
String |
getComnent() |
Комментарий, описывающий назначение cookie, или null, если комментарий не был присоединен |
void |
setComment( String purpose) |
Присоединяет комментарий, который описывает назначение cookie |
String |
getDomain( ) |
Возвращает имя домена, установленного для этого файла cookie |
void |
setDomain(String pattern) |
Устанавливает домен, внутри которого должен быть представлен данный файл cookie |
void i |
setPath(String uri) |
Устанавливает путь, по которому клиент должен будет возвращать cookie |
int |
getMaxAge( ) |
Возвращает время (в секундах), оставшееся до конца срока действия cookie. Значение, равное -1, которое устанавливается по умолчанию, означает, что cookie будет существовать, пока не отключится браузер, то есть только во время текущего сеанса |
void |
setMaxAgednt expiry) |
Устанавливает максимально допустимый срок действия cookie. Если это значение равно нулю, cookie немедленно уничтожается |
String |
getName( ) |
Имя cookie |
String |
getPath( ) |
Путь на сервере, по которому браузер возвращает cookie |
bool ean |
getSecure( ) |
Возвращает true, если браузер посылает cookie только по безопасным протоколам; возвращает f al se, если браузер может посылать cookie, используя любой протокол |
void |
setSecure(boolean flag) |
Указывает браузеру, должен ли файл cookie посылаться только по безопасному протоколу, например HTTPS или SSL |
int |
getVersion( ) |
Возвращает версию протокола, с которой согласуется cookie |
void |
setVersiondnt v |
Устанавливает версию протокола для cookie, с которой согласован данный файл cookie |
Специальные объекты, связанные с запросом
В интерфейсе RequestDispatcher определены два метода, которые позволяют одному сервлету или одной JSP-странице переадресовать или включить выходные данные другого сервлета или файл, находящийся на сервере. Вы получаете объект RequestDispatcher из объекта ServletRequest с конструктором, который указывает, какой ресурс должен быть присоединен. Этот объект создается процессором сер- влетов, как показано в следующем примере:
RequestDispatcher rd = req.getRequestDispatcher(String path)
Используя этот объект, вы можете вызвать любой из следующих методов:
forward(ServletRequest req, ServletResponse resp) include(ServletRequest req, ServletResponse resp)
Формирование ответа пользователю
В этом разделе мы рассмотрим классы и методы, связанные с отправкой данных в ответ на запрос пользователя.
ServletResponse. Объект, реализующий этот интерфейс, должен быть создан процессором сервлетов и передан методу service сервлета для передачи клиенту данных MIME.
HttpServletResponse. Расширение интерфейса ServletResponse, в котором добавляются некоторое методы, специфические для протокола HTTP.
Servl etOutputStream. Класс для создания потока двоичных данных как части ответа.
Методы интерфейса ServletResponse
Процессор сервлетов создает объект, реализующий интерфейс ServletResponse, прежде чем будет вызван ваш сервлет или JSP-страница. Методы этого класса перечислены в табл. А. 13.
Таблица А.13. Методы в интерфейсе ServletResponse
Тип возвращаемого значения |
Метод |
Описание |
void |
setBufferSize(int size) |
Устанавливает предпочтительный размер буфера для тела ответа |
void |
flushBuffer() |
Содержимое буфера отсылается клиенту |
void |
reset () |
Удаляет все данные из буфера, а также код состояния и заголовки |
int |
getBufferSize() |
Фактический размер буфера, используемый для ответа |
boolean |
isComitted() |
Возвращает true, если ответ был послан |
String |
getCharacterEncoding( ) |
Возвращает название набора символов, используемого в MIME-теле ответа |
Locale |
getLocale() |
Возвращает объект Locale (идентификатор региона), присоединенный к данному ответу |
Servl etOutputStream |
getOutputSrteam( ) |
Возвращает выходной поток, который используется для записи двоичных данных в ответе. Обратите внимание, что вы не можете поменять тип выходного потока после того, как он выбран. Это расширение java.io.OutputStream, и его можно использовать для создания специализированных выходных потоков, таких как ObjectOutputStream или ZipOutputStream |
PrintWriter |
getWriter() |
Возвращает выходной поток, предназначенный для записи символьного текста. Поскольку он осуществляет преобразование символов в соответствии с типом содержимого и идентификатором территории, вы должны задать эти параметры до того, как будут записаны какие-либо данные. Чтобы данные были посланы, вы можете использовать метод flush(). Когда сервлет заканчивает запись выходных данных, должен быть вызван метод close(), в противном случае клиент может никогда не получить ответ |
void |
setContentLength(int len) |
Устанавливает размер содержимого тела ответа. В НТТР-сервлетах этот метод устанавливает заголовок ответа протокола HTTP Content-Length. Он должен быть вызван до того, как фактически будет послано какое-либо содержимое. Размер содержимого, как правило, требуется указывать не для всех типов данных, а только для двоичных |
void |
setContentType(Srting type) |
Устанавливает тип содержимого ответа. Тип ответа должен быть одним из MIME- типов и может включать дополнительную информацию о кодировке. Например, для документа HTML, в котором используется набор символов Latin-4 для западноевропейских языков, будет указан следующий тип содержимого text/html : chatset=ISO-8859-4. Если набор символов не указан, по умолчанию будет использоваться ISO-8859-1 (ACSII) |
void |
setLocale ( Java.util.Locale loc) |
Задает идентификатор региона и соответствующим образом устанавливает заголовки (в том числе задает набор символов для Content-Type) |
Методы, добавляемые интерфейсом HttpServletResponse
Интерфейс HttpServletResponse расширяет ServletResponse и добавляет некоторые полезные методы, специфичные для протокола HTTP, которые перечислены в табл. А.14. Также в нем определен набор констант, соответствующих кодам состояния ответа, как, например, печально известное сообщение «404 — page not found». Заметим, что методы заголовков, которые начинаются с префикса add, могут добавлять значения в существующий заголовок, формируя список, разделенный запятыми, в то время как методы типа set замещают любой существующий заголовок с тем же именем.
Таблица А.14. Методы интерфейса HttpServletResponse
Тип возвращаемого значения |
Метод |
Описание |
void |
addCookie (Cookie cookie) |
Добавляет cookie в ответ. Этот метод можно вызывать многократно, но заметим, что браузер, возможно, будет способен принять только 20 файлов cookie из данного источника или вообще не принимать cookie |
void |
addDateHeader (String name, lonf date) |
Добавляет заголовок ответа с указанным именем и значением даты. Значение даты указывается в формате System. currentTimeMillisO, но значение заголовка ответа будет строкой с датой в формате GMT, например Тие, 15 Nov 1994 08:12:31 GMT |
void |
setDateHeader (String name, lonf date) |
Устанавливает заголовок ответа с указанным именем и значением даты. Любой установленный ранее заголовок с тем же именем будет потерян, поэтому здесь нужно проявить бдительность |
void |
addHeader (Srting name. String value) |
Добавляет заголовок запроса с указанным именем и значением. Если заголовок уже существует, то после его значения через запятую добавляется новое значение |
void |
setHeader (Srting name. String value) |
Устанавливает заголовок ответа с указанным именем и значением. Если заголовок с этим именем уже существует, то он заменяется новым |
void |
addlntHeader (Srting name, String value) |
Добавляет заголовок ответа с указанным именем и значением. Естественно, когда значение присоединяется к заголовку, оно преобразуется к типу String |
void |
setlntHeader (Srting name. String value) |
Устанавливает заголовок ответа с указанным именем и значением |
bool ean |
containsHeader(String name) |
Возвращает true, если заголовок с указанным именем уже был установлен |
void |
sendRedi rect (String location) |
Посылает ответ клиенту, используя указанный URL-адрес нового временного местоположения документа |
String |
encodeRedi rectURL (String url) |
Преобразует указанный URL-адрес в вид, пригодный для использования в методе sendRedi rect, или, если преобразования не требуется, возвращает тот же URL-адрес |
String |
encodeURUSrting url) |
Перекодирует указанный URL-адрес, включая в него идентификатор сеанса, или, если перекодировка не требуется, возвращает URL без изменения |
void |
sendError(int sc) |
Посылает клиенту код ошибки HTTP |
void |
sendError (int sc. Srting msg) |
Посылает код ошибки с описанием |
void |
setStatus(int sc) |
Устанавливает код состояния для ответа |
Экземпляр класса JspWriter, называемый out, автоматически создается в методе _jspService класса PageContext. Объект JspWriter аналогично объекту Java.iо.PrintWriter записывает поток символов в специальной кодировке. Но между ними имеется значительная разница: методы класса JspWriter для вывода данных могут генерировать исключение lOException. В классе PrintWriter исключение IOЕхсерtion обрабатывается внутри, и программист должен вызывать метод checkError(), чтобы узнать, было ли сгенерировано исключение.
Способность генерировать исключение lOException является существенной для управления буферизацией, которую осуществляет JspWriter.
В API сервлетов предусмотрены специальные классы исключений — ServletException и UnavaliableException, описанные ниже.
ServletException. Исключение общего назначения, которое используется в API сервлетов. Конструкторы, представленные в табл. А.15, предлагают различные способы включения других ошибок (Error) и исключений (Exception) с объяснениями или без них. Для того чтобы извлечь из класса ServletException включенные в него объекты Error или Exception, используйте метод getRootCause().
UnavaliableException. Это исключение генерируется, если сервлету нужно сообщить, что он временно или постоянно недоступен. Причиной этого может быть недостаток поддержки со стороны системы — невозможность соединения с базой данных, недостаток памяти или места на диске. В табл. А. 16 объясняется, каким образом используется это исключение и почему оно полезно.
Таблица А.15. Конструкторы класса ServletException
Конструктор |
Описание |
Servl etExcepti on( ) |
Конструирует новое исключение сервлета |
ServletException (Java.Tang.String message) |
Конструирует новое исключение сервлета с заданным сообщением |
ServletException (java.lang.Throwable rootCause) |
Конструирует новое исключение сервлета в результате возникновения исключительной ситуации в системе, и включает системное сообщение (rootCause), объясняющее причину этой исключительной ситуации, нарушившей нормальный ход выполнения сервлета |
ServletException ( Java.lang.String message. java.lang.Throwable rootCause) |
Конструирует новое исключение сервлета в результате возникновения исключительной ситуации в системе и включает системное сообщение (rootCause), объясняющее причину этой исключительной ситуации, нарушившей нормальный ход выполнения сервлета, а также строку с описанием нового исключения сервлета |
Таблица А. 16. Конструкторы класса UnavaliableException
Конструктор |
Описание |
Unavaliabl eException (Java.lang.String message) |
Конструирует новое исключение сервлета с сообщением, что данный сервлет постоянно недоступен |
Unavaliabl eException (Java.lang.String message, int seconds) |
Конструирует новое исключение сервлета с сообщением, что данный сервлет временно недоступен, и с оценкой времени, в течение которого он будет недоступен |
Ошибки и исключения JSP-страниц
Как говорилось в главе 5, в API для JSP-страниц предусмотрено специальное обозначение страницы, которая обрабатывает все исключения. Эта страница задается с помощью атрибута еггогРаде директивы page, подобно тому как показано в следующем примере:
<%@ page language= "Java" ErrorPage = "JSPbook/Chapt02/whoops.jsp" %>
Любая JSP-страница, назначенная обрабатывать ошибки, должна включать тег, аналогичный приведенному ниже:
<%@ page language= "Java" isErrorPage = "true" %>
Этот тег устанавливает параметр isErrprPage, гарантирующий, что в данной странице имеется заданная по умолчанию переменная с именем exception, через которую страница получает доступ к фактически сгенерированному исключению или ошибке. Эта переменная ссылается на один из двух связанных с ошибками классов — JspException или JspError. В этих классах нет никаких специальных методов, кроме определенных в родительском классе, Java.lang.Exception. В табл. А. 17 перечислены конструкторы классов JspException и JspError.
Таблица А.17. Конструкторы классов JspException и JspError
Конструктор |
Определение |
JspException() |
Конструирует объект JspException |
JspException(String msg) |
Исключение с сообщением |
JspError() |
Обратите внимание, что класс JspError происходит от класса JspException |
JspError(String msg) |
Добавляет сообщение об ошибке |
В интерфейс HttpServl etResponse входят константы для обозначения всех кодов состояний и ошибок HTTP. Они перечислены в табл. А. 18. По существу это та же информация, которая содержится в спецификации RFC 2616, где описан стандарт HTTP 1.1. Вообще коды можно разделить на следующие категории:
серия 100-199 — информационные коды, процесс продолжается;
серия 200-299 — коды указывают, что процесс был успешным;
серия 300-399 — переадресация, для выполнения запроса требуются дальнейшие действия;
серия 400-499 — ошибка клиента, в запросе содержатся синтаксические ошибки или запрос не может быть выполнен;
серия 500-599 — ошибка сервера, сервер отказывается выполнять заведомо корректный запрос.
Сами коды ошибок перечислены в табл. А. 19.
Таблица А.18. Константы HTTP для кодов состояний
Имя константы |
Величина |
Описание |
SC_CONTINUE |
100 |
Клиент может продолжать работу |
SC_SWITCHING_PROTOCOLS |
101 |
Сервер меняет протоколы в соответствии с содержимым заголовка Upgrade HTTP-запроса |
SCJJK |
200 |
Запрос обработан успешно |
SC_CREATED |
201 |
Запрос обработан успешно, на сервере в ответ на него создан новый документ |
SC_ACCEPTED |
202 |
Запрос был принят, но его обработка еще не закончена |
SC NON AUTHORITATIVE INFORMATION |
203 |
Некоторые заголовки ответов могут быть неверными, так как используется копия документа |
SC_NO_CONTENT |
204 |
Запрос обработан успешно,, но отсутствует новая информация, которую можно было бы вернуть с ответом |
SC_RESET_CONTENT |
205 |
Браузер должен обновить документ, который вызвал отправку запроса на сервер |
SC_PARTIAL_CONTENT |
206 |
Сервер выполнил частичный запрос для данного ресурса методом GET |
SC_MULTIPLE_CHOICES |
300 |
Запрошенный ресурс представлен в нескольких документах, расположенных в разных местах |
SC_MOVED_PERMANENTLY |
301 |
Ресурс перемещен в новое место, где он будет находиться постоянно. Все дальнейшие ссылки на этот ресурс должны использовать новый URI-адрес |
SCJWEDJEMPORARI LY |
302 |
Ресурс перемещен в новое место временно. Все дальнейшие ссылки для доступа к этому ресурсу должны использовать прежний URI-адрес |
SC_SEE_OTHER |
303 |
Ответ на данный запрос может быть найден с использованием другого URI-адреса |
SC_NOT_MODIFIED |
304 |
В результате выполнения условного запроса методом GET оказалось, что данный ресурс доступен, но не был изменен |
SC_USE_PROXY |
305 |
Запрашиваемый ресурс должен возвращаться через прокси-сервер, заданный в поле Location |
Таблица А.19. Константы для кодов ошибок HTTP
Имя константы |
Величина |
Описание |
SC_BAD_REQUEST |
400 |
Запрос, посланный клиентом, синтаксически неверен |
SC_UNAUTHORIZED |
401 |
В поле Authorization запроса отсутствует необходимая для аутентификации информация |
SC_PAYMENT_REQUIRED |
402 |
Зарезервировано для будущего использования |
SC_FORBIDDEN |
403 |
Сервер понимает запрос, но отказывается его выполнить |
SC_NOT_FOUND |
404 |
Запрошенный ресурс невозможно найти по указанному адресу |
SC_METHOD_NOT_ALLOWED |
405 |
Заданный метод запроса не разрешен для ресурса, идентифицированного с помощью указанного URJ- адреса |
SC_NOT_ACCEPTABLE |
406 |
Запрашиваемый ресурс может генерировать ответы только таких MIME-типов, которые несовместимы с типами, заданными клиентом в поле Accept запроса |
SC PROXY AUTHENIFICATION REQUIRED |
407 |
Клиент должен пройти аутентификацию на прокси-сервере |
SC_REQUEST_TIMEOUT |
408 |
Клиент не послал запрос в тот промежуток времени, когда сервер был готов принять его |
SC_CONFLICT |
409 |
Запрос не может быть выполнен из-за конфликта с текущим состоянием ресурса |
SCJ30NE |
410 |
Ресурс недоступен более на этом сервере, и не указан адрес для перенаправления запроса |
SC_LENGTH_REQUIRED |
411 |
Запрос не может быть выполнен в отсутствие определенного клиентом заголовка Content -Length |
SC_PRECONDITION_FAILED |
412 |
Входное условие, заданное в одном или нескольких полях заголовка запроса, при тестировании на сервере оказалось ложным |
SC_REQUEST_ENTITYJOO_LARGE |
413 |
Сервер отказывается обрабатывать запрос, так как размер запрашиваемого документа больше, чем сервер готов или способен обрабатывать |
SC_REQUESTJJRI_TOO_LONG |
414 |
Сервер отказывается выполнять запрос, так как приведенный в нем URI-адрес слишком длинный для того, чтобы сервер мог его обработать |
SC_UNSUPPORTED_MEDIA_TYPE |
415 |
Сервер отказывается выполнять запрос, так как в запросе содержится документ в таком формате, который не поддерживается запрошенным ресурсом для метода, указанного в запросе |
SC REQUESTED RANGE NOT SATISFIABLE |
416 |
В запросе содержится невыполнимый для сервера заголовок Range |
SC_EXPECTATION_FAILED |
417 |
Сервер не может выполнить то задание, которое указано в заголовке Expect запроса клиента |
SC_INTERNAL_SERVER_ERROR |
500 |
Запрос не может быть выполнен по причине ошибки внутри HTTP-сервера |
SC_NOT_IMPLEMENTED |
501 |
HTTP-сервер не поддерживает функции, необходимые для выполнения запроса |
SC_BAD_GATEWAY |
502 |
HTTP-сервер получил неверный ответ от удаленного сервера, по отношению к которому он выполнял роль прокси-сервера или шлюза |
SC_SERVICE_INAVAILABLE |
503 |
HTTP-сервер временно перегружен и не может ответить на запрос |
SC_GATEWAY_TIMEOUT |
504 |
Сервер, который используется в качестве прокси- сервера или шлюза, не получил своевременный ответ от удаленного сервера |
SC HTTP VERSION NONSUPPORTED |
505 |
Сервер не поддерживает или отказывается поддерживать версию протокола HTTP, используемую в запросе |
ПРИМЕЧАНИЕ
Для диагностики кодов ошибок в Microsoft Internet Explorer имеется так называемый дружественный режим, который не позволяет пользователю увидеть фактические сообщения об ошибках в сервлетах или JSP-страницах. Для отключения этого режима выберите команду Tools > Internet Options (Сервис > Свойства обозревателя), в открывшемся окне перейдите на вкладку Advanced (Дополнительно) и снимите флажок Show Friendly Http Error Messages (Показывать уведомление о каждой ошибке сценария).
В табл. А.20 приведены переменные, которые, за исключением переменных session и exception, всегда создаются в JSP-странице. Переменная session недоступна, если в директиве страницы присутствует выражение session="false". Переменная exception доступна только в том случае, если атрибут isErrorPage имеет значение true, как показано в следующем примере:
<%@page language = "Java" isErrorPage = "true"
Таблица А.20. Неявные переменные в JSP-страницах
Имя переменной |
Тип |
Описание |
request |
Объект класса, являющегося подклассом класса javax.servlet.Servl etRequest |
Представляет запрос пользователя |
response |
Объект класса, являющегося подклассом класса javax.servlet.Servl etResponse |
Создает ответ на запрос |
pageContext |
Объект класса javax.servlet.jsp.PageContext |
Содержит атрибуты страницы |
session |
Объект класса javax.servlet.http.HttpSession |
Содержит произвольные переменные, связанные с данным сеансом |
application |
Объект класса javax.servlet.ServletContext |
Содержит атрибуты для всего приложения и влияет на интерпретацию некоторых других тегов |
out |
Объект класса javax.servlet.jsp.JspWriter |
Выходной поток для данного ответа |
config |
Объект класса javax.servlet.ServletConfig |
Содержит пары имя-значение для параметров инициализации сервлета и объект Servl etContext |
page |
Ссылка на объект, синоним указателя this |
Возвращает ссылку на сервлет |
exception |
Объект класса javax.lang.Throwable или одного из его подклассов |
Только те страницы, которые обозначены в директиве страницы как страницы ошибок |
Интерфейсы JspPage и HttpJspPage очень просты, как видно из табл. А.21. Поскольку за создание метода _jspService отвечает процессор JSP, вам нужно определить только методы jsplnit и jspDestroy.
Таблица А.21. Методы интерфейсов JspPage и HttpJspPage
Метод |
Интерфейс |
Описание |
void jspDestroy() |
JspPage |
Этот метод вызывается, когда JSP-страница должна быть уничтожена. Метод используется для удаления всех ресурсов |
void jspInit() |
JspPage |
Этот метод вызывается, когда JSP-страница инициализируется. Метод используется для установления значений параметров |
void _jspService (HttpServletRequest request, HttpServletResponse response) |
HttpJspPage |
Этот метод создается процессором JSP для написания тела JSP-страницы |
Класс PageContext — это абстрактный класс. Для конкретного сервера класс, расширяющий PageContext, создается процессором JSP. Объект PageContext управляет всеми генерируемыми процессором JSP ресурсами, которые требуются серв- лету. Важно отметить, что при управлении ресурсами используются различные области видимости.
Доступ к стандартным переменным
В классе PageContext предусмотрены методы для получения ссылок на стандартные (неявные) переменные JSP, которые перечислены в табл. А.20. Поскольку эти переменные автоматически определены в вашей JSP-странице (в методе _jspService()), методы, перечисленные в табл. А.22, используются в основном в других классах.
Таблица А.22. Методы класса PageContext, предназначенные для получения неявных переменных
Неявная переменная |
Тип |
Метод PageContext |
exception out page request response config application session |
Exception JspWriter Object ServletRequest ServletResponse ServletConfig ServletContext HttpSession |
getException() getOut() getPage() getRequest() getResponse() getServletConfig() getServletContext() getSession() |
В табл. А.23 перечислены методы класса PageContext, которые используются для извлечения различных объектов. Обратите внимание на то, что переменные области видимости являются ссылками на константы класса PageContext (см. табл. А.25).
Таблица А.23. Методы класса PageContext, связанные с хранением и извлечением атрибутов
Тип возвращаемого значения |
Метод |
Описание |
Object |
getAttribute(String name) |
Возвращает объект, связанный с указанным именем, областью видимости которого является страница. Если такой объект на странице не обнаружено, возвращается null |
void |
removeAttribute (String name) |
Объект с указанным именем, относящийся к любой области видимости, удаляется |
void |
setAttribute (String name, Object attribute) |
Возвращает объект, который становится атрибутом страницы с именем name и значением attribute |
Object |
getAttribute (String name, int scope) |
Возвращает объект, связанный с указанным именем, в заданной области видимости. Если в этой области объект с таким именем не обнаружен, возвращается null |
void |
removeAttri bute (String name, int scope) |
Удаляет объект, связанный с данным именем |
void |
setAttribute(String name. Object obj. int scope) |
Возвращает объект, который становится атрибутом с именем name и значением obj. Область видимости задается параметром scope |
Enumeration |
getAttri buteNames I nScope (int scope) |
Возвращает перечисление объектов типа String, которые являются атрибутами с указанной областью видимости |
int |
getAttri buteScope (String name) |
Возвращает область видимости атрибута с указанным именем |
Object |
findAttribute(String name) |
Ищет атрибут с заданным именем последовательно в странице, запросе, сеансе (если он существует) и приложении. Возвращает значение атрибута или mil 1 , если такой атрибут не обнаружен |
В табл. А.24 перечислены методы класса PageContext, которые не вошли ни в одну из приведенных выше категорий.
Таблица А.24. Остальные методы класса PageContext
Тип возвращаемого значения |
Метод |
Описание |
void |
forward (String relativeUrlPath) |
Переадресует текущие объекты классов ServletRequest и Servl etResponse другому активному компоненту приложения |
void |
hand! ePageExcepti on (Exception e) |
Этот метод вызывается из раздела try- catch, который включает в себя код вашей JSP-страницы. Он переадресует исключение специальной странице ошибок для данной JSP-страницы или, если она отсутствует, выполняет определенное на этот случай действие |
void |
include (String relativeUrlPath) |
Указанный ресурс обрабатывается как часть текущих объектов классов ServletRequest и ServletResponse |
void |
initialize(Servlet serlet, ServletRequest request, ServletResponse response. String errorPageURL, boolean needsSession, int bufferSize, boolean authFlush) |
Метод вызывается для инициализации объекта PageContext, чтобы его можно было использовать в классе реализации JSP для обслуживания входящих запросов и ответов в методе jspService. Вызов метода осуществляется процессором JSP |
JspWriter |
popBody() |
Возвращает предыдущий объект out класса JspWriter, который был сохранен в соответствующем методе pushBody(), а затем обновляет значение атрибута out в пространстве имен атрибутов PageContext с областью видимости, равной странице |
BodyContent |
pushBody() |
Возвращает новый объект BodyContent, сохраняет текущий объект out класса JspWriter и обновляет значение атрибута out в пространстве имен атрибутов PageContext с областью видимости, равной странице |
void |
release() |
Восстанавливает исходное состояние объекта PageContext, чтобы он мог быть повторно использован. Вызов этого метода осуществляется процессором JSP |
В классе PageContext определено некоторое количество констант, в основном относящихся к определению области видимости. Эти константы приведены в табл. А.25.
Таблица А.25. Константы, определенные в классе PageContext
Тип |
Имя |
Описание |
String |
APPLICATION |
Имя, используемое для хранения объекта класса Servl etContext в таблице имен PageContext |
int |
APPLICATION_SCOPE |
Область видимости — приложение: ссылка в классе Servl etContext остается доступной, пока приложение не будет запущено заново |
String |
CONFIG |
Имя, используемое для хранения объекта класса Servl etContext в таблице имен PageContext |
String |
EXCEPTION |
Имя, используемое для хранения не перехваченного исключения |
Stri ng |
OUT |
Имя, используемое для хранения текущего объекта класса JspWriter в таблице имен PageContext |
String |
PAGE |
Имя, используемое для хранения объекта класса Servlet в таблице имен PageContext |
int |
PAGE_SCOPE |
Область видимости — страница (задается по умолчанию): ссылка остается доступной в данном классе PageContext до окончания выполнения метода serviceO сервлета |
String |
PAGECONTEXT |
Имя, используемое для хранения объекта класса PageContext в его собственной таблице имен |
String |
REQUEST |
Имя, используемое для хранения объекта класса ServletRequest в таблице имен PageContext |
int |
REQUEST_SCOPE |
Область видимости — запрос: ссылка остается доступной в объекте ServletRequest, связанном сданным сервлетом, пока не будет выполнен текущий запрос |
String |
RESPONSE |
Имя, используемое для хранения объекта класса ServletResponse в таблице имен PageContext |
String |
SESSION |
Имя, используемое для хранения объекта класса HttpSession в таблице имен PageContext |
int |
SESSIONJCOPE |
Область видимости — сеанс (только в том случае, если страница участвует в сеансе): ссылка остается доступной в объекте HttpSession (если он существует), связанном с сервлетом, пока объект HttpSession не станет недействительным |
Класс JspWriter является расширением абстрактного класса Java.io.Writer. Назначение этого класса — обеспечивать функциональность вывода данных, аналогичную функциональности классов BufferWriter и PrintWriter в JSP, как видно из табл. А.26. Важное различие между этими классами заключается в том, что методы JspWriter могут генерировать исключение lOException, в то время как методы PrintWriter не могут этого делать.
Таблица А.26. Перечень методов управления буферизацией класса JspWriter
Тип возвращаемого значения |
Метод |
Описание |
void |
clear() |
Очищает содержимое буфера. Если какое-либо содержимое было сброшено в выходной поток, генерирует исключение lOException, чтобы предупредить приложение о том, что некоторые данные уже посланы |
void |
clearBuffer() |
Очищает содержимое буфера, но не генерирует исключение, если какие-либо данные уже были отосланы |
void |
close() |
Закрывает поток после того, как сброшено содержимое |
void |
flush() |
Сбрасывает содержимое потока |
int |
getBufferSize() |
Текущий размер буфера |
int |
getRemaining() |
Неиспользованное пространство в буфере |
boolean |
isAutoFlush() |
Состояние флага Autoflush |
Методы для вывода данных в классе JspWriter, приведенные в табл. А.27, аналогичны методам класса java.io.PrintWriter, но они могут генерировать исключение lOException, если возникает какая-либо проблема с выходным потоком.
Таблица А.27. Методы для вывода данных класса JspWriter
Тип возвращаемого значения |
Метод |
Описание |
void |
newLine() |
Записывает разделитель строк |
void |
print(boolean b) |
Выводит булево значение |
void |
print(char c) |
Выводит символ |
void |
print(char[] s) |
Выводит массив символов |
void |
print(double d) |
Выводит число двойной точности с плавающей точкой |
void |
print( float f) |
Выводит число с плавающей точкой |
void |
print(int i) |
Выводит целое число |
void |
print (long 1) |
Выводит длинное целое число |
void |
print(java.lang.Object obj) |
Выводит значение типа Object |
void |
print(java.lang.String s) |
Выводит значение типа String |
void |
println() |
Завершает текущую строку разделителем строк |
void |
print! n(boolean x) |
Выводит булево значение, после чего завершает строку |
void |
println(char x) |
Выводит символ, после чего завершает строку |
void |
println(char[] x) |
Выводит массив символов, после чего завершает строку |
void |
println( double x) |
Выводит число двойной точности с плавающей точкой, после чего завершает строку |
void |
println(float x) |
Выводит число с плавающей точкой, после чего завершает строку |
void |
printlndnt x) |
Выводит целое число, после чего завершает строку |
void |
printlndong x) |
Выводит длинное целое число, после чего завершает строку |
void |
println(java.lang.Object x) |
Выводит значение типа Object, после чего завершает строку |
void |
println(Java.lang.String x) |
Выводит значение типа String, после чего завершает строку |
Пакет javax.servlrt.jsp.tagext
При создании пользовательских тегов JSP вам понадобятся только некоторые классы из этого пакета. Пользовательский тег должен расширять либо интерфейс Tag, либо интерфейс BodyTag. Методы интерфейса Tag перечислены в табл. А.28.
Таблица А.28. Методы интерфейса Tag
Тип возвращаемого значения |
Метод |
Описание |
int |
doEndTag() |
Определяет код, который вызывается, если обнаруживается закрывающий тег |
int |
doStartTag() |
Определяет код, который вызывается, если обнаруживается открывающий тег для данного экземпляра |
Tag |
getParent() |
Для вложенных тегов возвращает родителя данного обработчика тега |
void |
release() |
Вызывается обработчиком тега для возвращения к исходному состоянию |
void |
setPageContext (PageContext pc) |
Устанавливает контекст текущей страницы |
void |
setParentdag () |
Устанавливает текущий родительский (ближайший из внешних по отношению к данному) объект Tag для данного объекта Tag |
Интерфейс Tag предназначен для работы с пользовательскими тегами, для которых не требуется обработка тела тега. Для того чтобы иметь возможность обрабатывать тело тега, вам следует добавить методы интерфейса BodyTag, приведенные в табл. А.29.
Таблица А.29. Интерфейс BodyTag добавляет следующие методы
Тип возвращаемого значения |
Метод |
Описание |
int |
doAfterBody() |
Выполняет действия после обработки тела тега |
void |
doIntBody() |
Подготовка к обработке тела тега |
void |
setBodyContent( BodyContent b) |
Устанавливает свойство bodyContent |
Этот класс является подклассом класса JspWriter и наследует его методы, приведенные в табл. А.26 и А.27. Также этот класс добавляет новые методы, представленные в табл. А.ЗО, для буферизации символьной информации и манипулирования ею. Обратите внимание, что метод flush должен быть переопределен, так как объект BodyContent присоединяется не к выходному потоку, а только к внутреннему буферу.
Таблица А.З0. Методы класса BodyContent
Тип возвращаемого значения |
Метод |
Описание |
void |
clearBody() |
Очищает буфер тела тега, обычно в процессе подготовки к повторному считыванию тела тега в буфер |
void |
flush() |
Переопределяет метод flush() класса JspWriter, поскольку объект BodyContent не может быть сброшен. Генерирует исключение lOException |
JspWriter |
getEnclosingWriter ( ) |
Получает ближайший внешний (enclosing) объект JspWriter |
Reader |
getReader() |
Возвращает объект класса Reader, который может получить доступ к объекту BodyContent |
Srting |
getString() |
Возвращает значение BodyContent в виде строки типа String |
void |
writeOut(java.io.Writer out) |
Записывает содержимое объекта BodyContent в выходной поток Writer |