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

       

JSP-страница UpdateFullfilment


Последняя JSP-страница, которую мы исследуем в этой главе, отвечает за обновление значений номера отслеживания и даты отправления, введенных на странице ShowOrder. На этой JSP-странице мы применим другой способ обработки файла XML. Перед нами стоит довольно-таки простая задача: нужно обновить значения двух переменных в файле XML. Вместо того чтобы использовать DOM и проводить анализ документа, а затем снова записывать его в виде файла XML, мы применим более простой метод текстовой обработки. Элементам, которые нам нужны, — tracki ng_number и date_sent — при создании файла XML были присвоены специальные значения, NO_TRACKING_NUMBER и NO_DATE_SENT. Обновление файла XML в данном случае сводится к элементарному контекстному поиску этих строк и замене их на новые значения.

Сначала JSP-страница получает пересланные ей параметры, включая скрытые поля формы. Для считывания файла XML создается объект BufferReader, a объект FileWriter используется для вывода обновленного файла XML. Каждая прочитанная строка XML передается методу replace для выполнения необходимых замен. Этот метод replace аналогичен методу replace класса String, единственное отличие заключается в том, что он оперирует не символами (то есть объектами типа char), а строками.

Описанная техника обработки текста в простых случаях пригодна для обработки документов XML. Ее использование позволяет избежать дополнительных сложностей и расходов, связанных с анализом документа XML. Но эта техника не всегда хорошо работает, если требуется произвести какие-либо сложные замены. Работая с документом XML как с простым текстовым документом, вы создаете слишком чувствительный к внешним условиям код, который не будет работать при любых изменениях DTD или формата XML. Использование анализатора кода является наилучшим решением, если требуется достаточно серьезная обработка документа XML.

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




Листинг 5.32. JSP-страница UpdateFullfilment (UpdateFullfilment.jsp)

<%@ page import="java.io.*,com.XmlEcomBook.Chap05.*" %>

<html>

<head><title>Update Complete</title></head>

<body>

<% String tracking = request.getParameter( "tracking" );

String dateSent = request.getParameter( "date_sent" );



String dir = request.getParameter( "dir" );

String filename = request.getParameter( "file" );

String email = request.getParameter( "email" );

String id = request.getParameter( "id" );

String auth_code = request.getParameter( "auth_code" );

String priceString = request.getParameter( "price" );

double price = Double.parseDouble( priceString );

File inFile = new File( dir, filename );

File outFile = new File( dir, filename + ".tmp" );

BufferedReader reader = new BufferedReader ( new FileReader( inFile ) );

FileWriter writer = new FileWriter( outFile );

String line;

while( (line = reader.readLine()) != null ) {

String newLine = replace( line, "NOT_SENT_YET", dateSent );

newLine = replace( newLine, "NO_TRACKING_NUMBER", tracking );

writer.write( newLine + "\n" );

}

reader.close();

writer.close();

inFile.renameTo( new File( dir, filename + ".old" ) );

outFile.renameTo( inFile );

Emailer.sendShipped( email, id );

TestPaymentAuthorizer.capture( auth_code, price );

%>

<p> The fulfillment was updated with the new information.</p>

<a href="OrderDateSelector.jsp">Back to date selection</a>

</body>

</html>

<%!

String replace( String s, String oldString, String newString ) {

int pos = s.indexOf( oldString );

String newLine = s;

if( pos != -1 ) {

newLine = s.substring( 0, pos );

newLine += newString;

newLine += s.substring( pos + oldString.length() );

}

return newLine;

}

%>

Листинги программ, приведенные в этой главе, показывают, как можно реализовать необходимые для работы магазина функции по обработке заказов и составлению счетов. Чтобы использовать эти программы в реальном магазине, необходима некоторая доработка. Наибольшие изменения будут касаться требований безопасности. JSP-страницы, которые задействуются в процессе ввода информации клиентом, должны использовать не простой протокол HTTP, a HTTPS. Далее, в нашем примере информация о клиентах хранилась в незашифрованном файле в той же системе файлов, в которой работает web-сервер магазина. В идеале вся персональная информация о клиентах должна храниться в зашифрованном, безопасном источнике данных на изолированном сервере, к которому нет доступа из Интернета.

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


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