Опубликован: 18.03.2010 | Уровень: специалист | Доступ: платный
Лекция 3:

Технология 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. Консольный вывод тестового клиента

Вывод тестового клиента показан на Рис. 3.38.

Антон Зубеков
Антон Зубеков

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

Ярославй Грива
Ярославй Грива
Россия, г. Санкт-Петербург
Ольга Малых
Ольга Малых
Россия, Казань, Университет управления "ТИСБИ"