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

         

Управление ветвлением опроса


В листинге 7.15 показан метод setBranch, который вызывается из метода doPostQ, когда ответ пользователя на данный вопрос определяет выбор очередной ветви опроса. Этот метод просто просматривает все элементы ВТ ock и ищет имя (значение атрибута name), совпадающее с заданным именем блока. В этом методе также устанавливаются значения переменных nowBlock и nowNode.

Листинг 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++ ){ // block 0 was the start nowBlock = blockNodeList.item(i); String name = ((Element)nowBlock).getAttribute("name"); if( name.equals( block )){ checkBlockType() ; // to set terminal flag setQnodeInBlock( 0 ) ; // set nowNode return ; } } System.err.println("Interpreter.setBranch failed to find " + block ); nowBlock = nowNode = null ; }

Метод doPostQ, начало которого приводится в листинге 7.16, вызывается из метода doPost и управляет созданием новой HTML-страницы. Обратите внимание на то, что в первую очередь этот метод проверяет, не был ли зафиксирован соответствующим объектом Recorder тот факт, что опрос завершен. Это сделано для того, чтобы пользователь не мог с помощью кнопки Back (Назад) браузера возвратиться на предыдущую страницу для ввода данных, когда опрос уже завершен и данные записаны.

Следующая часть кода отводится для обработки специального случая, когда переменная quesid равна intro, то есть вопрос является первым в анкете. Во всех других случаях ответ пользователя записывается путем сравнения значений opt, взятых из формы, с атрибутами тега Qopt с помощью объекта Recorder этого сеанса.

Листинг 7.16. Начало метода doPost (Interpreter.java)

// req contains user response public void doPostQ( PrintWriter out, HttpServletRequest req, Recorder recordB ){ if( recordB.terminated ){ writeHead( out ); out.println("<b>This questionnaire has been terminated</b>"); return ; } String action = req.getParameter("action"); String quesid = req.getParameter("quesid"); if( !action.equals("Next") ){ out.println("Unexpected state in Interpreter.doPost<br>"); return ; } if( quesid.equals("intro") ){ // this calls for generating first question // doIntro already set nowNode to first <Ques> node genQuest( out ); return ; } // if here, not generating first question, examine request Element E = (Element) nowNode ; NodeList oplist = E.getElementsByTagName("Qopt"); int type = lookUpType( E.getAttribute("type")); String lim = E.getAttribute("limit"); // ? String[] optS = req.getParameterValues("opt"); recordB.record( quesid, type, optS );




Содержание  Назад  Вперед