Листинг 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 );
Следующий шаг метода doPostQ, как показано в листинге 7.17, сводится к тому, чтобы определить, инициирует ли последний записанный ответ пользователя переход к новой ветви опроса. Естественно, новая ветвь начинается с первого вопроса в блоке, как указано в методе setBranch. Если переходить на новую ветвь не нужно, определяется место данного вопроса в текущем элементе Block и выполняется переход к следующему вопросу. Также нужно предусмотреть ситуацию, когда элемент, следующий за текущим вопросом, является завершающим; в этом случае мы вызываем метод getTerminal, функции которого описаны в следующем разделе и связаны с формированием последней страницы опроса.