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




Глава 7. Поиск своего покупателя с помощью опросов


    Глава 7. Поиск своего покупателя с помощью опросов
    Глава 7. Поиск своего покупателя с помощью опросов Для успешной работы вашего электронного магазина необходимо, чтобы вы имели некоторое представление о ваших покупателях. Для этого в первую очере...
    Обеспечение конфиденциальности
    Обеспечение конфиденциальности В настоящее время многие разделяют беспокойство по поводу сохранения права потребителей на частную жизнь и с подозрением воспринимают любую организацию, которая хран...
    Промышленные стандарты
    Промышленные стандарты Желание решить описанную проблему в области электронной коммерции без вмешательства правительства привело к созданию независимой некоммерческой инициативной организации под...
    Общественные организации
    Общественные организации Многие считают, что частная информация подвергается такой же опасности при сборе данных, проводимых правительственными организациями, как и при опросах коммерческих органи...
    Создание системы опросов с помощью XML-сценария
    Создание системы опросов с помощью XML-сценария Простая, но эффективная форма сбора информации — это проведение опроса по сети. Поскольку язык XML предназначен, в частности, для определения структ...
    Определение последовательности вопросов
    Определение последовательности вопросов На рис. 7.1 показаны возможные ветви сценария опроса. Существенно следующее: имеются блоки вопросов, в которых ветвление отсутствует и которые заканчиваются...
    Листинг 7.1. Первый и второй уровень иерархии анкеты
    Листинг 7.1. Первый и второй уровень иерархии анкеты Questionnai re Intro /Intro Block name=A /Block Block name=B type=terminal /Block Block name=C /Block Block name=D /Block Block name=E type=ter...
    Рис. 7.1. Возможные ветви сценария
    Рис. 7.1. Возможные ветви сценария Каждый вопрос в блоке создается с помощью тега dues, который включает в себя текстовый фрагмент и два или более варианта выбора, создаваемых тегами Qopt. Атрибут...
    Пример анкеты
    Пример анкеты В листинге 7.2 показаны введение и первый вопрос анкеты, которую вы могли бы использовать для определения, какие товары добавить в ваш каталог. ПРИМЕЧАНИЕ Полная версия анкеты имеетс...
    Листинг 7.2. Начало документа...
    Листинг 7.2. Начало документа XML, определяющего анкету (customsurvey.xml) ?xml version=1.0 standalone=yes ? Questionnaire title=Example Customer Survey author=wbb date=May 30, 2000 method=xml fil...
    Листинг 7.3. Блок вопросов «Книги»...
    Листинг 7.3. Блок вопросов Книги (custom.ersurvey.xml) Block name=books type=terminal Ques id=books:1 type=QMCM QtextPlease select all of the book categories you would like to see in our catalog....
    Сервлет управления опросом
    Сервлет управления опросом В этом разделе приводится полный код сервлета Java, который управляет опросом, основанным на приведенном в предыдущем разделе документе XML. Этот сервлет записывает резу...
    Код сервлета управления опросом
    Код сервлета управления опросом В листинге 7.4 показаны инструкции импорта, объявления классов и метод init для сервлета QuestionnaireServ. Статическая переменная homedir, значение которой может б...
    Листинг 7.4. Начало кода сервлета...
    Листинг 7.4. Начало кода сервлета QuestionnaireServ (QuestionnaireServ.java) package com.XmlEcomBook.Chap07; import com.XmlEcomBook.DOMlibrary ; import org.w3c.dom.* ; import java.io.*; import jav...
    Листинг 7.5. Код метода doGet (QuestionnaireServ.java)
    Листинг 7.5. Код метода doGet (QuestionnaireServ.java) public void doGet (HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { resp.setContentType(text/html); P...
    Листинг 7.6. Метод doPost класса...
    Листинг 7.6. Метод doPost класса QuestionnaireServ (QuestionnaireServ.java) public void doPost (HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { resp.setCon...
    Листинг 7.7. Вспомогательные методы...
    Листинг 7.7. Вспомогательные методы сервлета QuestionnaireServ (QuestionnaireServ.java) public void footer( PrintWriter out ){ out.println(hr Servlet version: + version + br); out.println(/body);...
    Класс Interpreter
    Класс Interpreter В классе Interpreter инкапсулирована вся работа по созданию на основе документа XML форм для вопросов. Этот класс устроен так, чтобы быть максимально гибким в отношении способов...
    Листинг 7.8. Начало блока вопросов...
    Листинг 7.8. Начало блока вопросов в документе XML (customersurvey.xml) Block name=cds type=terminal Ques type=QMCM id=palm:1 QtextPlease select all of the categories of CD that you would like to...
    Листинг 7.9. Константы и инструкции...
    Листинг 7.9. Константы и инструкции импорта в начале исходного кода класса Interpreter (Interpreter.java) package com.XmlEcomBook.Chap07; // import org.w3c.dom.* ; import com.sun.xml.tree.* ; impo...
    Листинг 7.10. Переменные экземпляра...
    Листинг 7.10. Переменные экземпляра и конструктор класса Interpreter (Interpreter.java) // instance variables below this Document theDom ; Node nowBlock, nowNode ; // nowNode should be quest type...
    Листинг 7.11. Методы для создания...
    Листинг 7.11. Методы для создания различных частей HTML-страницы (Interpreter.java) void writeHead( PrintWriter out ){ out.println(html); out.println(headtitle + title + /title/head); if( css.leng...
    Отображение вопросов
    Отображение вопросов Метод genQues, приведенный в листинге 7.12, вызывается после того, как переменной nowNode присваивается значение того элемента dues, который требуется отобразить. Обратите вни...
    Листинг 7.12. Метод genQuest (Interpreter-Java)
    Листинг 7.12. Метод genQuest (Interpreter-Java) public void genQuest( PrintWriter out ){ Element E = (Element) nowNode ; String qid = E.getAttribute(id) ; String type = E.getAttribute(type); Strin...
    Листинг 7.13. Метод doOption (Interpretr.java)
    Листинг 7.13. Метод doOption (Interpretr.java) // opN is from node list of Qopt - create output // Qopt val=a branch= Option a./Qopt private void doOption(PrintWriter out, Node opN, int typeN ){ E...
    Отображение введения
    Отображение введения В листинге 7.14 представлен метод dolntro, который задает начальный элемент Block, отыскивая первый элемент в списке узлов ЫockNodeList. Когда значение переменной nowBlock зад...
    Листинг 7.14. Метод dolntro, который...
    Листинг 7.14. Метод dolntro, который выводит текст из тега Intro (Interpreter.java) // head has been set, we are in body public void doIntro(PrintWriter out ){ writeHead( out ); nowBlock = blockNo...
    Управление ветвлением опроса
    Управление ветвлением опроса В листинге 7.15 показан метод setBranch, который вызывается из метода doPostQ, когда ответ пользователя на данный вопрос определяет выбор очередной ветви опроса. Этот...
    Листинг 7.15. Метод setBranch (Interpreter.java)
    Листинг 7.15. Метод setBranch (Interpreter.java) // jump to another block has been detected private void setBranch(String block ){ int ct = blockNodeList.getLength(); for( int i = 1 ; i ct ; i++ )...
    Листинг 7.16. Начало метода doPost (Interpreter.java)
    Листинг 7.16. Начало метода doPost (Interpreter.java) // req contains user response public void doPostQ( PrintWriter out, HttpServletRequest req, Recorder recordB ){ if( recordB.terminated ){ writ...
    Листинг 7.17. Метод doPost, продолжение (Interpreter.java)
    Листинг 7.17. Метод doPost, продолжение (Interpreter.java) String branch = branchLookUp( oplist, optS ); if( branch != null ){ //System.out.println(Taking Branch: + branch ); setBranch( branch );...
    Обработка элемента Terminal
    Обработка элемента Terminal Как показано в листинге 7.18, метод doTerminal выполняет две основные задачи. Во-первых, он формирует завершающую страницу опроса, используя либо текст, содержащийся в...
    Листинг 7.18. Метод genTerminal (Interpreter.Java)
    Листинг 7.18. Метод genTerminal (Interpreter.Java) // have reached the end of a terminal block // note that a Terminal tag may have an altfile=filepathandname // that replaces the default establis...
    Вспомогательные методы класса Interpreter
    Вспомогательные методы класса Interpreter В листинге 7.19 показаны вспомогательные методы класса Interpreter....
    Листинг 7.19. Завершение кода...
    Листинг 7.19. Завершение кода класса Interpreter (Interpreter.Java) private Node setQnodeInBlock( int n ){ Element E = (Element) nowBlock ; NodeList nl = E.getElementsByTagName(Ques); nowNode = nl...
    Класс Recorder
    Класс Recorder Класс Recorder отвечает за хранение ответов пользователя на каждый вопрос и за их запись в файл для дальнейшего анализа. Каждому пользователю отводится экземпляр класса Recorder, ко...
    Листинг 7.20. Начало исходного...
    Листинг 7.20. Начало исходного кода класса Recorder (Recorder.java) package com.XmlEcomBook.Chap07; import org.w3c.dom.* ; import com.sun.xml.tree.* ; import java.io.*; import java.util.* ; import...
    Листинг 7.21. Конструктор класса...
    Листинг 7.21. Конструктор класса Recorder и метод setMethods (Recorder.java) public Recorder(String id, String typ, String ses,String src ){ userid = id ; usertype = typ ; sessionid = ses ; source...
    Листинг 7.22. Код класса Recorder...
    Листинг 7.22. Код класса Recorder, продолжение (Recorder.java) // called when a Terminal block is reached // if altdest is not this changes the default output public void terminal(String altdest )...
    Листинг 7.23. Запись результатов...
    Листинг 7.23. Запись результатов опроса одного пользователя на XML Qresuits source=e:\scripts\javatest.xml date=Mon May 22 22:30:20 CDT 2000 userid=unknown usertype=passed sessionid=95905262085948...
    Варианты анализа анкеты
    Варианты анализа анкеты Поскольку формат записи результатов опроса таков, что ответы каждого пользователя сохраняются в виде отдельной записи, имеется много вариантов анализа этих ответов. Для наш...
    Класс для создания файлов снимков
    Класс для создания файлов снимков Создание файлов снимков осуществляется классом PrepQxml, как показано в листинге 7.24 и следующих листингах. Конструктор берет объект XML Document и извлекает име...
    Листинг 7.24. Код класса PrepQxml (PrepQxml.java)
    Листинг 7.24. Код класса PrepQxml (PrepQxml.java) package com.XmlEcomBook.Chap07; import com.XmlEcomBook.DOMlibrary ; import org.w3c.dom.* ; import com.sun.xml.tree.* ; import java.io.*; import ja...
    Листинг 7.25. Методы createFiles и makeXML (PrepQxml.java)
    Листинг 7.25. Методы createFiles и makeXML (PrepQxml.java) // for every file in allfiles, create a temporary with xml root // return array of file path/names public String[] createFiles() throws I...
    Класс для создания таблиц
    Класс для создания таблиц Класс TallyQues использует интерфейс SAX для обработки документа QResultsSet. В результате этой обработки формируется таблица, в которой указывается, сколько раз встретил...
    Листинг 7.26. Начало кода класса TallyQues (TallyQues.java)
    Листинг 7.26. Начало кода класса TallyQues (TallyQues.java) package com.XmlEcomBook.Chap07; import java.io.* ; import java.util.* ; import org.w3c.dom.* ; import org.xml.sax.* ; import org.xml.sax...
    Листинг 7.27. Метод tallyAns (TallyQues.java)
    Листинг 7.27. Метод tallyAns (TallyQues.java) // srcdoc is complete path to a formatted answer set file public Vector tallyAns(String srcdoc ){ Parser parser ; InputSource input ; try { File f = n...
    Листинг 7.28. Методы обработки событий SAX (TallyQues.java)
    Листинг 7.28. Методы обработки событий SAX (TallyQues.java) // this is the SAX specified callback called when the // parser detects an element public void startElement( String name, AttributeList...
    Листинг 7.29. Метод formatTally...
    Листинг 7.29. Метод formatTally создает таблицу HTML (TallyQues.java) // assumes that tallyAns was just run public void formatTally(PrintWriter out ){ out.println(centerh2 + ordered.size() + Quest...
    Рис. 7.2. Отображение в браузере...
    Рис. 7.2. Отображение в браузере таблицы, сформированной методом fbrmatTally Остается рассмотреть еще один компонент класса TallyQues — внутренний класс Counter. Как показано в листинге 7.30, в об...
    Листинг 7.30. Внутренний класс Counter (TallyQues.java)
    Листинг 7.30. Внутренний класс Counter (TallyQues.java) // counter objects represent a single question/option combo class Counter { public String val ; public String unique ; // Ques id plus : plu...
    Пример сервлета для просмотра результатов отчета
    Пример сервлета для просмотра результатов отчета Сервлет QanalysisServ, рассматриваемый в этом разделе, предоставляет доступ по сети к снимку результатов проходящего опроса, поэтому его можно назв...
    Листинг 7.31. Сервлет QanalysisServ (QanalysisServ.java)
    Листинг 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.*; im...
    Листинг 7.32. Метод doGet класса...
    Листинг 7.32. Метод doGet класса QanalysisServ (QanalysisServ.java) // entry with password public void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException...
    Листинг 7.33. Первая часть метода...
    Листинг 7.33. Первая часть метода doPost (QanalysisServ.java) public void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { resp.setContentType(text/h...
    Листинг 7.34. Метод doPost, продолжение (QanalysisServ.java)
    Листинг 7.34. Метод doPost, продолжение (QanalysisServ.java) if( action.equals(analyze) ){ out.println(h1Analysis/h1); out.println(pXML questionnaire file: i + source + /i/p); String ansXml = pQ.g...
    Листинг 7.35. Метод createList (QanalysisServ.java)
    Листинг 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, S...
    Листинг 7.36. Служебные методы...
    Листинг 7.36. Служебные методы в классе QanalysisServ (QanalysisServ.java) public void header( PrintWriter out ){ out.println(HTML); out.println(HEADTITLEQanalysisServ Output/TITLE /HEAD); out.pri...
    Служебная библиотека документа XML
    Служебная библиотека документа XML Существует альтернативный подход к тому, чтобы обеспечить каждому сервлету доступ к соответствующему документу XML. Этот подход заключается в использовании служе...
    Листинг 7.37. Инструкции импорта...
    Листинг 7.37. Инструкции импорта и статические методы класса DOMlibrary (DOMIibrary.java) package com.XmlEcomBook ; import java.io.* ; import java.util.* ; import com.sun.xml.tree.* ; import com.s...
    Листинг 7.38. Конструктор и переменные...
    Листинг 7.38. Конструктор и переменные экземпляра класса DOMlibrary (DOMIibrary.java) private Hashtable domHash, trackerHash ; boolean running ; private String lastErr = none ; // private construc...
    Листинг 7.39. Метод loadXML осуществляет...
    Листинг 7.39. Метод loadXML осуществляет анализ документа XML (DOMIibrary.java) private synchronized void loadXML(File xmlFile, String src ) { //File xmlFile = new File( src ) ; try { long timesta...
    Листинг 7.40. Метод getDOM (DOMIibrary.java)
    Листинг 7.40. Метод getDOM (DOMIibrary.java) // either return the doc or null if a problem public synchronized Document getDOM( String src ){ Object doc = domHash.get( src ); DomTracker dt = (DomT...
    Листинг 7.41. Некоторые служебные методы (DOMIibrary.java)
    Листинг 7.41. Некоторые служебные методы (DOMIibrary.java) // use this to force removal of a dom. it // returns last copy of dom or null if dom not in hash public synchronized Document removeDOM(...
    Листинг 7.42. Метод run и другие...
    Листинг 7.42. Метод run и другие служебные методы (DOMIibrary.java) // run is used for upkeep, not reading XML public void run() { while( running ){ try{ Thread.sleep( 60000 ); // example manageme...
    Листинг 7.43. Определение класса...
    Листинг 7.43. Определение класса DOMTracker как члена класса DOMIibrary (DOMIibrary.java) // utility class to aid in tracking memory resident DOM class DomTracker { private long lastMod ; private...









Начало