Bu makalada EJB - Enterprise JavaBeans-a serederis. Bu tehnologiýa Java EE spesifikasiýasynyň bir bölegidir. Issuesaly meselelere degip geçeris:
- EJB näme?
- EJB-iň taryhy näme?
- EJB haýsy görnüşleri bar?
EJB-iň gysgaça taryhy
1996-njy ýylda, bu makalanyň awtory 5 ýaşyndaka, Java eýýäm döredijileriň arasynda meşhur bolupdy. Munuň sebäbi dostlukly API, awtomatiki zibil ýygnamak we ş.m. Java arkasy üçin jogapkär ulgamlarda giňden ulanyldy. Şeýle-de bolsa, diliň ähli lezzetlerine garamazdan, şol döwrüň programmistleri JDK-da entek durmuşa geçirilmedik käbir funksiýalara mätäçdiler. Bu zerurlyklar:- maglumatlaryň dowamlylygyny üpjün etmek;
- geleşigiň bitewiligi
- maglumatlara bäsdeşlik ukyby (köp sapakly gözegçilik);
- we başga bir zat bolmagy ähtimal.
EJB näme
EJB belli bir manyda, kontekste baglylykda, ýa-da kärhana JavaBeans tehnologiýasynyň ýa-da EJB tehnologiýasynyň bir bölegi bolan belli bir kärhana JavaBean programma üpjünçiligi komponentini (noýba) aňladyp bilýän köpçülikleýin termin. EJB-ni tehnologiýa hökmünde kesgitlemesi Wikipediýada berilýär: Enterprise JavaBeans (köplenç EJB gysgaltmasy hökmünde hem ulanylýar), iş logikasyny öz içine alýan serwer komponentlerini ýazmak we goldamak tehnologiýasynyň spesifikasiýasydyr. Java EE-iň bir bölegi. Bu tehnologiýa, adatça, iş logikasy iň bolmanda aşakdaky hyzmatlardan birini talap edeninde ulanylýar we köplenç olaryň hemmesi:- maglumatlaryň dowamlylygy üçin goldaw: programmany togtatandan soň hem maglumatlar howpsuz bolmalydyr. Köplenç maglumat bazasyny ulanmak arkaly gazanylýar;
- paýlanan amallara goldaw;
- paralel maglumatlary üýtgetmek we köp okamak üçin goldaw;
- hadysany goldamak;
- at bermek we katalog goldawy (JNDI);
- howpsuzlyk we maglumatlara elýeterliligi çäklendirmek;
- programma serwerinde awtomatiki gurnama goldawy;
- uzakdan giriş.
EJB görnüşleri
Gysgaça jemläliň. EJB, ýörite bellikleriň biri bilen bellenen adaty Java synpy. Şeýle sapaklara noýba diýilýär. Synpyň haýsy bellik bilen bellenendigine baglylykda, ol EJB (noýba) bir ýa-da başga bir görnüşiniň wekili bolar. Fasuliniň üç esasy görnüşi bar:- Habar bilen dolandyrylýan noýba (habar bilen dolandyrylýan noýba);
- Entity fasuly - JPA (Java Persistence API) spesifikasiýasynda kesgitlenendir we maglumatlary saklamak üçin ulanylýar;
- Sessiýa noýbasy.
- raýatsyz (döwletsiz);
- döwletli (häzirki sessiýa ýagdaýyny goldamak bilen);
- singleton (tutuş programma üçin bir obýekt; EJB 3.1-den başlap).
Sessiýa noýbasy
Sessiýa noýbasy ýa-da seans noýbasy, noýbanyň belli bir görnüşidir. Müşderiniň noýba usullaryny çagyryp, programma taýdan ulanyp boljak iş logikasyny öz içine alýar. Usul jaňy edip biler:- ýerli, seans noýbasy ýaly JVM-de başga bir synp tarapyndan;
- uzakdan, tordan, başga bir JVM-den, Java RMI (Uzakdan usul çagyryş) tehnologiýasyny ulanyp.
@Stateless
. Aşakda bir mysal getireliň:
import javax.ejb.Stateless;
@Stateless
public class StatelessEjbExample {
public String sayHi() {
return "Hi, I'm Stateless EJB!";
}
}
Häzirki sessiýa ýagdaýyny goldaýan sessiýa noýbasy, şol bir müşderiden edilen jaňlaryň arasynda öz ýagdaýy barada maglumatlary saklaýar we müşderiniň aç-açan haýyşy boýunça barlygyny bes edýär. Bu, döwlet noýbasynyň her bir müşderi üçin özboluşlydygy sebäpli gazanylýar. Bu görnüşli noýba jogapkär bolup biljek meseläniň mysaly, söwda arabasyny onlaýn ulanyjyda her ulanyjy üçin täzeläp durmakdyr. Bu noýbalaryň ömrüni EJB konteýner dolandyrýar. Müşderi çykanda bu noýba hem ýok edilýär. Şeýle noýba döretmek hem aňsat. Bu düşündiriş bilen bellenen Java synpy Stateful
. Aşakdaky mysal:
import javax.ejb.Stateful;
@Stateful
public class StatefulEjbExample {
public String sayHi() {
return "Hi, I,m Stateful EJB";
}
}
“Singleton” seans noýbasy, programmanyň dowamlylygynyň dowamynda bir gezek başlaýar we programmanyň bütin ömri üçin bar. Şeýle noýba bir müşderiniň arasynda bir ştatyň paýlaşylmaly ýagdaýlary üçin niýetlenendir. Raýatsyz noýba ýaly, özbaşdak noýba görnüşinde öndüriji noýbanyň içindäki daşky gurşawyň sapak taýdan tertipli bolmagyny üpjün etmeli. Aboveokarda ara alnyp maslahatlaşylan kärdeşleri ýaly döretmek aňsat bolan “Singleton” noýbasyna mysal bereliň. Munuň düşündirişli Java synpydygyny çaklamak aňsat @Singleton
. Şeýle-de bolsa, bu ýagdaýda seresap bolmaly. Sintaksisde birmeňzeş, ýöne maksady dürli we dürli paketlerde ýerleşýän iki sany düşündiriş bar:
- javax.ejb.Singleton
- javax.inject.Singleton
javax.ejb
. Aşakdaky mysal:
import javax.ejb.Singleton;
@Singleton
public class SingletonEjbExample {
public String sayHi() {
return "Hi, I'm Singleton EJB!";
}
}
Habar bilen dolandyrylýan noýba
Habar bilen dolandyrylýan noýba, ýa-da MDB, ýa-da sessiýa noýbasy ýaly habarly noýba käbir iş logikasyny durmuşa geçirýär. Emma garyndaşlaryndan tapawutlylykda MDB-de bir möhüm tapawut bar. Müşderiler hiç haçan MDB usullaryna göni jaň etmeýärler. Şeýle noýba köplenç JMS (Java Message Service) habarlaryny diňleýji hökmünde çykyş edýär we ulgamyň bölekleriniň arasynda asynkron habar alyş-çalşyny guraýar. Şeýle habaryň mysaly, awtomatiki bölek satuw ulgamyndan üpjünçilik dolandyryş ulgamyna inwentarlary ibermek haýyşy bolup biler. Aşakda MDB noýbasynyň mysaly. Sessiýa noýbasyndan tapawutlylykda, onuň döredilmegi birneme gyzykly: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();
}
}
}
Annotasiýa MessageDriven
MDB synpymyzy noýba edýär. Annotasiýanyň içinde JNDI ulanyp (JNDI hakda okaň ) , JMS paýlanyşynyň ady kesgitlenýär, synpymyz diňleýji bolýar. Mundan başga-da, synpymyz interfeýsi MessageListener
we usuly ýerine ýetirýär onMessage
. Bu usul, düşündirişiň içinde kesgitlenen at bilen nobatdan / paýlanyşdan käbir habar gelende çagyrylar MessageDriven
.
Kärhana noýbasy
EJB tehnologiýasynyň bir bölegi JPA spesifikasiýasydyr. JPA, ýa-da Java Persistence API, Java obýektleriniň (Entity noýba) obýekt-baglanyşyk kartasyny (ORM) üpjün edýän we şular ýaly zatlary saklamak, almak we dolandyrmak üçin API üpjün edýän spesifikasiýa. JPA maglumatlar bazasyndan maglumatlary Java obýektleri hökmünde görkezmäge, şeýle hem Java obýektlerini maglumatlar bazasyndaky ýazgylar hökmünde ýatda saklamaga mümkinçilik berýär. Her synp beýle obýekt hökmünde hereket edip bilmeýär, ýöne kärhana noýbasy. Entity Bean, maglumatlar bazasyndaky tablisany görkezýän Java synpydyr. Ekran (kartalaşdyrmak) ýörite bellikleri ulanmak arkaly gazanylýar. Olaryň kömegi bilen Java synpy maglumatlar bazasyndaky tablisa bilen deňeşdirilýär, şeýle hem Java synp meýdanlary maglumatlar bazasynyň tablisalary bilen deňeşdirilýär. Ine, koddaky düşündirişler bilen “Entity” noýbasynyň mysaly:@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...
}
Fasulye bu görnüşiniň diňe JPA spesifikasiýasyny öwrenmek kontekstinde öwrenmegiň manylydygyny bellemelidiris.
Programma ýazmak: EJB HelloWorld
Bu bölümde, GlassFish serwerinde ýerleşdirjek kiçijik Java EE HelloWorld programmasyny ýazarys. Bu makalany okamazdan ozal ýerli gurşawyňyzy gurmak baradaky makalany okamagyňyz maslahat berilýär .-
IntelliJ IDEA-da täze Maven taslamasyny dörediň.
Faýl -> Täze -> Taslama ...
-
"Indiki" düwmesine basyň .
-
Maven taslamasynyň parametrlerini dolduryň:
-
"Finish" -e basyň
-
Taslama döredildi we aşakdaky gurluşy bar:
<?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>
Ondan soň Java koduna geçip bilersiňiz. Biziň arzamyz iň ýönekeý bolar. Bizde 1 servlet we 1 EJB bolar. Bu raýatlygy bolmadyk sessiýa noýbasy bolar. EJB-iň içinde “Salam dünýä” setirini yzyna gaýtarjak diňe 1 usuly kesgitläris. Ilki bilen bukja döredeliň com.javarush.lectures
. Soň bolsa, bukjanyň içinde com.javarush.lectures
noýba - DemoEJB dörederis. Fasulye kody aşakda berilýär:
import javax.ejb.Stateless;
@Stateless
public class DemoEJB {
public String helloWorld() {
return "Hello world!";
}
}
Öň aýdylyşy ýaly hemme zat gaty ýönekeý. Indiki ädimimiz, HTTP haýyşyna jogap hökmünde EJB-den bahany geçirjek servlet döretmekdir. Serwletleriň bu makalanyň mowzugy däldigini bellemelidiris, ýöne EJB-ni görkezmek üçin olary ulanmaly bolarsyňyz. DemoServlet
Munuň üçin EJB bilen bir paketde täze servlet döredeliň . Onuň kody aşakda:
@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());
}
}
Ine kod hakda gysga teswirler. Abstrakt @WebServlet("/helloWorld")
- synpymyzy HTTP haýyşlaryny ahyrky nokada çenli işleýän serwlet hökmünde kesgitleýär /helloWorld
. Biziň synpymyzyň bir ugry bar - DemoEJB ejb
. Bu öň kesgitlenen noýba. Synp meýdançasynyň üstünde düşündiriş - @EJB
garaşlylyk sanjymyny (DI) ýerine ýetirýär. Bular. Ejb üýtgeýjisi, zerur bolanda awtomatiki usulda täze mysal bilen başlaýar. Biziň synpymyz HttpServlet-iň neslidir we superklass usullaryndan birini ýok edýär - doGet
. Bu usul HTTP GET haýyşlaryny işleýär we iki parametr alýar - HttpServletRequest
we HttpServletResponse
. HttpServletRequest
gelýän HTTP haýyşy barada maglumat almaga hyzmat edýär. HttpServletResponse
haýyşa jogap döretmek üçin zerur. Usulyň içinde, obýekti ulanyp, PrintWriter
jogap obýektinden ( HttpServletResponse
) alýarys getWriter()
. Ondan soň, ulanylan netijä belli bir baha ýazyp bileris write
. Aslynda, kesgitlän PrintWriter
EJB-den alnan baha-obýekti ýazmak bilen ulanýan zadymyz (bahasy “Salam Dünýä!” Setiridir). HTTP haýyşyny iberen müşderi, islegine jogap hökmünde bu bahany alar. Indiki ädim, programmany GlassFish Java EE serwerinde işe girizmek. Munuň üçin ýerli gurşawy gurmak baradaky makalada beýan edilişi ýaly täze konfigurasiýa dörederis . Aşakda häzirki taslama üçin taýýar konfigurasiýanyň skrinshoty görkezilýär. Başlamazdan ozal GlassFish serweriniň gurnalandygyna göz ýetiriň: Işletmek konfigurasiýasyny döredeniňizden soň, Run -> Run 'ejb_demo' menýusyny ýa-da Shift + F10 düwmesini ulanyp programmany işe giriziň . Işledilenden soň, onuň gündeligini görüp bilersiňiz: Şeýle hem açylýan brauzer: Bularyň hemmesi programmanyň niýetlenilişi ýaly işleýändigini görkezýär.
Netije
Bu makalada EJB - Enterprise JavaBeans bilen tanyşdyk. Questionsaly soraglara garadyk:- EJB näme?
- EJB Taryhy
- EJB-leriň dürli görnüşleri
- Habar bilen dolandyrylýan noýba (habar bilen dolandyrylýan noýba);
- Kärhana noýbasy - JPA (Java Persistence API) guramalarynyň spesifikasiýasynda kesgitlenýär we maglumatlary saklamak üçin ulanylýar;
- Sessiýa noýbasy:
- raýatsyz (döwletsiz)
- döwletli (häzirki sessiýa ýagdaýyny goldamak bilen)
- singleton (tutuş programma üçin bir obýekt; EJB 3.1-den başlap)
GO TO FULL VERSION