|
Здравствуйте, подскажите пожалуйста где можно достать материалы по курсу Кросс-платформенные и многозвенные технологии, о которых говориться, к примеру, в Лекции 2. Пример "Служба мгновенных сообщений" |
Технология 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.
Если все было сделано правильно - то при запуске 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;
}
}Введем в качестве первой валюты доллар, в качестве второй - евро, а в качестве суммы - 100 долларов. Щелкнем кнопку Get value:, и появится сумма уже в евро - 83 евро.
Если же в качестве валют для перевода указывается что-либо отличное от пар USD -> EUR или USD -> YEN, то тогда выводится сообщение Rate not found (Рис. 3.28).


