Электронный магазин на Java и XML




Глава 9. Привлечение постоянных посетителей


    Глава 9. Привлечение постоянных посетителей
    Глава 9. Привлечение постоянных посетителей Ваш электронный магазин предлагает великолепные товары по конкурентоспособным ценам — что еще можно сделать, чтобы посетители возвращались на ваш сайт с...
    Источники новостей и стандарты
    Источники новостей и стандарты Вероятно, вы знакомы с идеей синдицирования в мире средств массовой информации. Корреспонденты, авторы передовиц и карикатуристы печатаются не только в своей родной...
    Формат RSS
    Формат RSS Компания Netscape первой предложила идею создания страниц новостей, поступающих из различных источников, на сайте Netscape Netcenter ( www.netscape.com ) и разработала специальный форма...
    NewsML и планы стандартизации
    NewsML и планы стандартизации Международный совет по медиа-телекоммуникациям (The International Press Telecommunications Council, IPTC), представленный по адресу www.iptc.org , предпринимает попыт...
    Формат сообщений Moreover.com
    Формат сообщений Moreover.com Для задач, которые решаются в этой главе, мы используем формат импорта и экспорта сообщений, предложенный организацией Moreover.com ( www.moreover.com ). Мы выбрали M...
    Рис. 9.1. Выбор категорий заголовков на сайте Moreover.com
    Рис. 9.1. Выбор категорий заголовков на сайте Moreover.com...
    Получение файла XML
    Получение файла XML Первым этапом процесса настройки вашего web-сайта на использование материалов информационных web-синдикатов является получение исходного файла XML от поставщика. В нашем пример...
    Листинг 9.1. Заголовок и первый...
    Листинг 9.1. Заголовок и первый элемент загруженного файла XML (xmldump.xml)1 ?xml version=1.0 encoding=iso-8859-1? !DOCTYPE moreovernews SYSTEM moreovernews.dtd moreovernews article id=_8510757 u...
    Листинг 9.2. Файл moreovernews.dtd (moreovernews.dtd)
    Листинг 9.2. Файл moreovernews.dtd (moreovernews.dtd) !ELEMENT moreovernews (article*) !ELEMENT article (url,headline_text,source,media_type, cluster,tagline,document_url,harvest_time, access_regi...
    Листинг 9.3. Начало класса XMLgrabber (XMLgrabber.java)
    Листинг 9.3. Начало класса XMLgrabber (XMLgrabber.java) package com.XmlEcomBook.Chap09; import java.net.* ; import java.io.* ; import java.util.*; public class XMLgrabber { String source ; // comp...
    Листинг 9.4. Метод doQueryNow (XMLgrabber.java)
    Листинг 9.4. Метод doQueryNow (XMLgrabber.java) // run by external Thread to get file resident // return true if suceeds public boolean doQueryNow() throws IOException { theURL = new URL( source )...
    Листинг 9.5. Методы для управления...
    Листинг 9.5. Методы для управления временными файлами (XMLgrabber.java) // saveDir used for all private boolean renameTemp(String tmp, String saveN ) { File src = new File( saveDir, tmp ); File de...
    Листинг 9.6. Метод grabXML считывает...
    Листинг 9.6. Метод grabXML считывает строки файла XML из заданного с помощью URL источника (XMLgrabber.java) // at this point pw is open to a temp file private void grabXml() throws IOException {...
    Листинг 9.7. Метод grabDtd получает...
    Листинг 9.7. Метод grabDtd получает текущее определение moreovernews.dtd (XMLgrabber.java) // at this point pw is open to a temp file for dtd private void grabDtd() throws IOException { System.out...
    Листинг 9.8. Метод reformDocType...
    Листинг 9.8. Метод reformDocType модифицирует ссылку на DTD (XMLgrabber.java) // string has doctype declaration, revise to //point to local version private String reformDoctype( String dts ){ int...
    Листинг 9.9. Метод finalize может...
    Листинг 9.9. Метод finalize может удалять временные файлы (XMLgrabber.java) // last chance to clean up temp files if something failed public void finalize(){ if( tfnxml != null ){ new File( saveDi...
    Класс NewsModel
    Класс NewsModel Теперь, когда файл XML и соответствующий файл DTD находятся на локальном жестком диске, нам нужен класс для синтаксического анализа файла XML и создания DOM. Написанный нами для ^т...
    Создание DOM
    Создание DOM В листинге 9.10 показано начало класса NewsModel, включая переменные экземпляра и конструктор. Обратите внимание на то, что здесь присутствуют две коллекции, Hashtable и Nodelist, кот...
    Листинг 9.10. Начало класса NewsModel...
    Листинг 9.10. Начало класса NewsModel (NewsModel.java) package com.XmlEcomBook.Chap09; package com.XmlEcomBook.Chap09; import java.io.* ; import java.util.* ; import com.sun.xml.tree.* ; import co...
    Листинг 9.11. Метод loadXML осуществляет...
    Листинг 9.11. Метод loadXML осуществляет синтаксический анализ (NewsModel.java) // return true if sucessful - if false, see lastErr public synchronized boolean loadXML( ) { File xmlFile = new File...
    Листинг 9.12. Метод locateCategories...
    Листинг 9.12. Метод locateCategories классифицирует заголовки (newsModel.java) public void locateCategories(){ Element dE = doc.getDocumentElement(); // the root element clusterHash = new Hashtabl...
    Выбор заголовков
    Выбор заголовков Теперь мы подошли к рассмотрению методов сервлета, которые отвечают на запросы пользователя о поиске определенных заголовков сообщений. Для нашего примера мы ограничились двумя ме...
    Листинг 9.13. Метод articlesByKeyWord...
    Листинг 9.13. Метод articlesByKeyWord вызывается сервлетом (NewsModel.java) // articles by keyword appearance in headline // keys may be word or phrase, one or more, sep by comma // just use origi...
    Листинг 9.14. Методы, которые...
    Листинг 9.14. Методы, которые поддерживают поиск заголовков по ключевым словам (NewsModel.java) // return true if one of the keys appears //in the headline_text element private boolean searchArtic...
    Листинг 9.15. Этот метод возвращает...
    Листинг 9.15. Этот метод возвращает все элементы с заданным значением элемента cluster (NewsModel.java) // return array of Element for this topic // or null if none available public Element[] arti...
    Листинг 9.16. Метод getTopics (NewsModel.java)
    Листинг 9.16. Метод getTopics (NewsModel.java) // return exact names of all topics available public String[] getTopics(){ Enumeration keys = clusterHash.keys(); String[] ret = new String[ clusterH...
    Листинг 9.17. Метод formatElement (NewsModel.java)
    Листинг 9.17. Метод formatElement (NewsModel.java) // Element known to be an article, formatting string public String formatElement( Element art, String fmt ){ StringBuffer sb = new StringBuffer(...
    Листинг 9.18. Метод для сортировки...
    Листинг 9.18. Метод для сортировки и другие служебные методы (NewsModel.java) public void shellSort (String[] srted ) { // h is the separation between items we compare. int h = 1; while ( h srted....
    Главный управляющий класс
    Главный управляющий класс Теперь мы переходим к рассмотрению класса, который управляет процессом получения заголовков через определенные промежутки времени и обеспечивает доступ к ним сервлетов. К...
    Листинг 9.19. Начало класса NetNewsSuper...
    Листинг 9.19. Начало класса NetNewsSuper (NetNewsSuper.java) package com.XmlEcomBook.Chap09; package com.XmlEcomBook.Chap09; import java.util.*; import java.io.* ; public class NetNewsSuper extend...
    Листинг 9.20. Переменные экземпляра...
    Листинг 9.20. Переменные экземпляра и конструктор класса NetNewsSuper (NetNewsSuper.java) // instance variables and methods follow String sourceURL ; String destPath, destFname ; public String err...
    Листинг 9.21. Метод run класса...
    Листинг 9.21. Метод run класса NetNewsSuper (NetNewsSuper.java) // low priority - check for need to update xml public void run(){ running = true ; try { // runs when first started if( !checkSrc()...
    Листинг 9.22. Этот метод создает...
    Листинг 9.22. Этот метод создает новый объект NewsModel (NetNewsSuper.java) // xml source known to exist, go for it private synchronized void createModel(){ newsM = new NewsModel( destPath, destFn...
    Листинг 9.23. Метод getNewsModel...
    Листинг 9.23. Метод getNewsModel возвращает NewsModel (NetNewsSuper.java) // Note that there are two steps to getting a news //model resident: // 1. grabbing the current XML to local file if not t...
    Листинг 9.24. Метод toString (NetNewsSuper.java)
    Листинг 9.24. Метод toString (NetNewsSuper.java) public String toString() { StringBuffer sb = new StringBuffer( NetNewsSuper for ); sb.append( sourceURL ); if( newsM == null ){ sb.append( No NewsM...
    Классы для отображения заголовков
    Классы для отображения заголовков Для отображения заголовков мы используем два класса — сервлет с именем NetNewsServ и класс для форматирования NetNewsBean. Существует множество способов задейство...
    Сервлет NetNewsServ
    Сервлет NetNewsServ Этот сервлет выполняет две существенные функции: метод doGet создает форму, которая позволяет пользователю выбирать интересующие его темы сообщений и/или задавать ключевые слов...
    Листинг 9.25. Начало исходного...
    Листинг 9.25. Начало исходного кода NetNewsServ (NetNewsServ.java) package com.XmlEcomBook.Chap09; import java.io.*; import javax.servlet.*; import javax.servlet.http.*; public class NetNewsServ e...
    Листинг 9.26. Метод doGet создает...
    Листинг 9.26. Метод doGet создает простую форму (NetNewsServ.java) public void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { resp.setContentType(te...
    Рис. 9.2. Форма для выбора темы заголовков
    Рис. 9.2. Форма для выбора темы заголовков Когда пользователь щелкает на кнопке Continue (Продолжить), методу doPost, приведенному в листинге 9.27, отправляется запрос. Если пользователь не ввел н...
    Листинг 9.27. Метод doPost (NetNewsServ.java)
    Листинг 9.27. Метод doPost (NetNewsServ.java) // assumes response has been set to text/html private void errorMsg ( PrintWriter out, String msg, Exception ex ){ header( out ); out.println(h2Error:...
    Листинг 9.28. Этот метод форматирует...
    Листинг 9.28. Этот метод форматирует полученные заголовки (NetNewsServ.java) // assumes a table has been started // topics[] are tags from list, ie 0, 1 etc. private void doNetNews ( PrintWriter o...
    Листинг 9.29. Некоторые служебные методы (NetNewsServ.java)
    Листинг 9.29. Некоторые служебные методы (NetNewsServ.java) // assumes response has been set to text/html private void errorMsg ( PrintWriter out, String msg, Exception ex ){ header( out ); out.pr...
    Класс NetNewsBean
    Класс NetNewsBean Этот класс выполняет роль интерфейса между сервлетом и хранящимся в памяти объектом NewsModel, который соответствует конкретному источнику сообщений. Как показано в листинге 9.30...
    Листинг 9.30. Начало класса NetNewsBean...
    Листинг 9.30. Начало класса NetNewsBean (NetNewsBean.java) package com.XmlEcomBook.Chap09; package com.XmlEcomBook.Chap09; import java.util.* ; import org.w3c.dom.* ; public class NetNewsBean { st...
    Листинг 9.31. Методы, которые...
    Листинг 9.31. Методы, которые возвращают тематические категории в виде массива и в виде списка в формате HTML (NetNewsBean.java) public String[] getTopicsAsArray(){ if( newsM == null || !newsM.usa...
    Листинг 9.32. Метод, контролирующий...
    Листинг 9.32. Метод, контролирующий поиск заголовков по ключевым словам (NetNewsBean.java) public String getContentByKeyWord( String kwds, String fmt ){ if( newsM == null ) return noDataStr ; Stri...
    Листинг 9.33. Метод getAHTopics...
    Листинг 9.33. Метод getAHTopics форматирует все имеющиеся заголовки (NetNewsBean.java) public String getAllTopics( String fmt ){ if( newsM == null ) return noDataStr ; StringBuffer sb = new String...
    Рис. 9.3. Представление заголовков сообщений
    Рис. 9.3. Представление заголовков сообщений...
    Листинг 9.34. Метод getContentByTopic (NetNewsBean.java)
    Листинг 9.34. Метод getContentByTopic (NetNewsBean.java) public String getContentByTopic( String content, String fmt ){ if( newsM == null ) return noDataStr ; StringBuffer sb = new StringBuffer(10...
    Возможные усовершенствования
    Возможные усовершенствования Хотя основанный на использовании DOM подход является вполне приемлемым для систем с небольшой нагрузкой на сервер, он не слишком эффективен, так как для доступа к кажд...









Начало