Главная » Java, Web » Web-сервер Blazix

0

Рассмотрим параметры конфигурации Web-cepeepa Blazix.

Расположение файла конфигурации сервера

Положение файла конфигурации сервера может быть задано при помощи следующей команды с переключателем -с):

blxweb -с c:\path\myweb.ini ИЛИ

java desisoft.server.ServerMain -с c:\path\myweb.ini

Если местоположение файла конфигурации Web-cepeepa не указано, то сервер будет искать этот файл, придерживаясь следующего порядка:

?      если задано свойство desisoft.web.config, то используются указанные в нем параметры;

?      производится поиск в папке c:\BlazixWebServer.ini;

?      производится поиск файла web.ini в текущем каталоге.

Как работает сервер

Приложения

Приложение состоит из одного или нескольких файлов. Таким образом файлы, расположенные на сервере, группируются в приложения. По умолчанию используется приложение с именем default. Файлы можно разместить и в другом приложении. Имя приложения указывается в качестве значения свойства application.name. Что такое приложение? Приложение соответствует интерфейсу javax.servlet.Servietcontext. Файлы архивов JAR (Java ARchive) могут быть загружены с указанием параметра application.<appname>. jarFile. Можно задать иное имя для приложения, используемого по умолчанию. Для этого следует задать значение свойства application.default.<property-name>. Здесь в угловых скобках показаны имена, которые могут быть изменены в зависимости от желания разработчика или администратора.

Базы данных

Сервлеты (небольшие программы, расширяющие и дополняющие функциональность Web-cepeepa) и серверные страницы JSP имеют возможность осуществлять доступ к одной или нескольким базам данных JDBC (Java DataBase Connectivity — связь с данными на языке Java). Имена источников данных можно указать в библиотеке ярлыков JSP в качестве значений свойств connection. Можно использовать источники данных со средствами JNDI (Java Naming and Directory Interface — интерфейс имен и каталогов), задав соответствующие значения в виде java: comp/env/jdbc/<data-source- name>. При этом мы будем иметь возможность пользоваться объектами типа j avax.sql.DataSource.

Конфигурирование источников данных производится посредством задания класса драйвера driverciass и положения базы данных (указания url базы данных). Можно также имплементироватъ desisoft.deploy. JdbcResourceFactory или указать имя ODBC (Open Database Connectivity — связь с открытыми базами данных).

Роли

Сервер работает со средствами безопасности: пользовательские роли (при помощи ролей определяется уровень доступа пользователя к ресурсам системы) определены и защищены парами name/password. Любой ресурс сервера может быть защищен, включая сервлеты, страницы HTML, страницы JSP и тому подобное, причем любой из этих ресурсов может быть сделан доступным только для определенного набора ролей.

Интерфейс ION

Интерфейс ION (Interfaces Over the Net) — технология, реализованная в сервере Blazix, которая позволяет клиентам использовать Java-интерфейс сервера для работы с сетью.

ION — это технология работы с распределенными системами. ION основан на интерфейсах Java. Имплементация того или иного интерфейса располагается на сервере, клиент ищет интерфейс и использует его. Сервер имеет возможность осуществлять обратные запросы к клиенту при помощи интерфейса Callback Interface. Отличие интерфейса ION от таких технологий, как RMI (Remote Method Invocation — вызов удаленных методов) или EJB, состоит в том, что он предельно прост и позволяет легко осуществлять обратные запросы к клиенту. При создании интерфейсов первая задача — это описать интерфейс. При этом следует иметь в виду, что все аргументы, используемые в интерфейсе, а также все переменные, возвращаемые интерфейсом, должны быть Java-примитивами или сериализуемыми. После этого интерфейс компилируется и местоположение классов указывается в переменных classpatth таким образом, чтобы интерфейс был доступен как серверу, так и клиенту. Таким образом, следует выполнить следующие действия.

1.    Зарегистрировать интерфейс на Web-cepeepe.

2.     Создать класс, имплементирующий интерфейс.

3.     Зарегистрировать класс в файле web.ini.

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

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

Для обратных запросов используется другой интерфейс. Этот интерфейс также должен быть зарегистрирован на Web-сервере. Имплементация интерфейса осуществляется в клиенте.

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

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

Ниже приводится пример интерфейса для работы с ION.

package computer-

public interface Factorial {

public int computeFactorial(int n);

На серверной стороне регистрируется объект, который осуществляет вычисление факториала. Если клиент ищет интерфейс Factorial, то он может обнаружить его на сервере и вызвать метод computeFactorial о .

Клиент ION осуществляет поиск интерфейса на удаленной машине. Для этого он вызывает метод lookup класса ion, указывая имя удаленного хоста и искомый интерфейс (листинг 3.22).

Листинг 3.22. Пример реализации клиента

import desisoft.dsap.*;

public class IonClient { public static void main(String[] args)

try {

Ion ion = new Ion(); Factorial fact = (Factorial)

ion.lookupCwww.mopjhost.com", Factorial.class) ; System.out.println("Factorial 3 = " +

fact.computeFactorial(3)); System.out.println("Factorial 4 = " +

fact.computeFactorial(4)); ion.close ();

} catch (Exception ex) {

ex.printStackTrace (); }

Этот клиент ищет имплементацию метода compute.Factorial, описанного в интерфейсе Factorial на хосте www.mojhost.com. Найденный метод будет выполнен на этом хосте. После завершения работы связь должна быть закрыта при помощи метода close ().

Методы, используемые при работе с ION, описаны в классе ion (листинг 3.23). При работе с SSL (Secure Socket Layer — безопасное соединение через соке- ты) вместо этого класса следует использовать класс ionssi.

I Листинг 3.23. Класс ION

public class Ion

public Object lookup(String host, Class intf) throws IOException; public Object lookup(String host, String url) throws IOException; public Object lookup(String host, String url, Class intf)

throws IOException; public Object lookup(String host, int port, Class intf)

throws IOException; public Object lookup(String host, int port, String url)

throws IOException; public Object lookup(String host, int port, String url, Class intf)

throws IOException; public Object lookup(InetAddress host, int port, Class intf)

throws IOException; public Object lookup(InetAddress host, int port, String url)

throws IOException;

public Object lookup(InetAddress host, int port, String url,

Class intf) throws IOException;

public void close();

public void setCallback(Object c, Class intf); public void setAuthorization(String user, String pass);

Имплементация интерфейса факториала может быть такой, как показано в листинге 3.24.

Листинг 3.24. Имплементация класса сервера                                                         j

package mojpaket; import compute.Factorial;

public class MojServer implements Factorial {

public int computeFactorial(int n) {

int result = 1;

for (int i = 2; i < n; i++)

result = result * i; return result;

}

Все интерфейсы ION должны быть зарегистрированы на сервере. Это справедливо как для серверных интерфейсов, так и для интерфейсов обратных вызовов. Для того чтобы зарегистрировать интерфейс, используется утилита blxionreg в качестве аргумента, которой указывает имя интерфейса. В данном случае регистрация осуществляется при помощи команды blxionreg compute.Factor

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

Кроме такой регистрации, серверные классы должны быть зарегистрированы в файле конфигурации Web.ini:

ion.name: MojlonServer

ion.MojIonServer.className: mojpackage.MojServer ion.MojIonServer.interface: compute.Factorial

Эти три строки производят регистрацию класса mojpackage.MojServer, который имплементирует интерфейс compute. Factorial.

Если сервер производит обратный вызов, то операции сервера при этом прекращаются, работа передается клиентской стороне. При этом клиент возвращает ответ серверу сразу. Но может возникнуть такая ситуация, когда, прежде чем клиент пошлет ответ серверу, он будет вынужден произвести дополнительные обращения к серверу. При этом сервер также может сделать еще несколько обратных запросов к клиенту. Клиент сначала возвращает результаты по "вторичным" запросам, а затем возвращается окончательный результат.

Чтобы протестировать вышеописанное, снова запустим Web-cepeep Blazix. Из отдельного консольного окна запустим клиент. Клиент может быть запущен и с другого компьютера. На компьютере клиента должен присутствовать файл интерфейса и файл клиентского класса. Серверный класс Moj IonServer там не понадобится. На клиентском компьютере также будет нужен файл Blazixjar или файл IonClient.jar. Эти файлы должны быть переданы с клиентом, и путь к ним указан в переменной class path. Для того чтобы сервер Blazix имел возможность работать с протоколом DSAP (Dynamic Stream Access Protocol — протокол доступа с использованием динамических потоков), необходимо его правильно сконфигурировать, иначе мы получим сообщение об ошибке, в котором будет указано, что DSAP не доступен. О том, как сконфигурировать сервер для работы с протоколом DSAP, будет объяснено немного позже.

Чтобы использовать обратные запросы, необходимо определить интерфейс обратного запроса:

public interface MojObrZapros {

void intermediateStep(String message);

}

Файл MojObrZapros.java компилируется и интерфейс регистрируется при помощи утилиты blxionreg.

Клиент должен содержать объект, имплементирующий этот интерфейс. Чтобы создать имплементацию интерфейса обратного запроса, изменим файл IonClient.java.

public class IonUser implements MyCallback { // вставим метод

public void intermediateStep(String message) {

System.out.println("Server says: " + message);

Вставим также строку:

ion.setCallback(new IonUser(), MyCallback.class) ;

Эта строка располагается после инициализации в методе main, но перед обращением к lookup. Необходимо также внести изменения в класс сервера. Определим класс сервера при помощи следующей строки:

class MojIonServer implements Factorial, desisoft.dsap.IonServer Затем вставим объект: MojObrZapros obrzaprosObj = null; И добавим в сервер методы:

public void onConnect () {} public void onClose() { }

public void setCallback(Object obj) {

obrzaprosObj = (MojObrZapros) ob j ;

}

Изменим метод вычисления факториала:

public int computeFactorial(int n) {

int result = 1;

if (mojzaprosObj != null)

moj zaprosObj.intermediateStep("Vychislenie nachato"); for (int i = 2; i <= n; i++) { result = result * i; if (mojzaprosObj != null) moj zaprosObj.intermediateStep(

"Promezhutochnyj rezultat = " + result);

}

System.out.printIn("Polucheno !" + n + " = " + result); return result;

}

Следует помнить о том, что необходимо изменить файл конфигурации Web.ini, вставив в него:

ion.Moj Server.callback: Moj ObrZapros

Разработчики сервера особо подчеркивают, что все интерфейсы ION и соответствующие им классы имплементации должны быть доступны как клиенту, так и серверу, то есть пути к ним указаны в качестве значений соответствующей переменной окружения class path. Доступным должен быть также файл классов blazix. jar.

Протокол HTTP основан на обмене запросами и ответами, он не поддерживает непрерывную связь. Имплементация ION произведена на основе протокола DSAP. Протокол DSAP может работать только в том случае, если Blazix используется в качестве Web-cepeepa непосредственно, но не как Java-сервер в сочетании с каким-либо другим сервером, обеспечивающим фронт-энд (внешний вид), потому что такой сервер не будет поддерживать DSAP. Разработчики сервера утверждают, что Blazix является весьма эффективным сервером, и дополнительные серверы, обеспечивающие фронт-энд, вряд ли будут нужны.

Для того чтобы иметь возможность работать с DSAP, а значит, и с ION, необходимо учесть некоторые особенности сервера. Чтобы сервер Blazix имел возможность работать с протоколом DSAP, имплементируем интерфейс desisoft. dsap. Server. Этот интерфейс имеет два метода:

public interface desisoft.dsap.Server {

public boolean authCheck(String username, String pwd); public void onConnect(String arg,

ServletInputstream input, ServletOutputStream output) throws IOException;

}

Метод authcheck() в качестве аргументов принимает имя и пароль, если они будут указаны. Если в доступе будет отказано, то метод возвратит false.

Метод onConnect() вызывается для обработки удаленных запросов. Потоки ввода и вывода input и output осуществляют обмен данными между клиентом и сервером.

Метод onConnect() вызывается из независимого потока. Метод не возвращает никакого значения до тех пор, пока сессия не будет завершена. Для повторного вызова этого метода создается отдельный поток. После возвращения значения этим методом закрывается соответствующий ему сокет.

После того как класс, имплементирующий этот интерфейс, создан, его необходимо зарегистрировать в файле конфигурации Web.ini. Регистрация производится в следующем виде:

dsap.name: <имя для DSAP>

dsap.<имя для DSAP>.className: Сполное имя класса имплементации> dsap.<имя для DSAP>.url: <адрес>

URL — это не полноценный URL, а некоторая строка, которая известна и серверу, и клиенту, например:

dsap.name: MojDsapServer

dsap.Moj DsapServer.className: moj dsapserver dsap.Moj DsapServer.url: /moj/dsapserver

Класс dsap должен быть открытым (public), конструктор тоже должен быть открытым и не иметь аргументов. Метод doConnect должен поддерживать потоки. Строка соединения arg может иметь в своем составе знак "?" в соответствии с правилами синтаксиса протокола HTTP.

Библиотека ярлыков

В настоящей главе мы достаточно подробно рассмотрели вопрос о создании пользовательских ярлыков JSP. Описатель библиотеки может быть задан в виде обычного URL либо помещен в папку с иерархией Web-документов. При этом следует иметь в виду, что конфигурация сервера зависит от параметров, указанных в файле конфигурации Web-cepeepa. Описание самой библиотеки ярлыков приводится в приложении 3.

Параметры конфигурации Web-сервера

В Web-cepeepe Blazix предусмотрены следующие параметры конфигурации, задаваемые в файле Web.ini.

?   server.port — порт сервера, целое число. По умолчанию — 80.

?   server.address — адрес сервера, полезен для машин, использующих несколько IP-адресов. Здесь необходимо указать действительное имя хоста или IP.

?   admin.port — порт администрирования. Если значение admin.port или admin.password не указано, то сервер не будет доступен для удаленного администрирования. При использовании ргоху-сервера необходимо позаботиться о том, чтобы данный порт не был доступен извне.

?   admin.password — пароль администратора.

?   connection.timeout — время жизни неиспользуемого постоянного соединения (по протоколу НТТР/1.1).

?   session.timeout — время "жизни" неиспользуемых данных сессии.

?   MaxUsers — максимальное количество пользователей, по умолчанию для Windows это значение равно 512, для других систем — 256. Реальный предел можно найти путем проведения экспериментов по загрузке сервера. При использовании ION это число полезно увеличить, так как ION- соединения требуют сравнительно большего времени.

?   PrintAiiAccess — задает необходимость (или отмену) печати всех строк URL-запросов в файл логов. По умолчанию используется значение true.

?   TempDir — временная папка.

?   access.logDir — указанный в качестве значения этого параметра каталог будет использоваться для хранения файлов дневных логов. Если задан этот параметр, то будут создаваться ежедневные файлы логов, если параметр не задан, то ежедневные логи не будут сохранены.

?   server.ciassDir — эта папка и все содержащиеся в ней файлы JAR будут добавлены в качестве значений переменной ciassapth для работы сервлетов и компонентов EJB. Полезно иметь в виду, что JAR-файлы могут быть помещены в эту папку с удаленного компьютера администратором сервера.

?   warDir — все файлы архивов Web-приложений (файлы WAR), помещенных в эту папку, будут автоматически размещены на сервере. Для таких файлов предусмотрен доступ через указание в URL имени WAR-файла. Имя default.war используется для доступа по умолчанию, то есть когда запрашивает основной документ и в URL указывается "/". Утилита администрирования сервера предоставляет возможность размещать новые WAR-файлы в указанной папке, а также удалять ненужные WAR-файлы из этой папки.

?   ionDir — папка, которая будет использоваться ION для поддержки своего регистра.

?   ionLogExceptions — будут или нет выводиться сообщения об ошибках ION в поток вывода.

?   mimeType.*— типы Mime-кодировок, поддерживаемых сервером, например:

mimeType.yesyes: application/yesyes-files

?   ejb.nameServerl, ejb.nameServer2, , ejb.nameServer9 — серверы имен EJB. Если используется более одного сервера, то они могут подменять друг друга. Так, если сервер ejb.nameServerl окажется недоступен, то его может подменить сервер ejb.nameServer2.

?   jms.nameServerl, jms.nameServer2, …, jms.nameServer9 — JMS-серверы. Если указано более одного сервера, то серверы могут подменять друг друга. Для функционирования всего кластера JMS-серверов достаточно лишь одного сервера.

?   еjb.protocoi — протокол, используемый при работе с серверными компонентами EJB, может быть либо JRMP, либо ПОР. Протокол должен совпадать с протоколом, указанным в качестве значения параметра ejb.protocol в файле конфигурации EJB (ejb.ini). По умолчанию задается протокол JRMP.

?   license.file — местоположение файла с лицензией.

?   backup.readonly — сервер кластера используется только для чтения, и никакие записи сохраняемых данных не производятся. Используется для разрешения ошибочных ситуаций, требующих устранения ошибок.

?   j sp.keepGenerated — файлы Java для создания файлов JAR будут расположены в этой папке.

?   ssi.port — порт для сервера с поддержкой SSL.

?   ssi.share — разделение ресурсов при работе с SSL.

?   ssi.keystore — путь к файлу keystore.

?   ssi.keystore Password — пароль для keystore.

?   ssi.showPasswordDiaiog — запускать диалоговое окно установки пароля при старте сервера или нет?

?   startup.asynchronous — имя класса, который имплементирует интерфейс Runnabie. Этот класс будет инициализирован и запущен в отдельном потоке при запуске сервера.

?   startup.synchronous — имя класса, который имплементирует интерфейс Runnabie. Этот класс будет запущен (вызван метод run этого класса) при запуске сервера. Запуск сервера не будет продолжен до тех пор, пока метод run не будет завершен (не возвратит значение).

?   useSystemLoader — используется для задания папок и файлов JAR в качестве параметров переменной ciasspath.

?   application.name — имя приложения. Имя default определено заранее.

?   application.<name>.authType — используется с ресурсами, для которых задан доступ с указанием пароля. Может принимать значения Basic или Form. Тип Basic заставляет браузер вывести стандартное окно запроса пароля, тип From приводит к тому, что браузер перенаправляется на страницу аутентификации, если аутентификация проходит успешно, то после этого браузер перенаправляется обратно к запрошенному ресурсу.

?   application. <name>. authLoginForm — название HTML-страницы, на которую происходит перенаправление в случае использования метода аутентификации Form. HTML-страница должна содержать форму с полями j_username и j_password, атрибут action должен иметь значение

j_security_check.

?   application.<name>.authErrorPage — имя HTML-страницы, показываемой в случае неправильно указанной пары имя/пароль.

?   application.<name>.authRealm — используется при аутентификации с типом Basic, authReaim посылается браузеру и отображается в вице имени диалогового окна для введения имени и пароля.

?   application.<name>.authClass — указывается класс, имплементирую- щий desisoft.deploy.AuthCheck. Этот класс, если он указан, будет производить аутентификацию.

?   application. <name>. authParam. * — используется совместно с предыдущим параметром, задает параметры, передаваемые классу аутентификации.

?   application.<name>.url — адрес URL, где располагается контекст приложения с указанным именем.

?   application. <name>. jarFile — файл архива WAR или JAR, содержащий приложение с указанным именем, в соответствии со спецификацией сервлетов (версия 2.2).

?   application.<name>.dir — папка, в которой расположены файлы приложения, включая файлы HTML, картинки и т. п.

?   application. <name>. jspDir — папка для хранения классов JSP.

?   application.<name>.param.* — параметры инициализации контекста, доступные при помощи интерфейса servietcontext.

?   application.<name>.virtuaiHost — если приложение содержит страницы виртуального хостинга, то здесь необходимо указать виртуальный хост.

?   application. <name>. reloadUrl — здесь указывается URL, с помощью которого производится разгрузка сервера, то есть удаление всех ранее загруженных классов.

?   application.<name>. filter — вставляет в приложение фильтр в формате name=class, например:

application.default.filter: myfilter=mypackage.MyFilterClass

?   role.name — ИМЯ роли.

?   role.<name>.url — адрес URL ресурса, доступного для данной роли.

?   role.<name>.application — имя приложения для роли.

?   servlet. name — ИМЯ сервлета.

?   servlet. <name>. className — имя класса, иплементирующего сервлет.

?   servlet.<name>.url — URL-адрес сервлета.

?   servlet.<name>.param.* — параметры инициализации сервлета, доступные посредством интерфейса servlet.

?   servlet. <name>. application — если сервлет является частью приложения (не приложения default), то имя этого приложения можно указать в этом параметре.

?   dataSource .name — имя источника данных dataSource.

?   dataSource.<name>. jndiName — имя JNDI для источника данных, если оно не совпадает с именем самого источника данных.

?   dataSource.<name>.driverClass — ИМЯ класса драйвера JDBC.

?   dataSource.<name>.providerClass — класс имплементации desisoft.deploy.JdbcResourсеFactory.

?   dataSource.<name>.param.* — параметры инициализации, передаваемые классу desisoft.deploy.JdbcResourceFactory.

?   dataSource.<name>.odbc — имя источника данных ODBC.

?   dataSource.<name>.username — имя пользователя при установлении соединений.

?   dataSource.<name>.password — пароль при установлении соединений.

?   ion.name — имя для ION.

?   ion.<name>.url — адрес URL для интерфейса ION. Это не URL, используемый в Интернете, но условная строка, которая должна быть известна клиенту. Этот параметр не является обязательным, поиск может быть осуществлен и без него либо по имени интерфейса, а не только по URL.

?   ion.<name>.interface — полное имя класса интерфейса ION. Регистрация осуществляется при помощи утилиты blxionreg.

?   ion.<name>. ciassName — полное имя класса имплементации интерфейса ION.

?   ion.<name>.callback — полное имя интерфейса обратных вызовов, регистрируется при помощи blxionreg.

?   ion.<name>. callbackNullable — может ли клиент возвращать null и не имплементировать методы интерфейса обратного вызова.

?   ion.<name>.authciass — стандартный механизм аутентификации сервера Blazix.

?   ion.<name>.authParam. * — параметры аутентификации.

?   virtualHost.name — имя виртуального хоста.

?   virtualHost.<name>.addr — домен виртуального хоста. Это имя может быть задано для нескольких виртуальных имен доменов, например, www.mojadres.com и mojadres.com.

?   virtualHost.<name>.accessLogDir — папка файлов логов для виртуального хоста.

В заключение раздела приведем пример файла конфигурации Web-сервера Blazix, который используется по умолчанию (листинг 3.25).

Листинг 3.25. Файл web.ini                                                                                                                j

server.port: 81

admin.port: ЗОЮ

admin.password: vad

ejb.nameServerl: olymp:2050

license.file: C:\Blazix\license.dat

tempDir: C:\Blazix\temp

ionDir: C:\Blazix\iondir

application.default.dir: C:\Blazix\webfiles

application.default.jspDir: С:\Blazix\jspdir

#  Простая идентификация

#  Для того чтобы удалить идентификацию, уберите строки

#  Для базовой идентификации "Basic" используется другой пример application.default.authType: Form

#app1i cat ion.default.authRealm: Samp1e application.default.authLoginForm: /login.html application.default.authErrorPage: /loginFailed.html role.name: user

role.user.url: /AuthenticationTest.html

#  Используется во время разработки application.default.reloadUrl: /_reload

#  Для использования файлов .java в страницах JSP, удалите комментарий в

#  следующей строке

#  jsp.keepGenerated: true

#  Примерный файл для аутентификации.

application.default.authParam.file: С:\Blazix\sampleAuth.txt

Этот файл должен быть изменен в соответствии с возникающими требованиями.

Источник: Будилов В. А. Интернет-программирование на Java. — СПб.: БХВ-Петербург, 2003. — 704 е.: ил.

По теме:

  • Комментарии