Сервлет SubmitOrder
Когда подтвержденные клиентом данные (то есть JSP-страница Confirmlnfo) отправлены, необходимо послать поставщику услуг по обработке сведения, связанные с оплатой заказа. Это делается с помощью сервлета SubmitOrder. Здесь мы используем не JSP-страницу, а сервлет, поскольку данная процедура, с одной стороны, требует довольно много кода, а с другой стороны, генерирует сравнительно немного выходных данных. Дело в том, что, как правило, создавать и отлаживать сервлеты проще, чем JSP-страницы, но отрицательной стороной сер- влетов является сложность генерируемого кода HTML.
Главная точка входа в сервлет — метод doGet, который получает объект Session, соответствующий текущему сеансу (листинг 5.24). Затем мы получаем объект Order, сформированный для этого сеанса предыдущими JSP-страницами. Далее для получения подтверждения данных кредитной карты используется класс TestPaymentAuthorizer. Если подтверждение получено, клиенту посылается соответствующее сообщение с помощью класса Emailег, вызывается метод, который записывает заказ в специальный файл, и вызывается JSP-страница Approved.jsp, создающая сообщение с информацией о подтверждении заказа и указанием идентификатора заказа. Если подтверждение не было получено, вызывается JSP-страница Declined .jsp и создается другое сообщение.
Листинг 5.24. Метод doGet сервлета SubmitOrder (SubmitOrder.java)
import java.io.*;
import java.util.*;
import javax.servlet.*;
import javax.servlet.http.*;
import com.XmlEcomBook.Chap05.*;
// Explain why we used a servlet: easier to code, debug
public class SubmitOrder extends HttpServlet {
public void doGet(HttpServletRequest req,
HttpServletResponse res)
throws IOException, ServletException {
res.setContentType("text/html");
PrintWriter out = res.getWriter();
try {
HttpSession session = req.getSession();
Order order = (Order)session.getAttribute( "order" );
Authorization auth = TestPaymentAuthorizer.getAuthorization(order );
order.setAuthorization( auth );
if( auth.isApproved() ) {
//Emailer.sendConfirmation( order );
writeOrder( order );
getServletContext()
.getRequestDispatcher("/Approved.jsp").forward(req, res);
}
else {
getServletContext()
.getRequestDispatcher("/Declined.jsp").forward(req, res);
}
}
catch( Exception e )
{
e.printStackTrace(out); } }
Метод writeOrder используется для записи информации о заказе в файл XML. Этот метод помещает все файлы с заказами, поступившими в течение одного дня, в отдельную папку. Поэтому для определения даты (год, месяц и число месяца) создается специальный объект, GregorianCalendar. В имени папки указывается соответствующая дата, а название файла содержит идентификатор заказа. Метод mkdir класса File вызывается для проверки наличия данной папки, а затем с помощью метода writeXML объекта Order информация о заказе заносится в файл, как показано в листинге 5.25.
Листинг 5.25. Метод writeOrder (SubmitOrder.java)
private void writeOrder( Order order ) {
try
{
Calendar calendar = new GregorianCalendar();
int day = calendar.get( Calendar.DAY_OF_MONTH );
int month = calendar.get( Calendar.MONTH ) + 1;
int year = calendar.get( Calendar.YEAR );
String dir = "Orders_" + year + "-" + month + "-" + day;
String filename = "Order_" + order.getId() + ".xml";
File file = new File( dir );
file.mkdir();
FileWriter writer = new FileWriter( dir + File.separator + filename );
order.writeXML(writer);
writer.close();
}
catch( IOException e ) {
}
}
}