Здравствуйте, подскажите пожалуйста где можно достать материалы по курсу Кросс-платформенные и многозвенные технологии, о которых говориться, к примеру, в Лекции 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.