JavaRush /Блоги Java /Random-TG /Муаррифии EJB
Анзор Кармов
Сатҳи
Санкт-Петербург

Муаррифии EJB

Дар гурӯҳ нашр шудааст
Дар ин мақола мо EJB - Enterprise JavaBeans-ро дида мебароем. Ин технология як қисми мушаххасоти Java EE мебошад. Мо ба масъалаҳои зерин дахл хоҳем кард:
  • EJB чист;
  • таърихи EJB чист;
  • кадом намуди EJB вуҷуд дорад?
Мо инчунин бо истифода аз EJB ва сервлетҳо як барномаи хурди HelloWorld менависем. Муаррифии EJB - 1Ин мақола барои хонандагоне муфид хоҳад буд, ки бо Java SE бароҳатанд ва ба омӯхтани Java EE шурӯъ мекунанд. Барои пурра фаҳмидани қисми амалии ин мақола, тавсия дода мешавад, ки аввал мақолаи " Танзими муҳити маҳаллӣ " -ро хонед.

Таърихи мухтасари EJB

Ҳанӯз дар соли 1996, вақте ки муаллифи ин мақола 5-сола буд, Java аллакай дар байни таҳиягарон маъмул буд. Сабаби ин API дӯстона, ҷамъоварии автоматии ахлот ва ғайра буд. Java дар системаҳое, ки барои пуштибонӣ масъуланд, васеъ истифода мешуд. Аммо, сарфи назар аз ҳама лаззатҳои забон, барномасозони он вақт ба баъзе функсияҳое ниёз доштанд, ки ҳанӯз дар JDK татбиқ карда нашудаанд. Ин ниёзҳо буданд:
  • таъмини устувории маълумот;
  • якпорчагии муомилот
  • дастрасии рақобатӣ ба додаҳо (назорати чанд ришта);
  • ва эҳтимолан чизи дигар.
Хамаи ин боиси афзоиши табиии шумораи ахолии хонагй, худ-нависй, китобхонахои пушида гардид. Ба ибораи дигар, ҳар кас ба қадри имкон ниёзҳои худро иҷро мекард. Ин то он даме, ки IBM бо шиори "Ҳама бояд ниёзҳои худро як хел қонеъ кунад" баромад ва мушаххасоти Enterprise Java Bean (EJB) -ро дар соли 1997 интишор кард. Маҳз ҳамин чиз имкон дод, ки раванди рушд муттаҳид карда шавад ва ҳалли мушкилоти маъмулӣ (дар боло ҳамчун ниёзҳо тавсиф карда шуд) ба чаҳорчӯба гирифта шавад. Sun дар давоми 2 сол тарҳи IBM-ро мутобиқ мекунад ва дар соли 1999 мушаххасоти EJB 1.0-ро нашр кард. Ҳамин тавр технология ба вуҷуд омадааст, ки минбаъд дар рагҳои бештар татбиқшаванда муҳокима карда мешавад.

EJB чист

EJB ба маънои истилоҳи дастаҷамъӣ аст, ки вобаста ба контекст метавонад ё дар маҷмӯъ худи технологияи Enterprise JavaBeans ё ягон ҷузъи мушаххаси нармафзори Enterprise JavaBean (лӯбиё), ки ҷузъи технологияи EJB мебошад, маъно дорад. Таърифи EJB ҳамчун технология дар Википедия дода шудааст: Enterprise JavaBeans (инчунин аксаран ҳамчун ихтисораи EJB истифода мешавад) мушаххасоти технология барои навиштан ва дастгирии ҷузъҳои serverи дорои мантиқи тиҷорӣ мебошад. Он як қисми Java EE мебошад. Ин технология одатан вақте истифода мешавад, ки мантиқи тиҷорат ҳадди аққал яке аз хидматҳои зеринро талаб кунад ва аксар вақт ҳамаи онҳоро талаб кунад:
  • дастгирии устувории маълумот: маълумот бояд ҳатто пас аз қатъ кардани барнома бехатар бошад. Аксар вақт бо истифода аз пойгоҳи додаҳо ба даст оварда мешаванд;
  • дастгирии амалиёти тақсимшуда;
  • дастгирии тағир додани маълумотҳои мувозӣ ва мултимедиявӣ;
  • дастгирии чорабиниҳо;
  • дастгирии номгузорӣ ва директория (JNDI);
  • амният ва маҳдудияти дастрасӣ ба маълумот;
  • дастгирии насби автоматӣ дар serverи барнома;
  • дастрасии дурдаст.
Хидматҳои дар боло номбаршуда бартарии бешубҳа технологияи EJB мебошанд. Бартарии дигари ин аст, ки ҳама чизҳои дар боло номбаршуда аз қуттӣ фавран кор мекунанд. Онхое. ба барномасоз лозим нест, ки дар бораи дастгирии транзаксияҳои тақсимшуда фикр кунад. Ба барномасоз танҳо лозим аст, ки дар бораи мантиқи тиҷорӣ фикр кунад, ки ҳоло ӯ кӯшиши амалӣ кардани онро дорад. EJB ҳамчун ҷузъи мушаххаси нармафзор синфи Java бо як ё якчанд эзоҳҳо аз мушаххасоти EJB мебошад, ки баъзе мантиқи тиҷоратии барномаро дар бар мегирад. Эзоҳҳо аз мушаххасоти EJB ба синфи барчасп ваколатҳо, қудратҳо ва абарқудратҳои муайян медиҳанд. Дар ин бора дар зер бештар хонед.

намудҳои EJB

Биёед ҷамъбаст кунем. EJB як синфи муқаррарии Java мебошад, ки бо яке аз эзоҳҳои махсус қайд карда шудааст. Чунин синфҳо лӯбиё номида мешаванд. Вобаста аз он, ки синф бо кадом эзоҳ қайд карда шудааст, он намояндаи ин ё он намуди EJB (лубиё) хоҳад буд. Се намуди асосии лӯбиё вуҷуд дорад:
  • Message Driven Beans (лӯбиёи паёмнависӣ);
  • Entity Beans - дар мушаххасоти JPA (Java Persistence API) муайян карда шудааст ва барои нигоҳ доштани маълумот истифода мешавад;
  • Сеанси лӯбиё.
Охирин (лӯбиёи сессия) ба якчанд зергурӯҳҳо тақсим мешавад:
  • бешаҳрвандӣ (бе давлат);
  • давлатдор (бо дастгирии ҳолати сессияи ҷорӣ);
  • singleton (як an object барои тамоми барнома; сар карда аз EJB 3.1).
Муаррифии EJB - 2Дар зер мо ҳар як намуди лӯбиёро муфассалтар дида мебароем.

Сеанси лӯбиё

Сессия лӯбиё, ё лӯбиёи сессия, як навъи махсуси лӯбиё мебошад. Онҳо мантиқи тиҷоратиро фаро мегиранд, ки муштарӣ метавонад ба таври барномавӣ тавассути даъват кардани усулҳои лӯбиё даъват кунад. Даъвати метод метавонад иҷро кунад:
  • ба таври маҳаллӣ, аз ҷониби синфи дигар дар ҳамон JVM ҳамчун лӯбиёи ҷаласа;
  • фосилаи дур, тавассути шабака, аз JVM дигар, бо истифода аз технологияи Java RMI (Remote Method Invocation).
Калимаи "сессия" маънои онро дорад, ки лӯбиё танҳо дар ҳоле дастрас аст, ки server вазифаи мушаххасро иҷро мекунад ва дар сурати нокомӣ ё қатъ шудани server бебозгашт нест мешавад. Давраи ҳаёти як мисоли лӯбиёи сеанс аз ҷониби контейнери EJB идора карда мешавад (шумо метавонед дар лексияи якуми силсила бештар дар бораи контейнерҳои EJB хонед ). Лӯбиёи сеанси бидуни шаҳрвандӣ маълумотро дар бораи ҳолати худ нигоҳ намедорад. Ин навъи ҷузъро муштариёни гуногун истифода бурдан мумкин аст. Лӯбиёҳои бидуни шаҳрвандӣ барои татбиқи равандҳои тиҷоратӣ истифода мешаванд, ки метавонанд дар як амалиёт анҷом дода шаванд. Масалан, тафтиши таърихи кредитии муштариён. Азбаски як мисоли лӯбиё метавонад аз ҷониби муштариёни сершумор истифода шавад, таҳиякунанда бояд дастрасии бехатарро ба маълумоти лӯбиё таъмин кунад. Эҷоди як лӯбиёи ин навъи (инчунин ҳама лӯбиёи сессия) хеле оддӣ аст. Ин як синфи муқаррарии Java бо эзоҳ аст @Stateless. Дар зер мисол меорем:
import javax.ejb.Stateless;

@Stateless
public class StatelessEjbExample {
    public String sayHi() {
        return "Hi, I'm Stateless EJB!";
    }
}
Лӯбиёи сеанс, ки ҳолати сеанси ҷорӣ (Statful) -ро дастгирӣ мекунад, маълумот дар бораи ҳолати худро дар байни зангҳо ба он аз як муштарӣ нигоҳ медорад ва мавҷудияти онҳоро бо дархости возеҳ аз муштарӣ қатъ мекунад. Ин ба туфайли он ба даст омадааст, ки лӯбиёи давлатӣ барои ҳар як муштарӣ беназир аст. Намунаи вазифае, ки барои он ин навъи лӯбиё метавонад масъул бошад, нигоҳ доштани аробаи харид дар мағозаи онлайн барои ҳар як корбар мебошад. Давраи зиндагии ин лӯбиёҳо аз ҷониби контейнери EJB идора карда мешавад. Ин лӯбиёҳо инчунин ҳангоми баромадани муштарӣ нобуд мешаванд. Эҷоди чунин лӯбиёҳо низ хеле осон аст. Ин синфи Java аст, ки бо эзоҳ ишора шудааст Stateful. Мисол дар зер:
import javax.ejb.Stateful;

@Stateful
public class StatefulEjbExample {
    public String sayHi() {
        return "Hi, I,m Stateful EJB";
    }
}
Лӯбиёи сеанси ягона як маротиба дар давоми мӯҳлати амали барнома оғоз карда мешавад ва дар тӯли тамоми мӯҳлати барнома мавҷуд аст. Чунин лӯбиёҳо барои ҳолатҳое тарҳрезӣ шудаанд, ки дар он як давлат бояд дар байни ҳамаи муштариён тақсим карда шавад. Мисли лӯбиёҳои бидуни шаҳрвандӣ, дар лӯбиёи мустақил, таҳиякунанда бояд таъмин кунад, ки муҳити дохor лӯбиё ба таври бехатар ташкил карда шавад. Биёед як лӯбиёи Singleton-ро мисол меорем, ки сохтани он мисли ҳамтоёни худ, ки дар боло мавриди баррасӣ қарор гирифтанд, осон аст. Фаҳмидани он осон аст, ки ин синфи Java бо шарҳи @Singleton. Бо вуҷуди ин, дар ин ҳолат шумо бояд эҳтиёт бошед. Ду эзоҳ мавҷуд аст, ки аз ҷиҳати синтаксис якхелаанд, вале аз ҷиҳати мақсад гуногунанд ва дар бастаҳои гуногун ҷойгиранд:
  • javax.ejb.Singleton
  • javax.inject.Singleton
Барои сохтани EJB, шумо бояд эзоҳро аз javax.ejb. Мисол дар зер:
import javax.ejb.Singleton;

@Singleton
public class SingletonEjbExample {
    public String sayHi() {
        return "Hi, I'm Singleton EJB!";
    }
}

Message Driven Beans

Message Driven Beans, ё MDBs, ё лӯбиёи ба паём асосёфта, баъзе мантиқи тиҷорӣ, ба монанди лӯбиёи сессияро амалӣ мекунанд. Аммо бар хилофи хешовандони худ, MDB як фарқияти муҳим дорад. Мизоҷон ҳеҷ гоҳ ба усулҳои MDB мустақиман занг намезананд. Чунин лӯбиёҳо аксар вақт ҳамчун шунавандагони паёмҳои JMS (Java Message Service) амал мекунанд ва барои ташкor мубодилаи асинхронии паёмҳо байни қисмҳои система хизмат мекунанд. Намунаи чунин паём метавонад дархост барои интиқоли инвентаризатсия аз системаи автоматии чакана ба системаи идоракунии таъминот бошад. Дар зер намунаи лӯбиёи MDB оварда шудааст. Баръакси лӯбиёи сессия, эҷоди он каме ҷолибтар аст:
import javax.annotation.Resource;
import javax.ejb.MessageDriven;
import javax.ejb.MessageDrivenContext;
import javax.jms.JMSException;
import javax.jms.Message;
import javax.jms.MessageListener;
import javax.jms.TextMessage;

@MessageDriven(mappedName = "jms/TestQueue")
public class MessageDrivenEjbExample implements MessageListener {

    @Resource
    private MessageDrivenContext messageDrivenContext;

    public void onMessage(Message message) {
        try {
            if (message instanceof TextMessage) {
                TextMessage msg = (TextMessage) message;
                msg.getText();
            }
        } catch (JMSException e) {
            messageDrivenContext.setRollbackOnly();
        }
    }

}
Эзоҳ MessageDrivenсинфи MDB-и моро як лӯбиё месозад. Дар дохor эзоҳ, бо истифода аз JNDI (дар бораи JNDI инҷо бихонед ), номи тақсимоти JMS муайян карда мешавад, ки синфи мо шунаванда мешавад. Илова бар ин, синфи мо интерфейс MessageListenerва усули онро амалӣ мекунад onMessage. Ин усул вақте даъват карда мешавад, ки ягон паём аз навбат/тақсим бо номи дар дохor эзоҳ муайяншуда меояд MessageDriven.

Лӯбиёи an object

Қисми технологияи EJB мушаххасоти JPA мебошад. JPA, ё Java Persistence API, мушаххасотест, ки Харитасозии Объект-Муносибат (ORM)-и an objectҳои Java (Lube Entity) ва API-ро барои нигоҳдорӣ, дарёфт ва идоракунии чунин an objectҳо таъмин мекунад. JPA ба шумо имкон медиҳад, ки маълумотро аз пойгоҳи додаҳо ҳамчун an objectҳои Java муаррифӣ кунед ва инчунин an objectҳои Java-ро ҳамчун сабт дар пойгоҳи додаҳо захира кунед. На ҳар як синф метавонад ҳамчун чунин an object амал кунад, аммо Entity beans. Entity Bean синфи Java мебошад, ки ҷадвалро дар пойгоҳи додаҳо муаррифӣ мекунад. Намоиш (харитасозӣ) тавассути истифодаи эзоҳҳои махсус ба даст оварда мешавад. Бо ёрии онҳо синфи Java бо ҷадвали пойгоҳи додаҳо муқоиса карда мешавад, инчунин майдонҳои синфи Java бо майдонҳои ҷадвали пойгоҳи додаҳо муқоиса карда мешаванд. Ин аст як мисоли лӯбиёи Entity бо шарҳҳо дар code:
@Entity // Делает данный класс Entity бином
@Table(name = "employee") // "Связывает" данный класс с таблицей employee в БД
public class Employee implements Serializable {

    @Id // Говорит о том, что поле ниже является первичным ключом
    @GeneratedValue(strategy = GenerationType.AUTO) // Определяет тип генерации значений первичного ключа
    private int id;

    @Column(name="name") // "Связывает" поле ниже с полем name в таблице employee в БД
    private String name;

    @Column (name="age") // "Связывает" поле ниже с полем age в таблице employee в БД
    private int age;

    // getters and setters...
}
Қобor зикр аст, ки ин навъи лӯбиё танҳо дар заминаи омӯзиши мушаххасоти JPA омӯхтан маъно дорад.

Навиштани ариза: EJB HelloWorld

Дар ин бахш мо як барномаи хурди Java EE HelloWorld менависем, ки онро дар serverи GlassFish ҷойгир мекунем. Пеш аз хондани ин мақола, тавсия дода мешавад, ки мақоларо дар бораи танзими муҳити маҳаллии худ хонед .
  1. Дар IntelliJ IDEA лоиҳаи нави Maven эҷод кунед.

    Файл -> Нав -> Лоиҳа...

    Муаррифии EJB - 3
  2. Next -ро клик кунед .

  3. Параметрҳои лоиҳаи Mavenро пур кунед:

    Муаррифии EJB - 4
  4. Finish -ро пахш кунед

  5. Лоиҳа сохта шудааст ва дорои сохтори зерин мебошад:

    Муаррифии EJB - 5
Файли pom.xml чунин менамояд: Муаррифии EJB - 6Пеш аз ҳама, мо бояд вобастагӣ ба Java EE API илова кунем ва инчунин бастабандии лоиҳаи худро дар шакли бойгонии веб-барнома (ҷанг) муайян кунем. Барои ин, шумо бояд рамзи pom.xml-ро ба шакли зерин иваз кунед:
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>com.javarush.lectures</groupId>
    <artifactId>ejb_demo</artifactId>
    <version>1.0-SNAPSHOT</version>
    <packaging>war</packaging>

    <dependencies>
        <dependency>
            <groupId>javax</groupId>
            <artifactId>javaee-api</artifactId>
            <version>7.0</version>
        </dependency>
    </dependencies>

</project>
Баъдан, шумо метавонед ба рамзи Java гузаред. Аризаи мо соддатарин хоҳад буд. Мо 1 сервлет ва 1 EJB хоҳем дошт. Ин лӯбиёи сеанси бидуни шаҳрвандӣ хоҳад буд. Дар дохor EJB мо танҳо 1 усулро муайян хоҳем кард, ки сатри "Hello World" -ро бармегардонад. Пеш аз ҳама, биёед баста эҷод кунем com.javarush.lectures. Сипас, дар дохor баста com.javarush.lectures, мо лӯбиёи худро эҷод мекунем - DemoEJB. Рамзи лӯбиё дар зер оварда шудааст:
import javax.ejb.Stateless;

@Stateless
public class DemoEJB {
    public String helloWorld() {
        return "Hello world!";
    }
}
Тавре ки дар боло гуфта шуд, ҳама чиз хеле оддӣ аст. Қадами навбатии мо эҷод кардани сервлет мебошад, ки арзишро аз EJB ҳамчун посух ба дархости HTTP интиқол медиҳад. Бояд қайд кард, ки сервлетҳо мавзӯи ин мақола нестанд, аммо ба ҳар ҳол шумо бояд онҳоро барои намоиш додани EJB истифода баред. Барои ин, биёед сервлети навро DemoServletдар ҳамон бастаи EJB созем. Рамзи он дар зер оварда шудааст:
@WebServlet("/helloWorld")
public class DemoServlet extends HttpServlet {

    @EJB
    private DemoEJB ejb;

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        resp.getWriter().write(ejb.helloWorld());
    }
}
Инҳоянд чанд шарҳи кӯтоҳ дар бораи code. Реферат @WebServlet("/helloWorld")- синфи моро ҳамчун сервлет муайян мекунад, ки дархостҳои HTTP-ро то нуқтаи ниҳоӣ коркард мекунад /helloWorld. Синфи мо як майдон дорад — DemoEJB ejb. Ин лӯбиёи мост, ки қаблан муайян карда шуда буд. Эзоҳ дар майдони синф — @EJBтазриқи вобастагӣ (DI) -ро иҷро мекунад. Онхое. Ҳангоми зарурат тағирёбандаи ejb ба таври худкор бо мисоли нав оғоз карда мешавад. Синфи мо насли HttpServlet аст ва яке аз усулҳои суперкласс - doGet. Ин усул дархостҳои HTTP GET-ро коркард мекунад ва ду параметрро мегирад - HttpServletRequestва HttpServletResponse. HttpServletRequestбарои гирифтани маълумот дар бораи дархости HTTP-и воридотӣ хизмат мекунад. HttpServletResponseбарои тавлиди посух ба дархост лозим аст. Дар дохor усул, мо an objectро PrintWriterаз an objectи посух ( HttpServletResponse), бо истифода аз getWriter(). Баъдан, мо метавонем бо истифода аз write. Дар асл, он чизест, ки мо ҳангоми навиштан ба PrintWriteran objectи -a арзише, ки аз EJB муайян кардаем, истифода мебарем (арзиш сатри "Салом Ҷаҳон!" аст). Муштарие, ки дархости HTTP-ро фиристодааст, ин арзишро ҳамчун посух ба дархости худ мегирад. Қадами навбатӣ оғози барнома дар serverи GlassFish Java EE мебошад. Барои ин, мо конфигуратсияи наверо эҷод мекунем, тавре ки дар мақолаи танзими муҳити маҳаллӣ тавсиф шудааст . Дар зер скриншоти конфигуратсияи анҷомёфта барои лоиҳаи ҷорӣ оварда шудааст. Боварӣ ҳосил кунед, ки шумо пеш аз оғоз serverи GlassFish насб кардаед: Муаррифии EJB - 7Пас аз сохтани конфигуратсияи оғозёбӣ, барномаро бо истифода аз менюи Иҷро -> Иҷроиши 'ejb_demo' ё бо истифода аз тугмаи Shift+F10 оғоз кунед . Пас аз оғоз, шумо метавонед гузоришҳои онро бинед: Муаррифии EJB - 8Ва инчунин браузери кушодашуда: Муаррифии EJB - 9Ҳамаи ин нишон медиҳад, ки барнома мувофиқи таъиншуда кор мекунад.

Хулоса

Дар ин мақола мо бо EJB - Enterprise JavaBeans шинос шудем. Мо чунин саволҳоро баррасӣ кардем:
  • EJB чист?
  • Таърихи EJB
  • Намудҳои гуногуни EJB
Ёдовар мешавем, ки EJB дар намудҳои зерин меоянд:
  • Message Driven Beans (лӯбиёи паёмнависӣ);
  • Entity Beans - дар мушаххасоти an objectҳои JPA (Java Persistence API) муайян карда шудааст ва барои нигоҳ доштани маълумот истифода мешавад;
  • Сеанси лӯбиё:
    • бешаҳрванд (бе давлат)
    • давлатӣ (бо дастгирии ҳолати сеанси ҷорӣ)
    • singleton (як an object барои тамоми барнома; сар карда аз EJB 3.1)
Мо инчунин бо истифода аз EJB як барномаи хурди HelloWorld навиштем. Ҳамчун PD, шумо метавонед қисми амалии ин мақоларо худатон такрор кунед. Ва он гоҳ ба замимаи шумо ду сервлети дигар илова кунед, ки барои гирифтани арзиш лӯбиёи давлатӣ ва ягонаро истифода мебаранд.
Шарҳҳо
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION