WWW.DISSERS.RU

БЕСПЛАТНАЯ ЭЛЕКТРОННАЯ БИБЛИОТЕКА

   Добро пожаловать!

текст сценария, выполняющего вызов элемента управления ditCard, представлен в листинге 8-8.

Листинг 8-8 Вы найдете в файле на прилагае мом к книге компакт-диске.

В начале своей работы сценарий создает объект Credi tCard, указывая его идентификатор:

var = Ссылка на объект записывается в с помощью которой мы будем к свойствам и методам объекта.

Первым делом необходимо из нолей формы информацию о платеже.

Мы это делаем помощью объекта Request:

= = var = != "") = 10);

cc. = 0;

Так как в форме может быть указан пустой идентификатор, мы обрабатыва ем такую ситуацию как ошибочную, записывая при этом в свойство нулевое значение.

350 Базы данных в Интернете. Практическое руководство Далее сценарий вызывает метод SendPayData:

Результаты работы метода SendPayData извлекаются из свойств элемента уп равления и сохраняются в соответствующих локальных переменных:

var Result = = sErrorURL = sNotificationURL = Далее, если метод выполнен без ошибок (то есть если в свойстве Result находится нулевое значение), наш сценарий отображает содержимое всех свойств объекта:

== 0) Х>

Pages:     | 1 |   ...   | 3 | 4 || 6 |

«Вячеславович Фролов, Григорий Вячеславович Фролов в Интернете практическое руководство по созданию Web-приложений с базами данных Издание исправленное УДК 004.7 ББК 32.973.202 Фролов А. В., Фролов Г. ...»

-- [ Страница 5 ] --

В случае успеха функция TRUE, а при ошибке — значе ние FALSE. Код ошибки можно получить посредством функции что после данных функция WriteClient записывает в пе ременную, адрес которой был ей передан через параметр IpdwBytes, количество успешно байт данных. В отличие от ReadClient, функция WriteClient посылает данные за один прием, поэтому нет необходимости вызы вать ее в цикле. Если же эта функция смогла передать только часть данных, то это означает, что произошла ошибка.

Функция Прототип функции ServerSupportFuncti on, определенный в структуре типа приведен ниже:

BOOL (WINAPI hConn, DWORD LPVOID LPDWORD IpdwSize, LPDWORD 320 Базы данных в Интернете. Практическое руководство Через параметр передается идентифи катор канала, через поле структуры Параметр позволит задать из нескольких кодов запроса, определяющих операцию, выполняемую этой Через параметр передается размер буфера, который при выполнении операции. Размер этого буфера должен быть записан в перемен ной типа DWORD, адрес которой передается через параметр После выпол нения операции передачи данных в эту переменную будет записан размер успеш но переданного данных.

Параметр IpdwDataType для указания дополнительной строки заголовка или дополнительных данных, которые будут добавлены к заголовку, удаленному Если для параметра IpdwDataType указать значение NULL (что допустимо), к заголовку будут добавлены символы конца строки Какие операции допустимо при помощи функции ServerSupport Function?

Ниже мы привели список возможных значений параметра dwHSERRequest, оп ределяющего код выполняемой операции.

Эта операция для пересылки удаленному пользователю стан дартного заголовка HTTP. Если надо добавить другие следует вос пользоваться параметром IpdwDataType. В качестве дополнительного заголов ка Вы можете указать любую строку, закрытую символами конца строки и двоичным нулем.

Если Ваше расширение ISAPI динамически формирует документ HTML и отправляет его пользователю, то ей не нужно вызывать функцию WriteClient.

Все необходимые для этого действия можно сделать средствами одной толь ко функции Ниже мы показали фрагмент в ко тором эта функция используется для посылки документа HTML, ленного заранее в буфере CHAR from ISAPI strcat(szBuff, NULL, NULL, Заметим, что функция ServerSupportFunction не позволяет посылать двоичные данные. Для отправки двоичных данных Вы обязательно должны применить функцию WriteCl ient.

Глава 7. Расширения CG! и 1SAPI сервера Web Используя операцию расширение ISAPI может послать удаленному пользователю данные, хранящиеся по определенному адресу URL, как будто бы эти данные были непосредственно пользова телем по этому адресу URL. Это удобно для отправки либо динамически со зданных данных, либо предварительно подготовленных данных.

Адрес URL должен быть указан в виде текстовой строки, двоичным через Размер строки задают в параметре IpdwSize.

Что же касается параметра то выполнении данной опера ции этот параметр игнорируется.

Отправка сообщения с номером 302 (URL Redirect). Адрес URL указывает ся аналогично тому, как это делается выполнении операции • Преобразование логического адреса URL в физический. Адрес логического пути передается через параметр IpvBuffer. По этому же адресу записывает ся результат преобразования. Размер буфера при вызове функции задается, как обычно, с помощью параметра IpdwSize.

После выполнения преобразования в переменную типа DWORD, адрес которой указан параметром IpdwSize, будет записана длина строки результата преоб разования.

В том случае, когда расширение ISAPI оставляет канал открытым для выпол длительной обработки данных, этой командой сообщить серве ру о завершении обработки. Все параметры функции при указании этой команды игнорируются.

Приложение ISHELLO В качестве нашего первого расширения 1SAPI мы предлагаем приложение ISHELLO, выполняющее простейшие функции.

Вызов расширения ishello.dll выполняется из формы, исходный текст кото рой приведен в листинге 7-9.

Листинг 7-9 Вы найдете в файле на прилагаемом к книге компакт-диске.

Расширение вызывается в параметре ACTION тега аналогично тому, как это делается для программ CGI:

После вызова наше динамически создает на рис. 7-7.

Базы данных в Практическое Hello from Extension!

POST D image fe-xbrtmap, 5.0. NT, deflate I Local Рис. 7-7. Документ HTML, динамически расширением В части этого отображается содержимое некоторых полей структуры а в нижней — содержимое переменной ALL_HTTP, полученное с помощью функции GetServerVariable.

Исходный текст расширения ishello.dll представлен в листинге 7-10.

Листинг 7-10 Вы найдете в файле на прилагаемом к кни ге компакт-диске.

Наряду с обычным для приложений Windows файлом мы в исходный текст файл в котором определены все необходи мые константы, структуры данных и прототипы функций:

ffinclude Этот файл поставляется в Microsoft Visual C++.

В определена — ее мы уже рас сматривали ранее. Она записывает ISAPI и текстовую стро ку описания расширения в поля структуры типа HSE_VERSION_INFO с именами и соответственно. Адрес структуры передается функции GetExtensionVersion параметр.

Функция обращается к буферу для подготовки динамически создаваемого документа HTML, который будет послан удаленно му в результате работы В качестве вспомо гательного буфера применяется буфер CHAR CHAR Глава 7. CGI и ISAPI Web Прежде всего мы в нулевое значение:

0;

Потом в это поле мы результат выполнения команды.

Далее в буфер szBuff копируется заголовок HTTP и начальный фрагмент документа HTML, для чего используется функция "Content-Type:

ISAPI from ISAPI После этого к буферу szBuff с функции strcat добавляются дру гие строки документа. Например, разделительная линия:

После первой разделительной линии в документ вставляются несколько строк со значениями некоторых полей структуры типа В фрагменте кода показана строка версии интерфейса ISAPI:

Version:

Далее в документ выводятся строка с названием метода данных (иоле строка параметров запуска расширения ISAPI (поле физический путь к программному файлу библиотеки DLL расши рения (поле полный размер данных, которые нужно про читать (поле а также тип данных (поле st После этого в документ снова добавляется разделительная линия и отобра жается переменных сервера с префиксом имени HTTP, для используется рассмотренная ранее функция = 4096;

(см. стр.) 324 Базы данных в Практическое В завершение в документ записывается финальная таким образом документ отправляется посетителю серве ра функцией как это показано NULL, NULL, { return = 200;

return HSE_STATUS_SUCCESS;

Если при пересылке данных ошибка, завершает свою работу с кодом В случае успеха в ноле состояния записывается код 200. этим расширение завершает свою рабо ту с кодом HSE_STATUS_SUCCESS.

Создавая проект расширения ISAPI, Вы должны файл опреде ления модуля для соответствующей библиотеки DLL (листинг 7-И).

Листинг хранится в файле на прилагаемом к кни ге В разделе EXORT этого файла нужно имена Version и LIBRARY DESCRIPTION ISAPI EXPORTS HttpExtensionProc Вызов функций ODBC из ISAPI Ранее мы рассказывали, как обращаться к базе данных из программы CGI с при менением объектного ADO. В этом разделе мы приведем исходные тексты расширения ISAPI, которое тоже работает с базой данных, но с приме программного интерфейса ODBC.

Для этого приложения (с мы использу ем форму, показанную на 7-8.

С этой формы нашего магазина сможет просмотреть свои права. Для этого ему придется ввести в ней свой идентифи катор и пароль, а затем щелкнуть кнопку Submit.

Расширение ISFORM обращается к базе данных BookStore, запуская на вы полнение хранимую процедуру Если пользователь зарегистриро ван в ISFORM отправляет ему динамически со зданный документ HTML, в котором отображается идентификатор пользовате ля, его пароль и права, из этой таблицы (рис. 7-9).

Глава 7. CGI и ISAP1 сервера Web Book. < E Book Просмотр прав сотрудника Пароль Рис. Форма ввода идентификатора и пароля 3 - Ь сотрудника User: frolw word.

Рис. 7-9. Перечень прав сотрудника магазина, извлеченный из данных Похожие действия выполняла консольная программа рас смотренная нами в главе. Именно эта программа и была в основу расширения А опишем исходные тексты ISFORM.

Исходный текст документа HTML, предназначенного для запуска этого рас ширения, Вы найдете в листинге Листинг 7-12 хранится в файле на прилагаемом к книге компакт-диске.

В этом документе имеется ссылающаяся на файл расши рения isform.dll:

После щелчка кнопки Вход управление передается странице с именем Book StoreLogin.asp, указанным в параметре ACTION тега . Исходный текст этой страницы представлен в листинге 8-2.

Листинг 8-2 Вы найдете в файле на прилагаемом к книге Глава 8. Создание серверных элементов управления AcliveX строка в файле задаст язык серверного сценария JScript:

LANGUAGE = "JScript" Далее в расположен фрагмент серверного сценария, показанный ниже:

var var culogin = = sPassword);

Здесь мы вначале извлекаем параметры с именами и формой, и сохраняем эти параметры в переменных и sPassword соответ Далее с помощью метода встроенного объекта ASP с именем мы объект с идентификатором BookStore.BookStoreLogin. Это тот самый идентификатор, мы определяли при создании проекта в панели, на рис. 8-5.

Объект будет записан в culogin, при помощи которой сценарий обращается к свойствам и методам объекта. Строкой ниже мы читаем свойство передавая ему в качестве параметров идентификатор посетителя и его пароль.

Значение, из свойства, в Далее эта переменная используется при формировании текста докумен та HTML, создаваемого сценарием:

ввели (идентификатор: пароль) - sResult Определения методов элемента Исходный текст метода CheckResult, а также двух других созданных мастером проекта, находится в файле BookStoreLogin.cpp (листинг 8-3).

Листинг 8-3 Вы найдете в файле на прилагаемом к книге компакт-диске.

Рассмотрим его содержимое.

Помимо файла stdafx.h мастер проекта включает в файл BookStoreLogin.cpp файлы и tfinclude Первый из них создается автоматически и содержит определения интерфей сов. Вам не нужно его редактировать, так как это сделает мастер проекта при добавлении новых методов и свойств.

Второй файл содержит определение класса CBookStoreLogin, который пред ставляет собой класс нашего объекта. Опять же, при добавлении в оп ределение этого класса новых полей мастер проекта произведет все изменения в файле автоматически.

342 Базы данных в Интернете. Практическое Методы OnStartPage и генерируются автоматически, если при со здании проекта отметить на вкладке ASP (рис. 8-7).

Когда посетитель страницу ASP, управление получаст метод OnStartPage. Ему передается на интерфейс с помощью кото рого получит на нужные для связи нашего элемента со встроенными элементами ASP:

pUnk) I Вначале метод OnStartPage получает указатель на интерфейс Context:

= (void Далее, пользуясь этим метод извлекает указатели на объекты Request, Response, и Application:

= = = = = Метод OnEndPage освобождает полученные указатели при завершении обра ботки серверного расположенного на странице:

Кроме методов и OnEndPage в файле находится определение созданного нами метода STDMETHODIMP BSTR *bsName, BSTR return S_OK;

Автоматическая обработка кредитных карточек Создавая Интернет-магазин, Вы должны продумать способ оплаты товара. Наи более современный способ оплаты — с кредитных карточек. Мы уже рассказывали о том, как организовать такую оплату с выполняющих обработку кредиток через Как Вам известно, такие компании предоставляют всем желающим интер фейс в виде библиотеки DLL или автономной программы. Модуль интерфейса Глава 8. серверных ActiveX необходимо на Web Вашего магазина, причем вызов этого модуля должен выполняться из программного обеспечения магазина.

Если магазин создан с применением технологии ASP, нужно придумать способ вызова интерфейсного модуля из серверных сценариев, написанных на или VBScript.

В этом разделе мы расскажем о том, как создать управ ления ActiveX, вызывающий функции из библиотеки имитирующей часть интерфейса обработки карточек.

Библиотека для имитации интерфейса демонстрационный интерфейс обработки кредитных карточек состоит все го из одной функции с именем nSendPayData. Ее задача — отправить информа цию о платеже на сервер компании. Напомним, что при созда нии реального магазина Вы интерфейсный модуль от процессинговой компании.

Прототип функции f nSendPayData показан ниже:

extern "С" int LPSTR DWORD LPSTR szSuccessURL, LPSTR LPSTR Так как предполагается, что мы вызываем из программы, написан на C++, для отключения механизма функции (name используется определение «extern Чтобы функция fnSendPayData попала в список экспортируемых функций, определим ее как Это позволит нам не создавать def-файл определения модуля библиотеки DLL.

При вызове функции необходимо передать шесть параметров.

Через первые два параметра szAmount и передается величина суммы и название валюты. И тот, и другой параметр задается виде текстовой строки.

Третий dwMerchantID — идентификатор покупателя, назначенный ему при регистрации и зарегистрированный в процессинговой компании. По этому идентификатору компания сможет определить, кто выполняет платеж.

Через последние три интерфейсный модуль серверу ма газина адреса URL-страниц, на которые попадает посетитель в зависимости от результата выполнения платежа. Если результат успешный, посетитель попада ет на страницу, адрес которой задан параметром szSuccessURL, если нет — па стра ницу с адресом szErrorURL, а если при выполнении операции появилась допол нительная информация — на страницу с адресом Функция код выполнения Если этот код нулю, операция выполнена успешно, а если нет, то это означает, что ошибки.

Рассмотрим действия, выполняемые функцией Ее исходный текст Вы найдете в листинге 8-4.

Листинг 8-4 хранится в файле на прилагаемом к книге компакт-диске.

Прежде всего эта функция проверяет идентификатор покупателя:

l= return 1;

344 Базы данных в Интернете. Практическое руководство Мы разрешаем выполнение платежа только посетителя с ром 12345. При ошибке значение 1. компания этот идентификатор своей базе данных.

Далее функция убеждается, что параметры szAmount и не нулевых значений:

== 0 strlen(szCurrency) == 0) return 2;

В случае функция возвращает значение 2.

Если указаны правильно, функция fnSendPayData имена файлов по хранящимся в параметрах szSuccessURL, szErrorURL и szNoyificationURL:

NULL) != NULL) NULL) Далее функция возвращает нулевой значение в качестве признака го завершения своей работы.

Помимо функции fnSendPayData в исходном тексте нашей библиотеки DLL определена стандартная функция BOOL APIENTRY DllMain(HANDLE hModule, LPVOID { switch (ul_reason_for_call) { case DLL_PROCESS_ATTACH:

case case case DLL_PROCESS_DETACH;

break;

!

return TRUE;

Она вызывается, когда или поток обращается к библиотеке. Эта функция была создана мастером Microsoft Visual C++ и не выполняет никаких Тестовая программа для вызова имитатора интерфейса Прежде чем только что описанный модуль из серверного сценария ASP, его тестирование. Для этого мы подготовили небольшую кон программу, исходный текст которой Вы найдете в листинге 8-5.

Листинг 8-5 хранится в файле на прилагаемом к книге компакт-диске.

Глава 8. Создание серверных элементов управления ActiveX В области глобальных переменных этой программы мы подготовили ление типа (* DLLFN)(LPSTR LPSTR DWORD LPSTR szErrorURL, LPSTR Как этот тип представляет собой указатель на fnSend PayData, описанную ранее.

Тестовая программа функцию предварительно вы полняя динамическую загрузку библиотеки DLL с именем face.dll.

Библиотека DLL функцией LoadLibrary, как это показано ниже:

HINSTANCE = Идентификатор загруженной библиотеки сохраняется в локальной перемен ной hCreditCardlnterfaceDLL.

Если загрузка прошла успешно, тестовая программа вызывает функцию предварительно получив на нее указатель с помощью функции DLLFN fn;

char char != NULL) { fn = (DLLFN)GetProcAddress( != NULL) int = 12345, szSuccessURL, szErrorURL, szNoyificationURL);

Здесь мы передаем функции сумму 123, название валюты — иденти фикатор покупателя 12345. Адреса функция запишет в переменные szErrorURL и szNoyificationURL.

Убедившись с тестовой программы и отладчика, что интерфейсная библиотека DLL работает мы переходим к серверного эле мента ActiveX, доступного из страниц ASP и предназначенного для вызова f nSendPayData, Элемент В начале этой главы мы подробно рассмотрели создания серверного элемента ActiveX с применением библиотеки шаблонов ATL. Поэто му сейчас мы не будем вдаваться в детали.

346 данных в Интернете. Практическое руководство Нам создать модуль уп равления должен быть как Исходный текст главного модуля управления, созданный мастером и дополненный Вы найдете в листинге 8-6.

Листинг хранится в файле на мом к книге компакт-диске.

Рассмотрим определения свойств и добавленных нами к объекту CreditCard.

Для свойства Amount, предназначенного для хранения суммы денег, мы пре дусмотрели две функции с именами и < return STDMETHODIMP newVal) return S_OK;

Обе эти функции обращаются полю типа CComBSTR:

CComBSTR Мы добавили эту переменную в класс пользуясь мастером класса.

Функция записывает в поле значение, полученное через параметр newVal.

Что же касается функции то она извлекает значение поля и возвращает его, вызывая метод Сору.

Аналогичным образом устроены функции для работы со свойствами Currency, и Для них в классе CreditCard мы опре делили следующие поля:

CComBSTR CComBSTR CComBSTR Функции для работы со MerchantID, хранящим численное значе ние, определены так:

STDMETHODIMP { return STDMETHODIMP newVal) return Глава 8. серверных управления ActiveX Эти функции к полю типа long.

Теперь мы займемся методом SendPayData, для на шей библиотеки DLL, имитирующей интерфейс Так же как и в тестовой программе, мы определили тип DLLFN, необходимый для вызова функции через (* DLLFN)(LPSTR LPSTR szCurrency, DWORD szSuccessURL, LPSTR LPSTR В самом начале метода SendPayData, эту функцию, мы распо макрокоманду необходимую для работы с макрокоман дами перекодировки OLE2A и A20LE:

I В области локальных переменных метода SendPayData мы определили пере менную для хранения идентификатора библиотека переменную для хранения указатель на функцию с именем три массива для хранения адресов URL с именами szSuccessURL, s zEr r or URL и а также рабочую переменную типа HINSTANCE DLLFN char char bstrTemp;

В начале своей работы метод SendPayData загружает интерфейсную библио теку DLL из файла и получает указатель на функцию fnSendPayData:

hCreditCardlnterfaceDLL = != NULL) fn = :

Если библиотека загрузилась, а указатель получен без ошибок и равен NULL, метод преобразует значения из полей и в текстовые строки ANSI:

= = OLE2A(m_Currency);

Соответствующие указатели и pszCurrency Вы должны определить в классе CreditCard:

char* pszCurrency;

char* pszAmount;

Базы данных в Интернете. Практическое Теперь можно вызывать f m_Result = Ее код мы записываем в поле определенное в классе как long.

Если функции без ошибок, метод иден тификатор библиотеки DLL, а затем преобразует полученные строки адресов записывая их в соответствующие поля класса CreditCard:

= = При ошибке в записывается значение -1:

= -1;

Сценарий определяет результат вызова с свойства Result, доступного только для чтения. Для этого свойства мы подготовили только функцию с именем return S_OK;

Вызов элемента управления CreditCard Для вызова элемента управления CreditCard мы подготовили документ HTML с формой, позволяющей идентификатор платежа, сумму и выбрать валюту (рис. 8-12).

3 • Введите сведения о платеже Идентифйкатср Валюта I Рис. 8-12. Форма для вызова элемента управления CreditCard Полный исходный текст этого документа расположен в листинге 8-7.

Листинг 8-7 Вы найдете в файле на прилагаемом к книге компакт-диске.

Глава 8. Создание серверных элементов управления ActiveX Этот документ содержит форму, ссылающуюся па страницу ASP с именем dopay.asp:

Success Amount r>
Merchant
В противном случае в окне браузера отобразится лишь код завершения.

Отправка почтового из сценария ASP Как в Интернет-магазинах, созданных за рубежом, оплата товаров про изводится с помощью кредитных карточек. Что же касается отечественных то в них преобладают другие формы: предварительный сбор заказов и оплата наличными или через сберегательный банк.

При этом торгующий сервер Web выступает в роли автоматизированной си стемы сбора заказов, Такие заказы обычно отправляются в магазин в виде элек тронных почтовых и затем обрабатываются сотрудниками магазина вручную. Для подтверждения покупки сделавшему заказ посетителю сервера перезванивают по телефону или подтверждение по электронной почте. Это не слишком удобно, но более или менее надежно. В качестве приме ра можно привести маленький магазин, расположенный на сервере авторов этой книги по адресу а также крупные отечественные книж ные магазины, подобные Bolero (http://www.bolero.ru).

Для практической реализации системы автоматизированного сбора предва рительных заявок обычно используются программы CGI типа FormMail. Эти программы принимают данные из полей формы и отправляют их почтовому серверу при помощи протокола SMTP.

А сейчас речь пойдет о применении серверного элемента управления ActiveX с названием разработанного Максимом из компании Web Development и предназначенного для от Глава 8. Создание элементов управления правки почты. Так как этот элемент реализует интерфейс его можно вызывать из клиентских и серверных сценариев, а также из любых про грамм, способных работать с объектами СОМ.

Основы работы SMTP Как Вы знаете, простой протокол передачи почты Simple Mail Transfer Protocol (SMTP) основан на передаче текстовых строк через порт с номером 25. Как правило, провайдеры требуют, чтобы для передачи почты было установлено прямое соединение между сервером или рабочей станцией, отправляющей по чту, и почтовым сервером провайдера (то есть они должны находиться в сети с одним адресом IP).

Прежде чем Вас с исходными текстами серверного элемента управления мы попытаемся отправить почтовое с помо щью программы telnet, входящей в комплект операционной системы Windows.

Итак, к своему провайдеру и запустите программу telnet. Вы берите из меню Connect строку Remote system. Укажите в поле Host name рес почтового сервера своего провайдера, а в поле Port — значение 25. Щелкните кнопку Connect для подключения к почтовому серверу провайдера.

Если адрес сервера указан правильно, в окне программы появится сообще ние от почтового сервера. Пример такого сообщения для сервера показан ниже:

1999-Nov-10) ready at Sun, 26 Dec 20:42:55 +0300 (HSK) 220 supported Для другого сервера внешний вид приглашения может отличаться от приве денного выше, однако текст должен начинаться с цифры 220.

Теперь отправьте серверу команду подключения НЕЮ ru Сервер должен ответить сообщением с кодом 250:

250 Hello from address Продолжим диалог с сервером: командой MAIL укажите адрес отправи теля (тое есть свой адрес):

MAIL В ответ Вы должны получить сообщение с кодом 250:

250 Sender Okay.

Теперь введите адрес получателя. Мы указали здесь свой собственный адрес, так как отправляем тестовое сообщение сами себе:

RCPT Вам придет подтверждение следующего вида:

250 2.1.0 Recipient Okay.

Далее мы должны ввести текст сообщения. Выдайте серверу команду DATA:

DATA Базы данных в Интернете. Практическое руководство, Вы приглашение для ввода текста сообщения с кодом 354:

354 Enter mail, end with on a Line by itself...

тему сообщения командой SUBJECT:

Тема указывается в одной строке, непосредственно после команды. Закончите ввод строкой, состоящей из одной точки в первой This is test Сообщение будет отправлено, а Вы получите извещение об этом в следующем виде:

250 2.6.0 Mail accepted, queue ID Теперь Вы можете разорвать с почтовым сервером и завершить работу программы telnet. Запустив свою программу, убедитесь, что Вы новое сообщение.

Элемент управления Мы покажем, как использовать элемент MTASend для отправки почтовых из формы, расположенной на Вашем сервере Web.

Форма показана на рис. 8-13.

3 -.

Заполните поля отправьте Кому:

От Сервер SMTP Это тестовое Рис. 8-13. Форма для отправки почты При ее заполнении нужно указать адрес отправителя и тему письма Subject, а также адрес сервера Вашего провайдера. Для отправ ки сообщения щелкните кнопку Отправить.

Если электронное письмо без ошибок, в окне браузера появится показанное на рис.

исходный текст формы отправки сообщения показан в листинге 8-9.

Листинг 8-9 Вы найдете в файле на прилагаемом к книге компакт-диске.

Глава 8. Создание серверных управления ActiveX -3 почты J Рис. 8-14. Сообщение об успешной отправке почты Форма ссылается на страницу ASP с именем mta.asp, которая и выполняет обращение к элементу управления В форме также поля с именами То, From, Subj ect, SMTPServer и Message:

Листинг Вы найдете в файле на прилагаемом к книге компакт-диске.

В самом этого листинга находится тег , символами комментария:

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

var MTAHail = После того как сценарий создает объект MailMTA и записывает его в он получает данные из полей формы помещает их в свойства:

В свойство мы записываем 25, так этот порт используется стандартными серверами.

354 Базы данных Практическое Подготовив свойства, сценарий вызывает метод выполняющий отправку почты:

Результат выполнения операции отправки почты сохраняется в свойстве Status, и наш сценарий может проверить. Если почта без оши бок, сценарий записывает в создаваемый HTML соответствующее со общение:

== 1) I отправки успешно отправлена В противном случае в текст сообщения об ошибке включается код заверше ния из свойства Status, а также уточняющий код ошибки из свойства StatusEx:

else { отправки RC = мы исходные тексты элемента управления Прежде всего, обратите внимание на файл (листинг 8-11).

Листинг 8-11 Вы найдете в файле на прилагаемом к книге компакт-диске.

В нем нам интересны функции и DllUnregisterServer, пред соответственно для регистрации и для отмены регистрации элемен та управления:

STDAPI return Глава 8. Создание серверных элементов управления ActiveX STDAPI return В них мы функции и для и для ресурсов для работы с Определение методов Вы найдете в файле (листинг 8-12).

Листинг 8-12 хранится в файле на прилагаемом к кни ге компакт-диске.

Для объема исходных текстов, функционирова ние методов, в этом файле определена макрокоманда \ \ { \ \ \ = \ return \ } \ STDMETHODIMP \ ! \ \ \ return Она два метода, один из которых извлекает значение свойства из поля класса, а другой — сохраняет значение в поле класса.

Вот как просто выглядит определение нескольких свойств, сделанное с мощью макрокоманды:

MTAStringProperty(To) В классе МТА определен конструктор, выполняющий начальную инициализа цию свойств значениями, из ресурсов элемента управления:

I ));

else (см.

356 Базы данных в Интернете. Практическое руководство В файле Вы также свойств SMTPPort, Status и StatusEx.

Файл (листинг 8-13) содержит определение функций и методов, для установки соединения с почтовым сервером и для отправки сообщения.

Листинг 8-13 хранится в файле на прилагаемом к кни ге компакт-диске.

Рассмотрим метод посылающий сообщение:

{ try { } I } else { !

return Прежде приступить к работе, этот метод устанавливает код завершения, 1, в ноле Этот код можно извлечь из Status.

Далее метод Send устанавливает соединение с почтовым сервером, вызывая метод Connect. Если эта процедура выполнена успешно, метод Send вызывает метод выполняющий передачу данных. Далее программа отключается от почтового сервера при помощи метода Disconnect. В случае возникновения каких-либо новое в поле Status.

Глава 8. серверных элементов управления ActiveX Исходный текст метода Connect мы рассмотрим ниже.

Получив управление, метод Connect структуру типа sockaddr_in, записывая в нее адрес почтового сервера:

struct = AF_INET;

= Далее мы получаем адрес ТР почтового сервера и сохраняем его в перемен ной he:

if(he) FAR else { failed code } Полученный адрес копируется в s_addr структуры srv_addr.

На этапе метод Connect получает для связи с почтовым сер вером:

if ' Этот сокет затем привязывается функцией bind к адресу IP почтового сер вера:

== :

!

Далее выполняется соединение:

•:

!

358 Базы данных в Практическое руководство Теперь мы займемся методом Transfer, выполняющим с по чтовым сервером по каналу, методом Connect.

В начале с помощью макрокоманды WAIT этот метод дожидается получения от почтового сервера сообщения о готовности:

Когда сообщение, имеющее код 220, приходит, мы посылаем почтовому сер веру команду НЕЮ, указав ей в адрес почтового сервера:

Для отправки почтовому текстовой строки мы вызываем функцию WriteLn, определенную в нашей Дождавшись подтверждения с кодом 250, мы сообщаем серверу адрес отпра вителя:

Далее метод снова ожидает подтверждения и посылает почтовому серверу аналогичным образом адрес получателя и содержимое письма, включая все стан дартные Отправка заканчивается строкой и строкой, содер жащей одну точку в первой позиции:

Далее наша отключается от почтового сервера:

Работа методов WriteLn и с помощью которых наш элемент управле ния общается с почтовым сервером, основана на применении функций send и Эти функции предназначены для обмена данными через потоковые Метод Disconnect, выполняющий отключение от почтового сервера, закры вает сокет функцией void SOCKET) { Применение аплетов Java Последняя глава нашей книги аплетов Java в прило жениях Интернета. Как Вы знаете, написанные на языке програм мирования Java, способны работать практически на всех распространенных ком пьютерных платформах. В результате одна из разновидностей таких программ, а именно Java, получили широкое па страницах серве Web. Именно так реализуется главное преимущество аплетов Java — совме стимость с различными платформами, так как этих страниц могут запускать свои браузеры под управлением различных операционных систем.

Заметим, что в большинстве случаев аплеты Java используются толь ко для достижения визуальных эффектов, создания «интеллек туальных» графических ссылок, меню и т. д. Между тем, они способны решать и сложные задачи, такие, как непосредственное взаимодействие с расши рениями сервера в виде приложений CGI и ISAPI и передача параметров ASP. Мы рассмотрим эти вопросы, не нашедшие, на наш взгляд, достойного отражения в многочисленных книгах, посвященных прило жениям Java.

Тем из Вас, кто еще никогда не создавал программ на языке мы предла гаем наше руководство, размещенное на сервере создателя этого языка Sun Microsystems по адресу Система Layout Manager В наших примерах мы как создавать аплеты с формами, позволяющи ми вводить информацию о кредитных карточках. Эти формы содержат такие элементы управления, как текстовые поля и кнопки.

Начинающих программистов, особенно тех, кто создавал приложения для Windows или OS/2, может шокировать способ, которым в приложениях Java выполняется размещение компонентов и контейнеров внутри окна. Самая боль шая и па первый взгляд особенность заключается в невозможности размещения компонентов с указанием точных координат (хотя с применением специальной техники это все же достижимо).

Другая особенность — программы Java не имеют ресурсов, подобных сам исполнимых файлов Windows и описывающих диалоговые или эле менты управления. Внешний вид пользовательского интерфейса определяется во время выполнения программы.

Поясним, чем тут дело и для нужно преодолевать такие трудности.

360 Базы данных в Интернете. Практическое руководство Создавая приложения Java, никогда следует забывать о том, что они пред назначены для работы на различных платформах. При этом Вы не можете полагаться на то, что Вам будет доступен какой-либо конкретный шрифт, кнопки или другие компоненты будут иметь определенный размер или форму, а видеоадаптер будет работать в режиме с каким-либо заданным или за ранее известным разрешением.

Для того чтобы обеспечить работу приложений Windows в режимах с различ ным разрешением видеоадаптера, размеры элементов управления «привязыва к размерам системного шрифта. Однако указанный способ недостаточно универсален для применения на различных платформах, так как в разных опе рационных системах, вероятно, эта привязка будет выполняться Кроме того, теоретически системный шрифт в какой-нибудь операционной си стеме может отсутствовать как таковой.

С другой стороны, динамическое формирование внешнего вида пользователь ского интерфейса во время работы программы позволит адаптировать его «на ходу» к особенностям конкретной операционной системы. Для этого приложе ния Java используют достаточно гибкую и мощную систему управления щением и контейнеров с названием Layout Manager.

Система Layout Manager способна работать в нескольких основных режимах, отличающихся различными стратегиями размещения компонентов, определения их размеров и выравнивания.

Режим В самом простом режиме добавляются в окно контей нера с применением следующего алгоритма. Каждый новый добавленный ком располагается вслед за предыдущим в слева направо и сверху вниз, при этом выполняется центровка компонентов по горизонтали, Одной из особенностей данного режима является возможное изменение взаим ного расположения добавленных компонентов при изменении размеров контей нера.

Установка режима FlowLayout при помощи метода set как это показано ниже:

Далее компоненты добавляются в окно контейнера методом add, например:

TextField tf;

Button add(tf);

add(btnGetName);

Режим Когда установлен режим размещения GridLayout, все компоненты располагают ся в ячейках таблицы, имеющей заданное количество строк и столбцов. Разме ры компонентов изменяются таким чтобы они полностью занимали свои ячейки.

Глава 9. Применение аплетов Java Установка режима выполняется при помощи метода как это показано ниже:

());

Далее компоненты добавляются в окно контейнера методом add, например:

tf;

Button Режим Режим предполагает разделение окна контейнера на рамку и цен тральную часть. Методу add при этом от центра окна, в котором следует размещать компоненты.

Направление указывается следующим образом:

// центр btn2);

// восток btn3);

// запад btn4);

// btn5);

// юг Здесь мы в окно контейнера компоненты..., При этом компонент располагается в центре окна а остальные компонен ты — по бокам. Размеры изменяются таким образом, чтобы они полностью заполняли контейнер.

Заметим, что Вы обязаны каждый раз добавлять в контейнер именно пять компонентов и задействовать этом все возможные Режим Режим размещения CardLayout предназначен для поочередного размещения нескольких в одном контейнере (например, класса Panel).

При добавлении компонента в контейнер необходимо передать его имя ме тоду add через первый параметр, например:

picFrame pf;

pf = new pf);

Остальные компоненты добавляются аналогичным образом.

В классе CardLayout предусмотрено несколько методов, предназначенных для выбора отображаемого компонента. Эти методы перечислены в таблице 9-1.

Таблица Методы для выбора компонента Метод Компонент для отображения first Первый last Последний next previous Предыдущий show заданный своим именем 362 Базы данных в Интернете. Практическое Всем указанным методам, кроме метода show, через единственный параметр ссылка на родительский контейнер, в котором выполняется размеще ние. show через второй параметр дополнительно передается имя компо нента (как строка класса String).

Режим режим размещения системы — это режим GridBag Layout. Он считается наиболее трудным, однако по сравнению с другими режи мами он очень гибкий. В ряде случаев Вам просто не обойтись него.

Так же как и рассмотренный нами режим режим GridBag Layout предполагает размещение компонентов в ячейках некоторой таблицы заданной размерности. Вот наиболее важные отличия между этими режимами:

4 в режиме GridLayout размещаемые изменяют свои размеры та ким образом, чтобы заполнить ячейки таблицы, в которых они ся. Режим GridBagLayout контролировать этот процесс, причем при необходимости Вы можете задать стратегию такого изменения или отка заться от него вовсе;

в GridLayout каждый компонент занимает только одну ячейку. Что же касается режима то здесь компоненты могут занимать несколько смежных ячеек в строках или столбцах;

при изменении размеров контейнера во время работы приложения при ис пользовании режима GridLayout все компоненты неизбежно изменяют свои размеры. Это далеко не всегда удобно. В режиме GridBagLayout Вы можете управлять стратегией изменения размеров компонентов или отказаться от такого изменения.

Режим размещения компонентов GridBagLayout удобен для создания диало говых панелей, содержащих такие как текстовые поля редактиро вания, кнопки и т. д.

Выбирая соответствующим образом параметры размещения понентов путем заполнения соответствующих полей класса можно создавать панели, напоминающие по своему внешнему виду и поведению стандартные диалоговые панели Windows или других операционных систем с графическим интерфейсом. При этом чтобы размеры компонен тов и их взаимное расположение не изменялись при корректировке размеров окна контейнера. Это невозможно при работе в других режимах размещения, таких, как или GridLayout.

Как пользоваться режимом размещения GridBagLayout?

Схема достаточно проста.

Прежде веего Вы должны создать объект класса GridBagLayout помощи конструктора и выбрать его, как это показано ниже:

GridBagLayout = new setLayout(gbl);

Далее Вам нужно создать объект класса GridBagConstraints, поля которого будут определять параметры отдельных компонентов:

GridBagConstraints с = new Глава 9. Применение Java Далее нужно задать значения полей объекта класса GridBagConstraints, так (позже мы расскажем о отдельных полей):

= = GridBagConstraints. NONE;

= 1;

c.gridx = c.gridy = = new Insets(40, 0, 0, 0);

= 0;

= 0;

= = 0.0;

Подготовив объект класса Вам нужно установить его в системе Layout Manager методом setConstraints и добавить очередной компо нент в окно контейнера методом add:

tf = new gbl.setConstraints(tf, с);

add(tf);

Далее описанная процедура над всеми остальными ми компонентами, причем объект класса GridBagConstraints можно создавать каждый раз заново, а Но если все так то в чем же тогда сложность работы с режимом раз Очевидно, дело в выборе значений параметров класса GridBagConst raints.

Перечислим эти поля и дадим их краткую характеристику. инфор мацию Вы найдете в документации JDK.

Поля и gridy Поля и gridy задают соответственно номер столбца и номер строки для ячейки, в которую будет помещен компонент. Левой верхней ячейке соответ ствуют нулевые значения.

В качестве для этих полей можно также указывать константу Grid RELATIVE. Если эта константа указана в поле номер стол бца размещаемого компонента будет на единицу больше номера столбца для компонента, размещенного ранее. и для поля Вы можете использовать значение Gri dBagConstrai nts. RELATIVE в данных полях при последовательном размещении компонентов в ячейках таблицы в направлении слева направо и сверху вниз.

Поля и gridheight Поля gridwidth и gridheight количество ячеек, занимаемых добав ляемым компонентом.

Если компонент полностью помещается в одну ячейку, Вы вправе задать этих полях равное единице. Если же должен занимать, на пример, две смежные ячейки в строке, то для нужно зна чение, равное двум, а для gridheight — значение, равное единице.

364 Базы данных е Интернете. Практическое руководство Специальное GridBagConstraints. REMAINDER указывает, что компо нент должен занять все место в текущей строке (для ноля gridwidth) или в текущем столбце (для поля В поля gri dwi dt h и gri dhei ght можно также значение Gri dBag Constraints. RELATIVE. В этом случае будет задано такое расположение компонен та, при котором он займет все оставшееся место в строке (для gridwidth) или столбце (для поля gridheight), оставив при этом одну свободную ячейку в последнем столбце или строке.

Поле fill Поле определяет стратегию распределения свободного пространства ячей ки (или ячеек) таблицы для компонента, если его размеры размеров вы деленного для него места, Возможные значения приведены в таблице 9-2.

Таблица 9-2. Значения поля fill Значение Стратегия выделения места NONE Компонент не изменяет своих размеров GridBagConstraints. BOTH Изменяется высота и ширина, таким образом, чтобы компонент занимал все отведенное для него пространство GridBagConstraints. HORIZONTAL растягивается по горизонтали GridBagConstraints. VERTICAL Компонент растягивается по вертикали anchor Поле anchor задает компонента внутри отведенного для него про странства. Он включается в работу, когда размеры компонента меньше размеров выделенного для него места.

Для поля anchor Вы можете указать значения, приведенные в таблице 9-3.

Таблица 9-3. Значения поля anchor Значение Направление выравнивания По центру Вверх Вправо Влево Вверх вправо G Вверх влево Вниз вправо Вниз влево Поля weightx и weighty Эти поля определяют стратегию изменения размеров компонента, отвечая за выделение пространства для столбцов (weightx) и строк (weighty).

Глава 9. Java Если записать в нулевые значения, все добавленные компоненты займут место в контейнера и будут выровнены по центру (как по вертикали, так и по горизонтали).

Чтобы размеры компонента изменялись по горизонтали или в поля и weightx нужно записать значения от 0,0 до 1,0.

Если в столбце несколько компонентов, то его ширина компо нентом с максимальным значением weightx. Аналогичное утверждение верно и для строк.

Заметим, что дополнительное пространство добавляется к строкам и столб цам снизу и справа соответственно.

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

Поле insets Поле insets задать для компонента отступы от краев выделенной ему области. По умолчанию такие отступы отсутствуют.

В поле insets необходимо записать ссылку на объект класса Insets, создан ную соответствующим конструктором. Этот конструктор имеет следующий про тотип;

public int top, // отступ сверху int left, // слева int bottom, // снизу int right);

// справа Аплет с формой В качестве примера демонстрации режима GridBagLayout приведем исходные тексты аплета с формой 3 ! Book I '• ' EN ЕЖ • OK "JP | • Рис. Форма для регистрации посетителей 366 Базы данных в Интернете. Практическое В окне нашего аплета находится форма для регистрации посетителей серве ра, в которой нужно заполнить несколько стандартных полей (рис. 9-1).

Если Вы форму и щелкнете кнопку ОК, на экране появится диа логовая панель, отображающая введенные значения в окне многострочного ре дактора (рис. 9-2). Кнопка Cancel информацию.

name Ivan le P S Рис. 9-2. Отображение введенной информации Как в окне основного аплета, так и в окне диалоговой панели мы установи ли режим размещения компонент Перейдем к рассмотрению исходного текста аплета. Полностью он приведен в листинге 9-1.

Листинг 9-1 найдете в файле на прилагаемом к книге компакт-диске.

Главный класс аплета Главный класс аплета GridBag создан на базе класса Applet и реализует интер фейс ActionListener:

import import public class Applet ActionListener Данный интерфейс необходим для обработки событий, вызываемых щелчком кнопок.

В главном классе мы определили несколько полей, для хранения ссылок на компоненты — текстовые поля, метки класса Label и кноп ки:

TextField Label TextField Label TextField Label Глава 9. Применение Java TextField tfZip;

Label TextField Label Button Button btnCancel;

Метод init Этот метод получает управление при инициализации аплета. Он создает и раз мещает все компоненты в окне аплета, а затем регистрирует обработчики собы тий от кнопок.

Компоненты создаются обычным образом при помощи конструкторов:

= new = new tfMiddleName = new = new tfLastName = new TextField(20);

= tfZip = new IbZip = new tfCountry = new IbCountry = new btnOK = new btnCancel = new Далее мы устанавливаем режим размещения и создаем объект класса необходимый для задания параметров размещения отдельных компонентов:

GridBagLayout = new GridBagConstraints с = new setLayout(gbl);

| Ниже мы расскажем о выборе этих Поле First name Заполнение параметров и размещение этого поля выполняется следующим об разом:

= = 1;

c.gridwidth = 1;

(см. стр.) 368 Базы данных в Интернете.

= = = Insets(10, 10, 0, 0);

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

Параметр fill имеет значение NONE, а значит, при коррек тировке размеров контейнера размеры ноля изменяться не будут.

Так как значение полей и gridwidth единице, поле занима ет одну ячейку таблицы.

Поля gridx и содержат значение GridBagConstraints. RELATIVE, поэто му добавление поля выполняется в направлении слева направо и сверху вниз.

И наконец, поле insets задает отступы сверху и слева, равные 10 пикселам.

Метка для поля First name Для этой метки мы используем те же параметры, что и для самого поля:

В результате метка займет положение справа от поля First Кнопка OK Вот как заполняются параметры размещения для кнопки ОК:

= = 32;

с);

add(btnOK);

Как видите, параметр gr i dwi dt h имеет значение, равное Gri dBagCons traints. REMAINDER. В результате кнопка будет последним компонентом в первой строке. Ее размеры останутся неизменными при корректировке размеров кон тейнера, так как поле fill имеет значение GridBagConstraints. NONE.

Чтобы несколько увеличить кнопки ОК по горизонтали, мы задали в поле ipadx значение, равное 32 пикселам.

Поле и метка этого поля Перед добавлением поля и его метки мы восстанавливаем параметры ipadx и gridwidth, измененные на предыдущем = 0;

с. gridwidth = В результате поле Middle name будет размещено в первой ячейки второй строки.

Глава 9. Java Кнопка Cancel Эта кнопка размещается так:

= = 10;

= 1.0;

add(btnCancel);

в gridwidth мы указали значение GridBagConstraints. REMAINDER, поэтому кнопка Cancel будет последней во второй Обратите внимание на поле Его значение не равно нулю, значит, последний столбец нашей таблицы займет все оставшееся место в направлении вправо. Если бы значение этого поля равнялось нулю, все компоненты оказались бы выровненными по центру в горизонтальном направлении. Вы можете сделать это сами.

Поле Last name Это поле добавляется в начало третьей строки:

= 0;

= 1;

= 0.0;

Здесь мы просто параметры, аналогичные параметрам поля Middle name, расположенного в начале второй строки.

Метка поля Last name Эта метка занимает всю оставшуюся часть третьей строки, так как в поле g rid мы задали значение = с);

Поле ZIP При размещении этого поля мы восстанавливаем значение параметра измененное на этане:

= 1;

c);

Метка поля ZIP Для этого компонента мы выделяем всю оставшуюся часть строки, задавая в поле gridwidth значение GridBagConstraints. REMAINDER:

= add(lbZip);

370. Базы данных в Интернеге. Практическое Поле Country Это поле занимает одну ячейку последней строки, поэтому в поле мы записали значение = 1;

add(tfCountry);

Метка поля Country Для этой метки мы установили = 1.0;

= add(lbCountry);

Так как в указано значение 1, для последней строки таблицы отводится все оставшееся снизу контейнера. Если же записать сюда нулевое значение, все будут центрированы в окне контейне ра по вертикали.

Перед завершением работы метод регистрирует обработчики событий от кнопок:

Метод actionPerformed В задачу этого метода входит обработка событий, вызываемых щелчком кноп ки, и отображение диалоговой При щелчке кнопки ОК метод acti onPerformed строки полей нашей формы и записывает их в текстовую переменную с именем s:

String s = s = "First name: + + name: + name: + + code: + + + Далее метод создает диалоговую класса AppletMsgBox (определенный в нашем приложении), передавая строку s соответствующему конструктору:

amsgbox;

= new Панель затем отображается методом show.

В том случае если Вы щелкнете кнопку Cancel, поля формы очистятся:

Глава 9. Применение Класс Этот класс мы создали для отображения диалоговой панели с и кнопкой ОК. образован на базе класса Frame и интерфейс Action Listener:

class AppletMsgBox extends Frame implements { !

В классе AppletMsgBox определены два поля:

Button btnOK;

TextArea ta;

Первое из хранит ссылку на а второе — ссылку на многостроч ный редактор текста, в окне которого мы отображаем сообщение.

Конструктор класса AppletMsgBox Конструктору класса AppletMsgBox передаются два параметра — строка сообще ния и строка заголовка:

public String title) i делом конструктор класса AppletMsgBox вызывает конструктор базо вого класса ему строку заголовка title, и устанавливает раз меры окна панели:

setSize(400, 200);

Кнопка и редактор текста создаются образом:

btnOK = new ta = new 5, 40);

Так как поле ta будет использоваться только для отображения сообщений, мы отменяем функцию редактирования, вызывая метод setEditable.

Далее мы устанавливаем режим размещения компонента = new с = new Параметры размещения текстового поля выбираются следующим образом:

= = = 1;

= c.gridx = c.gridy = new Insets(10, 0, 0, 0);

c);

add(ta);

372 Базы данных в Интернете. Практическое руководство Задавая в поле anchor значение мы добиваемся центрирования редактора внутри выделенного ему пространства.

Так как поле fill имеет значение GridBagConstraints. размеры окна редактора изменяются таким чтобы он занимал всю поверхность вы деленной ему ячейки таблицы.

Мы расположили окно редактора в одной ячейке (значение поля gridheight равно единице), причем так, чтобы оно заняло всю первую строку (в поле width мы установили значение GridBagConstraints. REMAINDER).

Что же касается кнопки, то ее размеры останутся постоянными при коррек тировке размеров контейнера:

= = 35;

с);

Заметим, что мы не ввели в полях и weighty. В результате при изменении размеров окна диалоговой панели и редактор, и кнопка остают ся в его центре.

Перед завершением своей работы конструктор регистрирует обработчик со бытий для кнопки btnOK:

Метод actionPerformed Этот метод скрывает окно диалоговой панели, когда пользователь щелкает кноп ку ОК:

public void e) if (e.

setVisible(false);

Классы Java для работы в сети Язык программирования Java отличается богатой и продуманной библиотекой классов, предназначенной для решения самых разных задач — от создания ар хивов ZIP и работы с растровыми графическими изображениями до задач орга низации приложений Java через сеть.

В этом разделе кратко описаны основные сетевой библиотеки Java, которые потребуются нам для связи аплетов с расширениями сервера Web, Класс Для работы с адресами IP в библиотеке классов Java предназначен класс Inet Address. С его помощью приложение определяет адрес IP локального узла, а также адреса удаленного узла, заданного своим доменным именем.

Вот примеры наиболее интересных методов этого класса:

Глава Применение Java public static public static InetAddress host);

public static InetAddress[] host);

public byte[] public String public String public boolean что создание объекта класса InetAddress выполняется не с помощью оператора new, а с применением статических методов и Метод getLocalHost создаст объект класса для локального узла, то есть для той рабочей станции, на которой выполняется приложение Java:

InetAddress iaLocal;

iaLocal = Б том случае, если Вас интересует удаленный узел сети, Вы создать для него объект класса InetAddress, используя методы getByName или getAll Первый возвращает адрес узла, а второй — массив всех адресов IP, свя с данным узлом.

Если с указанным именем не существует, при выполнении методов getByName и возникает исключение Методам getByName и допустимо передавать не только имя узла, www.sun.com, но и строку адреса IP в виде четырех десятичных чисел, разделенных точками.

Кратко рассмотрим другие методы класса InetAddress.

Метод getAddress возвращает массив из четырех байт IP-адреса объекта. Байт с нулевым этого массива содержит старший байт IP.

Метод возвращает текстовую строку, которая содержит имя узла, раз делитель и адрес IP в виде четырех десятичных чисел, разделенных точками.

Средствами метода Вы можете определить имя узла, для кото рого был создан объект класса И наконец, метод equals для сравнения адресов IP как объек тов класса InetAddress.

Класс URL Для работы с ресурсами, заданными адресами URL, в библиотеке классов Java имеется удобный и мощный класс с названием URL.

С помощью определенных в нем и методов нетрудно извлечь и проверить отдельные компоненты адреса;

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

Расскажем кратко о классе Конструкторы класса В этом классе предусмотрено четыре конструктора.

Первый из создает объект URL для сетевого ресурса, адрес URL которого передается в виде текстовой строки единственный параметр spec:

public spec);

374 Базы данных в Интернете. Практическое В создания объекта проверяется заданный адрес Если адрес указан неверно, возникает Это же происхо дит при использовать протокол, с которым данная система не может работать.

Второй вариант конструктора класса URL допускает раздельное про токола, адреса узла, номера порта, а также имя файла:

public protocol, String host, int file);

Третий вариант предполагает использование номера порта, принятого по умолчанию:

public protocol, String host, String file);

Для протокола HTTP, это порт с номером 80.

И четвертый вариант конструктора допускает указание контекста адреса URL и строки адреса public context, String spec);

Строка контекста позволяет компоненты адреса URL, отсутству ющие в строке spec, такие, как протокол, имя узла, файла или номер порта.

Методы класса URL Кратко рассмотрим самые интересные методы, определенные в классе URL.

Метод позволяет создать входной поток для чтения файла ресурса, с созданным объектом класса public final InputStream Для операции чтения из созданного таким образом потока Вы можете метод read, определенный в классе InputStream.

getHost позволит Вам определить имя узла, данно му объекту public String getHost();

Метод getFile позволяет получить имя файла, с данным объек том public String getFile();

Метод getPort предназначен определения номера порта, на котором вы полняется связь для объекта public int Методом getProtocol Вы можете определить протокол, использование кото рого приводит к установлению соединения с ресурсом, заданным объектом public String getProtocol();

Метод getRef возвращает текстовую строку ссылки на ресурс, соответству ющий данному объекту public String Метод возвращает хэш-код объекта URL:

public Вы можете использовать метод equals для определения идентичности адре сов URL, заданных двумя объектами класса Глава 9. Применение Java public boolean obj);

Если адреса URL метод equals если — значение false.

Метод возвращает текстовую строку внешнего представления адреса URL, определенного данным объектом public String Метод возвращает текстовую строку, представляющую данный объект класса URL:

public String Класс URLConnection В этом классе нам интересен метод Он предназначен для создания канала между приложением и сетевым ресур сом, представленным объектом класса URL:

public URLConnection В этом классе также методы и getlnputStream.

средствами которых Вы сможете создать соответственно потоки вывода и да, привязанные к каналу.

Взаимодействие приложений Java и расширений сервера Web Библиотеки классов Java позволяют организовать взаимодействие между при ложением Java и такими расширениями сервера Web, как CGI или ISAPI. В этом случае приложения или Java смогут посылать произвольные сервера Web для обработки, а затем получать результат этой обра ботки.

Методика организации взаимодействия приложений Java и расширений сер Web основана па применении классов и URLConnection.

Приложение Java, желающее работать с сервера Web, создает объект класса URL для (то есть для исполняемого моду ля или библиотеки динамической компоновки DLL расшире ния ISAPI).

Далее приложение получает ссылку на канал передачи данных с этим расши рением, в объекта класса URLConnection. Затем, пользу ясь методами getOutputStream и getlnputStream из класса URLConnection, прило жение создает с расширением сервера Web выходной и входной капал переда чи данных.

Когда приложение отправляет данные в выходной канал, созданный подоб образом, они попадают в поток ввода приложения CGI или ISAPI. Все выглядит так, как будто бы данные отправлены методом POST из формы, определенной в документе HTML.

Обработав полученные данные, расширение сервера Web их в свой стандартный выходной поток. После этого они становятся доступны при ложению Java через входной поток, открытый методом getlnputStream класса URLConnection.

376 Базы данных в Интернете. Практическое Аплет для передачи номера кредитной карточки Некоторые компании предлагают клиентам систему бе зопасного ввода о кредитных карточках, реализованную на базе Java. Их работа основана на шифровании на стороне клиента о карточке, покупателем. При этом аплет шифрует пе ред передачей ее через сеть, а приложение, работающее на сервере компании, получает се и расшифровывает.

Заметим, что подобная задача также решается при клиентского эле мента управления на покупателя, или при помощи специальной программы, Однако первый способ, основанный на при менении не пользуется особой популярностью из-за потенциальной опасности клиентских элементов управления ActiveX, Второй, предполагающий загрузку специальной программы, неудобен для покупателя.

Еще один безопасной номера кредитной карточки связан с использованием протокола HTTP. При этом информация шифруется средствами а расшифровывается на стороне сервера Web. Но и этот способ не без недостатков. Во-первых, длина ключа, равная для интернациональ ных версий браузера Microsoft Internet Explorer, составляет 40 бит, чего не все гда достаточно. Во-вторых, прежде чем применять указанный протокол, необхо димо приобрести специальный сертификат, за использование которого в даль нейшем придется вносить ежемесячную или ежегодную плату.

Java обезопасят Вашу информацию. Их можно применять для защищенной передачи данных независимо от наличия соответствующих браузера, кроме того, Вам не придется приобретать какие-либо сертификаты.

Однако, если Вы решили создать собственное средство защищенной переда чи критичной через Интернет, то мы настоятельно рекомендуем выполнять с использованием каких-либо известных и хорошо про методов. В Интернете немало доступных исходных текстов криптог рафических созданных на основе серьезных математических исследо ваний. Что же касается самодельных криптографических систем, то, скорее все го, они не смогут противостоять серьезным попыткам дешифрования.

name sad numfaa Cancel Done My C Рис. 9-3. Ввод номера кредитной карточки в окне аплета Глава 9. Применение Мы не будем описывать криптографические алгоритмы и программы, так как это выходит за рамки рассматриваемого в книге материала. Мы приведем исход ные тексты передающего информацию о карточ ке расширению сервера Web в открытом виде. При необходимости Вы сами до бавите к криптографические модули.

Внешний вид аплета CreditCard показан на рис. 9-3.

ввода информации о кредитной карточке посетитель кнопку ОК. При этом данные из полей формы ввода будут переданы расшире нию сервера Web, созданному нами в виде приложения ISAPI. Это приложение извлечет данные формы и отправит их обратно аплету. Аплет отобразит строку, принятую расширением ISAPI, в диалоговой показанной на рис. 9-4.

2/ Window Рис. 9-4. Информация о кредитной карточке, полученная от расширения ISAPI Реальная система передачи номера кредитной карточки обязательно шифрует передачей се на сервер. При этом аплет, шиф рование, должен содержать в себе никаких ключей. Дело том, что злоумыш ленники могут байт-код аплета с извлечения секретного ключа.

Поэтому если для получения ключа аплет, например, установит прямую связь с сервером компании с сокетов и получит ключ через этот Расширение сервера Web в реальной системе должно получен ную информацию и выполнить платежную операцию через сервер банка.

Для разработки программных модулей, выполняющих все описанные операции, необходимо привлекать специалистов процессинговой компании или банка (если Вы создаете сервер процессинговой компании). Поэтому мы не ста нем описывать этот процесс более подробно, а займемся исходными текстами аплета, выполняющего обмен данными с расширением сервера Web. Полный текст аплета Вы найдете в листинге 9-2.

Листинг 9-2 хранится в файле на прилагаемом к книге Инициализация аплета При инициализации аплета метод it вначале создает все необходимые компо ненты и устанавливает режим размещения tfName new = new new = new (см. стр.) 378 Базы данных а Интернете. Практическое = new = btnOK new = new = new GridBagConstraints с = new Далее метод init устанавливает параметры размещения отдельных компонен тов и добавляет их в окно используется техника, нами ранее в этой главе при создании аплета GridBag.

Отправка данных расширению сервера Web Когда пользователь щелкает кнопку ОК, управление передается методу action Performed. Рассмотрим выполняемые им действия.

Прежде всего, этот метод извлекает данные из компонентов, размещенных в окне аплета. Данные оформляются в виде текстовой строки параметров ка расширения ISAPI с именем как это показано и;

{ и new + + + + + + > catch(Exception { String = new При этом создается новый объект класса URL, представляющий собой запускаемого расширения ISAPI. Все операции выполняются в блоке try catch, так как при работе могут возникать ошибки, связанные, на пример, с разрывом связи между браузером покупателя и сервером.

Далее мы создаем канал связи с расширением как объект класса URLCon с;

с = С помощью методов и для канала разрешается нение операций вывода и ввода соответственно.

Глава 9. Применение Java Чтобы принять данные от расширения ISAPI, мы создаем входной поток данных класса основанный на потоке Этот поток, в свою очередь, получен помощи метода DatalnputStream is;

is = new Чтение из потока выполняется в цикле:

String String { = == null) break;

str += Здесь в строке str накапливаются полученные данные.

По достижении конца потока мы его закрываем:

После получения всех строк от расширения мы отображаем со держимое строки в диалоговой панели:

= new amsgbox.

Размещение аплета в документе HTML обмен данными с сервера Web, надо загружать именно с сервера, а с какого-либо другого. Поэтому в документе HTML с апле правильно указывайте параметры тега :

Параметр задавать имя аплета, а параметр CODEBASE — адрес URL каталога, в котором будет расположен аплет.

Полный исходный текст документа HTML, подготовленный нами для апле та Card, Вы в листинге 9-3.

Листинг 9-3 хранится в файле на прилагаемом к книге компакт-диске.

Исходный текст расширения ISAPI В листинге 9-4 находится полный исходный текст расширения ISAPI, подготов ленного нами для совместной работы с 9-4 Вы найдете в файле ch09/lsCard/lsCard.c на прилагаемом к книге компакт-диске.

Все основные действия выполняются расширением в HttpExten 380 Базы данных в Интернете. Практическое руководство Получив управление, эта функция в буфер f заголовок фор мируемого документа:

"Content-Type:

Обратите внимание: в заголовке мы указали, что документ представляет со бой текст без форматирования, а не страницу Передаваемый текст из буфера будет прочитан из входного потока.

Далее функция HttpExtensionProc получаст строку параметров, переданную аплетом при загрузке и добавляет ее в буфер:

Таким образом, расширение ISAPI отправляет обратно получен ные от Содержимое буфера посылается аплету следующим образом:

NULL, NULL, return = 200;

return Создавая реальный проект, не забудьте выполнить сканирование строки с целью извлечения из нее параметров и при необхо димости — расшифровку. Далее Вы сможете использовать параметры в соответ ствии с логикой обработки номеров кредитных карточек, предусмотренной бан ком или Передача параметров странице ASP Если по каким-либо Вы не сумеете создать на сервере расширение ISAPI, описанный способ передачи о кредитных карточках можно реализовать средствами сценариев, расположенных в документах ASP. При аплет Java получит номер кредитной карточки посетителя и за шифрует его, а затем передаст странице ASP с использованием механизма за грузки нового документа в окно браузера. В этом разделе мы приведем пример аплета указанные действия.

Полный исходный текст аплета приведен в листинге Листинг 9-5 Вы найдете в файле ch09/CreditCard2/CreditCard2.java на прилага емом к книге компакт-диске.

Так же как и только что описанный аплет CreditCard, аплет CreditCard2 по лучает от посетителя о при помощи тов, добавленных в режиме размещения Когда посетитель щелкает в окне аплета кнопку метод загружает страницу ASP с именем указывая полный адрес в конструкторе класса = new + + + Глава 9. Применение Java + + + tfExpiration.getTextC) + Для того чтобы серверный расположенный на получил о кредитной карточке, при создании объекта класса URL мы добавляем к адресу параметры, отделив их При этом параметры друг от друга символом Чтобы загрузить ccard.asp в окно браузера, мы создаем объект клас са вызывая для этого метод AppletContext appletContext;

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

if (и != null) < } Для загрузки мы вызываем метод передавая в качестве второго параметра имя окна для документа. Пользуясь этим парамет ром, аплет может загрузить документ в любой в существующее или созданное окно браузера. Параметр >> означает, что документ будет загру жен в то же самое окно, где находится аплет.

Исходный текст страницы ccard.asp приведен в листинге 9-6.

Листинг 9-6 Вы найдете в файле на прилагаемом к книге компакт-диске.

В нем мы получаем параметры, переданные помощи объекта Request, а затем отображаем их значения в динамически создаваемом докумен те HTML:

= number = date = В реальном проекте можно, например, передать серверному эле менту управления ActiveX для расшифровки и дальнейшей обработки. Таким образом, страница ASP станет удобным средством извлечения параметров из данных, отправленных посетителем Вашего сервера при помощи Java.

Элементы языка JavaScript Это приложение содержит краткую справочную информацию по языку сцена риев JavaScript. пригодится Вам при составлении как клиентских, так и серверных сценариев.

Переменные В JavaScript Вы можете использовать переменные, адресуясь к ним по имени. Переменные бывают как так и локальные. Первые до ступны из любого места сценария. Область действия локальных переменных ог раничивается функцией, внутри которой эти переменные объявлены.

Так же как и в языке при составлении сценариев JavaScript допустимо использовать без их предварительного объяв ления. Исключение из этого — локальные переменные, определенные в функциях.

Объявление переменных Все переменные в JavaScript объявляются с ключевого слова как это показано ниже:

var При объявлении тип переменной не указывается. Он присваивается перемен ной только тогда, когда в нее какое-либо значение.

При выборе имен переменных следует придерживаться следующих правил:

имя должно начинаться с буквы или с символов и мо жет состоять только из букв, цифр, а также символов имя переменной не должно совпадать с ключевыми словами JavaScript.

Список зарезервированных ключевых слов JavaScript приведен в таблице П-1.

Таблица Зарезервированные ключевые слова JavaScript break default false case delete finally null try catch do return class else function super var const I switch void continue export import this while debugger extends throw with Приложение Элементы языка Присвоение значения переменным Вы можете присвоить при помощи оператора Например, мы объявляем переменную и затем записываем в стовую строку:

var szHelloMsg;

= "Hello, В любом месте программы мы можем присвоить переменной szHelloMsg чис ленное значение, например, так:

szHelloMsg = 4;

После выполнения такой операции тип переменной изменится, причем в сценария браузер не отобразит никаких предупрежда ющих сообщений.

Вы вправе присвоить значение null:

szHelloMsg = null;

Такое присвоение не назначает переменной типа. Оно применяет ся в тех случаях, когда Вам нужно объявить переменную и вать ее, не присваивая этой переменной никакого начального значения и В частности, в только что приведенном примере переменной szHelloMsg при сваивается пи численное значение 0, ни пустая текстовая строка.

Типы данных Хотя при создании переменной Вы не можете присвоить ей тип, в языке Java Script все же существует несколько типов данных. Это числа, текстовые стро ки, логические данные, объекты, неопределенного типа, а также специ альный тип null.

Числа JavaScript использование чисел в форма тах: целые числа, числа в формате с плавающей десятичной точкой и числа в научной нотации. Целые числа могут быть представлены по основанию 8, или В некоторых случаях арифметические функции так называемое «нечисло», которое в JavaScript называется NaN a Number). это специальное значение, которое не соответствует никакому числу. Оно рируется в случаях, когда результат операции над числами может быть представлен в виде числа. Средства isNaN позволят Вам проверить, является ли значение «нечислом».

Текстовые Текстовые строки — это последовательность символов Unicode, заключенных в одинарные или двойные кавычки, например:

"Hello, "12345" 384 Базы данных Практическое Строка — пустая. Заметим, следующие два присвоения не эквивалентны:

В первом случае в переменной хранится текстовая строка (хотя бы и но втором — совсем Логические данные Логические данные имеют только два и Эти ни как не соотносятся с числами 1 0. Они главным образом для выполнения операций сравнения, а также для в условных опе раторах.

Данные неопределенного типа Если была объявлена, но ей еще ни разу не присваивалось значение, она имеет неопределенный тип. в следующей строке сценария объяв лена MyVariable, которая имеет неопределенный тип:

var Если же этой переменной присвоить значение null, то тип переменной нится — теперь она будет содержать MyVariable = null;

Преобразование типов данных Когда в выражениях встречаются переменные разных типов, интерпретатор JavaScript автоматически преобразует численные данные в текстовые строки, Обратное же преобразование (строк в числа) приходится выполнять с помощью специальных функций — и parseFloat.

Рассмотрим следующий сценарий:

= = 4 + число четыре + = + 2) + чиспо четыре" + + szBuf2);

Здесь мы объявили переменную szTextBuf и ее пустой строкой. Далее мы присвоили этой строке сумму числа 4 и двух текстовых строк:

szTextBuf = 4 + число четыре" + При вычислении этого выражения значение 4 автоматически преобразуется в текстовую строку. Дальнейшее суммирование выполняется как слияние (кон катенация) трех текстовых строк.

Обратите внимание на символ пробела который ис пользуется в документах HTML. Если заменить его обычным пробелом, то пос ле конкатенации строк этот пробел исчезнет.

В следующей строке мы преобразуем текстовую строку «2» в численное зна чение с помощью функции parselnt, прибавляем к результату преобразования число 2, а затем выполняем конкатенацию с двумя текстовыми строками:

szBuf2 = число четыре В результате переменная будет содержать ту же самую строку, что и переменная SzTextBuf.

Приложение 1. Элементы языка JavaScript Операторы Операторы языка сценариев JavaScript напоминают общеизвестные операторы языка С.

Унарные операторы Они применяются для изменения знака, операции и декремента (таблица П-2).

Таблица П-2. Унарные операторы Унарный оператор Назначение Изменение знака : Дополнение. Используется для логи ческих переменных ++ Увеличение значения переменной. Также применяется как пре фикс переменной или как ее суффикс переменной. Также как пре фикс или как ее суффикс Бинарные операторы Бинарные операторы соединяют два операнда. В языке сценариев JavaScript предусмотрены бинарные операторы для вычитания, сложения, деления и вычисления остатка деления (таблица П-3).

Таблица П-3. Бинарные операторы Бинарный оператор Назначение Вычитание Сложение * Умножение / Деление X Вычисление остатка от деления Операторы для выполнения логических В своих Вы можете применять операторы, выполняющие над бита ми переменных такие логические как «И», «ИЛИ», «ИСКЛЮЧАЮ ЩЕЕ ИЛИ», «НЕ» (таблица Данные операторы перед сво их функций преобразуют значения переменных в 32-разрядные целые числа.

Таблица Операторы для выполнения Оператор Логическая операция & И ИЛИ ИСКЛЮЧАЮЩЕЕ ИЛИ НЕ Базы данных в Интернете. Практическое руководство Операторы сдвига Для выполнения операций сдвига в языке JavaScript предусмотрено три опера тора (таблица Таблица П-5. Операторы сдвига Оператор сдвига Назначение Сдвиг вправо Сдвиг Сдвиг вправо с Перед операторов сдвига значение переменной преобразует ся в 32-разрядное целое число.

Операторы отношения Операторы отношения для сравнения переменных (таб лица П-6). Они возвращают логические значения true или false в зависимости от результата сравнения и применяются главным образом в условных опера торах.

Таблица П-6. Операторы отношения Оператор отношения Условие, при котором оператор возвращает значение > Левый больше правого >= Левый операнд больше или равен правому правого Левый операнд меньше или равен правому == Левый операнд равен правому ! = равен правому В условных операторах также часто применяются логические операторы (таб лица Таблица П-7. Логические операторы Логический оператор Описание | | Оператор Возвращает когда один из равен Оператор «И». значение true, когда оба операнда равны Оператор присваивания Оператор присваивания задает значения В языке Java Script, так же как и в языке программирования С, допускается комбинирование этого оператора с другими для изменения содержимого В таблице мы перечислили возможные комбинации оператора при сваивания и других операторов.

Приложение Элементы языка JavaScript Таблица Комбинации оператора присваивания и других операторов Оператор Описание Простое Увеличение значения или слияние строк численного *= /= Вычисление остатка от деления Сдвиг вправо Сдвиг вправо с разрядов нулями | = ИЛИ И ИЛИ Условные операторы Любой язык программирования бесполезен, если в нем не предусмотрены тс или иные средства ветвления при выполнении программы. В языке име ется условный оператор else-if, который разные про строки в зависимости от условия.

Общий вид оператора else-if показан ниже:

строка [else строка 2] Часть оператора, выделенная квадратными скобками, необязатель ной. При выполнении этого оценивается условие, заданное в круглых скобках после слова if. Если в результате оценки условия получи лось логическое значение выполняется строка 1. Если же получилось зна чение false, то выполняется строка 2 (в том случае, когда она присутствует).

Оператор может быть вложенным. Учтите, что еели в строке 1 или необходимо расположить несколько операторов, их следует выделить фигурны ми скобками.

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

выражение ? строка 1 : строка При вычислении оператора вначале оценивается логическое расположенное в левой части. Если оно равно строка 1, а false — строка 2.

Операторы цикла В языке JavaScript несколько предназначены для организации циклов.

Базы данных в Интернете. Практическое Оператор for Общий вид оператора for показан ниже:

] строки тела цикла } Б области инициализации обычно выполняется присваивание начальных значений переменным цикла. Здесь допустимо объявление новых переменных при помощи ключевого слова Вторая область задает условие выхода из Это условие оценивается каждый раз при прохождении Если в результате оценки получается ло гическое значение выполняются строки тела цикла.

Область итерации применяется для изменения значений переменных цикла, например для счетчика цикла.

Оператор for-in Оператор for-in предназначен просмотра всех свойств объекта и записыва ется в следующем виде:

in { строки тела цикла Оператор while Для организации циклов с проверкой их завершения перед выполнени ем итерации используется оператор while:

строки тела цикла Если в результате оценки условия получается значение тогда итерация если false — цикл Оператор break С оператора break можно прервать выполнение цикла, созданного операторами или while, в любом месте.

i = 0;

Приложение 1. Элементы JavaScript 10) break;

:

Оператор continue оператора continue внутри цикла или while приводит к что итерация прерывается, а затем возобновляется заново. Этот оператор не пре рывает цикл.

Ниже мы пример использования оператора continue:

i = < 100) if(i < 10) continue;

Здесь фрагмент тела цикла, отмеченный многоточием, будет выполняться только после того, как значение переменной i 10. Когда же это значение достигнет 100, цикл завершится.

Прочие операторы Среди прочих операторов языка сценариев JavaScript рассмотрим оператор доступа к полю, индексирование массива, скобки и запятую (таблица П-9).

Таблица П-9. Прочие операторы Оператор Описание Доступ к полю объекта Индексирование Скобки Запятая Первый из этих операторов для методов, определенных в объектах, а также для доступа к полям объектов, или, как их еще называют, к свойствам объектов.

Ниже, мы метод write, определенный в объекте document:

Квадратные скобки используются для индексации массивов аналогично тому, как это делается в других языках программирования.

Что касается круглых то они либо для изменения по вычисления выражений, либо для передачи параметров функциям.

Оператор предназначен для разделения выражений, которые надо оценивать последовательно. Этот прием называется многократным вычислени ем. в фрагменте исходного ниже, па каждой ите рации цикла выполняется увеличение содержимого i и 390 Базы данных в Практическое var var = 0;

ford = 0;

i < 25;

i++, Старшинство операторов JavaScript В таблице операторов JavaScript порядок вычисления со ставных операторов. Не забудьте, что все логические операции слева Первыми вычисляются расположенные в начале таб лицы старшинства.

Таблица старшинства операторов JavaScript Оператор Описание Доступ к полю, индексирование функции. [] С) Унарные деление, вычисление остатка от деления Сложение, слияние строк Битовые сдвиги или равно, больше, больше или равно Логическая операция «И» Логическая «ИСКЛЮЧАЮЩЕЕ Логическая Логический оператор отношения «И» Логический оператор отношения «ИЛИ» Условный оператор = += -= /= |= = Многократное вычисление Функции Вы можете оформить фрагменты исходного текста в виде функции, вызывая эту функцию по мере необходимости из мест сценария JavaScript.

Для клиентских сценариев обычно определяются в разделе заголов ка документа HTML, отмеченного тегами и . Как мы уже говори ли, функцию надо определить перед вызовом. Размещение всех функций в разделе заголовка документа HTML гарантирует этих функций при обработке документа. В серверных сценариях ASP функции необ ходимо определить до их использования.

Общий вид функции показан ниже:

1] 2] Приложение Элементы языка JavaScript строки тела функции [return Все параметры передаются функции по значению. Поэтому функция не мо жет изменить содержимое переменных, передаваемых ей параметров.

слово return позволяет функции вернуть значение.

Встроенные объекты В таблице мы перечислили встроенные свойства и методы кото рых доступны в сценариях JavaScript без предварительного определения этих объектов.

Таблица Встроенные объекты JavaScript Объект Описание Array Массив Boolean Логические Date Календарная дата Function Функция Global методы Math Математические константы и функции Числа Object Объект String Строки Встроенные объекты очень для различных операций со строками, календарными датами, массивами, числами и т. д. Они освобождают программиста от выполнения рутинных операций вроде строк или вычисления математических функций.

Как работать со встроенными Это достаточно просто. Программа создает объекты, а затем обращается к их свойствам и методам.

В качестве примера, имеющего практическое рассмотрим фрагмент сценария, расположенного в документе HTML, в котором текущая дата и время:

dt = new DateC);

szDate = "Date;

+ + + + + + + + + + 392 Базы данных в Интернете. Практическое Здесь сценарий JavaScript создает объект Data, применяя для этого ключевое слово new. знакомое всем поклонникам языка C++, и конструктор Date без па dt;

new таким образом объект Data инициализируется текущей локаль ной датой, на компьютере пользователя (а не на сервере Web, с которого был загружен соответствующий документ HTML). Если же располо жить данный фрагмент кода в серверном сценарии ASP, то объект Data, напро тив, инициализируется датой, установленной на сервере, В следующей строке формируется текстовая строка даты:

szDate = "Date: + + + Значение календарного числа, номера месяца и года здесь получается при помощи методов getDate, и getYear соответственно. Эти методы вызы ваются для объекта dt, содержащего текущую дату.

Текстовая строка даты выводится в документ HTML с помощью метода определенного в объекте document:

Заметим, что Date содержит также информацию о текущем Она извлекается для отображения с помощью методов и getSeconds (соответственно часы, минуты и секунды):

+ + + + + Массивы Язык сценариев JavaScript допускает работу с массивами встроенных объектов браузера и любых других объектов.

Вы можете создать массив как объект встроенного класса Array, а затем об ращаться к его элементам средствами обычной операции индексации:

var myArray;

myArray = new = 255;

= 254;

= 0;

Встроенный класс Math Хотя сценарии JavaScript редко применяют для математических вычислений, в нем все же есть встроенный класс Hath, предназначенный как раз для Свойства Перечислим свойства класса Math. Все они являются математическими констан поэтому сценарий JavaScript не изменять их Приложение 1. Элементы языка JavaScript Е Это свойство представляет собой константу е. Приблизительное ее значение равно 2,72.

Вот пример использования свойства Е:

var = Здесь мы записываем в переменную пЕ константы е, PI Свойство PI это число р, то есть константа с приблизительным значением, равным 3,14.

Пример использования свойства PI:

nR;

nL = 2 * * Здесь свойство PI применяется для вычисления длины окружности по ее радиусу. Формула такова:

1 = 2pR, где R — радиус окружности.

Свойство LN2 — константа со значением натурального логарифма числа 2, то есть 1п2.

Пример использования:

nValue = LN Свойство — константа со значением натурального логарифма числа 10, то есть Пример использования:

nValue = LOG2E Это свойство является константой со значением, равным логарифму числа 2 по основанию е. то есть 2.

Пример использования:

nValue;

nValue = LOG10E Свойство — это логарифм числа е по основанию 10, то есть loglOe.

Пример использования:

var nValue;

nValue 394 данных в Интернете, Практическое SQRT Свойство SQRT2 — это значение корня из 2.

Пример использования:

= SQRT1_ Свойство — это значение квадратного корня из ОД Пример использования:

nValue Методы Перечислим методы класса Math.

abs Вычисление абсолютного значения.

Пример использования:

nValueAbs;

= Здесь в переменную nValueAbs записывается абсолютное значение перемен ной nValue.

acos Вычисление арккосинуса.

Пример использования:

nValue;

nValue = asin Вычисление арксинуса.

Пример использования:

var nValue;

nValue = atan Вычисление арктангенса.

Пример использования:

nValue;

nValue = ceil наименьшего целого значения, большего или равного аргументу функции.

Пример использования:

Приложение Элементы языка var = COS Вычисление косинуса.

Пример nValue;

nValue = exp Экспоненциальная функция, значение которой равно числу е, возведенному в степень аргумента функции.

Пример nValueExp;

= floor Вычисление наибольшего целого значения, меньшего или равного аргументу функции.

Пример nValue;

nValue = log Вычисление натурального логарифма Пример использования:

nValue;

nValue = max Определение наибольшего из значений.

Пример var nValue2;

nValueMax;

nValueMax nValuel);

min Определение наименьшего из двух Пример использования:

var var nValue2;

nValueMin = nValuel);

396 Базы данных в Интернете. руководство pow Возведение числа в заданную степень.

Пример var = 3);

Здесь число 2 возводится в степень 3, а равный 8, записывается в переменную nValue.

random Метод random случайное число в интервале от 0 до 1.

Пример использования:

nRandomValue = round Метод round предназначен для выполнения округления значения аргумента до ближайшего целого. Если десятичная часть числа равна 0,5 или больше этого значения, то выполняется округление в большую сторону, если меньше — в мень шую.

Пример использования:

var nValue;

nValue После выполнения округления значение nValue равно 2.

sin Вычисление синуса.

Пример использования:

var nValue;

nValue sqrt Вычисление квадратного корня от аргумента.

Пример использования:

nValueSqrt;

nValueSqrt = tan Вычисление тангенса.

Пример var nValue;

nValue = Встроенный класс С помощью методов встроенного класса Date сценарий JavaScript выполняет действия с часами например получает и устанавливает Приложение JavaScript текущую дату и время. Ниже мы кратко конструкторы и методы этого класса.

класса Date Для использования большинства методов класса необходимо создать объект этого класса при помощи одного из трех конструкторов.

Конструктор первого вызывается следующим образом:

var = new Date<);

Здесь создается объект Date, в котором хранится информация о текущей дате и времени. Это время задается по Гринвичу, или, пользуясь современным опре делением, с использованием времени Universal Coordinated Time Конструктор второго вида позволяет указать дату через единственный пара метр:

dtNewDate;

dtNewDate new Параметр задает дату в миллисекундах, считая от 1 января 1970 года.

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

dtNewDate;

month, date, min, sec, Параметры этого конструктора перечислены в таблице Таблица П-12. Параметры конструктора Date Параметр Описание Год, 1998 month Номер месяца от 0 (январь) до date дата в диапазоне от 1 до Необязательный параметр, час дня в диапазоне от 0 до 23. Не обходимо указывать параметр только в том случае, если задан пара метр rain min Необязательный задающий минуты в диапазоне от 0 до 59. Не обходимо указывать этот параметр только в том случае, если задан пара метр sec sec параметр, секунды в диапазоне от 0 до 59.

Необходимо указывать параметр только в том случае, если задан параметр ms ms параметр, задающий миллисекунды в диапазоне от 0 getDate Определение даты, хранящейся в класса Date.

Метод возвращает значение календарной даты в от 1 до 31.

398 Базы данных в Интернете. руководство Пример использования:

var nDate;

dtNewDate = new nDate = getDay Определение номера дня недели, хранящегося в объекте класса Date Метод возвращает 0 для воскресения, 1 — для понедельника и т. д.

Пример использования;

= getHours Определение количества часов, прошедших после полуночи.

Пример = Определение количества минут, прошедших с начала часа.

Пример использования:

Определение количества месяцев, прошедших с января.

Пример getSeconds Определение количества секунд, прошедших с минуты.

Пример = dtDate.getSecondsO;

getTime времени для заданного объекта класса Date.

Метод getTime возвращает количество миллисекунд, прошедших с 1 января года.

Пример = смещения локального времени относительно времени по Гринви чу (в миллисекундах).

Пример использования:

= Приложение 1. Элементы языка JavaScript getYear Метод getYear возвращает год, хранящийся в объекте класса Пример использования:

= parse Метод parse возвращает количество миллисекунд, прошедших с 00 часов 00 минут 1 января 1970 года по указанное в параметре функции. Для вы зова этого метода Вам не нужно создавать объект класса достаточно про сто сослаться на имя этого класса:

= Через параметр szDataString Вы можете указать время, например так:

"12 1998 12:00:00" "12 Oct 1998 12:00: "12 Oct 1998 12:00: Первая из этих строк задает локальную дату и время, вторая — дату и время по Гринвичу, и, наконец, последняя — время и дату по Гринвичу со смещением на 3 часа и 30 минут.

Метод parse обычно применяют вместе с конструктором объекта Date или с методом который мы рассмотрим ниже.

setDate Метод setDate используется для установки календарной даты в объекте класса Date.

Пример использования:

Параметр может принимать значения от 1 до 31.

setHours Метод setHours используется для установки количества часов, прошедших после полуночи, в объекте класса Пример использования:

Параметр может принимать любые положительные или отрицатель ные значения. При необходимости происходит соответствующее изменение ка лендарной даты, записанной в объекте класса Date.

Метод setMinutes используется для определения количества минут, прошедших с начала часа, в объекте класса Date.

Пример использования:

400 Базы данных в руководство Параметр может принимать любые положительные или отрицатель ные значения. При необходимости происходит соответствующее изменение ка лендарной даты, записанной в объекте класса Date.

setMonth Метод setMonth используется для установки номера месяца, прошедшего с на чала года, в объекте класса Date.

Пример использования:

Параметр может принимать любые положительные или отрицатель ные значения. При необходимости происходит изменение ка лендарной даты, записанной в объекте класса Date.

setSeconds Метод setSeconds применяется для определения количества секунд, прошедших с начала минуты, в объекте класса Date.

Пример использования:

Параметр nSeconds может принимать любые положительные или отрицатель ные значения. При необходимости происходит соответствующее изменение ка лендарной даты, записанной в класса Date.

setTime С помощью метода можно установить дату в объекте класса Date, соот ветствующую заданному количеству миллисекунд, прошедших с 1 января года.

Пример использования:

setYear Метод setYear применяется для определения номера года в объекте класса Date.

Пример использования:

Метод предназначен для преобразования даты в строку, записанную в стандартном формате времени по Гринвичу (GMT).

toLocaleStrlng Аналогично однако вместо времени GMT используется локаль ное время.

Метод UTC преобразует дату, заданную параметрами метода, в количество мил лисекунд, прошедшее с 1 1970 года.

Приложение Элементы языка При использовании метода так же как и метода parse, Вам не нужно со здавать объект класса Date:

= month, date, hours, sec, ms);

Встроенные функции В этом разделе перечислены несколько полезных встроенных которые Вы можете использовать в своих JavaScript.

eval для преобразования текстовой строки в численное Через параметр она получает текстовую строку и вы числяет ее как выражение языка Функция возвращает результат вычисления:

var Eval(szStr);

parselnt Эта функция предназначена для преобразования текстовой строки в целочислен ное значение. Строка передается функции через параметр:

var = parseFloat Функция parseFloat пытается преобразовать текстовую строку в число с пла вающей точкой. Текстовая строка передается этой функции через первый пара метр, а счисления — через второй:

var nFloat = parseFloat(szStr, nRadix);

escape Средствами функции escape сценарий JavaScript может закодировать текстовую строку с URL-кодировки. В этой кодировке специальные симво лы — пробел или символ табуляции — преобразуются к следующему виду:

где хх — шестнадцатеричный код символа.

Вот пример использования этой функции:

var = escape(szStr);

Функция unescape выполняет действие, прямо противоположное действию фун кции unescape — перекодирует строку из URL-кодировки в текстовую строку:

var = П Р ИЛ ОЖЕ Н ИЕ Встроенные объекты ASP В этом кратко описаны и методы встроенных объектов, ных ASP: Server, Request, Response, Application и Session.

Объект Server Этот объект обеспечивает сценариям доступ к методам и свойствам сервера. С их помощью выполняются такие операции, как создание перекодиро вание строк и т. д, Свойства объект имеет только одно свойство Оно время работы перед возникновением состояния тайм-аута.

Пример использования:

= Здесь устанавливается интервал, равный 150 секундам (по умолчанию он равен 90 секундам).

Методы Рассмотрим методы объекта Server.

CreateObject Этот метод применяется серверными сценариями для создания экземпляра эле мента управления ActiveX.

Пример использования:

connect;

connect = Здесь мы создаем объект передавая методу CreateObject объекта.

Execute Метод предназначен для вызова файла ASP из серверного сценария. Вызванный файл обрабатывается так, как будто он является частью вызывающего файла ASP.

Пример использования:

Приложение 2. Встроенные объекты ASP Этот метод доступен до когда сценарий отправил ответ.

Он возвращает ASPError, описывающий состояние возникшей ошибки.

Метод HTMLEncode преобразует текстовую строку ANSI в строку с кодировкой заменяя символы пунктуации специальными символьными объектами типа URLEncode Аналогичен предыдущему, но выполняется кодировка В частности, про белы заменяются символами а символы пунктуации преобразуются к виду Ххх, где хх — код символа.

отображение виртуального или логического пути на физический сервера. Позволяет получить физический путь для заданного виртуально го пути.

в результате выполнения следующей строки в переменную path записывается физический путь, по которому находится текущая страница path = Transfer Метод Transfer передает информацию о текущем состоянии в другой файл ASP для дальнейшей обработки.

Пример использования:

В результате обработка будет продолжена в файле Объект Request Объект Request доступ к информации, переданной браузером через заголовок HTTP: использованный метод передачи данных (POST или GET), Cookie и т. д.

Для объекта Request определены наборы, свойства и методы.

Наборы Наборы могут содержать один или несколько объектов.

Cookies В этом наборе хранятся значения Cookie, переданные браузером.

Ниже показано, как можно извлечь из набора Cookie с nc = ;

404 Базы данных в Интернете. Практическое Form Этот набор содержит значения из полей формы.

Ниже мы показали, как сценарий определяет количество элементов в набо ре с именем Colors:

i = Первый элемент набора извлекается следующим образом:

= ;

Мы широко использовали набор Form в наших примерах серверных сценари ев, работающих с формами.

QueryString Набор QueryString содержит данные, как часть адреса стра ницы ASP.

ClientCertificate Этот набор хранит такие значения клиентского сертификата, как серийный но мер, признак действительности сертификата, дата истечения срока действия сертификата и т. д.

Набор ServerVariables хранит из предопределенных переменных сре ды. Некоторые из определить параметры системы посетителя сервера и представляют большой интерес для разработчиков.

В таблице П-13 перечислены некоторые, наиболее интересные, на наш взгляд, переменные среды, доступные через набор ServerVariables.

Таблица П-13. Переменные среды Параметр Описание Все заголовки HTTP, отправленные посетителя Аналогичен предыдущему, но заголовки представлены в виде (без префикса НТТР_ и без вания в заглавные буквы) Размер данных, отправленных браузером Тип полученных от браузера НТТР_АССЕРТ Заголовок Accept Строка, описывающая национальный язык, который использовать для отображения содержимого Строка браузера посетителя Строка значений Cookie Адрес URL для перенаправления.

HTTPS Содержит строку если передача данных выполняется по защищенному каналу SSL, или если применяется канал LOGON_USER Учетная запись Windows NT, с которой подключился посе титель сервера Приложение 2. объекты ASP Таблица Переменные среды Параметр Описание Строка, в запросе HTTP после знака REMOTE_ADDR Адрес IP посетителя сервера. Может быть использован для определения, с какого адреса IP посетитель выполнил регистрацию Имя посетителя (то есть имя его компьютера) Имя пользователя Метод, использованный для выдачи HEAD, POST и т. д.) Виртуальный путь к странице со сценарием Имя сервера SERVER_PORT Номер порта, на котором сделан запрос Если эта строка содержит 1, запрос был создан с примене нием безопасного порта. В противном случае строка содер жит значение О Имя и протокола, с применением которого запрос Имя и версия обеспечения сервера Свойства Для объекта определено только одно свойство Оно содер жит количество байт данных, полученных в результате выполнения запроса.

Методы Для объекта Request определен метод позволяющий извлечь данные, отправленные серверу как часть запроса POST.

Объект Response Объект Response используется для управления информацией, отправляемой клиентским сценарием в браузер посетителя. Он позволяет передавать данные выполнять переадресацию браузера на другой адрес URL, a также устанавливать значения Cookie.

Наборы В объекте Response предусмотрен набор Cookies, позволяющий устанавливать Cookie. Об этого набора мы рассказали в третьей гла ве нашей книги.

Свойства Рассмотрим свойства объекта Response.

Buffer Признак вывода страницы. Если вывод в этом свой стве хранится значение true, в противном случае — false.

406 Базы данных в Интернете. Практическое При использовании буферизации сервер не отправляет ответ клиенту до тех пор, пока не завершится обработка серверных сценариев, расположенных на текущей странице, или пока будут методы Flush или End, определен ные в рамках объекта Response.

CacheControl Если это свойство имеет Public, страницы сервера будут ся внешними прокси-серверами. В том случае, если содержит строку Private, внешнее кэширование отменяется.

Charset Имя набора символов, которое нужно в заголовке определения содер жания (content-type).

Тип содержимого, такой, как или Expires Период времени в минутах, по прошествии которого содержимое документа будет считаться устаревшим.

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

Если это так, возможно, сценарию следует прекратить работу.

Status Строка сервером. Например, следующий фрагмент кода устанавливает строку диагностического сообщения:

= "401 Access denied - password do not match" Методы Ниже перечислены методы объекта Response.

к создаваемой странице нового произвольного заголовка.

Добавление строки в журнал сервера BinaryWrite Запись на страницу двоичных данных для использования клиентскими объек Выполняется без преобразований символов.

Приложение 2. Встроенные объекты ASP Удаление из буфера вывода создаваемой страницы HTML (без заголовков HTTP).

End Прекращение обработки сценария.

Flush содержимого буфера клиенту и последующая очистка буфера.

Redirect Переадресация браузера посетителя по адресу в параметре данного метода.

Write Запись текстовой строки в формируемый документ HTML. Для сокращения вместо этого метода используется символ Объект Application Как Вы знаете из третьей главы нашей книги, объект Application позволяет здавать переменные, одновременно всем пользователям, работающим с Вашим приложением.

Для этого объекта определены наборы, методы, а также события.

Наборы В объекте Application два набора — Contents и Contents Этот набор содержит все элементы, добавленные при помощи Методы Contents. Remove и Contents. позволяют удалить выбранные или все элементы StaticObjects Набор StaticObjects содержит все статические объекты, при по мощи тега .

Методы С помощью методов Lock и Unlock сценарий может соответственно запретить или доступ к набору переменных объекта Application.

События, возникающие при работе посетителей с приложением ASP, обрабаты ваются при помощи сценария, в файле Мы подроб но описали эту процедуру в третьей главе книги.

Перед созданием нового сеанса событие a перед работы — событие 408 данных в Интернете. руководство Объект Session Объект Session для хранения информации, имеющей отношение к сеансам отдельных посетителей а не ко всему приложению в целом.

В рамках этого объекта определены наборы, свойства, методы и события.

Наборы В объекте Session определены два набора — Contents и StaticObjects.

Contents Набор Contents содержит все элементы, созданные сеанса при помощи сце нария.

StaticObjects Этот в отличие от предыдущего, статические элементы, создан ные при помощи тега .

Свойства Четыре свойства объекта Session позволяют четыре параметра сеанса.

CodePage Кодовая страница, применяемая для отображения динамически создаваемой страницы. Для символов кириллицы в Windows кодовая страница 1251.

LCID Идентификатор локального контекста (идентификатор национального языка), SessionID Идентификатор текущего сеанса.

Timeout Период тайм-аута, по истечении которого сеанс автоматически ра боту и закрывается.

Методы Метод для объекта Session, выполняет аварийное завер шение сеанса. При этом уничтожаются все объекты, созданные в рамках сеанса, и освобождаются ресурсы, заказанные сеансом для своей работы.

События В файле Вы можете выполнить обработку событий Session_OnStart и Первое из них возникает в начале работы сеанса, а второе — ее завер шением.

Предметный указатель 208 88 208, 214 208 A abs Variant ActiveX 9, ActiveX Data Objects Template Library aiert ad Array ALL_11TTP Anchor anchor 22, Applet adByRef adChar Start Area Array adCmdText in ASP 4, adDBDate ATL Attributes В adDecimal 126 binary AddRcf adEmpty 126 BOOKMARK 126 126 Layout 126 ad Integer Binary catch CCommand ADO CGT adojavas.inc 133, char Close t Output Value 208, 222, 234, Базы данных в Интернете. Практическое DHTML 221 document 221 collection 122 COM Command elements EOF CommandType J confirm escape Connection 121, 56, event Cookie cxp Cookies EXTENSION CONTROL BLOCK Field 24. Fields stance CreateSession floor Form CString forms Frame D frames Function Data Source Date 391, datetime 11, GetData 233, gctdate Day DBPROP DBPROPSET Stream DBTYPE_CY Variable DBTYPE_STR GIF Global globai.asa 94, 134.

decimal t Description description Предметный указатель н LN2 HeipFile History location history Location log HTTP LOG2E HTTP_ACCEPT M HTTP_USER_AGENT 311, max MFC 208, Microsoft 233, Microsoft Management Console Microsoft OLE DB Provider ommand Prepare Visual Basic Visual C++ IDBCreatcSession money MSDN Library IDispatch N I Records NativeError navigator Navigator 130, Number Initialize instanceof 132 Oak 233, 242, Object ODBC ODBC Data Sources OLE Error Info OLE DB 12, Open Java JavaScript JPEG Script Parameter Parameters parse parseFloat Layer Layout Manager Perl Link links POST и Базы данных в Практическое руководство 396 SMTP Source Prepare SQL Server Manager 132 SQL Server Query Analyzer 136, Q QUERY_STRING 208. 239, SQL_C_SBIGINT R M E random SQL_C_TYPE_TIMESTAMP RDO 12, 120, SQL_C_UBIGINT real SQL_DATE_STRUCT Recordset 122, Release SQL_NO_DATA REMOTE_HOST Request 91, SQLBindCol round s SQLExccDirect 269. 283, SCRIPT_NAME SQLFetch send Server SERVER_PORT_SECURE SQLGUID SERVER_SOFTWARE Support Function SQLParamData Session Session_OnEnd SQLREAL 266, Set-Cookie setDate lours set SQRT2 String SetPropcrties 232, 233, 238, substring setSeconds SUCCEEDED SUCCESS setTimeout setYear Т Simple Mail Transfer Protocol tan sin Terminate smalldatetime smallmoney smart pointer Предметный указатель !

Pages:     | 1 |   ...   | 3 | 4 || 6 |



© 2011 www.dissers.ru - «Бесплатная электронная библиотека»

Материалы этого сайта размещены для ознакомления, все права принадлежат их авторам.
Если Вы не согласны с тем, что Ваш материал размещён на этом сайте, пожалуйста, напишите нам, мы в течении 1-2 рабочих дней удалим его.