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

       

Сервлет UpdateProduct


Сервлет UpdateProduct вызывается из JSP-страницы Edit, когда пользователь заканчивает ввод в форму информации о товаре. Задача этого сервлета заключается в том, чтобы собрать данные из параметров запроса (объекта request) и обновить объект связывания данных Product. После некоторой стандартной инициализации в методе doGet из текущего объекта HttpServletRequest извлекается объект Session. Затем из него вы получаете объект Catalog, с которым и работаете в данном сеансе. Из каталога вы получаете объект Product, снабженный правильным идентификатором. Все это иллюстрирует листинг 6.58.

Листинг 6.58. Начало кода сервлета UpdateProduct (UpdateProduct.java)

import java.io.*; import javax.servlet.*; import javax.servlet.http.*;

import com.XmlEcomBook.Chap06.*;

public class UpdateProduct extends HttpServlet {

public void doGet(HttpServletRequest req, HttpServletResponse res) throws IOException, ServletException { res.setContentType("text/html"); PrintWriter out = res.getWriter();

HttpSession session = req.getSession(); Catalog catalog = (Catalog)session.getAttribute( "catalog" ); String id = req.getParameter( "id" ); Product product = catalog.getProduct( id );

Далее, как показано в листинге 6.59, проверяется, не является ли элемент product пустым, то есть не равен ли он null. Если это так, то мы делаем вывод, что была выполнена операция Add Product, поэтому требуется добавить новый товар в каталог, то есть создать новый объект Product с правильным значением идентификатора и добавить его к соответствующей серии товаров. Затем из запроса считываются такие параметры, как имя и ключевые слова, и в объект Product вносятся обновленные значения этих параметров.

Листинг 6.59. Создание нового объекта product, обновление ключевых слов и имени (UpdateProduct.java)

if( product == null ) { //new product product = new Product(); product.setId( id ); String productLineString = req.getParameter( "productline" ); ProductLine productLine = catalog.getProductLine( productLineString ); productLine.addProduct( product ); } String keywords = req.getParameter( "keywords" ); product.setKeywords( keywords ); String name = req.getParameter( "name" ); product.setName( name );


Далее внесенные в форму объекты Author добавляются в Product. Прежде чем вы впишете новых авторов, необходимо удалить все существующие на данный момент записи об авторах. Для этого используется метод removeAHAuthors. После этого все готово для добавления новых авторов. Для этого используется метод getAuthor, определенный ниже в этом разделе. Метод getAuthor возвращает булеву величину true, если им был обнаружен автор с указанным идентификатором, и false, если не было найдено ни одного автора с таким идентификатором. Также вам нужно проверить, не был ли добавлен какой-либо новый автор; для этого используется идентификатор New. Далее весь процесс повторяется для объектов Artist, как показано в листинге 6.60.

Листинг 6.60. Добавление Author и Artist (UpdateProduct.java)



product.removeAllAuthors(); for( int i = 0; getAuthor( "" + i, req, product ); i++ ) ;//do nothing getAuthor( "New", req, product );

product.removeAllArtists(); for( int i = 0; getArtist( "New", req, product ); i++ ) ;//do nothing getArtist( "New", req, product );

Для обновления остальных характеристик товара используется код, во многом похожий на уже рассмотренный. Он приведен в листинге 6.61. С помощью метода getParameter данные извлекаются из объекта request, а затем используется соответствующий метод set объекта Product. Для двух полей, clip и image, задействован тот же процесс, который мы рассматривали для полей artists и authors. Наконец, создается и отображается для пользователя HTML-страница, которая сообщает, что обновление данных прошло успешно, и на которой имеется ссылка на главную страницу.

Листинг 6.61. Добавление остальных характеристик товара (UpdateProduct.java)

String price = req.getParameter( "price" ); price = price.replace( '$', ' ' ); product.setPrice( Util.getDouble( price ) ); String quantity = req.getParameter( "quantity" ); product.setQuantityInStock( Util.getInt( quantity ) ); String dateString = req.getParameter( "onSaleDate" ); Date date = product.getOnSaleDate(); if( date == null ) { date = new Date(); product.setOnSaleDate( date ); } date.fromString( dateString ); String description = req.getParameter( "description" ); product.setDescription( description );



product.removeAllImages(); for( int i = 1; getImage( "" + i, req, product ); i++ ) ;//do nothing getImage( "New", req, product );

product.removeAllClips(); for( int i = 1; getClip( new String( "" + i ), req, product ); i++ ) ;//do nothing getClip( "New", req, product ); // Return HTML. out.println( "<html><head><title>Update Successful</title> </head>" ); out.println( "<body><h2>Update Succesful</h2>" ); out.println( "<a href='/main.html'>Return to main page</a> </body></html>" ); }

Метод getAuthor, показанный в листинге 6.62, вызывается из метода doPost cep- влета, чтобы извлекать информацию из запроса и добавлять ее в Product. В JSP- странице Edit мы идентифицировали каждый элемент Author с помощью значения счетчика, которое добавлялось к строке author, а теперь мы ищем ту же строку для извлечения информации. Если строка не найдена или значение элемента Author пропущено, возвращается f al se. Если же значение обнаружено, то оно добавляется в Product как имя автора и метод возвращает булеву величину true.

Листинг 6.62. Метод getAuthor (UpdateProduct.java)

boolean getAuthor( String i, HttpServletRequest req, Product product ) { String author = req.getParameter( "author" + i ); if( author == null || author.equals( "" ) ) { return false; } product.addAuthor( author ); return true; }

Методы getArtist, getlmage и getClip, показанные в листинге 6.63, используют ту же технику, что и в методе getAuthor. Метод getArtist почти идентичен getAuthor, а методы getlmage и getClip несколько длиннее, так как для объектов Image и Clip требуется извлечь большее количество параметров запроса и установить их в качестве значений полей объекта Product.

Листинг 6.63. Методы getArtist, getlmage и getClip (UpdateProduct.java)

boolean getArtist( String i, HttpServletRequest req, Product product ) { String artist = req.getParameter( "artist" + i ); if( artist == null || artist.equals( "" ) ) { return false; } product.addArtist( artist ); return true; }



boolean getImage( String i, HttpServletRequest req, Product product ) { String format = req.getParameter( "img" + i + "-format" ); if( format == null || format.equals("") ) { return false; } Image img = new Image(); img.setFormat( format ); String src = req.getParameter( "img" + i + "-src" ); img.setSrc( src ); String height = req.getParameter( "img" + i + "-height" ); img.setHeight( Util.getInteger( height ) ); String width = req.getParameter( "img" + i + "-width" ); img.setWidth( Util.getInteger( width ) ); String caption = req.getParameter( "img" + i + "-caption" ); img.setCaption( caption ); product.addImage( img ); return true; }

boolean getClip( String i, HttpServletRequest req, Product product ) { String format = req.getParameter( "clip" + i + "-format" ); if( format == null || format.equals("") ) { return false; } Clip clip = new Clip(); clip.setFormat( format ); String src = req.getParameter( "clip" + i + "-src" ); clip.setSrc( src ); String title = req.getParameter( "clip" + i + "-title" ); clip.setTitle( title ); String length = req.getParameter( "clip" + i + "-length" ); clip.setLength( length ); String size = req.getParameter( "clip" + i + "-size" ); clip.setSize( size ); String description = req.getParameter ( "clip" + i + "-description" ); clip.setDescription( description ); product.addClip( clip ); return true; } }

JSP-страницы и сервлеты, представленные в этой главе, показывают, как можно использовать приложение, работающее через браузер, для добавления, редактирования и удаления элементов каталога, размещенного на сервере. Таким образом, возможности WWW расширяются от простого представления статических данных до полноценной системы обработки информации.

Представленное в этой главе решение лишено некоторых свойств, которые потребовались бы для настоящего крупномасштабного сайта. Следовало бы улучшить обработку ошибок, которая не слишком хорошо организована. У нас отсутствует синхронизация доступа к файлам XML, так что если два человека одновременно возьмутся редактировать один и тот же файл, то изменения, внесенные одним из них, будут потеряны. Но, несмотря на эти недостатки, данное приложение справилось бы с задачей редактирования XML-каталога товаров небольшого сайта.


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