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-сервер магазина. В идеале вся персональная информация о клиентах должна храниться в зашифрованном, безопасном источнике данных на изолированном сервере, к которому нет доступа из Интернета.
С другой стороны, необходимо заменить класс, отвечающий за проверку номеров кредитных карт, на класс, который будет взаимодействовать с реальным поставщиком услуг по обработке. Но в процессе тестирования системы, на том этапе, когда еще не нужно взаимодействие с реальным поставщиком, можно воспользоваться приведенным здесь классом.