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

       

Код для сервлета TheNewsServ


Сервлет TheNewsServ можно использовать для отображения одного сообщения с указанным параметром id или для отображения нескольких сообщений с заданными параметрами topic и аде. В листинге 8.15 показаны инструкции импорта и статические переменные. Мы установили значения статических переменных равными заданным по умолчанию, но, разумеется, вам нужно будет заменить их на значения, отражающие ваши фактические настройки.

Листинг 8.15. Начало исходного кода сервлета TheNewsServ (TheNewsServ)

package com.XmlEcomBook.Chap08 ;

import java.io.*; import java.util.* ; import javax.servlet.*; import javax.servlet.http.*;

public class TheNewsServ extends HttpServlet { static String workDir = "E:\\scripts\\CompanyNews" ; static String newsFile = "thenews.xml" ; static String handler = "http://localhost/servlet/thenews" ; static String propfile = "conewserv.properties"; static String version = "v1.0"; static String pversion = "" ; static Properties cnProp ; static String brcrlf = "<br />\r\n" ; static String defaultHead = "<html>\r\n" + "<head><title>Company News Servlet</title></head>\r\n" + "<body>\r\n" + "<h2>Here is the news</h2>\r\n" ; static String defaultFoot = "</body></html>\r\n";

Метод init, показанный в листинге 8.16, считывает файл свойств, значения которых могут быть использованы для замены установленных по умолчанию значений статических переменных.

Листинг 8.16. Метод init класса TheNewsServ (TheNewsServ.java)

public void init(ServletConfig config) throws ServletException { super.init(config); String tmp = config.getInitParameter("workdir"); if( tmp != null ) workDir = tmp ; tmp = config.getInitParameter("propfile"); if( tmp != null ) propfile = tmp; System.out.println("Start TheNewsServ using " + workDir ); File f = new File( workDir, propfile ); try { cnProp = new Properties(); cnProp.load( new FileInputStream(f) ); tmp = cnProp.getProperty("thenewshandler"); if( tmp != null ) handler = tmp ; pversion = cnProp.getProperty("version"); if( pversion != null ){ defaultFoot = "<hr><br>News Servlet " + version + " properties: " + pversion + "<br>\r\n" + "</body>\r\n</html>\r\n" ; } NewsFormatter.setHandler( handler ); System.out.println( new Date().toString() + " Loaded properties for TheNewsServ: " + handler ); }catch(IOException e){ System.out.println("Error loading " + e ); }


}

Функциональность сервлета сконцентрирована в методе doGet, как видно из листинга 8.17. В запросе можно передать значения параметров, определяющих тему сообщений, максимальный «возраст» сообщений, требуемый способ представления и идентификатор сообщения. Заметим, что создается объект Fi I e, соответствующий файлу XML с сообщениями, и передается конструктору NewsFormatter. Использование объекта File гарантирует, что соблюдаются соглашения относительно разделителей для компонентов пути; NewsFormatter не открывает этот файл, но использует его имя при получении объектной модели документа для этого файла из DOMlibrary.



Листинг 8.17. Метод doGet (TheNewsServ.java)

public void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { resp.setContentType("text/html"); PrintWriter out = new PrintWriter(resp.getOutputStream()); String topics = req.getParameter("topic"); String ageStr = req.getParameter("days"); String len = req.getParameter("size" ); // "S","H" or "L" String id = req.getParameter("id"); // a single item is requested try { File f = new File( workDir, newsFile ); NewsFormatter nf = new NewsFormatter( f ); if( id != null ){ nf.doNews( out, defaultHead,defaultFoot, id ); } else { // PrintWriter, head, foot, topics, H,S or L, age, skip#, mx# nf.doNews( out, defaultHead, defaultFoot, topics, len, ageStr,0, 10 ); } out.close(); }catch(Exception e){ System.err.println("TheNewsServ.doGet " + e ); errorMsg( out, "TheNewsServ.doGet", e ); } }

Обратите внимание, что конструкция try-catch в методе doGet направляет все исключения методу errorMsg, показанному в листинге 8.18. Разумеется, вам следует вставить свой адрес электронной почты в текст сообщения либо текст этого сообщения может состоять из специальной строки, которая задается в файле свойств. Методы header и footer просто выписывают стандартные теги HTML.



Листинг 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 ); 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>Company News Servlet</title> </head>"); out.println("<body>"); }



private void footer(PrintWriter out ){ out.println("<hr><br>Company News Servlet " + version + " properties: <br>" ); out.println("</body>"); out.println("</html>"); out.close(); }

}






Содержание раздела