к библиотеке   к оглавлению   Банки данных Интернет   визуальные среды - 4GL   технологии программирования

Язык XML

Интерфейсы API для сервлетов и JSP-страниц

Работая с интерфейсами прикладных программ (API) сервлетов и JSP-страниц, мы обнаружили, что документация JDK, очень основательная в отношении описания классов, содержит мало полезной функциональной информации. Формальные описания API 2.2 для сервлетов и API 1.1 для JSP-страниц также, на наш взгляд, трудно применить на практике. Цель этого приложения — представить наиболее часто используемые интерфейсы API с функциональной точки зрения, сопровождая их описание рекомендациями по применению.

Мы будем заниматься следующими пакетами:

 

Параметры приложений

В интерфейсах API для сервлетов и JSP-страниц параметры рассматриваются как объекты, обладающие определенной областью видимости. Эта область состоит из тех частей системы, в которых применение данного параметра является корректным. Перечислим области видимости в порядке убывания: сервер, приложение, сеанс, запрос и страница.

 

Создание сервлета

Поскольку методы сервлета определяются в интерфейсе, а интерфейсы не могут определять конструкторы, инициализация сервлета полностью осуществляется в методе init. Процессор сервлетов непременно вызывает метод init после того, как сервлет разработан, и прежде, чем обработан первый запрос. Методу init, согласно определению интерфейса Servlet, передается объект ServletConfig, который может быть использован для получения параметров инициализации. Между интерфейсами SevletConfig и ServletContext имеют место отличия, которые нужно учитывать.

Все процессоры сервлетов предусматривают определение параметров инициализации, которые должны быть переданы данному сервлету. Соглашения о том, каким образом администратор сервера устанавливает эти параметры, могут быть различными для разных процессоров, но основная идея остается неизменной. Будем надеяться, что количество производителей, использующих стандартный подход 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)

Вызывается контейнером сервлетов для того, чтобы сервлет получил возможность ответить на запрос

 

Методы класса HttpServlet

Класс 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

Процессор сервлетов создает объект, этот интерфейс 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

Обратите внимание на аналогию между методами, относящимися к атрибутам (перечисленным в табл. А. 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, то есть объект должен реализовать два показанных ниже метода.

 

Методы класса Cookie

Конструктор 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

Процессор сервлетов создает объект, реализующий интерфейс 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)

Устанавливает код состояния для ответа

 

Выходные данные JSP-страниц

Экземпляр класса JspWriter, называемый out, автоматически создается в методе _jspService класса PageContext. Объект JspWriter аналогично объекту Java.iо.PrintWriter записывает поток символов в специальной кодировке. Но между ними имеется значительная разница: методы класса JspWriter для вывода данных могут генерировать исключение lOException. В классе PrintWriter исключение IOЕхсерtion обрабатывается внутри, и программист должен вызывать метод checkError(), чтобы узнать, было ли сгенерировано исключение.

Способность генерировать исключение lOException является существенной для управления буферизацией, которую осуществляет JspWriter.

 

Ошибки и исключения

В API сервлетов предусмотрены специальные классы исключений — ServletException и UnavaliableException, описанные ниже.

Таблица А.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)

Добавляет сообщение об ошибке

 

Коды состояний и ошибок HTTP

В интерфейс HttpServl etResponse входят константы для обозначения всех кодов состояний и ошибок HTTP. Они перечислены в табл. А. 18. По существу это та же информация, которая содержится в спецификации RFC 2616, где описан стандарт HTTP 1.1. Вообще коды можно разделить на следующие категории:

Сами коды ошибок перечислены в табл. А. 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 (Показывать уведомление о каждой ошибке сценария).

 

Интерфейс API для JSP-страниц

В табл. А.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 — это абстрактный класс. Для конкретного сервера класс, расширяющий 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

Класс 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

 

Класс 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

к библиотеке   к оглавлению   Банки данных Интернет   визуальные среды - 4GL   технологии программирования

Знаете ли Вы, низкочастотные электромагнитные волны частотой менее 100 КГц коренным образом отличаются от более высоких частот падением скорости электромагнитных волн пропорционально корню квадратному их частоты от 300 тыс. км/с при 100 кГц до примерно 7 тыс км/с при 50 Гц.

НОВОСТИ ФОРУМА

Форум Рыцари теории эфира


Рыцари теории эфира
 10.11.2021 - 12:37: ПЕРСОНАЛИИ - Personalias -> WHO IS WHO - КТО ЕСТЬ КТО - Карим_Хайдаров.
10.11.2021 - 12:36: СОВЕСТЬ - Conscience -> РАСЧЕЛОВЕЧИВАНИЕ ЧЕЛОВЕКА. КОМУ ЭТО НАДО? - Карим_Хайдаров.
10.11.2021 - 12:36: ВОСПИТАНИЕ, ПРОСВЕЩЕНИЕ, ОБРАЗОВАНИЕ - Upbringing, Inlightening, Education -> Просвещение от д.м.н. Александра Алексеевича Редько - Карим_Хайдаров.
10.11.2021 - 12:35: ЭКОЛОГИЯ - Ecology -> Биологическая безопасность населения - Карим_Хайдаров.
10.11.2021 - 12:34: ВОЙНА, ПОЛИТИКА И НАУКА - War, Politics and Science -> Проблема государственного терроризма - Карим_Хайдаров.
10.11.2021 - 12:34: ВОЙНА, ПОЛИТИКА И НАУКА - War, Politics and Science -> ПРАВОСУДИЯ.НЕТ - Карим_Хайдаров.
10.11.2021 - 12:34: ВОСПИТАНИЕ, ПРОСВЕЩЕНИЕ, ОБРАЗОВАНИЕ - Upbringing, Inlightening, Education -> Просвещение от Вадима Глогера, США - Карим_Хайдаров.
10.11.2021 - 09:18: НОВЫЕ ТЕХНОЛОГИИ - New Technologies -> Волновая генетика Петра Гаряева, 5G-контроль и управление - Карим_Хайдаров.
10.11.2021 - 09:18: ЭКОЛОГИЯ - Ecology -> ЭКОЛОГИЯ ДЛЯ ВСЕХ - Карим_Хайдаров.
10.11.2021 - 09:16: ЭКОЛОГИЯ - Ecology -> ПРОБЛЕМЫ МЕДИЦИНЫ - Карим_Хайдаров.
10.11.2021 - 09:15: ВОСПИТАНИЕ, ПРОСВЕЩЕНИЕ, ОБРАЗОВАНИЕ - Upbringing, Inlightening, Education -> Просвещение от Екатерины Коваленко - Карим_Хайдаров.
10.11.2021 - 09:13: ВОСПИТАНИЕ, ПРОСВЕЩЕНИЕ, ОБРАЗОВАНИЕ - Upbringing, Inlightening, Education -> Просвещение от Вильгельма Варкентина - Карим_Хайдаров.
Bourabai Research - Технологии XXI века Bourabai Research Institution