Московский государственный университет имени М.В.Ломоносова
Опубликован: 18.09.2006 | Доступ: свободный | Студентов: 1868 / 118 | Оценка: 4.32 / 3.36 | Длительность: 27:14:00
ISBN: 978-5-9556-0067-3
Лекция 14:

Разработка различных уровней web приложений в J2EE и .NET

  • Класс первичного ключа (primary key class).

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

    Определяет набор данных, которые образуют первичный ключ записи базы данных, соответствующей одному экземпляру компонента.

    Чаще всего это библиотечный класс, например, String или Integer. Пользовательский класс необходим, если первичный ключ составной, т.е. состоит из нескольких значений простых типов данных. В таком классе должен быть определен конструктор без параметров и правильно перегружены методы equals() и hashCode(), чтобы EJB-контейнер мог корректно управлять коллекциями экземпляров компонентов с такими первичными ключами. Такой класс также должен реализовывать интерфейс java.io.Serializable.

    Жизненный цикл сеансового компонента без состояния

    Рис. 14.4. Жизненный цикл сеансового компонента без состояния

Ниже приведены примеры декларации класса компонента и интерфейсов для компонентов данных, соответствующих простой схеме из двух таблиц, которая изображена на рис. 14.5.

В рамках этой схемы, состоящей из таблиц, где хранятся данные книг и организаций-издателей, каждая книга связана с одним и только одним издателем, а каждый издатель может иметь ссылки на некоторое множество книг (возможно, пустое). Каждая таблица имеет поле ID, являющееся первичным ключом. Таблица Book имеет поле PublisherID, содержащее значение ключа записи об издателе данной книги.

Пример схемы БД

Рис. 14.5. Пример схемы БД

Примеры кода удаленных интерфейсов для компонентов, представляющих данные о книгах и издателях в рамках EJB-приложения:

package ru.msu.cmc.prtech.examples;

import java.rmi.RemoteException;
import java.util.Collection;
import javax.ejb.EJBObject;

public interface PublisherRemote extends EJBObject
{
  public String getTitle ()             throws RemoteException;
  public void   setTitle (String title) throws RemoteException;

  public Collection getBooks ()throws RemoteException;
  public void       setBooks (Collection books)
    throws RemoteException;

  public void addBook    (String title, String isbn)
    throws RemoteException;
  public void removeBook (String title, String isbn)
    throws RemoteException;
}

package ru.msu.cmc.prtech.examples;

import java.rmi.RemoteException;

import javax.ejb.EJBObject;

public interface BookRemote extends EJBObject
{
  public String getTitle ()             throws RemoteException;
  public void   setTitle (String title) throws RemoteException;
  
  public String getISBN ()            throws RemoteException;
  public void   setISBN (String isbn) throws RemoteException;

  public PublisherRemote getPublisher () throws RemoteException;
  public void            setPublisher (PublisherRemote publisher)
    throws RemoteException;
}
14.1.

Примеры кода удаленных исходных интерфейсов.

package ru.msu.cmc.prtech.examples;

import java.rmi.RemoteException;

import javax.ejb.CreateException;
import javax.ejb.EJBHome;
import javax.ejb.FinderException;

public interface PublisherHomeRemote extends EJBHome
{
  public PublisherRemote create (Integer id)
    throws CreateException, RemoteException;

  public PublisherRemote findByPK (Integer id)
    throws FinderException, RemoteException; 
}

package ru.msu.cmc.prtech.examples;

import java.rmi.RemoteException;

import javax.ejb.CreateException;
import javax.ejb.EJBHome;
import javax.ejb.FinderException;

public interface BookHomeRemote extends EJBHome
{
  public BookRemote create (Integer id)
    throws CreateException, RemoteException;
  
  public BookRemote createBook (String title, String isbn)
    throws CreateException, RemoteException;

  public BookRemote findByPK (Integer id)
    throws FinderException, RemoteException; 
}
14.2.

Примеры кода классов компонентов. Показано, как реализовывать дополнительные, не поддерживаемые контейнером автоматически, методы работы со связями между данными об издателях и книгах и дополнительные методы создания компонентов.

package ru.msu.cmc.prtech.examples;

import java.util.Collection;
import java.util.Iterator;

import java.rmi.RemoteException;
import javax.ejb.CreateException;
import javax.ejb.EntityBean;
import javax.naming.InitialContext;
import javax.naming.NamingException;

public abstract class PublisherBean implements EntityBean
{
  public Integer ejbCreate (Integer pk)
  {
    setId(pk);
    return null;
  }
  
  public void ejbPostCreate (Integer pk) { }
  
  public abstract Integer getId ();
  public abstract void    setId (Integer pk);

  public abstract String getTitle ();
  public abstract void   setTitle (String title);

  public abstract Collection getBooks ();
  public abstract void       setBooks (Collection books);
  
  public void addBook (String title, String isbn)
  {
    try
    {
      InitialContext context = new InitialContext();
      BookHomeRemote bookHome = 
         (BookHomeRemote)context.lookup("BookHomeRemote");
      BookRemote book = bookHome.createBook(title, isbn); 
      
      Collection books = getBooks();
      books.add(book);
    }
    catch (NamingException e) { e.printStackTrace(); }
    catch (CreateException e) { e.printStackTrace(); }
    catch (RemoteException e) { e.printStackTrace(); }
  }
  
  public void removeBook (String title, String isbn)
  {
    Collection books = getBooks();
    Iterator it = books.iterator();
    
    try
    { 
      while(it.hasNext())
      {
        BookRemote book = (BookRemote)it.next();
        if(   book.getTitle().equals(title)
           && book.getISBN().equals(isbn)
          )
        {
          it.remove();
          break;
        }
      }
    }
    catch (RemoteException e) { e.printStackTrace(); }
  }
}

package ru.msu.cmc.prtech.examples;

import javax.ejb.EntityBean;

public abstract class BookBean implements EntityBean
{
  public Integer ejbCreate (Integer pk)
  {
    setId(pk);
    return null;
  }
  
  public void ejbPostCreate (Integer pk) { }
  
  public Integer ejbCreateBook (String title, String isbn)
  {
    setTitle(title);
    setISBN(isbn);
    return null;
  }
  
  public void ejbPostCreateBook (String title, String isbn) { }

  public abstract Integer getId ();
  public abstract void    setId (Integer pk);
  
  public abstract String getTitle ();
  public abstract void   setTitle (String title);

  public abstract String getISBN ();
  public abstract void   setISBN (String isbn);

  public abstract PublisherRemote getOrganization ();
  public abstract void            setOrganization (PublisherRemote pr);
}
14.3.

Компоненты, управляемые сообщениями

Компоненты, управляемые сообщениями, недоступны для удаленных вызовов, и поэтому не имеют удаленных и исходных интерфейсов. Для создания такого компонента нужно определить только его класс. Обращения к компоненту организуются в виде посылки сообщений к объекту этого класса как к реализующему интерфейс javax.jms.MessageListener. Вместе с этим интерфейсом класс компонента EJB, управляемого сообщениями, обязан реализовывать интерфейс javax.ejb.MessageDrivenBean.

Первый интерфейс требует определения метода void onMessage(javax.jms.Message), который разбирает содержимое пришедшего сообщения и определяет способ его обработки. Кроме того, нужно определить методы void ejbCreate() для создания компонента и void ejbRemove() для освобождения ресурсов при его удалении.

Жизненный цикл компонента, управляемого сообщениями, выглядит в целом так же, как и жизненный цикл сеансового компонента без состояния (рис. 14.4). Вся необходимая информация передается такому компоненту в виде данных обрабатываемого им сообщения.

Пример реализации класса компонента, управляемого сообщениями, приведен ниже. Данный компонент получает идентификатор издателя, название и ISBN книги и добавляет такую книгу к книгам, изданным данным издателем.

package ru.msu.cmc.prtech.examples;

import javax.ejb.EJBException;
import javax.ejb.MessageDrivenBean;
import javax.ejb.MessageDrivenContext;
import javax.jms.MapMessage;
import javax.jms.Message;
import javax.jms.MessageListener;
import javax.naming.Context;
import javax.naming.InitialContext;
import javax.naming.NamingException;

public class TransferProcessorBean 
  implements MessageDrivenBean, MessageListener
{
  Context context;
  
  public void setMessageDrivenContext (MessageDrivenContext mdc)
      throws EJBException
  {
    try { context = new InitialContext(); }
    catch (NamingException e) { throw new EJBException(e); }
  }
  
  public void ejbCreate() { }

  public void onMessage (Message msg)
  {
    MapMessage message = (MapMessage)msg;
    try
    {
      Integer publisherPK = (Integer)message.getObject("Publisher");
      String  title       = (String)message.getObject("Title");
      String  isbn        = (String)message.getObject("ISBN");
      
      PublisherHomeRemote publisherHome = 
        (PublisherHomeRemote)context.lookup("PublisherHomeRemote ");
      
      PublisherRemote publisher = publisherHome.findByPK(publisherPK);
      
      publisher.addBook(title, isbn);
    }
    catch (Exception e) { throw new EJBException(e); }
  }

  public void ejbRemove () throws EJBException
  {
    try { context.close(); }
    catch (NamingException e) { }
  }
}
14.4.
Владислав Нагорный
Владислав Нагорный

Подскажите, пожалуйста, планируете ли вы возобновление программ высшего образования? Если да, есть ли какие-то примерные сроки?

Спасибо!

Лариса Парфенова
Лариса Парфенова

1) Можно ли экстерном получить второе высшее образование "Программная инженерия" ?

2) Трудоустраиваете ли Вы выпускников?

3) Можно ли с Вашим дипломом поступить в аспирантуру?