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

Метод doPageMid


Метод doPageMid управляет ответом сервлета на запрос пользователя. Значение параметра action определяет выбор метода представления, который, в свою очередь, генерирует требуемое представление. Как показано в листинге 4.7, последовательность инструкций if определяет, какой из методов вызывается.

Листинг 4.7. Метод doPageMid (CatalogServ.java)

public void doPageMid( HttpServletRequest req, HttpServletResponse resp,

PrintWriter out, HttpSession session ){

String action = req.getParameter("action");

String select = req.getParameter("select");

if( "showcatalog".equals( action )){

if( select == null || select.equals("all") ){

completeCatalog( out );

}

else {

productLineCatalog( out, select );



}

}

else if( "selectkeyword".equals( action )){

if( select == null || select.equals("all") ){

doKeywordSelect( out );

}

}

else if( "keywdsearch".equals( action )) {

String keyword = req.getParameter("keyword");

if( keyword != null ){

keywordCatalog( out, keyword );

}

}

else if( "showproduct".equals( action ) ||

"setcart".equals( action) ){

doShowProduct( req, resp, out, session, action );

}else if( "showcart".equals( action ) ){

doShowCart( req, resp, out, session, action );

}

}

В методах completeCatalog (листинг 4.8) и productLineCatalog (листинг 4.9) используется один и тот же подход к генерированию таблицы, содержащей соответствующий список товаров (либо полный, либо одну серию). Основное различие заключается в том, что в методе completeCatalog, как видно на рис. 4.1, в таблице имеются три столбца — по одному на каждую серию товаров. Для выбора одной из этих серий следует вызвать метод setlnitialSelect класса CatalogBean. В случае если у вас имеется более четырех серий товаров, следует искать какой- нибудь другой метод отображения каталога, так как таблица с пятью и более столбцами будет выглядеть не слишком хорошо.

Текст HTML, относящийся к конкретному товару, будет иметь вид, подобный следующему:


<а class="ch3"

href="http://localhost/serviet/catalog?асtion=

showproduct&id=bk0022">

Guide to Plants </a>

<span class="ch4">price ea = $12.99 </span>

Этот код делает название товара активной ссылкой, которая отсылает параметры action и id сервлету, что ведет к отображению полной информации о данном товаре. Атрибут class контролирует тип, размер и цвет шрифта различных фрагментов текста путем выбора той или иной таблицы стилей из файла catalog.css.



Листинг 4.8. Методы doKeywordSelect и completeCatalog (CatalogServ.java)

public void doPageMid( HttpServletRequest req, HttpServletResponse resp,

PrintWriter out, HttpSession session ){

String action = req.getParameter("action");

String select = req.getParameter("select");

if( "showcatalog".equals( action )){

if( select == null || select.equals("all") ){

completeCatalog( out );

}

else {

productLineCatalog( out, select );

}

}

else if( "selectkeyword".equals( action )){

if( select == null || select.equals("all") ){

doKeywordSelect( out );

}

}

else if( "keywdsearch".equals( action )) {

String keyword = req.getParameter("keyword");

if( keyword != null ){

keywordCatalog( out, keyword );

}

}

else if( "showproduct".equals( action ) ||

"setcart".equals( action) ){

doShowProduct( req, resp, out, session, action );

}else if( "showcart".equals( action ) ){

doShowCart( req, resp, out, session, action );

}

}

Метод productLineCatalog, как показано в листинге 4.9, формирует таблицу, содержащую только один столбец. После того как внешний вид таблицы HTML определен, переменная line используется для вызова метода setlnitialSelect, который выбирает одну из серий товаров. Затем мы просто совершаем итерации по выбранному списку товаров и используем метод doListOutput для отображения форматированного текста HTML по каждому товару. Затем мы закрываем таблицу. Типичный результат представлен на рис. 4.3.





Листинг 4.9. Метод productLineCatalog (CatalogServ.java)

public void productLineCatalog( PrintWriter out, String line ){

CatalogBean cb = new CatalogBean();

out.println("<h2>" + line + " Catalog</h2>");

out.println("<table width=\"90%\" border=\"3\" align=\"center\" >");

out.println("<thead><tr><th>" + line + "</th>" + "</tr></thead>");

out.println("<tbody><tr valign=\"top\"><td>");

String link = alias + "?action=showproduct" ;

cb.setInitialSelect( line );

int ct = cb.getSelectedCount();

out.println("We have " + ct + " items." + brcrlf );

cb.setOutput("short", link);

for( int i = 0 ; i < ct ; i++ ){

out.println( cb.doListOutput(i) );

out.println( brcrlf );out.println( brcrlf );

}

out.println("</td></tr></table>");

}





Рис. 4.3. Отображение одной серии товаров

В методе keywordCatal og (листинг 4.10) применяется тот же принцип, но выбор происходит на основе переменной keyword, которая передается в качестве параметра методу setKeywordSel ect класса CalatogBean.



Листинг 4.10. Метод keywordCatalog отображает только элементы, содержащие выбранное ключевое слово (CatalogServ.java)

public void keywordCatalog( PrintWriter out, String keyword ){

CatalogBean cb = new CatalogBean();

out.println("<h2>Selected by " + keyword + " Catalog</h2>");

out.println("<table width=\"90%\" border=\"3\" align=\"center\" >");

out.println("<thead><tr><th>" + keyword + " </th>" + "</tr></thead>");

out.println("<tbody><tr valign=\"top\"><td>");

String link = alias + "?action=showproduct" ;

cb.setKeywordSelect( keyword );

int ct = cb.getSelectedCount();

out.println("We have " + ct + " items." + brcrlf );

cb.setOutput("short", link);

for( int i = 0 ; i < ct ; i++ ){

out.println( cb.doListOutput(i) );

out.println( brcrlf );out.println( brcrlf );

}

out.println("</td></tr></table>");

}






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