Класс NetNewsBean
Этот класс выполняет роль интерфейса между сервлетом и хранящимся в памяти объектом NewsModel, который соответствует конкретному источнику сообщений. Как показано в листинге 9.30, конструктор использует класс NetNewsSuper для получения текущего объекта NewsModel для заданного источника.
Листинг 9.30. Начало класса NetNewsBean (NetNewsBean.java) package com.XmlEcomBook.Chap09;
package com.XmlEcomBook.Chap09;
import java.util.* ; import org.w3c.dom.* ;
public class NetNewsBean { static String noDataStr ="No Data is available"; static String dataSourceErr = "Error when loading data " ; NewsModel newsM ; // has public boolean usable and errStr
// create with source url string, dest file path, dest fname NetNewsBean( String source, String pth, String fn ) throws Exception { NetNewsSuper nns = NetNewsSuper.getNetNewsSuper( source,pth,fn ); newsM = nns.getNewsModel() ; // throws exception }
public String getDocDate(){ if( newsM == null ) return noDataStr ; if( newsM.usable ) return newsM.dateStr ; return dataSourceErr ; }
В листинге 9.31 показаны методы, которые обеспечивают доступ к списку тематических категорий в конкретном объекте NewsModel. Метод getTopicsAsArray просто возвращает массив типа String, в то время как getTopicsAsSelect возвращает список в формате HTML.
Листинг 9.31. Методы, которые возвращают тематические категории в виде массива и в виде списка в формате HTML (NetNewsBean.java)
public String[] getTopicsAsArray(){ if( newsM == null || !newsM.usable ) return null; return newsM.getTopics(); } // return available topics as a Select control with values // matching the index of the topics array public String getTopicsAsSelect(){ if( newsM == null ) return noDataStr ; StringBuffer sb = new StringBuffer(1000); if( newsM.usable ){ String[] topics = newsM.getTopics(); sb.append(" <select name=\"topics\" MULTIPLE size=\"3\">\r\n"); for( int i = 0 ; i < topics.length ; i++ ){ sb.append("<option value=\""); sb.append( Integer.toString( i )); sb.append("\" > "); sb.append( topics[i] ); } sb.append("</select>\r\n"); } else { sb.append( dataSourceErr ); sb.append( newsM.lastErr ); } return sb.toString(); }
Метод getContentByKeyWord, показанный в листинге 9.32, контролирует выбор и формат заголовков, содержащих одно или несколько ключевых слов, введенных пользователем.
Листинг 9.32. Метод, контролирующий поиск заголовков по ключевым словам (NetNewsBean.java)
public String getContentByKeyWord( String kwds, String fmt ){ if( newsM == null ) return noDataStr ; StringBuffer sb = new StringBuffer(1000); if( newsM.usable ){ Element[] art = newsM.articlesByKeyWord( kwds ); for( int i = 0 ; i < art.length ; i++ ){ sb.append( newsM.formatElement( art[i], fmt )); sb.append("\n"); } } else { sb.append( dataSourceErr ); sb.append( newsM.lastErr ); } return sb.toString(); }
Альтернативным вариантом является представление всех заголовков новостей, которое осуществляется методом getAllTopics. Как показано в листинге 9.33, для каждого заголовка этот метод создает строку, содержащую форматированный текст заголовка.
Листинг 9.33. Метод getAHTopics форматирует все имеющиеся заголовки (NetNewsBean.java)
public String getAllTopics( String fmt ){ if( newsM == null ) return noDataStr ; StringBuffer sb = new StringBuffer(1000); if( newsM.usable ){ Element[] art = newsM.getAllTopics(); for( int i = 0 ; i < art.length ; i++ ){ sb.append( newsM.formatElement( art[i], fmt )); sb.append("\n"); } } else { sb.append( dataSourceErr ); sb.append( newsM.lastErr ); } return sb.toString(); }
На рис 9 3 показана страница с заголовками свежих новостей, выбранных в соответствии с указанными ключевыми словами и форматированных методом getContentByTopic, который приведен в листинге 934
Рис. 9.3. Представление заголовков сообщений
Листинг 9.34. Метод getContentByTopic (NetNewsBean.java)
public String getContentByTopic( String content, String fmt ){ if( newsM == null ) return noDataStr ; StringBuffer sb = new StringBuffer(1000); if( newsM.usable ){ Element[] art = newsM.articlesByTopic( content ); if( art == null ) return dataSourceErr ; for( int i = 0 ; i < art.length ; i++ ){ sb.append( newsM.formatElement( art[i], fmt )); sb.append("\n"); } } else { sb.append("getContentByTopic " + dataSourceErr ); sb.append("getContentByTopic " + newsM.lastErr ); } return sb.toString(); }
public String toString() { StringBuffer sb = new StringBuffer("NetNewsBean "); return sb.toString() ; }
}