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

       

Сервлет CompanyNewsServ


Форма HTML для обновления страницы новостей создается и управляется сер- влетом CompanyNewsServl et. Начальный вход в сервлет осуществляется с помощью HTML-страницы, в которой имеется обычная форма HTML для ввода имени автора и пароля. Пример такой страницы представлен в файле CoNewsUpdate.html, который находится на прилагаемом к книге компакт-диске. Сервлет отыскивает имя автора в файле свойств, проверяя таким образом, что этот человек имеет право на добавление новых сообщений.

В листинге 8.21 показан файл свойств для работы на сервере local host. Заметим, что имя автора является именем свойства, а пароль — его значением.

Листинг 8.21. Файл свойств, используемый сервлетом CompanyNewsServ (conewserv. properties)

# properties for CompanyNewsServ handler=http://localhost/servlet/conewserv thenewshandler=http://localhost/servlet/thenews newsfile=thenews.xml version=June 15, 2000 wbrogden=xmlrules

В листинге 8.22 показаны инструкции импорта, статические переменные и метод init для сервлета CompanyNewsServ.

Листинг 8.22. Начало кода метода CompanyNewsServ (ComanyNewsServ.java)

package com.XmlEcomBook.Chap08 ;

import com.XmlEcomBook.DOMlibrary ; import java.io.*; import java.util.* ; import javax.servlet.*; import javax.servlet.http.*; import org.w3c.dom.* ;

public class CompanyNewsServ extends HttpServlet { static String workDir = "E:\\scripts\\CompanyNews" ; static String propfile = "conewserv.properties" ; static String newsFile = "thenews.xml" ; static String handler = "http://localhost/servlet/conewserv" ; static String version = "v0.12"; static String pversion = "" ; static Properties cnProp ; static String brcrlf = "<br />\r\n" ;

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 CompanyNewsServ using " + workDir ); File f = new File( workDir, propfile ); try { cnProp = new Properties(); cnProp.load( new FileInputStream(f) ); tmp = cnProp.getProperty("handler"); if( tmp != null ) handler = tmp ; tmp = cnProp.getProperty("newsfile"); if( tmp != null ) newsFile = tmp ; pversion = cnProp.getProperty("version"); System.out.println("Loaded properties for CompanyNewsServ: " + handler + " file:" + newsFile ); }catch(IOException e){ System.out.println("Error loading " + e ); }


}



Метод doGet, как показано в листинге 8.23, проверяет введенные пользователем имя и пароль, сравнивая их с данными в файле свойств, загруженном при инициализации сервлета. Если обнаруживается, что имя соответствует паролю, вызывается метод generateForm, создающий форму HTML для ввода текста нового сообщения.



Листинг 8.23. Метод doGet создает форму для ввода нового сообщения (CompanyNewsServ.java)

public void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { resp.setContentType("text/html"); PrintWriter out = new PrintWriter(resp.getOutputStream()); String username = req.getParameter("username"); String password = req.getParameter("password"); String action = req.getParameter("action"); String tmp = cnProp.getProperty(username); boolean userok = false ; if( tmp != null ){ userok = tmp.equals( password ); } header( out ); if( userok ){ generateForm( out, username, password ); } else { out.println("<p>User: " + username + " password: " + password + " not found.</p>" ); } footer( out ); }

Заполненная форма посылается методу doPost. Как показано в листинге 8.24, различные текстовые элементы извлекаются и передаются объекту NewsllpKeep с помощью метода addltem.



Листинг 8.24. Метод doPost собирает данные из формы (CompanyNewsServ.java)

public void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { resp.setContentType("text/html"); PrintWriter out = new PrintWriter(resp.getOutputStream()); String username = req.getParameter("username"); String password = req.getParameter("password"); String action = req.getParameter("action"); String head = req.getParameter("head"); String date = req.getParameter("date"); String topics = req.getParameter("topics"); String shrtStr = req.getParameter("short").trim(); String longStr = req.getParameter("long").trim(); File f = new File( workDir, newsFile ); try { NewsUpkeep nup = new NewsUpkeep( f ); nup.addItem( head, date, topics, username, shrtStr, longStr ); header( out ); out.println("NewsUpkeep is " + nup + "<br />"); footer( out ); } catch( Exception e){ errorMsg( out, "CompanyNewsServ.doPost ", e ); } }



Форма HTML для ввода новых сообщений создается методом generateForm, как показано в листинге 8.25. Заметим, что имя пользователя и пароль вставлены в форму в виде скрытых значений.



Листинг 8.25. Метод generateForm создает форму для ввода (Com.panyNewsServ.java)

private void generateForm( PrintWriter out, String name, String pw ){ out.println("<h2>Enter Company News Item Data</h2>"); out.println("<form method=\"POST\" action=\"" + handler + "\" >"); out.println("Headline - 80 char max<br />"); out.println("<input type=\"text\" maxlength=\"80\" size=\"60\"" + " name=\"head\" ><br />" ); out.println("Dated <br />"); out.println("<input type=\"text\" maxlength=\"50\" size=\"40\"" + " name=\"date\" value=\"" + new Date().toString() + "\" ><br />" ); out.println("Topics separated by commas - please stick to the official list.<br />"); out.println("<input type=\"text\" maxlength=\"80\" size=\"60\"" + " name=\"topics\" ><br />" ); out.println("Short version <br />"); out.println("<textarea cols=\"60\" rows=\"3\" name=\"short\" >"); out.println("</textarea><br />"); out.println("Long version <br />"); out.println("<textarea cols=\"60\" rows=\"10\" name=\"long\" >"); out.println("</textarea><br />"); out.println("<input type=\"hidden\" name=\"username\" value=\"" + name + "\"><br>" ); out.println("<input type=\"hidden\" name=\"password\" value=\"" + pw + "\" ><br>"); out.println("<input type=\"submit\" name=\"action\" value=\"Submit\" ><br />" ); out.println("</form></center>"); }



Наконец, в сервлете имеются обычные вспомогательные методы, показанные в листинге 8.26. Естественно, вам нужно будет заменить адрес в тексте сообщения на свой собственный либо предоставить переменную типа String, которая инициализируется в файле свойств.



Листинг 8.26. Служебные методы в сервлете CompanyNewsServ (CompanyNewsServ.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(); }

}

 




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