Опубликован: 18.03.2010 | Доступ: свободный | Студентов: 840 / 85 | Оценка: 4.48 / 4.33 | Длительность: 12:01:00
Лекция 3:

Технология Enterprise Java Beans. Часть 1

Теперь рассмотрим страницу, в которой отображается содержимое корзины. На ней при помощи компонентов ShoppingBasketBean и CommoditiesListBean генерируется список из текущих товаров в корзине. Также снизу отображается суммарная стоимость товаров в заказе. Пользователь также может пересчитать количество каждого товара в корзине. Либо удалить его совсем из корзины, введя "0" в соответствующее текстовое поле. Суммарная стоимость считается прямо на странице (что не очень хорошо, это будет сделано далее непосредственно в компоненте).

<%@ page language="java" contentType="text/html;   charset=cp1251"
pageEncoding="cp1251"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" 
	"http://www.w3.org/TR/html4/loose.dtd">
<%@page import="shoppingBasket.ShoppingBasketRemote"%>
<%@page import="java.util.List"%> 
<%@page import="java.util.Iterator"%> 
<%@page import="dataObjects.CommodityOrder"%>
<%@page import="shoppingBasket.CommoditiesListRemote"%>
<%@page import="dataObjects.Commodity"%> 
<%@page import="java.text.NumberFormat"%> 
<%@page import="java.util.Locale"%>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html;   charset=ISO-8859-1">
<title>Shopping Basket</title>
</head>

<body>
<h1>Welcome to the finest internet cigarettes store!</h1> 
<h2>This is the current state of the shopping basket</h2>
<a href="goodlist.jsp">Goto commodities list</a><br> 
<a href="prevorders.jsp">View previous orders</a><br>
<table border="0" cellpadding="0" cellspacing="0">

<%
ShoppingBasketRemote remote = 
	(ShoppingBasketRemote) session.getAttribute("basketbean");
List commodities = remote.getCurrentCommoditiesList();
CommoditiesListRemote commRemote = 
	(CommoditiesListRemote) session.getAttribute("commoditiesbean");
NumberFormat format = NumberFormat.getCurrencyInstance(Locale.US);
double price = 0;
if (commodities.size() != 0)
{
for   (Iterator iter = commodities.iterator();  iter.hasNext();) 
{ // Getting the commodity order
CommodityOrder order = (CommodityOrder) iter.next();
Commodity commodity = commRemote.getCommodityById(order.getCommodityId());
// Подсчет суммарной стоимости заказа
price += commodity.getPrice() * order.getCommodityQuantity();
%><tr>
<!-Форма для запроса к сервлету, осуществляющему
пересчет товаров в корзине--> 
<form action="recalculate" method="post">
<input type="hidden" name="good id" 
	value="<%=order.getCommodityId()%>">
</input> <td style="padding-left:10px; padding-right:10px;">
<%=commodity.getName()%></td> 
<td style="padding-left:10px; padding-right:10px;">
<%=format.format(commodity.getPrice())%></td>


<td style="padding-left:10px;  padding-right:10px;">
Amount:  <input type="text" name="amount" value="
<%=order.getCommodityQuantity()%>"></input>
</td>

<td><input type="SUBMIT" 
	value="Recalculate"></input></td>

</form>
</tr>

<%
}

%>
<tr><td>The total price is <%=format.format(price)%>
</td></tr>

<%

}  else  {

%>

<!-Товаров в корзине нет ->
<tr><td><h3>No commodities in basket!</h3>
</td></tr>
<%
}

%>
</table>
<a href="makeorder">Make order</a><br> 
<a href="logout">Logout</a><br> 
</body> 
</html>
Корзина с товарами

увеличить изображение
Рис. 3.43. Корзина с товарами

Страница с корзиной изображена на Рис. 3.43.

RecalculateServlet вызывает метод recalculateCommodity(id, amount) с ID товара и новым количеством этого товара, после чего переходит обратно на страницу с корзиной. Опять таки, факт наличия товара с соответствующим ID нигде не проверяется.

public class RecalculateServlet extends HttpServlet  
{
private static final long serialVersionUID = 4151274707994513136L;
public RecalculateServlet()   
	{
	super();
	}

public void doPost(HttpServletRequest req,  HttpServletResponse res)   
	{ 
	HttpSession session = req.getSession(); 
	ShoppingBasketRemote remote = 
		(ShoppingBasketRemote) session.getAttribute("basketbean");
	
	String strGoodId = req.getParameter("good id"); 
	String strAmount = req.getParameter("amount");
	
	int goodId = 0; 
	int amount = -1;
	
	try 
		{
		goodId = Integer.parseInt(strGoodId); 
		amount = Integer.parseInt(strAmount); 
		}   
	catch   (NumberFormatException e)   
		{ 
		goodId = 0; 
		amount = -1;
		}
	
	if   (goodId > 0 && remote   != null && amount >= 0)   
		{
		try 
		{
		remote.recalculateCommodity(goodId,   amount); 
		}   
		catch   (RemoteException e)   
		{ 
		e.printStackTrace();
		}
		}

	RequestDispatcher reqDispatcher = getServletContext().getRequestDispatcher("/basket.jsp");
	try 
		{
		reqDispatcher.forward(req,   res); 
		}   
	catch   (java.io.IOException e)   
		{
		e.printStackTrace(); 
		}   
	catch   (javax.servlet.ServletException e)   
		{
		e.printStackTrace();
		}
	}
}

MakeOrderServlet получаем удаленный интерфейс компонента ShoppingBasketBean и вызывает у него метод void processOrder(). После чего переходит на страницу с, где пользователя благодарят за покупки.

public class MakeOrderServlet extends HttpServlet  
{
private static final long serialVersionUID = -171986817882942920L;
public MakeOrderServlet()   
	{ 
	super();
	}

public void doGet(HttpServletRequest req,  HttpServletResponse res)   
	{ 
	HttpSession session = req.getSession(); 
	ShoppingBasketRemote remote =   (ShoppingBasketRemote) session.getAttribute("basketbean");
	if   (remote   != null)   
		{
		try 
		{
		remote.processOrder(); 
		}   
		catch   (RemoteException e)   
		{ e.printStackTrace();
		}   
		catch   (SQLException e)   
		{ 
		e.printStackTrace();
		}
		}
	RequestDispatcher reqDispatcher =
	getServletContext().getRequestDispatcher("/thankyou.jsp");
	try 
		{
		reqDispatcher.forward(req,   res); 
		}   
	catch   (java.io.IOException e)   
		{
		e.printStackTrace(); 
		}   
	catch   (javax.servlet.ServletException e)   
		{
		e.printStackTrace();
		}
	}

public void doPost(HttpServletRequest req,  HttpServletResponse res)   
	{ 
	doGet(req,   res);
	}
}

На странице благодарности за покупки расположении три ссылки:

  • к странице с товарами, для продолжения покупок;
  • к странице со списков всех заказов;
  • к выходу из магазина.
<%@ page language="java" contentType="text/html;   
	charset=cp1251" pageEncoding="cp1251"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" 
	"http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html;   charset=cp1251">
<title>Cigarette store</title>
</head>
<body>
<h1>Thank you for making purchases in our store!</h1> 
<h2>From here you can:  </h2>
<ul>
<!- Продолжить делать покупки -->
<li>Continue shopping: <a href="goodlist.jsp">Goto shopping</a></li> 
<!- Просмотреть заказы -->
<li>View your orders:  <a href="prevorders.jsp">View orders</a></li>


<!- Выход из магазина -->

<li>Logout: <a href="logout">Logout</a></li>
</ul>
</body>
</html>
Спасибо за покупку

увеличить изображение
Рис. 3.44. Спасибо за покупку

Страница с благодарностью за покупку изображена на Рис. 3.44."/>

Сервлет выхода их магазина убирает из контекста сессии все атрибуты (компоненты EJB и имя пользователя).

public class LogoutServlet extends HttpServlet  
{
private static final long serialVersionUID = 4562488849398632419L;
public LogoutServlet()   
	{ 
	super();
	}

protected void doGet(HttpServletRequest req,  HttpServletResponse res)   
	{ 
	doPost(req,   res);
	}

protected void doPost(HttpServletRequest req,  HttpServletResponse res)   
	{ 
	HttpSession session = req.getSession(); 
	session.removeAttribute("username"); 
	session.removeAttribute("basketbean"); 
	session.removeAttribute("commoditiesbean"); 
	session.removeAttribute("ordersbean"); 
	RequestDispatcher reqDispatcher = 
		getServletContext().getRequestDispatcher("/index.jsp");
	
	try 
		{
		reqDispatcher.forward(req,   res);
		}   
	catch   (java.io.IOException e)   
		{
		e.printStackTrace(); 
		}   
	catch   (javax.servlet.ServletException e)   
		{
		e.printStackTrace();
		}
	}
}

На странице со всеми заказами, сделанными пользователем, используются две компоненты CommoditiesListBean и OrdersListBean.Посредством метода List getOrdersForUser (String username) компонента OrdersListBean сначала создается список из всех заказов пользователя, после этого для каждого заказа посредством метода List getCommodityOrdersForOrder(int orderId) создается список из объектов CommodityOrder. Далее для каждого объекта CommodityOrder вызывается метод Commodity getCommodityById (int commodityId), и формируется описание товара в заказе. Стоимость заказа формируется способом, аналогичным способу на странице с корзиной.

<%@ page language="java" contentType="text/html;   charset=cp1251"
pageEncoding="cp1251"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" 
	"http://www.w3.org/TR/html4/loose.dtd">
<%@page import="java.util.List"%>
<%@page import="java.util.Iterator"%>
<%@page import="shoppingBasket.OrdersListRemote"%>
<%@page import="dataObjects.Order"%>
<%@page import="dataObjects.CommodityOrder"%>
<%@page import="shoppingBasket.CommoditiesListRemote"%> 
<%@page import="dataObjects.Commodity"%> 
<%@page import="java.text.NumberFormat"%> 
<%@page import="java.util.Locale"%>
<tml> <head>
<meta http-equiv="Content-Type" content="text/html;   
charset=ISO-8859-1">
<title>Previous Orders</title>
</head>
<body>
<h1>Welcome to the finest internet cigarettes store!</h1> 
<h2>These are your orders</h2>
<a href="goodlist.jsp">Goto commodities list</a><br> 
<a href="basket.jsp">Goto Basket</a><br>
<table border="0" cellpadding="0" cellspacing="0">
<%
OrdersListRemote remote = (OrdersListRemote) session.getAttribute("ordersbean"); 
String username = (String) session.getAttribute("username");
CommoditiesListRemote commRemote = 
	(CommoditiesListRemote) session.getAttribute("commoditiesbean");
NumberFormat format = NumberFormat.getCurrencyInstance(Locale.US); 
// Получаем список заказов для пользователя 
List orders = remote.getOrdersForUser(username);
if   (orders.size() != 0)   
{
for   (Iterator iter = orders.iterator();  iter.hasNext();   )   
{ 
// Getting the commodity order 
Order order = (Order)   iter.next();
// Для каждого заказа получаем список товаров в нем 
List commodityOrders = remote.getCommodityOrdersForOrder(order.getId()); 
double price = 0;
%><tr>
<td>Order done on:  <%=order.getDate()%></td>
</tr>
<tr>
<td style="padding-left:   20px;">
<ul>
<%for   (Iterator iter2 = commodityOrders.iterator();  
iter2.hasNext();)   
{ CommodityOrder cOrder = (CommodityOrder) iter2.next(); 
// Получаем сам товар с описанием 
Commodity commodity = commRemote.getCommodityById(cOrder.getCommodityId()); 
price += commodity.getPrice() * cOrder.getCommodityQuantity();
%>//Выводим информацию о товаре

<li>Commodity:  <%=commodity.getName()%>, Price: 
<%=format.format(commodity.getPrice())   %>,  Quantity: 
<%=cOrder.getCommodityQuantity()%> </li>

<%
}
%>
</ul> </td>
</tr> <tr>
<td style="padding-left:   10px;">Total price is: 
	<%=format.format(price)%>
</td>
</tr> <tr>
<td style="padding-top:   20px;"></td>
</tr>

<%
}
}  else  {
%>
<tr>
<td>
<h3>No orders!</h3>
</td>
</tr>
<%

}
%>
</table>
<a href="logout">Logout</a>
</body>
</html>
Страница с заказами

увеличить изображение
Рис. 3.45. Страница с заказами

Страница с заказами изображена на Рис. 3.45.

Фильтр в данном веб-приложении один - он осуществляет контроль над несанкционированным доступом к персональным страницам. Проще говоря, если пользователь не ввел свое имя, то этот фильтр на даст ему возможности открыть страницу basket.jsp, prevorder.jsp, thankyou.jsp, goodlist.jsp а также все сервлеты, кроме сервлета входа в магазин LoginServlet. Делает он это просто проверяя наличие атрибута с именем пользователя в контексте сессии.

public class AuthFilter implements Filter  
{
private FilterConfig fc;
public void init(FilterConfig filterConfig)   throws ServletException  
	{
	fc = filterConfig;
	}
public void destroy()   
	{
	}

public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
throws IOException,   ServletException  
	{ 
	HttpServletRequest req =   (HttpServletRequest)   request; 
	HttpServletResponse res =   (HttpServletResponse)   response;
	
	if (req.getSession().getAttribute("username") == null)   
		{
		// Имя пользователя не обнаружено 
		RequestDispatcher reqDispatcher = fc.getServletContext().
		getRequestDispatcher("/index.jsp");
		try 
		{
		reqDispatcher.forward(req,   res);
		}   
		catch   (java.io.IOException e)   
		{
		e.printStackTrace(); 
		}   
		catch   (javax.servlet.ServletException e)   
		{ 
		e.printStackTrace();
		}
		}  
	else  
		{
		// Все в порядке,   страница или сервлет доступен 
		chain.doFilter(req,   res);
		}
	}
}

Файл конфигурации web.xml описывает все сервлеты и фильтры, используемые в веб-приложении, а также прописывает URL -адреса привязки сервлетов и фильтров. Помимо этого задаются названия файлов, открываемых по умолчанию ( index.html, index.jsp и т.д.).

<?xml version="1.0" encoding="UTF-8"?>
<web-app id="WebApp ID" version="2.4" 
xmlns="http://java.sun.com/xml/ns/j2ee" 
xmlns:xsi="http://www.w3.org/2 0 01/XMLSchema-instance" 
xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app 2 4.xsd">
<display-name>
ShoppingBasketWebClient </display-name>
<!- Список имен файлов,   открывающихся по умолчанию --> <welcome-file-list>
<welcome-file>index.html</welcome-file>
<welcome-file>index.htm</welcome-file>
<welcome-file>index.jsp</welcome-file>
<welcome-file>default.html</welcome-file>
<welcome-file>default.htm</welcome-file>
<welcome-file>default.jsp</welcome-file> 
</welcome-file-list>
<servlet>
<description>The servlet used to login</description>
<display-name>LoginServlet</display-name>
<servlet-name>LoginServlet</servlet-name>
<servlet-class>webclient.servlets.LoginServlet</servlet-class> 
</servlet>
<servlet-mapping>
<servlet-name>LoginServlet</servlet-name> 
<url-pattern>/login</url-pattern> </servlet-mapping>
<servlet>
<description>The servlet used to add items to cart</description>
<display-name>AddToCartServlet</display-name>
<servlet-name>AddToCartServlet</servlet-name>
<servlet-class>webclient.servlets.AddToCartServlet</servlet-class> 
</servlet>
<servlet-mapping>
<servlet-name>AddToCartServlet</servlet-name>
<url-pattern>/addtocart</url-pattern> </servlet-mapping>
<servlet>
<description>
The servlet used to recalculate items in cart </description>
<display-name>RecalculateServlet</display-name> 
<servlet-name>RecalculateServlet</servlet-name> 
<servlet-class>
webclient.servlets.RecalculateServlet </servlet-class> 
</servlet>
<servlet-mapping>
<servlet-name>RecalculateServlet</servlet-name>
<url-pattern>/recalculate</url-pattern> 
</servlet-mapping>
<servlet>
<description>The servlet used to make order</description>
<display-name>MakeOrderServlet</display-name>
<servlet-name>MakeOrderServlet</servlet-name>
<servlet-class>webclient.servlets.MakeOrderServlet
</servlet-class> </servlet>
<servlet-mapping>
<servlet-name>MakeOrderServlet</servlet-name> 
<url-pattern>/makeorder</url-pattern> </servlet-mapping>
<servlet>
<description>The servlet used to logout</description>
<display-name>LogoutServlet</display-name>
<servlet-name>LogoutServlet</servlet-name>
<servlet-class>webclient.servlets.LogoutServlet</servlet-class> 
</servlet>
<servlet-mapping>
<servlet-name>LogoutServlet</servlet-name>
<url-pattern>/logout</url-pattern> </servlet-mapping>
<filter>
<filter-name>AuthFilter</filter-name>
<filter-class>webclient.filter.AuthFilter</filter-class> 
</filter>
<filter-mapping>
<filter-name>AuthFilter</filter-name>
<servlet-name>AddToCartServlet</servlet-name>
</filter-mapping>
<filter-mapping>
<filter-name>AuthFilter</filter-name> 
<servlet-name>LogoutServlet</servlet-name>
</filter-mapping>
<filter-mapping>
<filter-name>AuthFilter</filter-name> 
<servlet-name>MakeOrderServlet</servlet-name>
</filter-mapping>
<filter-mapping>
<filter-name>AuthFilter</filter-name>
<servlet-name>RecalculateServlet</servlet-name> 
</filter-mapping> <filter-mapping>
<filter-name>AuthFilter</filter-name>
<url-pattern>/basket.jsp</url-pattern>
</filter-mapping> <filter-mapping>
<filter-name>AuthFilter</filter-name>
<url-pattern>/goodlist.jsp</url-pattern> 
</filter-mapping> <filter-mapping>
<filter-name>AuthFilter</filter-name>
<url-pattern>/prevorders.jsp</url-pattern> 
</filter-mapping> <filter-mapping>
<filter-name>AuthFilter</filter-name>
<url-pattern>/thankyou.jsp</url-pattern> 
</filter-mapping> <filter-mapping>
<filter-name>AuthFilter</filter-name>
<url-pattern>/img/</url-pattern> 
</filter-mapping> </web-app>
Антон Зубеков
Антон Зубеков

Здравствуйте, подскажите пожалуйста где можно достать материалы по курсу Кросс-платформенные и многозвенные технологии, о которых говориться, к примеру, в Лекции 2. Пример "Служба мгновенных сообщений"