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