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




Глава 8. Новости на сайте


    Глава 8. Новости на сайте
    Глава 8. Новости на сайте Вы, наверное, встречали web-сайты небольших организаций, в которых самые свежие новости относятся к событиям полугодовой давности. Эти организации теряют прекрасный шанс...
    Разработка системы показа новостей
    Разработка системы показа новостей Мы хотим предложить посетителям нашего web-сайта последние новости фирмы в компактном и удобном для чтения формате. Помните, что обычно в вашем распоряжении имее...
    Гибкость отображения
    Гибкость отображения Поскольку мы решили остановиться на XML как на исходной среде хранения данных, мы можем обеспечить гибкость отображения посредством хранения данных, необходимых для всех досту...
    Элементы текстов сообщений
    Элементы текстов сообщений Хотя в области искусственного интеллекта и понимания компьютером естественных языков сделаны большие успехи, никто не рассчитывает, что компьютер напишет хороший заголов...
    Листинг 8.1. Дата, заголовок...
    Листинг 8.1. Дата, заголовок, короткое и полное сообщения (thenews.xml) dateAustin, TX, Jun 14 2000/date headBest Seller at a Great Price/head short ![CDATA[Due to a special deal with the publishe...
    Расположение сообщений в зависимости от их новизны
    Расположение сообщений в зависимости от их новизны Самые свежие новости должны располагаться первыми. Так как документ XML автоматически сохраняет порядок следования элементов, новые элементы долж...
    Информация для управления сообщениями
    Информация для управления сообщениями Поскольку вы или ваши служащие будут обновлять страницу новостей в режиме подключения к сети, было бы полезно отслеживать, кто какое сообщение написал. (Напри...
    Корневой элемент документа
    Корневой элемент документа Мы отслеживаем некоторые параметры, используемые во всем файле, с помощью атрибутов, которые задаются в корневом элементе документа, Newsfile. Очередной атрибут id — это...
    Листинг 8.2. Элемент <Newsfile>...
    Листинг 8.2. Элемент Newsfile с одним элементом Newsitem (thenews.xml) ?xral version=l.О standalone=yes ? !-выходные данные NewsllpKeep -- Newsfile longtemplate=tmlong.html nextid=1010 Newsitem ti...
    Простота ввода данных
    Простота ввода данных Поскольку мы выбрали простой формат новостей, показанный в листинге 8.2, ввод данных осуществляется тоже достаточно просто. Система, основанная на формах HTML и сервлетах, оп...
    Минимальная нагрузка на сервер
    Минимальная нагрузка на сервер Поскольку мы надеемся, что посещаемость нашего сайта будет достаточно велика, мы хотим, чтобы отображение главной страницы выполнялось по возможности просто, то есть...
    Система показа новостей
    Система показа новостей Окончательный вариант устройства системы показа новостей изображается блок-схемой, приведенной на рис. 8.1. Обработка информации, происходящая на сервере, представлена в пр...
    Рис. 8.1. Обработка сообщений
    Рис. 8.1. Обработка сообщений Объектная модель документа поддерживается в памяти с помощью класса DOMlibrary, который был описан в главе 7. Обновление исходного файла XML в режиме подключения выпо...
    Внешний вид web-страницы
    Внешний вид web-страницы Прежде чем мы углубимся в рассмотрение кода нашей системы показа новостей, давайте посмотрим, как может выглядеть разрабатываемая страница. На рис. 8.2 показана web-страни...
    Рис. 8.2. Web-страница новостей...
    Рис. 8.2. Web-страница новостей, генерируемая с помощью JSP-страницы JSP-страница, используя класс NewsFormatter, который подробно описывается в следующем разделе, сгенерировала показанную на рису...
    Класс NewsFormatter
    Класс NewsFormatter Ключевым классом Java для формирования новостных сообщений является класс NewsFormatter. Как показано в листинге 8.3 и следующих листингах, класс NewsFormatter включает в себя...
    Листинг 8.3. Начало кода класса NewsFormatter
    Листинг 8.3. Начало кода класса NewsFormatter package com.XmlEcomBook.Chap08; import com.XmlEcomBook.DOMlibrary ; import java.io.*; import java.util.* ; import javax.servlet.*; import javax.servle...
    Листинг 8.4. Метод doNews выбирает...
    Листинг 8.4. Метод doNews выбирает способ представления сообщений (NewsFormatter.java) // hs and fs are head and foot used in short and long display // you can also specify templates in the Newsfi...
    Листинг 8.5. Версия doNews для...
    Листинг 8.5. Версия doNews для одного выбранного сообщения (NewsFormatter.java) // version to do a single item by id - always full length public int doNews( PrintWriter out, String hs, String fs,...
    Листинг 8.6. Метод, форматирующий...
    Листинг 8.6. Метод, форматирующий список заголовков новостей (NewsFormatter.java) // Headline always formatted as UL with link public void doHeadlineNews(PrintWriter out){ out.println( ul ); for(...
    Листинг 8.7. Метод doShortNews (NewsFormatter.java)
    Листинг 8.7. Метод doShortNews (NewsFormatter.java) public void doShortNews(PrintWriter out){ NamedNodeMap attrib = docRoot.getAttributes(); Node n = attrib.getNamedItem( shorttemplate) ; String t...
    Листинг 8.8. Метод doLongNews...
    Листинг 8.8. Метод doLongNews выводит полный текст сообщения (NewsFormatter.java) public void doLongNews(PrintWriter out){ NamedNodeMap attrib = docRoot.getAttributes(); Node n = attrib.getNamedIt...
    Листинг 8.9. Метод, выбирающий...
    Листинг 8.9. Метод, выбирающий сообщения по дате их создания (NewsFormatter.java) // limit to only most recent entries - return number, may be zero private int limitAge(String age, PrintWriter out...
    Листинг 8.10. Метод, который выбирает...
    Листинг 8.10. Метод, который выбирает сообщения по указанным темам (NewsFormatter.java) // based on String with topics separated by commas // example attribute topics=general,books,java // output...
    Листинг 8.11. Метод findNodes...
    Листинг 8.11. Метод findNodes класса NewsFormatter (NewsFormatter.java) // locate the nodes that are Elements for text data private void findNodes( Element ne ){ NodeList nl = ne.getChildNodes();...
    Листинг 8.12. Методы doNewsItemHead...
    Листинг 8.12. Методы doNewsItemHead и doNewsItemShort (NewsFormatter.java) // Newsitem has been hashed, id is attribute private void doNewsItemHead( PrintWriter out, String id ){ out.print(a href=...
    Листинг 8.13. Метод doNewsItemLong...
    Листинг 8.13. Метод doNewsItemLong выводит полную версию сообщения (NewsFormatter.java) // Newsitem elements have been hashed // output long form with p.../p formatting private void doNewsItemLong...
    Листинг 8.14. Конец исходного...
    Листинг 8.14. Конец исходного кода класса NewsFormatter (NewsFormatter.java) private void setFromTemplate(String template ) throws IOException { File f = new File( newsFilePath, template ); FileRe...
    Использование класса NewsFormatter
    Использование класса NewsFormatter В этом разделе рассматриваются два способа использования класса NewsFormatter: с сервлетом общего назначения TheNewsServ и с JSP-страницами....
    Код для сервлета TheNewsServ
    Код для сервлета TheNewsServ Сервлет TheNewsServ можно использовать для отображения одного сообщения с указанным параметром id или для отображения нескольких сообщений с заданными параметрами topi...
    Листинг 8.15. Начало исходного...
    Листинг 8.15. Начало исходного кода сервлета TheNewsServ (TheNewsServ) package com.XmlEcomBook.Chap08 ; import java.io.*; import java.util.* ; import javax.servlet.*; import javax.servlet.http.*;...
    Листинг 8.16. Метод init класса...
    Листинг 8.16. Метод init класса TheNewsServ (TheNewsServ.java) public void init(ServletConfig config) throws ServletException { super.init(config); String tmp = config.getInitParameter(workdir); i...
    Листинг 8.17. Метод doGet (TheNewsServ.java)
    Листинг 8.17. Метод doGet (TheNewsServ.java) public void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { resp.setContentType(text/html); PrintWriter...
    Листинг 8.18. Методы errorMsg...
    Листинг 8.18. Методы errorMsg, Header и Footer (TheNewsServ.java) // assumes response has been set to text/html private void errorMsg( PrintWriter out, String msg, Exception ex ){ header( out ); o...
    Пример JSP-страницы
    Пример JSP-страницы Для рассматриваемого нами примера JSP-страницы новостей ее основной формой является таблица с тремя столбцами. Чтобы уменьшить размер листинга, мы предельно сократили эту стран...
    Листинг 8.19. Первая часть упрощенной...
    Листинг 8.19. Первая часть упрощенной JSP-страницы для отображения новостей (mockup.jsp) !DOCTYPE HTML PUBLIC -//W3C//DTD HTML 4.0 Transitional//EN html head titleThe XMLGifts News /title /head bo...
    Листинг 8.20. Продолжение JSP-страницы...
    Листинг 8.20. Продолжение JSP-страницы с выходными данными NewsFormatter (mockup.java) !-- the nf and pw objects will be used for all three td -- tr valign=TOP font size=3 tdbNews Headlines/bbr %...
    Добавление свежих новостей
    Добавление свежих новостей Важной особенностью этого приложения является возможность добавления новых сообщений без нарушения нормальной работы web-сайта Эту функцию иллюстрирует верхний правый уг...
    Сервлет CompanyNewsServ
    Сервлет CompanyNewsServ Форма HTML для обновления страницы новостей создается и управляется сер- влетом CompanyNewsServl et. Начальный вход в сервлет осуществляется с помощью HTML-страницы, в кото...
    Листинг 8.21. Файл свойств, используемый...
    Листинг 8.21. Файл свойств, используемый сервлетом CompanyNewsServ (conewserv. properties) # properties for CompanyNewsServ handler=http://localhost/servlet/conewserv thenewshandler=http://localho...
    Листинг 8.22. Начало кода метода...
    Листинг 8.22. Начало кода метода CompanyNewsServ (ComanyNewsServ.java) package com.XmlEcomBook.Chap08 ; import com.XmlEcomBook.DOMlibrary ; import java.io.*; import java.util.* ; import javax.serv...
    Листинг 8.23. Метод doGet создает...
    Листинг 8.23. Метод doGet создает форму для ввода нового сообщения (CompanyNewsServ.java) public void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {...
    Листинг 8.24. Метод doPost собирает...
    Листинг 8.24. Метод doPost собирает данные из формы (CompanyNewsServ.java) public void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { resp.setConte...
    Листинг 8.25. Метод generateForm...
    Листинг 8.25. Метод generateForm создает форму для ввода (Com.panyNewsServ.java) private void generateForm( PrintWriter out, String name, String pw ){ out.println(h2Enter Company News Item Data/h2...
    Листинг 8.26. Служебные методы...
    Листинг 8.26. Служебные методы в сервлете CompanyNewsServ (CompanyNewsServ.java) // assumes response has been set to text/html private void errorMsg( PrintWriter out, String msg, Exception ex ){ h...
    Класс NewsUpKeep
    Класс NewsUpKeep Классу NewsUpKeep передаются существующий объект DOM Newsfile и различные текстовые строки, которые составляют новый элемент Newsitem; он переписывает файл XML с сообщениями. Прим...
    Листинг 8.27. Начало класса NewsUpKeep (NewsUpKeep.java)
    Листинг 8.27. Начало класса NewsUpKeep (NewsUpKeep.java) package com.XmlEcomBook.Chap08; import com.XmlEcomBook.DOMlibrary ; import java.io.*; import java.util.* ; import javax.servlet.*; import j...
    Листинг 8.28. Различные вспомогательные...
    Листинг 8.28. Различные вспомогательные функции класса NewsUpKeep (NewsUpKeep.java) //ensure there are no leading or trailing spaces on the // individual topics, comma separated, general,food , et...
    Листинг 8.29. Начало метода addltem (NewsUpKeep.java)
    Листинг 8.29. Начало метода addltem (NewsUpKeep.java) // items are always added at the top of the file // so we have to rebuild the start of the root element public void addItem( String head, Stri...
    Листинг 8.30. Метод addltem, продолжение (NewsllpKeep.java)
    Листинг 8.30. Метод addltem, продолжение (NewsllpKeep.java) out.print(Newsitem timestamp=\); out.print( timeInDays() + \ topic=\); out.print( formatTopics( topics ) ); out.println( \ author=\ + au...
    Листинг 8.31. Метод, который записывает...
    Листинг 8.31. Метод, который записывает отдельный элемент из DOM (NewsllpKeep.java) // write a Newsitem Element duplicating the attributes public void writeNewsNode(PrintWriter out, Element e) { N...









Начало