1. Что такое динамический контент?
Большинство популярных веб-сайтов зарабатывают деньги на онлайн-рекламе. Рекламное пространство на веб-страницах ограничено. Чтобы окупить инвестиции в рекламу, рекламодатели должны не только уместить большой объем информации в небольшое рекламное пространство, но и обеспечить, чтобы реклама могла привлечь внимание пользователей. На большинстве современных веб-сайтов рекламные баннеры, размещаемые на веб-страницах, обычно генерируются сервером при создании страницы. Мы не можем динамически вставлять новые рекламные объявления в уже отправленные страницы. Если вы хотите показывать новые объявления, единственный способ — обновить страницу. Мы можем обновить страницу программно, например:
использовать функцию setTimeOut объекта окна браузера, чтобы регулярно обновлять страницу. Однако при обновлении рекламы таким способом пользователи будут четко ощущать процесс обновления страницы, в то же время сложно определить подходящую частоту обновления;
Установите срок действия страницы на несколько секунд, чтобы браузер повторно загружал страницу всякий раз, когда фокус ввода переходит на страницу (т. е. браузер активируется).
Некоторые крупные веб-сайты, такие как yahoo.com и msn.com, уже внедрили эти технологии. Оба метода имеют свои преимущества и недостатки. При использовании только Java мы можем полностью реализовать систему обновления баннерной рекламы посредством сетевого программирования и некоторой работы по программированию интерфейса, но необходимо решить проблемы длительного времени загрузки и задержки обновления.
2. Используйте Java для реализации отправки контента
Объединив межкадровую связь JavaScript с Java-апплетом, управляющим сетевой связью, мы можем решить эту проблему с помощью технологии push. В такой системе задачей Java-апплета является подключение к серверу и прослушивание обновлений контента. После получения нового содержимого апплет создает HTML-код, который отображает новое содержимое, вызывает функцию JavaScript и передает HTML, содержащий новое содержимое, в функцию JavaScript. Функция JavaScript использует технологии DHTML и DOM для замены содержимого тега
Веб-сервер прослушивает запросы на подключение только через порт 80. Таким образом, в дополнение к веб-серверу нам также нужна служба сетевых приложений, которая принимает запрос на подключение к сокету апплета. Эта служба сетевых приложений периодически запрашивает базу данных и публикует (отправляет) измененные данные всем подключенным апплетам. Благодаря использованию скрытых фреймов и возможностям межкадровой связи JavaScript мы можем скрыть от пользователя большую часть логики JavaScript.
Самой сложной задачей во всем этом процессе является связь между Java-апплетом и кодом JavaScript. Netscape предоставляет класс netscape.javascript.JSObject. Чтобы использовать этот объект, добавьте тег апплета, который содержит специальный атрибут «MAYSCRIPT»:
Методы JSObject позволяют апплетам взаимодействовать с объектом документа и вызывать команды JavaScript. Например, поместив следующий код в Applet, мы можем получить доступ к объекту окна:
import netscape.javascript.*; public class MyApplet расширяет java.applet.Applet { Private JSObject mainwin; mainwin = JSObject.getWindow; ( this); } }
После получения ссылки JSObject мы можем получить доступ к объекту окна документа и вызвать функцию JavaScript через метод eval() JSObject.
3. Обновите страницу с помощью DHTML.
При записи нового контента из апплета в документ, чтобы не влиять на существующий контент, мы можем использовать HTML-тег
Для IE и Netscape 6 этот HTML-тег:
// Весь обновляемый контент должен идентифицироваться по идентификатору
Для версий Netscape 4.x этот тег HTML:
Хотя для ясности мы можем напрямую обновить HTML-содержимое из апплета, указав соответствующий идентификатор. Программную логику обновления HTML-кода для простоты вынесем в функцию JavaScript. Следующий код JavaScript сохраняет тип браузера в переменной ie:
applnname=navigator.appName; if(applnname=="Microsoft Internet Explorer") { ie=true } else { ie=false }
Апплет создает HTML из нового
;код данных, сохраните его в содержимом переменной JavaScript, а затем вызовите метод AssignData(). Данные контента могут быть любыми: от простого HTML до XML и двоичных данных.
// Вызов соответствующего метода function AssignData() { if(ie) {explore();} else {navig() } } в соответствии с типом браузера
Если браузером является IE или Netscape 6, апплет вызывает метод explore():
//content — это переменная javascript, описывающая новые данные, которые необходимо //отобразить в формате HTML function explore() { iexplorer.innerHTML=content ; }
если браузер Netscape 4.0 или выше, и апплет вызывает метод navig():
function navig() { document.netscapev.document.write(““ + content + ““); document.netscapev.document.close() }
4. Процесс связи;
На стороне сервера экземпляр класса ImageAppliation.java отвечает на запросы на соединение Socket и создает новый поток для каждого нового запроса на соединение. Для упрощения кода каждый поток только проверяет, изменился ли файл данных. Если файл данных изменился, поток считывает содержимое файла и отправляет новые данные в подключенный апплет (пример приложения отправляет в апплет весь файл).
На стороне клиента скрытый фрейм содержит Applet ImageApplet.java, поэтому тег Applet невозможно увидеть с помощью функции просмотра исходного кода HTML браузера. Апплет реализует функцию подключения к серверу (исходному серверу для загрузки апплета) и реализует простой протокол связи. После установления соединения с сервером апплет получает данные с сервера, создает HTML-код и вызывает функцию JavaScript для передачи данных в документ:
public void upDateHTML(String str){ //data — это имя форма, //quote — это переменная JavaScript //str — это вновь созданный HTML-код mainwin.eval("document.data.quote.value="" + str + """); mainwin.eval("javascript:assignData) ()"); return; }
netscape.javascript.JSObject завершает связь между апплетом и JavaScript. Для разных версий клиентских браузеров требуются разные версии. Вы можете загрузить сжатый файл класса java40.jar, предоставленный для Netscape. В IE уже есть класс JSObject, но его сложно найти. Вы можете выполнить поиск в каталоге $windows$JavaPackages и найти ZIP-файл, содержащий класс JSObject.
Сервер сериализует экземпляр класса ImageArrayElement.java в строку с помощью метода toString() и отправляет ее в апплет. Сервер создает каждый объект из файла данных, вызывает метод toString(), объединяет строки, представляющие все объекты, и, наконец, отправляет результирующую строку. На другом конце апплет получает и анализирует эту строку и восстанавливает каждый объект ImageArrayElement. Причина, по которой данные передаются здесь в виде длинной строки, заключается в том, что этот метод требует очень простого процесса обработки, что позволяет пользователям немедленно узнавать об изменениях данных со скоростью, близкой к реальному времени, однако мы также можем использовать другой; метод метод, который отправляет объект как вектор.
В действующем приложении обычно следует сделать вставку новых данных на текущую страницу прозрачной. Но в примере приложения, чтобы сделать процесс выполнения программы более интуитивным, оно будет сообщать пользователю о поступлении нового контента.
Основное преимущество технологии push заключается в том, что сервер приложений отправляет в сеть только измененные данные, что минимизирует задержку. Поскольку этот апплет выполняет очень небольшую работу (он не задействует пользовательский интерфейс, эту часть работы берет на себя браузер), апплет имеет небольшой размер и загружается очень быстро.
5. Как запустить пример из этой статьи
Чтобы протестировать пример приложения в этой статье, на вашем компьютере должен быть установлен веб-сервер и JDK 1.7 или более поздней версии.
Пункты установки:
Разархивируйте сжатый ZIP-файл и установите его в корневой каталог веб-сервера по умолчанию.
Для серверов IIS корневым каталогом по умолчанию является Inetputwwwroot.
Для бесплатного сервера, включенного в jsdk2.1, каталог по умолчанию — <каталог установки>webpages.
После распаковки архива все файлы будут установлены в каталог <корень веб-сервера>/exp/.
Добавьте следующие строки кода на страницу по умолчанию. Каждый сервер имеет свою собственную страницу по умолчанию. Страница IIS по умолчанию — «default.htm». Подробные инструкции см. в документации веб-сервера:
Шаги для запуска приложения:
откройте окно DOS, введите <Веб-каталог по умолчанию>/exp и выполните «java ImageApplication». Система отобразит «Сервер начал прослушивание порта 6011». Убедитесь, что переменная среды classpath указывает на текущий рабочий каталог.
Запустите веб-сервер.
Откройте браузер и введите следующий URL-адрес: http://localhost:8080 . Этот URL-адрес откроет страницу веб-сервера по умолчанию, на которой должна быть ссылка «Динамический рекламный баннер на основе Java». Щелкните эту ссылку, чтобы запустить пример приложения для этой статьи.
Откройте файл «/exp/images.txt» с помощью Блокнота, скопируйте и вставьте строку содержимого и сохраните файл. Вы сразу увидите, как система отображает окно JavaScript, предлагающее обновления содержимого. Закройте окно JavaScript, и на странице отобразится новый контент.
Загрузите полный код примера в этой статье отсюда, 411 КБ/u/info_img/2009-06/20/pushweb.zip.