Ushbu maqolada biz EJB - Enterprise JavaBeans ni ko'rib chiqamiz. Ushbu texnologiya Java EE spetsifikatsiyasining bir qismidir. Biz quyidagi kabi masalalarga to'xtalamiz:
- EJB nima;
- EJB tarixi nima;
- EJB ning qanday turlari mavjud?
EJB ning qisqacha tarixi
1996 yilda, ushbu maqola muallifi 5 yoshga to'lganida, Java allaqachon ishlab chiquvchilar orasida mashhur edi. Buning sababi do'stona API, avtomatik axlat yig'ish va boshqalar edi. Java backend uchun mas'ul bo'lgan tizimlarda keng qo'llanilgan. Biroq, tilning barcha zavqlariga qaramay, o'sha davrdagi dasturchilar JDKda hali amalga oshirilmagan ma'lum funktsiyalarga muhtoj edi. Bu ehtiyojlar quyidagilar edi:- ma'lumotlarning barqarorligini ta'minlash;
- tranzaktsiyaning yaxlitligi
- ma'lumotlarga raqobatbardosh kirish (ko'p tarmoqli boshqaruv);
- va, ehtimol, boshqa narsa.
EJB nima
EJB ma'lum ma'noda umumiy atama bo'lib, kontekstga qarab, umuman Enterprise JavaBeans texnologiyasining o'zini yoki EJB texnologiyasining bir qismi bo'lgan ba'zi bir Enterprise JavaBean dasturiy komponentini (loviya) anglatishi mumkin. Texnologiya sifatida EJB ta'rifi Vikipediyada berilgan: Enterprise JavaBeans (shuningdek, EJB qisqartmasi sifatida ham qo'llaniladi) biznes mantiqini o'z ichiga olgan server komponentlarini yozish va qo'llab-quvvatlash texnologiyasining spetsifikatsiyasi. Bu Java EE ning bir qismidir. Ushbu texnologiya odatda biznes mantig'i quyidagi xizmatlardan kamida bittasini va ko'pincha ularning barchasini talab qilganda qo'llaniladi:- ma'lumotlarning doimiyligini qo'llab-quvvatlash: dastur to'xtatilgandan keyin ham ma'lumotlar xavfsiz bo'lishi kerak. Ko'pincha ma'lumotlar bazasi yordamida erishiladi;
- taqsimlangan operatsiyalarni qo'llab-quvvatlash;
- parallel ma'lumotlarni o'zgartirish va multithreading uchun qo'llab-quvvatlash;
- tadbirlarni qo'llab-quvvatlash;
- nomlash va kataloglarni qo'llab-quvvatlash (JNDI);
- xavfsizlik va ma'lumotlarga kirishni cheklash;
- dastur serverida avtomatlashtirilgan o'rnatishni qo'llab-quvvatlash;
- masofaviy kirish.
EJB turlari
Keling, xulosa qilaylik. EJB bu maxsus izohlardan biri bilan belgilangan oddiy Java sinfidir. Bunday sinflar fasol deb ataladi. Sinf qanday izoh bilan belgilanganiga qarab, u EJB (loviya) ning u yoki bu turining vakili bo'ladi. Fasolning uchta asosiy turi mavjud:- Message Driven Beans (xabarga asoslangan loviya);
- Entity Beans - JPA (Java Persistence API) spetsifikatsiyasida aniqlangan va ma'lumotlarni saqlash uchun ishlatiladi;
- Seans loviya.
- fuqaroligi bo'lmagan (davlatsiz);
- statistik (joriy sessiya holatini qo'llab-quvvatlash bilan);
- singleton (butun dastur uchun bitta ob'ekt; EJB 3.1 dan boshlab).
Seans loviya
Seans loviyalari yoki sessiya loviyalari loviyaning o'ziga xos turidir. Ular mijozning loviya usullarini chaqirish orqali dasturiy ravishda chaqirishi mumkin bo'lgan biznes mantiqini qamrab oladi. Usul chaqiruvi quyidagilarni amalga oshirishi mumkin:- mahalliy, seans fasoli bilan bir xil JVMdagi boshqa sinf tomonidan;
- masofadan, tarmoq orqali, boshqa JVM dan, Java RMI (Remote Method Invocation) texnologiyasidan foydalangan holda.
@Stateless
. Quyida bir misol keltiramiz:
import javax.ejb.Stateless;
@Stateless
public class StatelessEjbExample {
public String sayHi() {
return "Hi, I'm Stateless EJB!";
}
}
Joriy seans holatini (Statistik) qo'llab-quvvatlaydigan seans loviyalari bir mijozdan unga qo'ng'iroqlar orasidagi holati haqida ma'lumotni saqlab qoladi va mijozning aniq so'roviga binoan ularning mavjudligini to'xtatadi. Bunga davlat fasollari har bir mijoz uchun noyob bo'lganligi tufayli erishiladi. Ushbu turdagi loviya mas'ul bo'lishi mumkin bo'lgan vazifaga misol, har bir foydalanuvchi uchun onlayn-do'konda xarid qilish savatini yangilab turishdir. Ushbu fasollarning hayot aylanishi EJB konteyneri tomonidan boshqariladi. Bu fasol ham mijoz chiqib ketganda yo'q qilinadi. Bunday loviyalarni yaratish ham juda oson. Bu izoh bilan belgilangan Java sinfidir Stateful
. Quyidagi misol:
import javax.ejb.Stateful;
@Stateful
public class StatefulEjbExample {
public String sayHi() {
return "Hi, I,m Stateful EJB";
}
}
Singleton seans fasollari ilovaning amal qilish muddati davomida bir marta ishga tushiriladi va dasturning butun muddati davomida mavjud. Bunday loviya bir holat barcha mijozlar o'rtasida taqsimlanishi kerak bo'lgan holatlar uchun mo'ljallangan. Fuqaroligi bo'lmagan loviya kabi, mustaqil loviyalarda ishlab chiquvchi loviya ichidagi muhitni ip bilan xavfsiz tarzda tashkil etilishini ta'minlashi kerak. Keling, yuqorida muhokama qilingan hamkasblari kabi yaratilishi oson bo'lgan Singleton fasoliga misol keltiraylik. Bu izohga ega Java sinfi ekanligini taxmin qilish oson @Singleton
. Biroq, bu holatda siz ehtiyot bo'lishingiz kerak. Sintaksis bo'yicha bir xil, ammo maqsadi bo'yicha har xil va turli paketlarda joylashgan ikkita izoh mavjud:
- javax.ejb.Singleton
- javax.inject.Singleton
javax.ejb
. Quyidagi misol:
import javax.ejb.Singleton;
@Singleton
public class SingletonEjbExample {
public String sayHi() {
return "Hi, I'm Singleton EJB!";
}
}
Message Driven Beans
Message Driven Beans yoki MDBs yoki xabarga asoslangan fasol, masalan, seans fasollari, ba'zi biznes mantiqlarini amalga oshiradi. Ammo qarindoshlaridan farqli o'laroq, MDB bitta muhim farqga ega. Mijozlar hech qachon MDB usullarini to'g'ridan-to'g'ri chaqirmaydilar. Bunday fasollar ko'pincha JMS (Java Message Service) xabarlari uchun tinglovchi sifatida ishlaydi va tizim qismlari o'rtasida asinxron xabar almashinuvini tashkil qilish uchun xizmat qiladi. Bunday xabarga misol sifatida inventarizatsiyani avtomatlashtirilgan chakana savdo tizimidan ta'minotni boshqarish tizimiga etkazib berish bo'yicha so'rov bo'lishi mumkin. Quyida MDB loviya misoli keltirilgan. Seans loviyalaridan farqli o'laroq, uni yaratish biroz qiziqarliroq: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();
}
}
}
Izoh MessageDriven
bizning MDB sinfimizni loviya qiladi. Izoh ichida JNDI yordamida (JNDI haqida bu yerda o'qing ) JMS taqsimotining nomi aniqlanadi, bizning sinfimiz tinglovchiga aylanadi. Bundan tashqari, bizning sinfimiz interfeys MessageListener
va uning usulini amalga oshiradi onMessage
. Bu usul navbat/tarqatishdan izohda belgilangan nom bilan ba'zi xabar kelganda chaqiriladi MessageDriven
.
Birlik fasollari
EJB texnologiyasining bir qismi JPA spetsifikatsiyasidir. JPA yoki Java Persistence API - bu Java ob'yektlarining (Entity fasollari) Ob'ektga aloqador xaritalash (ORM) ni ta'minlovchi spetsifikatsiyasi va bunday ob'ektlarni saqlash, olish va boshqarish uchun API taqdim etadi. JPA ma'lumotlar bazasidagi ma'lumotlarni Java ob'ektlari sifatida ko'rsatishga, shuningdek Java ob'ektlarini ma'lumotlar bazasida yozuvlar sifatida saqlashga imkon beradi. Har bir sinf bunday ob'ekt sifatida harakat qila olmaydi, lekin Entity beans. Entity Bean - bu ma'lumotlar bazasidagi jadvalni ifodalovchi Java klassi. Displey (xaritalash) maxsus izohlardan foydalanish orqali erishiladi. Ularning yordami bilan Java sinfi ma'lumotlar bazasidagi jadval bilan, shuningdek, Java sinfining maydonlari ma'lumotlar bazasi jadvali maydonlari bilan taqqoslanadi. Mana koddagi izohlar bilan Entity loviya misoli:@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...
}
Shuni ta'kidlash kerakki, bu turdagi loviya faqat JPA spetsifikatsiyasini o'rganish kontekstida o'rganish mantiqiy.
Ariza yozish: EJB HelloWorld
Ushbu bo'limda biz kichik Java EE HelloWorld ilovasini yozamiz, uni GlassFish serverida joylashtiramiz. Ushbu maqolani o'qishdan oldin, mahalliy muhitni sozlash bo'yicha maqolani o'qib chiqish tavsiya etiladi .-
IntelliJ IDEA-da yangi Maven loyihasini yarating.
Fayl -> Yangi -> Loyiha...
-
Keyingiga bosing .
-
Maven loyihasi parametrlarini to'ldiring:
-
Finish tugmasini bosing
-
Loyiha yaratilgan va quyidagi tuzilishga ega:
<?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>
Keyin Java kodiga o'tishingiz mumkin. Bizning arizamiz eng oddiy bo'ladi. Bizda 1 ta servlet va 1 ta EJB bo'ladi. Bu fuqaroligi bo'lmagan seans loviya bo'ladi. EJB ichida biz "Salom dunyo" qatorini qaytaradigan faqat bitta usulni aniqlaymiz. Birinchidan, paketni yarataylik com.javarush.lectures
. Keyin, paket ichida com.javarush.lectures
biz o'z loviyamiz - DemoEJB yaratamiz. Fasol kodi quyida keltirilgan:
import javax.ejb.Stateless;
@Stateless
public class DemoEJB {
public String helloWorld() {
return "Hello world!";
}
}
Yuqorida aytib o'tilganidek, hamma narsa juda oddiy. Bizning keyingi qadamimiz HTTP so'roviga javob sifatida EJB qiymatini uzatadigan servlet yaratishdir. Shuni ta'kidlash kerakki, servletlar ushbu maqolaning mavzusi emas, lekin siz hali ham EJBni namoyish qilish uchun ulardan foydalanishingiz kerak bo'ladi. DemoServlet
Buning uchun EJB bilan bir xil paketda yangi servlet yarataylik . Uning kodi quyida:
@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());
}
}
Bu erda kod bo'yicha qisqacha sharhlar mavjud. Abstrakt @WebServlet("/helloWorld")
- bizning sinfimizni so'nggi nuqtaga HTTP so'rovlarini qayta ishlaydigan servlet sifatida belgilaydi /helloWorld
. Bizning sinfimiz bitta sohaga ega - DemoEJB ejb
. Bu bizning yuqorida tavsiflangan fasolimiz. Sinf maydoniga izoh - @EJB
qaramlik kiritishni (DI) amalga oshiradi. Bular. Ejb o'zgaruvchisi kerak bo'lganda avtomatik ravishda yangi misol bilan ishga tushiriladi. Bizning sinfimiz HttpServletning avlodidir va superklass usullaridan birini bekor qiladi - doGet
. Ushbu usul HTTP GET so'rovlarini qayta ishlaydi va ikkita parametrni oladi - HttpServletRequest
va HttpServletResponse
. HttpServletRequest
kiruvchi HTTP so'rovi haqida ma'lumot olish uchun xizmat qiladi. HttpServletResponse
so'rovga javob yaratish uchun kerak. Usul ichida biz ob'ektni PrintWriter
javob ob'ektidan ( HttpServletResponse
) yordamida olamiz getWriter()
. Keyinchalik, dan foydalanib, olingan ob'ektga qandaydir qiymat yozishimiz mumkin write
. Bu, aslida, biz aniqlagan EJB dan olingan qiymatni -a ob'ektiga yozishda foydalanamiz PrintWriter
(qiymat "Salom dunyo!" qatoridir). HTTP so'rovini yuborgan mijoz ushbu qiymatni so'roviga javob sifatida oladi. Keyingi qadam dasturni GlassFish Java EE serverida ishga tushirishdir. Buni amalga oshirish uchun biz maqolada tasvirlanganidek, yangi konfiguratsiyani yaratamiz mahalliy muhitni o'rnatish . Quyida joriy loyiha uchun tugallangan konfiguratsiyaning skrinshoti keltirilgan. Boshlashdan oldin GlassFish serveri o'rnatilganligiga ishonch hosil qiling: Ishga tushirish konfiguratsiyasini yaratgandan so'ng, Run -> Run 'ejb_demo' menyusidan yoki Shift+F10 tezkor tugmalaridan foydalanib dasturni ishga tushiring . Ishga tushgandan so'ng siz uning jurnallarini ko'rishingiz mumkin: Shuningdek, ochiladigan brauzer: Bularning barchasi dasturning mo'ljallanganidek ishlashini ko'rsatadi.
Xulosa
Ushbu maqolada biz EJB - Enterprise JavaBeans bilan tanishdik. Quyidagi kabi savollarni ko'rib chiqdik:- EJB nima?
- EJB tarixi
- EJB ning har xil turlari
- Message Driven Beans (xabarga asoslangan loviya);
- Entity Beans - JPA (Java Persistence API) ob'ektlar spetsifikatsiyasida belgilangan va ma'lumotlarni saqlash uchun ishlatiladi;
- Seans loviyalari:
- fuqaroligi bo'lmagan (davlatsiz)
- statistik (joriy sessiya holatini qo'llab-quvvatlagan holda)
- singleton (butun dastur uchun bitta ob'ekt; EJB 3.1 dan boshlab)
GO TO FULL VERSION