Сервлет NetNewsServ
Этот сервлет выполняет две существенные функции: метод doGet создает форму, которая позволяет пользователю выбирать интересующие его темы сообщений и/или задавать ключевые слова, а метод doPost осуществляет сам процесс отображения подходящих заголовков. В листинге 9.25 показано начало кода серв- лета. Чтобы не усложнять наш пример, мы жестко запрограммировали значение переменной queryStr, которая содержит URL для поиска соответствующего ресурса, путь и имя файла XML, а также значение переменной alias с URL-адре- сом сервлета. В реально работающей системе эти переменные будут считываться из файла свойств в методе init.
Листинг 9.25. Начало исходного кода NetNewsServ (NetNewsServ.java)
package com.XmlEcomBook.Chap09;
import java.io.*; import javax.servlet.*; import javax.servlet.http.*;
public class NetNewsServ extends HttpServlet { static String version = "1.02 July 26, 2000"; static String queryStr = "http://www.moreover.com/cgi-local/page" + "?wbrogden@bga.com+xml"; static String destDir = "e:\\scripts\\netnews" ; static String queryFile = "xmldump.xml" ; static String alias = "http://www.lanw.com/servlet/netnews" ;
String keywords = "Amazon,Dell,Microsoft"; String fmt = "<tr><td><a href=\"<%url>\" > <%headline_text></a>" + " from <%source></td></tr>" ;
public void init(ServletConfig config) throws ServletException { super.init(config); }
Метод doGet генерирует простую форму, которая позволяет выбрать одну или несколько тематических категорий и/или ввести ключевые слова. Как показано в листинге 9.26, он получает объект NetNewsBean для определенного источника новостей. Метод getTopicsAsSelect объекта NetNewsBean создает код для отображения списка возможных категорий. Получившаяся в результате страница HTML показана на рис. 9.2.
Листинг 9.26. Метод doGet создает простую форму (NetNewsServ.java)
public void doGet( HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { resp.setContentType("text/html"); PrintWriter out = new PrintWriter(resp.getOutputStream());
out.println("<HTML>"); out.println("<HEAD><TITLE>NetNewsServ Output</TITLE> </HEAD>"); out.println("<BODY>"); try { NetNewsBean nnb = new NetNewsBean( queryStr, destDir, queryFile );
out.println("<h1>The News</h1>"); out.println("<p>Select the general categories you would like to see. "+ "You can also enter a list of key words or phrases separated by " + "commas and the system will locate any headlines containing them.</p>" ); out.println("<center><form method=\"POST\" action=\"" + alias + "\" >" ); out.println("Key Words: <input type=\"TEXT\" size=\"60\"" + " maxlength=\"120\" name=\"keywords\" ><br>"); out.println("Select one or more topics (use <ctrl>click.) <br>"); out.println( nnb.getTopicsAsSelect() ); out.println("<br> <input type=\"SUBMIT\" value=\"Continue\" >"); out.println("</form></center><br>"); footer( out ); }catch(Exception e){ errorMsg( out, "NetNewsServ.doGet ", e ); } }
Рис. 9.2. Форма для выбора темы заголовков
Когда пользователь щелкает на кнопке Continue (Продолжить), методу doPost, приведенному в листинге 9.27, отправляется запрос. Если пользователь не ввел никаких ключевых слов и не выбрал никаких категорий в списке, вызывается метод doGet для обновления содержимого формы. В противном случае генерируется страница, содержащая таблицу HTML, строки которой создаются при помощи метода doNetNews. Разумеется, это сильно упрощенный вариант функционирования реального коммерческого сайта.
Листинг 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("<h2>Error: " ); out.println( msg ); out.println("</h2><br>"); if( ex != null ){ ex.printStackTrace( out ); } out.println("<br>"); out.println("<a href=\"mailto:wbrogden@bga.com\"> Please mail me the error message.</a><br>"); footer( out ); } private void header(PrintWriter out ){ out.println("<html>"); out.println("<head><title>Network News Servlet</title> </head>"); out.println("<body>"); }
private void footer(PrintWriter out ){ out.println("<hr><br>Network News Servlet " + version + " <br>" ); out.println("</body>"); out.println("</html>"); out.close(); }
}
Как показано в листинге 9.28, метод doNetNews получает объект NetNewsBean и выводит полученные заголовки в виде строк таблицы.
Листинг 9.28. Этот метод форматирует полученные заголовки (NetNewsServ.java)
// assumes a table has been started // topics[] are tags from list, ie 0, 1 etc. private void doNetNews ( PrintWriter out,String keywords, String[] topics ){ int i =0 ; try { NetNewsBean nnb = new NetNewsBean ( queryStr, destDir, queryFile ); out.println("Update " + nnb.getDocDate()); String[] tstr = nnb.getTopicsAsArray(); if( keywords.length() > 0 ) { out.println("<tr><td> Selected by keywords: " + keywords + "</td></tr>"); out.println( nnb.getContentByKeyWord( keywords, fmt )) ; } out.println("<hr>") ; if( topics == null ){ // none selected for( i = 0 ; i < tstr.length ; i++ ){ out.println("<tr><td>topic: " + tstr[i] + "</td></tr>" ); out.println( nnb.getContentByTopic( tstr[i], fmt ) ); } } else { for( i = 0 ; i < topics.length ; i++ ){ int tn = Integer.parseInt( topics[i] ); out.println("<tr><td>topic: " + tstr[tn] + "</td></tr>" ); out.println(nnb.getContentByTopic(tstr[ tn ], fmt)); } } }catch(Exception e){ out.println( "<tr><td>" ); e.printStackTrace(out ); out.println("</td></tr>"); } }
Все остальные методы в классе NetNewsServ являются служебными; некоторые из них показаны в листинге 9.29.
Листинг 9.29. Некоторые служебные методы (NetNewsServ.java)
// assumes response has been set to text/html private void errorMsg ( PrintWriter out, String msg, Exception ex ){ header( out ); out.println("<h2>Error: " ); out.println( msg ); out.println("</h2><br>"); if( ex != null ){ ex.printStackTrace( out ); } out.println("<br>"); out.println("<a href=\"mailto:wbrogden@bga.com\"> Please mail me the error message.</a><br>"); footer( out ); } private void header(PrintWriter out ){ out.println("<html>"); out.println("<head><title>Network News Servlet</title> </head>"); out.println("<body>"); }
private void footer(PrintWriter out ){ out.println("<hr> <br>Network News Servlet " + version + " <br>" ); out.println("</body>"); out.println("</html>"); out.close(); }
}