Связь приложений Java с расширениями сервера Web

Оглавление Сетевые приложения Адрес IP Адрес URL Класс URL Сокеты Потоковые сокеты Класс Socket Датаграммные сокеты Связь с Web Аплет ShowChart Приложения SocketServ и SocketClient Аплет Form

Назад Вперед

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

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

Взаимодействие приложения Java и расширения сервера Web

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

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

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

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

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

На рис. 1 показаны потоки данных для описанной выше схемы взаимодействия приложения Java и расширения сервреа Web с интерфейсом CGI.

Рис. 1. Взаимодействие приложения Java с расширением сервера Web на базе интерфейса CGI

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

Класс URLConnection

Напомним, что в классе URL, рассмотренном нами в начале этой главы, мы привели прототип метода openConnection, возвращающий для заданного объекта класса URL ссылку на объект URLConnection:

    public URLConnection openConnection();

Что мы можем получить, имея ссылку на этот объект?

Прежде всего, пользуясь этой ссылкой, мы можем получить содержимое объекта, адресуемое соответствующим объектом URL, методом getContent:

    public Object getContent();

Заметим, что метод с таким же названием есть и в классе URL. Поэтому если все, что вы хотите сделать, это получение содержимое файла, адресуемое объектом класса URL, то нет никакой необходимости обращаться к классу URLConnection.

Метод getInputStream позволяет открыть входной поток данных, с помощью которого можно считать файл или получить данные от расширения сервера Web:

    public InputStream getInputStream();

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

    public OutputStream getOutputStream();

Не следует думать, что этот поток можно использовать для записи файлов в каталоги сервера Web. Однако для этого потока есть лучшее применение - с его помощью можно передать данные расширению сервера Web.

Рассмотрим еще несколько полезных методов, определенных в классе URLConnection.

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

    public abstract void connect();

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

- setDefaultUseCaches

Включение или отключение кэширования по умолчанию

    public void setDefaultUseCaches(
      boolean defaultusecaches);

- setUseCaches

Включение или отключение кэширования

    public void setUseCaches(boolean usecaches);

- setDoInput

Возможность использования потока для ввода

    public void setDoInput(boolean doinput);

- setDoOutput

Возможность использования потока для вывода

    public void setDoOutput(boolean dooutput);

- setIfModifiedSince

Установка даты модификации документа

    public void setIfModifiedSince(
      long ifmodifiedsince);

В классе URLConnection есть методы, позволяющие определить значения параметров, установленных только что описанными методами:

    public boolean getDefaultUseCaches();
    public boolean getUseCaches();
    public boolean getDoInput();
    public boolean getDoOutput();
    public long getIfModifiedSince();

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

- getContentEncoding

Метод возвращает содержимое заголовка content-encoding (кодировка ресурса, на который ссылается URL)

    public String getContentEncoding();

- getContentLength

Метод возвращает содержимое заголовка content-length (размер документа)

    public int getContentLength();

- getContentType

Метод возвращает содержимое заголовка content-type (тип содержимого)

    public String getContentType();

- getDate

Метод возвращает содержимое заголовка date (дата посылки ресурса в секундах с 1 января 1970 года)

    public long getDate();

- getLastModified

Метод возвращает содержимое заголовка last-modified (дата изменения ресурса в секундах с 1 января 1970 года)

    public long getLastModified();

- getExpiration

Метод возвращает содержимое заголовка expires (дата устаревания ресурса в секундах с 1 января 1970 года)

    public long getExpiration();

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

Назад Вперед