Ing artikel iki kita bakal ndeleng EJB - Enterprise JavaBeans. Teknologi iki minangka bagéan saka spesifikasi Java EE. Kita bakal nyentuh babagan masalah kayata:
- apa EJB;
- apa sajarah EJB;
- Apa jinis EJB sing ana?
Sejarah Singkat EJB
Mbalik ing taun 1996, nalika panulis artikel iki umur 5 taun, Jawa wis misuwur ing kalangan pangembang. Alesan kanggo iki yaiku API sing ramah, koleksi sampah otomatis, lsp. Jawa iki akeh digunakake ing sistem tanggung jawab kanggo backend. Nanging, senadyan kabeh ditresnani saka basa, programer wektu iku mbutuhake fungsi tartamtu sing durung dileksanakake ing JDK. Kabutuhan kasebut yaiku:- njamin ketekunan data;
- integritas transaksi
- akses kompetitif kanggo data (kontrol multi-threading);
- lan paling kamungkinan liyane.
Apa iku EJB
EJB minangka istilah kolektif sing, gumantung saka konteks, bisa uga tegese teknologi Enterprise JavaBeans ing umum, utawa sawetara komponen piranti lunak Enterprise JavaBean tartamtu (kacang) sing minangka bagean saka teknologi EJB. Definisi EJB minangka teknologi diwenehake ing Wikipedia: Enterprise JavaBeans (uga asring digunakake minangka singkatan EJB) minangka spesifikasi teknologi kanggo nulis lan ndhukung komponen server sing ngemot logika bisnis. Iku bagéan saka Java EE. Teknologi iki biasane digunakake nalika logika bisnis mbutuhake paling ora siji saka layanan ing ngisor iki, lan asring kabeh:- dhukungan kanggo ketekunan data: data kudu aman sanajan program mandheg. Paling asring digayuh nggunakake database;
- dhukungan kanggo transaksi sing disebarake;
- dhukungan kanggo modifikasi data paralel lan multithreading;
- dhukungan acara;
- jeneng lan dhukungan direktori (JNDI);
- keamanan lan watesan akses menyang data;
- dhukungan kanggo instalasi otomatis ing server aplikasi;
- akses remot.
jinis EJB
Ayo ngringkes. EJB minangka kelas Jawa biasa sing ditandhani karo salah sawijining anotasi khusus. Kelas kasebut diarani kacang buncis. Gumantung ing anotasi kelas sing ditandhani, bakal dadi wakil saka siji utawa liyane jinis EJB (kacang buncis). Ana telung jinis utama kacang buncis:- Kacang buncis pesen (kacang buncis pesen);
- Entity Beans - ditetepake ing spesifikasi JPA (Java Persistence API) lan digunakake kanggo nyimpen data;
- Kacang Sesi.
- stateless (tanpa negara);
- stateful (kanthi dhukungan kanggo kahanan sesi saiki);
- singleton (siji obyek kanggo kabeh aplikasi; wiwit saka EJB 3.1).
Kacang Sesi
Kacang Sesi, utawa kacang sesi, minangka jinis kacang tartamtu. Padha encapsulate logika bisnis sing klien bisa programmatically invoke dening nelpon cara kacang. Panggilan metode bisa ditindakake:- lokal, dening kelas liyane ing JVM padha karo kacang sesi;
- mbatalake, liwat jaringan, saka JVM liyane, nggunakake teknologi Java RMI (Remote Method Invocation).
@Stateless
. Ayo menehi conto ing ngisor iki:
import javax.ejb.Stateless;
@Stateless
public class StatelessEjbExample {
public String sayHi() {
return "Hi, I'm Stateless EJB!";
}
}
Kacang buncis sing ndhukung negara sesi saiki (Stateful) nahan informasi babagan negara kasebut ing antarane telpon saka klien sing padha lan mungkasi eksistensi kasebut kanthi panjaluk sing jelas saka klien. Iki digayuh amarga kasunyatan manawa kacang buncis unik kanggo saben klien. Conto tugas sing jinis kacang iki bisa tanggung jawab yaiku njaga keranjang blanja ing toko online nganti saiki kanggo saben pangguna. Siklus urip kacang buncis iki dikelola dening wadhah EJB. Kacang buncis iki uga dirusak nalika klien metu. Kacang buncis kasebut uga gampang digawe. Iki kelas Jawa sing ditandhani karo anotasi Stateful
. Tuladha ing ngisor iki:
import javax.ejb.Stateful;
@Stateful
public class StatefulEjbExample {
public String sayHi() {
return "Hi, I,m Stateful EJB";
}
}
Kacang buncis sesi Singleton diwiwiti sapisan sajrone umur aplikasi lan ana kanggo kabeh umur aplikasi. Kacang buncis kasebut dirancang kanggo kahanan sing siji negara kudu dienggo bareng karo kabeh klien. Kaya kacang buncis tanpa negara, ing kacang sing mandiri, pangembang kudu mesthekake yen lingkungan ing jero kacang diatur kanthi cara sing aman. Ayo menehi conto kacang Singleton, sing gampang digawe kaya mitra, sing wis dibahas ing ndhuwur. Iku gampang kanggo guess sing iki kelas Jawa karo anotasi @Singleton
. Nanging, ing kasus iki sampeyan kudu ati-ati. Ana rong anotasi, padha ing sintaksis, nanging beda tujuane lan dumunung ing paket sing beda:
- javax.ejb.Singleton
- javax.inject.Singleton
javax.ejb
. Tuladha ing ngisor iki:
import javax.ejb.Singleton;
@Singleton
public class SingletonEjbExample {
public String sayHi() {
return "Hi, I'm Singleton EJB!";
}
}
Kacang buncis pesen
Kacang Kacang Pesen, utawa MDB, utawa kacang buncis pesen, ngetrapake sawetara logika bisnis, kaya kacang sesi. Nanging ora kaya sederek, MDB duwe siji prabédan penting. Klien ora tau nelpon cara MDB langsung. Kacang buncis kuwi paling kerep dadi pamireng kanggo pesen JMS (Java Message Service) lan digunakake kanggo ngatur ijol-ijolan pesen asinkron ing antarane bagean sistem. Conto pesen kasebut bakal dadi panyuwunan kanggo pangiriman persediaan saka sistem ritel otomatis menyang sistem manajemen pasokan. Ing ngisor iki minangka conto kacang MDB. Ora kaya kacang buncis, nggawe luwih menarik:
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();
}
}
}
Anotasi kasebut MessageDriven
ndadekake kelas MDB kita dadi kacang. Ing jero anotasi, nggunakake JNDI (waca babagan JNDI ing kene ), jeneng distribusi JMS ditemtokake, sing kelas kita dadi pamireng. Kajaba iku, kelas kita ngetrapake antarmuka MessageListener
lan metodee onMessage
. Cara iki bakal diarani nalika sawetara pesen teka saka antrian / distribusi kanthi jeneng sing ditetepake ing anotasi MessageDriven
.
Kacang entitas
Bagéyan saka teknologi EJB yaiku spesifikasi JPA. JPA, utawa Java Persistence API, minangka spesifikasi sing nyedhiyakake Object-Relational Mapping (ORM) saka obyek Java (Entity beans) lan nyedhiyakake API kanggo nyimpen, njupuk, lan ngatur obyek kasebut. JPA ngidini sampeyan makili data saka database minangka obyek Jawa, uga nyimpen obyek Jawa minangka cathetan ing database. Ora saben kelas bisa tumindak minangka obyek kasebut, nanging kacang Entitas. Entity Bean minangka kelas Java sing makili tabel ing basis data. Tampilan (pemetaan) digayuh kanthi nggunakake anotasi khusus. Kanthi bantuan, kelas Jawa dibandhingake karo tabel ing basis data, uga kolom kelas Jawa dibandhingake karo kolom tabel basis data. Punika conto kacang Entitas, kanthi komentar ing kode:
@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...
}
Wigati dimangerteni manawa jinis kacang iki bisa disinaoni mung ing konteks sinau spesifikasi JPA.
Nulis aplikasi: EJB HelloWorld
Ing bagean iki, kita bakal nulis aplikasi Java EE HelloWorld cilik, sing bakal kita pasang ing server GlassFish. Sadurunge maca artikel iki, disaranake sampeyan maca artikel babagan nyetel lingkungan lokal sampeyan .-
Nggawe proyek Maven anyar ing IntelliJ IDEA.
File -> New -> Project...
-
Klik Sabanjure .
-
Isi parameter proyek Maven:
-
Klik Rampung
-
Proyèk wis digawe lan nduweni struktur ing ngisor iki:
<?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>
Sabanjure, sampeyan bisa pindhah menyang kode Jawa. Aplikasi kita bakal paling gampang. Kita bakal duwe 1 servlet lan 1 EJB. Iki bakal dadi kacang sesi tanpa negara. Ing EJB kita bakal nemtokake mung 1 cara sing bakal ngasilake senar "Hello World". Kaping pisanan, ayo nggawe paket com.javarush.lectures
. Banjur, ing njero paket com.javarush.lectures
, kita bakal nggawe kacang - DemoEJB. Kode kacang diwenehi ing ngisor iki:
import javax.ejb.Stateless;
@Stateless
public class DemoEJB {
public String helloWorld() {
return "Hello world!";
}
}
Minangka ngandika sadurungé, kabeh iku cukup prasaja. Langkah sabanjure yaiku nggawe servlet sing bakal menehi nilai saka EJB minangka respon kanggo panjalukan HTTP. Wigati dicathet yen servlet dudu topik artikel iki, nanging sampeyan isih kudu nggunakake kanggo nuduhake EJB. Kanggo nindakake iki, ayo nggawe servlet anyar DemoServlet
ing paket sing padha karo EJB. Kode kasebut ing ngisor iki:
@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());
}
}
Kene sawetara komentar singkat ing kode. Abstrak @WebServlet("/helloWorld")
- nemtokake kelas kita minangka servlet sing bakal ngolah panjaluk HTTP menyang titik pungkasan /helloWorld
. Kelas kita duwe lapangan siji - DemoEJB ejb
. Iki kacang buncis kita ditetepake sadurunge. Anotasi ing lapangan kelas - @EJB
nindakake injeksi dependensi (DI). Sing. Variabel ejb kanthi otomatis diwiwiti kanthi conto anyar yen dibutuhake. Kelas kita minangka turunan saka HttpServlet lan ngatasi salah sawijining metode superclass - doGet
. Cara iki ngolah panjalukan HTTP GET lan njupuk rong paramèter - HttpServletRequest
lan HttpServletResponse
. HttpServletRequest
serves kanggo njupuk informasi babagan panjalukan HTTP sing mlebu. HttpServletResponse
dibutuhake kanggo ngasilake respon kanggo panjaluk. Ing metode kasebut, kita entuk obyek PrintWriter
saka obyek respon ( HttpServletResponse
), nggunakake getWriter()
. Sabanjure, kita bisa nulis sawetara nilai menyang obyek sing diasilake nggunakake write
. Sing, ing kasunyatan, apa sing digunakake kanthi nulis menyang PrintWriter
obyek -a nilai sing dipikolehi saka EJB sing ditetepake (nilai kasebut minangka senar "Hello World!"). Klien sing ngirim panjalukan HTTP bakal nampa nilai iki minangka respon kanggo panjalukane. Langkah sabanjure yaiku mbukak aplikasi ing server GlassFish Java EE. Kanggo nindakake iki, kita bakal nggawe konfigurasi anyar, kaya sing diterangake ing artikel babagan nyetel lingkungan lokal . Ing ngisor iki minangka gambar saka konfigurasi rampung kanggo proyek saiki. Priksa manawa sampeyan wis nginstal server GlassFish sadurunge miwiti: Sawise nggawe konfigurasi peluncuran, bukak aplikasi nggunakake Run -> Run 'ejb_demo' menu utawa nggunakake Shift+F10 hotkey . Sawise diluncurake, sampeyan bisa ndeleng log: Lan uga browser sing mbukak: Kabeh iki nuduhake yen aplikasi kasebut bisa digunakake.
Kesimpulan
Ing artikel iki, kita kenal karo EJB - Enterprise JavaBeans. Kita nimbang pitakonan kayata:- Apa EJB?
- Riwayat EJB
- Macem-macem jinis EJB
- Kacang buncis pesen (kacang buncis pesen);
- Entity Beans - ditetepake ing spesifikasi entitas JPA (Java Persistence API) lan digunakake kanggo nyimpen data;
- Kacang Sesi:
- stateless (tanpa negara)
- stateful (kanthi dhukungan kanggo kahanan sesi saiki)
- singleton (siji obyek kanggo kabeh aplikasi; wiwit saka EJB 3.1)
GO TO FULL VERSION