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

       

JSP-страница Edit


Страница Edit гораздо длиннее и сложнее, чем страница Delete. Она должна генерировать форму, в которой содержатся все данные о товаре в таком виде, который позволяет пользователю редактировать эти данные. В верхней части страницы содержится несколько элементов сценария. Как видно из листинга 6.50, после импорта необходимых пакетов из объекта request извлекаются требуемые параметры. Это те же самые параметры, которые были введены пользователем и затем переданы JSP-странице сервлетом Main.

Эта JSP-страница выполняет команды добавления и редактирования сервле- та Main, поэтому мы должны проверить параметр operation, указывающий, какая из двух операций будет выполняться. Если значение этого параметра равно edit, то мы знаем, что нужно извлечь указанный элемент из каталога. Если значение его не равно edit, очевидно, оно равно add; тогда нужно создать новый элемент каталога и установить его идентификатор равным тому значению, которое введено пользователем.

Листинг 6.50. Начало JSP-страницы Edit (Edit.jsp)

<%@ page import="com.XmlEcomBook.Chap06.*" %> <%@ page import="java.util.*" %> <% String pid = request.getParameter( "productid" ); String operation = request.getParameter( "operation" ); String productLine = request.getParameter( "productline" ); Catalog catalog = (Catalog)session.getValue( "catalog" ); Product product = null; String name = ""; if( operation.equals( "edit" ) ) { product = catalog.getProduct( pid ); name = "Edit"; } else { //it’s an “add” operation product = new Product(); product.setId( pid ); name = "Add"; } %>

Далее начинается фактическое формирование HTML-страницы, как показано в листинге 6.51. Сначала нужно установить заголовок страницы в тегах <head> и <hl>, после чего следует элемент form, содержащий остальную часть страницы. Элемент form вызывает сервлет с именем UpdateProduct, который мы обсудим в следующем разделе. Первые два элемента input этой формы — скрытые поля, содержащие информацию, необходимую для сервлета UpdateProduct. Это введенные пользователем идентификатор товара и серия товаров, к которой он относится. Название товара, серия и идентификатор вставляются в выходные данные JSP-страницы с помощью выражения (элемента сценария), которое начинается с символов <*=.


Листинг 6.51. Начало кода элементов HTML-страницы (Edit.jsp)

<html> <head><title><%= name %></title></head> <body> <h1><%= name %> Product</h1> <form action="/servlet/UpdateProduct"> <input name="productline" type="hidden" value="<%= request.getParameter( "productline" ) %>" /> <input name="id" type="hidden" value="<%= product.getId() %>" />

Далее начинается элемент table, который помогает выровнять строки, входящие в форму, как показано в листинге 6.52. Первый элемент, который вы отображаете, — это идентификатор товара. Он просто выводится в первой строке таблицы table. Название товара отображается в той же строке таблицы, что и его идентификатор, но в виде отдельного текстового поля, состоящего из одной строки, — этот тип для объекта input задается по умолчанию. Служебный метод notNull используется потому, что метод getName может выдать значение null, а мы хотели бы, чтобы в таких случаях отображалась пустая строка, а не строка "null". В следующей строке таблицы отображаются ключевые слова, характеризующие данный товар. Размер этого текстового поля установлен равным 40, потому что предполагается, что вводимая строка может быть несколько длиннее

Листинг 6.52. Отображение названия товара и ключевых слов (Edit.jsp)

<table> <tr> <td>Product ID</td> <td><%= product.getId() %></td> <td>Name</td> <td><input name="name" value="<%= Util.notNull(product.getName()) %>" /></td> </tr> <tr> <td>Keywords</td> <td colspan="3"><input size ="40" name="keywords" value="<%= Util.notNull(product.getKeywords()) %>" /></td> </tr>

Далее, у нас имеется два скриптлета, представленные в листинге 6.53, которые выводят для товара элементы Author и Artist. Первый скриптлет осуществляет цикл по всем элементам Author для данного товара и использует метод outputAuthor для их отображения. Для идентификации каждого автора (элемента Author) счетчик цикла преобразуется в строку путем добавления его значения к пустой строке. Затем формируется пустой элемент Author с идентификатором New (новый). Это позволяет пользователю дополнить список авторов, введя новый элемент Author. Второй скриптлет выполняет такие же действия для элементов Arti st. Код методов outputAuthors и outputArti sts мы рассмотрим ниже в этом разделе.





Листинг 6.53. Отображение элементов Author и Artist (Edit.jsp)

<% Enumeration authors = product.getAuthors(); for( int i = 0; authors.hasMoreElements(); i++ ) { out.print( outputAuthor( "" + i, (String)authors.nextElement() ) ); } out.print( outputAuthor( "New", "" ) ); %> <% Enumeration artists = product.getArtists(); for( int i = 0; artists.hasMoreElements(); i++ ) { out.print( outputArtist( "" + i, (String)artists.nextElement() ) ); } out.print( outputArtist( "New", "" ) ); %>

Следующая часть JSP- страницы выводит значения цены, количество экземпляров данного товара в магазине и дату начала продаж, а также описание товара, как показано в листинге 6.54. Каждому из этих элементов отводится своя строка в таблице, причем каждая строка содержит два элемента данных — идентификатор данного поля ввода и само поле ввода. Поскольку описание может содержать большой текстовый фрагмент, для него используется элемент textarea (текстовое поле с несколькими строками) вместо одиночной строки элемента input.

Листинг 6.54. Отображение цены, количества экземпляров, даты начала продаж и описания товара (Edit.jsp)

<tr><td>Price</td> <td><input name="price" value="<%= product.getPrice() %>" /> </td> <td>Discount</td> <td><input name="discount" value="<%= Util.notNull(product.getDiscount()) %>" /></td> </tr> <tr><td>Quantity in Stock</td> <td><input name="quantity" value="<%= product.getQuantityInStock() %>" /></td> </tr> <tr><td>On Sale Date</td> <td colspan="3"><input name='onSaleDate' value='<%= product.getOnSaleDate() %>' /> (mm-dd-yyyy hh:mm:ss)</td> </tr> <tr><td>Description</td> <td colspan="3"> <textarea rows="5" cols="40" name="description"><%= Util.notNull(product.getDescription()) %> </textarea> </td> </tr> </table>



Для отображения элементов Image и Clip, относящихся к данному товару, за- действуется новая таблица, задаваемая в листинге 6.55. Скриптлеты в данном случае аналогичны тем, которые использовались для отображения элементов Author и Artist. После отображения таблицы в нижней части страницы появляется кнопка Submit (Принять), на которой после завершения редактирования пользователь может щелкнуть для отправки содержимого формы на сервер.

Листинг 6.55. Отображение элементов Image, Clip и кнопки Submit (Edit.jsp)

<tr><td>Price</td> <td><input name="price" value="<%= product.getPrice() %>" /> </td> <td>Discount</td> <td><input name="discount" value="<%= Util.notNull(product.getDiscount()) %>" /></td> </tr> <tr><td>Quantity in Stock</td> <td><input name="quantity" value="<%= product.getQuantityInStock() %>" /></td> </tr> <tr><td>On Sale Date</td> <td colspan="3"><input name='onSaleDate' value='<%= product.getOnSaleDate() %>' /> (mm-dd-yyyy hh:mm:ss)</td> </tr> <tr><td>Description</td> <td colspan="3"> <textarea rows="5" cols="40" name="description"><%= Util.notNull(product.getDescription()) %> </textarea> </td> </tr> </table>

В нижней части этой JSP-страницы определено несколько вспомогательных методов. Первый из них называется output Image. Он призван отобразить элемент формы для объекта Image в нужных местах, которых может быть несколько. Этот метод не входит ни в один стандартный класс Java, вызываемый из JSP-страницы, так как он сильно связан с логикой представления. Полезно иметь отдельный класс для определения методов, которые выполняют в JSP-странице какие- либо задачи, не связанные с логикой представления; но в данном случае метод предназначен для получения кода HTML. Если вы поместите этот метод в отдельный класс, получится, что одна и та же страница обрабатывается в двух местах, в результате усложнится обслуживание кода. Лучше весь код, отвечающий за представление страницы, держать в одном месте.



Методу outputlmage, приведенному в листинге 6.56, передаются два параметра: строка, служащая идентификатором изображения, и сам объект Image. Имя поля input будет составлено из строки image (изображение) и переданного идентификатора. Таким образом вы получаете уникальное название для каждого изображения. Это название используется как для отображения на странице для пользователя, так и в качестве значения атрибута name объекта input. Каждый из атрибутов и элементов объекта Image отображается в отдельном текстовом поле, которое пользователь может заполнять.

Листинг 6.56. Вывод объекта Image (Edit.jsp)

<%! private String outputImage(String i, Image image) { String s; s = "<tr><td>" + i + ")</td>"; s += "<td>Format</td>"; s += "<td><input name='img" + i + "-format' value='" + Util.notNull(image.getFormat()) + "' /></td>" ; s += "<td></td><td>Source File</td>"; s += "<td><input name='img" + i + "-src' value='" + Util.notNull(image.getSrc()) + "' /></td>" ; s += "</tr>"; s += "<tr>"; s += "<td></td><td>Height</td>"; s += "<td><input name='img" + i + "-height' value='" + Util.notNull(image.getHeight()) + "' /></td>"; s += "<td></td><td>Width</td>"; s += "<td><input name='img" + i + "-width' value='" + Util.notNull(image.getWidth()) + "' /></td>"; s += "</tr>"; s += "<tr>"; s += "<td></td><td>Caption</td>"; s += "<td colspan='4'><textarea rows='5' cols='40' name='img" + i + "-caption'>" + Util.notNull(image.getCaption()) + " </textarea></td>"; s += "</tr>\n"; return s; } %>



Вывод объектов Author, Artist и Clip очень похож на вывод объектов Image. Каждый из элементов и атрибутов отображается в отдельной строке таблицы. Строка, которая идентифицирует конкретный объект, также используется двояким образом: для отображения в поле ввода и как значение атрибута name объекта input. Этот метод для объекта Clip показан в листинге 6.57.

Листинг 6.57. Отображение объекта Clip (Edit.jsp)

<%! private String outputClip( String i, Clip clip ) { String s; s = "<tr><td>" + i + ")</td>"; s += "<td>Format</td>"; s += "<td><input name='clip" + i + "-format' value='" + Util.notNull(clip.getFormat()) + "' /></td>" ; s += "<td></td><td>Source File</td>"; s += "<td><input name='clip" + i + "-src' value='" + Util.notNull(clip.getSrc()) + "' /></td>" ; s += "</tr>"; s += "<tr>"; s += "<td></td><td>Title</td>"; s += "<td colspan='3'><input name='clip" + i + "-title' value='" + Util.notNull(clip.getTitle()) + "' /></td>"; s += "</tr>"; s += "<tr>"; s += "<td></td><td>Length</td>"; s += "<td><input name='clip" + i + "-length' value='" + Util.notNull(clip.getLength()) + "' /></td>" ; s += "<td></td><td>Size</td>"; s += "<td><input name='clip" + i + "-size' value='" + Util.notNull(clip.getSize()) + "' /></td>"; s += "</tr>"; s += "<tr>"; s += "<td></td><td>Description</td>"; s += "<td colspan='4'><textarea rows='5' cols='40' name='clip" + i + "-description'>" + Util.notNull(clip.getDescription()) + "</textarea></td>" ; s += "</tr>"; return s; }

private String outputAuthor( String i, String author ) { String s = "<tr><td>Author</td>"; s += "<td><input name='author" + i + "' value='" + author + "' /> </td></tr>"; return s; }

private String outputArtist( String i, String artist ) { String s = "<tr><td>Artist</td>"; s += "<td><input name='artist" + i + "' value='" + artist + "' /> </td></tr>"; return s; } %>

 


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