Microsoft Visual J++. Создание приложений и аплетов на языке Java. Часть 2© Александр Фролов, Григорий ФроловТом 32, М.: Диалог-МИФИ, 1997, 288 стр. Связь приложений Java с расширениями сервера WebИтак, мы расказали вам, как приложения Java могут получать с сервера Web для обработки произвольные файлы, а также как они могут передавать данные друг другу с применением потоковых или датаграммных сокетов. Однако наиболее впечатляющие возможности открываются, если организовать взаимодействие между приложением Java и расширением сервера Web, таким как CGI или ISAPI. В этом случае приложения или аплеты Java могли бы посылать произвольные данные расширению сервера Web для обработки, а затем получать результат этой обработки в виде файла. О том, как сделать расширение сервера Web с применением интерфейса CGI или ISAPI вы можете узнать из 29 тома “Библиотеки системного программиста”, который называется “Сервер Web своими руками”. Если вы никогда раньше не создавали расширений сервера 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. На рис. 3.5 показаны потоки данных для описанной выше схемы взаимодействия приложения Java и расширения сервреа Web с интерфейсом CGI. Рис. 3.5. Взаимодействие приложения Java с расширением сервера Web на базе интерфейса CGI Расширения ISAPI работают аналогично, однако они получают данные не из стандратного входного потока, а с помощью вызова специально предназначенной для этого функции интерфейса ISAPI. Вместо стандартного потока вывода также применяется специальная функция. Подробности вы можете узнать из 29 тома “Библиотеки системного программиста”. Класс 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(); Перед установкой соединения приложение может установить различные параметры соединения. Некоторые из методов, предназначенных для этого, приведены ниже: // Включение или отключение кэширования по умолчанию public void setDefaultUseCaches(boolean defaultusecaches); // Включение или отключение кэширования public void setUseCaches(boolean usecaches); // Возможность использования потока для ввода public void setDoInput(boolean doinput); // Возможность использования потока для вывода public void setDoOutput(boolean dooutput); // Установка даты модификации документа public void setIfModifiedSince(long ifmodifiedsince); В классе URLConnection есть методы, позволяющие определить значения параметров, установленных только что описанными методами: public boolean getDefaultUseCaches(); public boolean getUseCaches(); public boolean getDoInput(); public boolean getDoOutput(); public long getIfModifiedSince(); Определенный интерес могут представлять методы, предназначенные для извлечения информации из заголовка протокола HTTP: // Метод возвращает содержимое заголовка content-encoding // (кодировка ресурса, на который ссылается URL) public String getContentEncoding(); // Метод возвращает содержимое заголовка content-length // (размер документа) public int getContentLength(); // Метод возвращает содержимое заголовка content-type // (тип содержимого) public String getContentType(); // Метод возвращает содержимое заголовка date // (дата посылки ресурса в секундах с 1 января 1970 года) public long getDate(); // Метод возвращает содержимое заголовка last-modified // (дата изменения ресурса в секундах с 1 января 1970 года) public long getLastModified(); // Метод возвращает содержимое заголовка expires // (дата устаревания ресурса в секундах с // 1 января 1970 года) public long getExpiration(); Другие методы, определенные в классе URLConnection, позволяют получить все заголовки или заголовки с заданным номером, а также другую информацию о соединении. Мы не будем их рассматривать для экономии места в книге. При необходимости вы найдете описание этих методов в справочной системе Microsoft Visual J++. |