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

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

Пример "Конвертор валют"

Компонент

В данном примере мы покажем разработку сеансового компонента без состояния (Stateless Session Bean) для конвертации денежных сумм из одной валюте в другую. В качестве валют будут использоваться доллары, евро и йены. Компонент будет переводить сумму в долларах в сумму в евро или йенах.

Удаленный интерфейс

В удаленном интерфейсе (Remote Interface) определим два метода - dollarToEuro (double) и dollarToYena (double). Эти методы, получив в качестве параметра сумму в долларах, переведут эту сумму по некоторому постоянному курсу и вернут сумму в евро или йенах соответственно.

public interface CurrencyRemote extends EJBObject  
{
public double dollarToEuro(double dollars)   throws RemoteException; public double dollarToYena(double yena)   throws RemoteException;
}
Домашний интерфейс

Домашний интерфейс (Home Interface) состоит из одного метода.

public interface CurrencyHome extends EJBHome  
{
public CurrencyRemote create()   throws RemoteException,   CreateException;
}
Класс компонента

В классе компонента заданы для простоты два постоянных курса перевода валют (задание этих констант, а также основных используемых извне методов выделены шрифтом).

public class CurrencyBean implements SessionBean  
{
private static final long serialVersionUID = 8897567469393327031L;
private double dollarToYenaRate = 100.25; 
private double dollarToEuroRate =0.83;
public void ejbCreate()  
	{
	}

public double dollarToEuro(double dollars)   
	{ 
	return dollars * dollarToEuroRate;
	}

public double dollarToYena(double dollars)   
	{ 
	return dollars * dollarToYenaRate;
	}
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  	
	{
	}
}
Дескриптор развертывания

Дескриптор развертывания для этого компонента ничем принципиально не отличается от дескриптора развертывания компонента из предыдущего примера.

<?xml version="1.0" encoding="UTF-8"?>

<ejb-jar id="ejb-jar ID" version="2.1" 
xmlns="http://java.sun.com/xml/ns/j2ee" 
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/ejb-jar_2_1.xsd">

<description> Second session bean </description>

<display-name>CurrencyConvertorBean</display-name>
<enterprise-beans> <session>
<ejb-name>CurrencyBean</ejb-name> 
<home>currencyConvertorBean.CurrencyHome</home> 
<remote>currencyConvertorBean.CurrencyRemote</remote> 
<ejb-class>currencyConvertorBean.CurrencyBean</ejb-class>

<session-type>Stateless</session-type>
<transaction-type>Container</transaction-type>
</session>
</enterprise-beans>
</ejb-jar>
Создание проекта для компонента

В этом примере не будет рассматриваться создание простого Java -проекта для компонента, ограничимся EJB -проектом. Создаем EJB -проект CurrencyConvertorBean.Также в каталоге ejbModule создаем интерфейсы и классы, вставляем дескриптор развертывания. После этого добавляем проект к контейнеру JBoss.

Теперь их два

увеличить изображение
Рис. 3.26. Теперь их два

Если все было сделано правильно - то при запуске JBoss появится сообщение об успешном развертывании двух компонентов (компонента из предыдущего примера и текущего компонента) (Рис. 3.26).

Создание проекта для клиентского приложения

Теперь напишем небольшое приложение, которое будет работать с компонентом CurrencyConvertorBean.Это будет графическое приложение, в котором пользователь сможет ввести наименования валют, и сумму денег в одной валюте. После этого приложение выведет сумму денег в другой валюте.

Вначале создадим Java -проект и назовем его CurrencyConvertorBeanClient.Аналогичным образом, как было описано в предыдущем примере, подключим необходимые библиотеки и выберем в качестве зависимого проекта CurrencyConvertorBean.Далее создадим пакет, а в нем - класс клиента.

public class CurrencyConvertorClient extends JFrame implements ActionListener  
{
private static final long serialVersionUID = 3889223123915102442L;
private Context jndiContext;
private JLabel cur1Label; 
private JTextField cur1; 
private JLabel cur2Label; 
private JTextField cur2; 
private JLabel amountLabel; 
private JTextField amount;
private JButton getRate; 
private JLabel rate;

public CurrencyConvertorClient()   
	{ 
	super("CurrencyConvertor"); 
	layoutPane();
	try 
		{
		jndiContext = createJBossContext();
		}   
	catch   (NamingException e)   
		{ 
		e.printStackTrace();
		}
	}

// Получение удаленного интерфейса
private CurrencyRemote getRemoteInterface() throws NamingException, CreateException, RemoteException 
	{ 
	Object ref = jndiContext.lookup("CurrencyBean"); 
	CurrencyHome home =   (CurrencyHome)
	PortableRemoteObject.narrow(ref,   CurrencyHome.class);
	CurrencyRemote remote = home.create(); 
	return remote;
	}

private void layoutPane()   
	{
	GridBagConstraints gc = new GridBagConstraints(); 
	gc.insets = new Insets(5,   5,   5,   5);
	Container content = getContentPane(); 
	content.setLayout(new GridBagLayout());
	
	cur1Label = new JLabel("Currency 1:   "); 
	gc.fill = GridBagConstraints.BOTH; 
	gc.weightx = 1.0; 
	gc.gridx = 0; 
	gc.gridy = 0; 
	gc.gridwidth = 2; 
	gc.gridheight = 1; 
	content.add(cur1Label,   gc);
	
	cur2Label = new JLabel("Currency 2: "); 
	gc.gridy = 1;
	content.add(cur2Label,   gc);
	amountLabel = new JLabel("Amount:   "); 
	gc.gridy = 2;
	content.add(amountLabel,   gc);
	
	getRate = new JButton("Get value:   "); 
	gc.gridy = 3; 
	content.add(getRate,   gc); 
	getRate.addActionListener(this);
	
	cur1 = new JTextField(); 
	gc.gridx = 2; 
	gc.gridy = 0; 
	content.add(cur1,   gc);
	
	cur2 = new JTextField(); 
	gc.gridy = 1;
	
	content.add(cur2,   gc);
	
	amount = new JTextField(); 
	gc.gridy = 2; 
	content.add(amount,   gc);
	
	rate = new JLabel("Not loaded");
	gc.gridy = 3; 
	content.add(rate,   gc);
	}

public void actionPerformed(ActionEvent ae)   
	{ 
	loadExchangeRate();
	}

private void loadExchangeRate()   
	{
	String currency1 = cur1.getText(); 
	String currency2 = cur2.getText();
	double am;
	try 
		{
		am = Double.parseDouble(amount.getText()); 
		}   
	catch   (NumberFormatException e)   
		{
		rate.setText("Invalid number"); 
		return;
		}
	try 
		{
		CurrencyRemote remote = null; 
		remote = getRemoteInterface(); 
		boolean loaded = true;
		
		// Пока поддерживается только перевод из долларов в евро 
		// и долларов в йены 
		loaded &= currency1.equals("USD"); 
		loaded &= (currency2.equals("EUR") || currency2.equals("YEN"));
		
		if   (loaded)   
			{
			double res = 0;
			if   (currency2.equals("EUR"))   
			{
			res = remote.dollarToEuro(am);
			}  
			else if   (currency2.equals("YEN"))   
			{ 
			res = remote.dollarToYena(am);
			}
		
			NumberFormat nf = NumberFormat.getInstance(); 
			nf.setMaximumFractionDigits(2); 
			rate.setText(nf.format(res)); 
			}  
		else  
			{
			rate.setText("Rate not found");
			}
		}   
	catch   (RemoteException e)   
		{
		e.printStackTrace();
		rate.setText("Error..."); 
		}   
	catch   (NamingException e)   
		{
		e.printStackTrace();
		rate.setText("Error..."); 
		}   
	catch   (CreateException e)   
		{
		e.printStackTrace();
		rate.setText("Error...");
		}
	}

public static void main(String args[])   
	{
	CurrencyConvertorClient client = new CurrencyConvertorClient();
	client.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
	client.setLocation(400,   400); 
	client.setSize(300,   200); 
	client.setVisible(true);
	}

private 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;
	}
}
Перевод долларов в евро

Рис. 3.27. Перевод долларов в евро

Введем в качестве первой валюты доллар, в качестве второй - евро, а в качестве суммы - 100 долларов. Щелкнем кнопку Get value:, и появится сумма уже в евро - 83 евро.

Курс перевода не найден

Рис. 3.28. Курс перевода не найден

Если же в качестве валют для перевода указывается что-либо отличное от пар USD -> EUR или USD -> YEN, то тогда выводится сообщение Rate not found (Рис. 3.28).

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

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

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