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

       

Пример сервлета для просмотра результатов отчета


Сервлет QanalysisServ, рассматриваемый в этом разделе, предоставляет доступ по сети к снимку результатов проходящего опроса, поэтому его можно назвать сер- влетом для просмотра результатов отчета. Он использует файл questionnaire.pro- perties для поиска всех текущих опросов и предлагает вам выбрать один из них. Затем он определяет, какие выходные файлы генерируются в этом опросе, и предлагает выбрать один из них для формирования отчета.

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

Листинг 7.31. Сервлет QanalysisServ (QanalysisServ.java)

package com.XmlEcomBook.Chap07;

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

public class QanalysisServ extends HttpServlet { static String brcrlf = "<br>\r\n" ; static String homedir = "e:\\scripts\\questionnaire" ; static String handler = "http://www.lanw.com/servlet/Qanalysis" ; static String passwd = "lovexml" ; static String version = "v1.0 May 28"; Properties qProp ;

// note we share properties file with QuestionnaireServ public void init(ServletConfig config) throws ServletException { super.init(config); System.out.println("Start QanalysisServ "); homedir = config.getInitParameter("homedir") ; File f = new File( homedir, "questionnaire.properties"); try { qProp = new Properties(); qProp.load( new FileInputStream(f) ); String tmp = qProp.getProperty("analysis"); if( tmp != null ) handler = tmp ; System.out.println("Loaded properties for Qanalysis: " + handler ); }catch(IOException e){ System.out.println("QanalysisServ Error loading " + e ); } }

Входом в сервлет служит метод doGet, показанный в листинге 7.32. Обычно для входа используется форма, в которую требуется ввести пароль пользователя, просто чтобы избежать риска случайного доступа к сервлету постороннего пользователя. Предположим, что все прошло успешно; тогда этот метод генерирует страницу с формой, которая позволяет осуществить выбор среди всех имеющихся в наличии отчетов. Выбранный файл передается методу doPost.



Листинг 7.32. Метод doGet класса QanalysisServ (QanalysisServ.java)
// entry with password public void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { System.out.println("Qanalysis doGet"); resp.setContentType("text/html"); PrintWriter out = new PrintWriter(resp.getOutputStream()); String user = req.getParameter("username"); String tmp = req.getParameter("userpw"); // Obviously this could be a lot more complex if( !passwd.equals( tmp )){ errorMsg( out, "404 page not found", null ); return ; } if( qProp == null || qProp.size() == 0 ){ errorMsg( out, "Bad Initialization", null ); return ; } HttpSession session = req.getSession( true ); session.putValue( "username", user ); // Enumeration e = qProp.keys(); Vector v = new Vector(); while( e.hasMoreElements()){ String key = (String)e.nextElement(); // everything not "handler" or "analysis" is a XML file path name if( !( key.equals("handler") || key.equals("analysis"))){ v.addElement( key ); } } if( v.size() == 0 ){ errorMsg( out, "No Questionnaire files found", null ); return ; } out.println("<HTML>"); out.println("<HEAD><TITLE>QanalysisServ Output</TITLE> </HEAD>"); out.println("<BODY>"); out.println("<h2>Select The Questionnaire XML File</h2>"); out.println("Found " + v.size() + " XML files" + brcrlf ); out.println("<form method=\"POST\" action=\"http://localhost/servlet/Qanalysis\" >"); out.println("<select name=\"source\" >"); for( int i = 0 ; i < v.size() ; i++){ tmp = (String) v.elementAt( i ); out.println("<option value=\"" + tmp + "\" >" + tmp ); } out.println("</select>"); out.println("<input type=\"hidden\" name=\"username\" value=\"" + user + "\"><br>" ); out.println("<input type=\"hidden\" name=\"action\" value=\"select\" ><br>"); out.println("<input type=\"submit\" value=\"Start\" ><br>" ); out.println("</form>"); footer( out ); }




В первом запросе, выполняемом методом POST, значение переменной action равно select. Как показано в листинге 7.33, такой запрос инициирует вывод раскрывающегося списка всех доступных файлов с результатами. При этом используется метод createQList.

Листинг 7.33. Первая часть метода doPost (QanalysisServ.java)
public void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { resp.setContentType("text/html"); PrintWriter out = new PrintWriter(resp.getOutputStream()); String source = req.getParameter( "source"); String action = req.getParameter( "action"); String ansfile = req.getParameter("ansfile"); // select when choosing quesionnaire XML file // analyze when choosing reformatted result file String[] files = null ; if( action == null || source == null || source.length() == 0 ){ errorMsg(out,"Bad source selection", null );return ; } // source is short name from properties String srcfile = qProp.getProperty( source ); if( srcfile == null ) { errorMsg( out, "Bad Source lookup", null ); return ; } HttpSession session = req.getSession(false); try { if( session == null ){ errorMsg(out, "No Session ", null ); return ; } DOMlibrary lib = DOMlibrary.getLibrary(); System.out.println("DOMlibrary ok, try for " + srcfile ); Document doc = lib.getDOM( srcfile ); if( doc == null ){ errorMsg( out, "DOM doc failed - unable to continue", null ); return ; } PrepQxml pQ = (PrepQxml)session.getValue("prepqxml"); // substitute getAttribute if using 2.2 api header( out ); if( pQ == null ){ // first pass pQ = new PrepQxml( doc ); files = pQ.createFiles(); session.putValue("prepqxml",pQ); } else { files = pQ.getFiles(); } if( action.equals("select") ){ out.println("<h1>Test: " + pQ.title +"</h1>" ); out.println("<p>XML questionnaire file: <i>" + source + "</i></p>"); out.println("<p>Author: " + pQ.author + " Dated: " + pQ.date + "</p>"); out.println("<p>The primary answer file is: " + pQ.primaryfile + "</p>" ); out.println("<p>There " ); if( files.length < 2 ) out.println("are no other "); if( files.length == 2 ) out.println("is one other "); if( files.length > 2 ) out.println( (files.length - 1) + " other "); out.println("answer file(s). Select a file and click <b>Start</b></p>"); createQList( out, source, files ); }


Когда пользователь выберет один из файлов с результатами, переменная action принимает значение analyze. Как показано в листинге 7.34, это инициирует создание нового объекта TallyQues, который используется для формирования таблицы с результатами.

Листинг 7.34. Метод doPost, продолжение (QanalysisServ.java)
if( action.equals("analyze") ){ out.println("<h1>Analysis</h1>"); out.println("<p>XML questionnaire file: <i>" + source + "</i></p>"); String ansXml = pQ.getAnsXml( ansfile ); out.println("<p>Answer file: " + ansfile + "</p>"); out.println("<p>Processing file: " + ansXml + "</p>"); TallyQues tQ = new TallyQues( doc ); // build with questions if( tQ.tallyAns( ansXml )== null ){ out.println("<h2>Error " + tQ.lastErr + "</h2>") ; } else { tQ.formatTally( out ); } } footer( out ); }catch( Exception ex ){ errorMsg( out, "QanalysisServ.doPost ", ex ); } }
Метод createQList, показанный в листинге 7.35, создает форму HTML, которая используется для вывода всех возможных файлов с ответами.

Листинг 7.35. Метод createList (QanalysisServ.java)
// the PrepQxml has located all of the answer files - only one // can be analyzed at at time void createQList( PrintWriter out, String source, String[] files ){ out.println("<form method=\"POST\" action= \"http://localhost/servlet/Qanalysis\" >"); out.println("<input type=\"hidden\" name= \"action\" value=\"analyze\" ><br>"); out.println("<input type=\"hidden\" name= \"source\" value=\"" + source + "\" ><br>"); out.println("<select name=\"ansfile\" >"); for( int i = 0 ; i < files.length ; i++){ String tmp = files[i]; out.println("<option value=\"" + tmp + "\" >" + tmp ); } out.println("</select>"); out.println("<input type=\"submit\" value=\"Start\" ><br>" ); out.println("</form><br>"); }


Мы почти завершили рассмотрение класса QanalysisServ! В листинге 7.36 показаны некоторые служебные методы, необходимые для форматирования выходных страниц и сообщений об ошибках.

Листинг 7.36. Служебные методы в классе QanalysisServ (QanalysisServ.java)
public void header( PrintWriter out ){ out.println("<HTML>"); out.println("<HEAD><TITLE>QanalysisServ Output</TITLE> </HEAD>"); out.println("<BODY>"); } public void footer( PrintWriter out ){ out.println("<hr>" + version + "<br>"); out.println("</BODY>"); out.println("</HTML>"); out.close(); } // assumes response has been set to text/html private void errorMsg ( PrintWriter out, String msg, Exception ex ){ out.println("<html>"); out.println("<head><title>QanalysisServ Output</title> </head>"); out.println("<body>"); out.println("<h2>" ); out.println( msg ); out.println("</h2><br>"); if( ex != null ){ ex.printStackTrace( out ); } out.println("<br>"); footer( out ); } }
 


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