|
Здравствуйте, подскажите пожалуйста где можно достать материалы по курсу Кросс-платформенные и многозвенные технологии, о которых говориться, к примеру, в Лекции 2. Пример "Служба мгновенных сообщений" |
Технология Enterprise Java Beans. Часть 1
Компоненты
Для реализации заявленной функциональности будут использоваться три сеансовых компонента EJB: CommoditiesListBean, OrdersListBean и ShoppingBasketBean. CommoditiesListBean и OrdersListBean являются сеансовыми компонентами без состояния, а ShoppingBasketBean - компонентом с состоянием (stateful).
CommoditiesListBean используется для поиска товара в базе данных по ID товара, а также для получения всех товаров в базе данных.
OrdersListBean используется для составления списка сделанных заказов по имени пользователя, а также для получения списка товаров, входящих в заказ, описываемый при помощи ID.
ShoppingBasketBean используется для реализации логики корзины в интернет магазине. При помощи него можно добавлять товары в корзину, пересчитывать количество товаров и делать заказ.
Удаленный интерфейс CommoditiesListBean
В удаленном интерфейсе (Remote Interface) определим два метода:
- public List getAvailableCommodities()throws RemoteException, SQLException. Этот метод возвращает список из объектов класса Commodity, которые соответствуют записям в таблице COMMODITIES_LIST.
- public Commodity getCommodityById(int id) throws RemoteException, SQLException. Этот метод по id возвращает объект класса Commodity, соответствующий товару в базе данных.
public interface CommoditiesListRemote extends EJBObject
{
public List getAvailableCommodities() throws RemoteException,
SQLException;
public Commodity getCommodityById(int id) throws RemoteException, SQLException;
}Домашний интерфейс класса CommoditiesListBean
Этот интерфейс аналогичен домашним интерфейсам из предыдущих примеров.
public interface CommoditiesListHome extends EJBHome
{
public CommoditiesListRemote create() throws RemoteException, CreateException;
}Класс компонента CommoditiesListBean
В классе компонента заданы два основных метода - ListgetAvailableCommodities() и Commodity getCommodityById(int id). В первом методе выполняется SELECT запрос в базе данных, после чего на основе сгенерированного ResultSet создается список из объектов класса Commodity. Выполнение запроса к базе данных, а также формирование объектов Commodity выделено шрифтом.
public class CommoditiesListBean implements SessionBean
{
private static final long serialVersionUID = -8641939595462379799L;
private DataSource dataSource = null;
public List getAvailableCommodities() throws SQLException
{
if (dataSource == null)
throw new SQLException("Datasource not loaded");
Connection conn = dataSource.getConnection();
PreparedStatement p = conn.prepareStatement("SELECT * FROM " + " COMMODITIES_LIST");
ResultSet r = p.executeQuery();
List arrayList = new ArrayList();
while (r.next())
{
Commodity commodity = new Commodity();
commodity.setId(r.getInt("ID"));
commodity.setName(r.getString("NAME"));
commodity.setDescription(r.getString("DESCRIPTION"));
commodity.setPrice(r.getDouble("PRICE"));
commodity.setImagePath(r.getString("IMAGEPATH"));
arrayList.add(commodity);
}
conn.close();
return arrayList;
}
/*
Во втором методе выполняется поиск товара по его ID. Если такой товар найден, то возвращается
созданный по ResultSet объект Commodity.
*/
public Commodity getCommodityById(int id) throws SQLException
{
if (dataSource == null)
throw new SQLException("Datasource not loaded");
Connection conn = dataSource.getConnection();
PreparedStatement p = conn.prepareStatement
("SELECT * FROM " + " COMMODITIES_LIST WHERE ID=?");
p.setInt(1, id);
ResultSet r = p.executeQuery();
Commodity commodity = new Commodity();
if (r.next())
{
commodity.setId(r.getInt("ID"));
commodity.setName(r.getString("NAME"));
commodity.setDescription(r.getString("DESCRIPTION"));
commodity.setPrice(r.getDouble("PRICE"));
commodity.setImagePath(r.getString("IMAGEPATH"));
}
conn.close(); return commodity;
}
public void ejbCreate()
{
}
public void ejbActivate() throws EJBException, RemoteException
{
}
public void ejbPassivate() throws EJBException, RemoteException
{
}
public void ejbRemove() throws EJBException, RemoteException
{
}
public void setSessionContext(SessionContext arg0) throws EJBException, RemoteException
{
try
{
InitialContext ctx = new InitialContext();
if (dataSource == null)
dataSource = (DataSource) ctx.lookup("java:/OracleDS");
}
catch (NamingException ex)
{
throw new EJBException(ex);
}
}
}Тестовый клиент для CommoditiesListBean
Для того чтобы проверить работоспособность компонента CommoditiesListBean, было написано тестовое консольное клиентское приложение. В нем выполнялся вызов обеих методов компонента, а результат выводился в консоль. Код этого клиента приводится далее.
public class TestClient
{
public static void main(String args[])
{
try
{
Context jndiContext = createJBossContext();
Object ref = jndiContext.lookup("CommoditiesListBean");
CommoditiesListHome home =
(CommoditiesListHome) PortableRemoteObject.narrow(ref, CommoditiesListHome.class);
CommoditiesListRemote remote = home.create();
System.out.println("There are following items available " +" in stock:");
List list = remote.getAvailableCommodities();
Iterator iter = list.iterator();
while (iter.hasNext())
{
Commodity commodity = (Commodity) iter.next();
System.out.println(commodity.toString());
}
Commodity commodity = remote.getCommodityById(2);
System.out.println("Single commotidy - " + commodity.toString());
}
catch (RemoteException e)
{
e.printStackTrace();
}
catch (NamingException e)
{
e.printStackTrace();
}
catch (CreateException e)
{
e.printStackTrace();
}
catch (SQLException e)
{
e.printStackTrace();
}
}
public static Context createJBossContext() throws NamingException
{
Properties p = new Properties();
p.put("java.naming.factory.initial",
"org.jnp.interfaces.NamingContextFactory");
p.put("java.naming.provider.url", "jnp://127.0.0.1:1099");
p.put("java.naming.factory.url.pkgs", "org.jboss.naming:org.jnp.interfaces");
Context jndiContext = new InitialContext(p);
return jndiContext;
}
}Для тестового клиента был создан отдельный Java -проект в Eclipse.
Вывод тестового клиента показан на Рис. 3.38.
