JavaRush /Blog Jawa /Random-JV /Ngenalke EJB
Анзор Кармов
tingkat
Санкт-Петербург

Ngenalke EJB

Diterbitake ing grup
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?
Kita uga bakal nulis aplikasi HelloWorld cilik nggunakake EJB lan servlets. Ngenalake EJB - 1Artikel iki bakal migunani kanggo para pamaca sing wis kepenak karo Java SE lan wiwit sinau basa Jawa EE. Kanggo mangerteni kanthi lengkap babagan praktis artikel iki, disaranake sampeyan maca artikel " Nyetel lingkungan lokal ".

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.
Kabeh iki mimpin kanggo wutah alam ing populasi omah-thukul, nulis poto, perpustakaan tertutup. Ing tembung liya, saben wong nyukupi kabutuhane sabisane. Iku nganti IBM metu karo slogan, "Saben uwong kudu nyukupi kabutuhan kanthi cara sing padha," lan ngrilis spesifikasi Enterprise Java Bean (EJB) ing taun 1997. Iki sing nggawe bisa nyawiji proses pangembangan lan njupuk solusi kanggo masalah khas (diterangake ing ndhuwur minangka kabutuhan) menyang kerangka. Sun wis adaptasi gagasan IBM sajrone 2 taun, lan ing taun 1999 ngrilis spesifikasi EJB 1.0. Iki minangka teknologi lair, sing bakal dibahas luwih lanjut ing urat sing luwih ditrapake.

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.
Layanan sing kadhaptar ing ndhuwur minangka kauntungan teknologi EJB sing ora diragukan. Kauntungan liyane yaiku kabeh sing kadhaptar ing ndhuwur bisa digunakake kanthi langsung. Sing. programmer ora perlu mikir bab ndhukung transaksi mbagekke. Programmer mung kudu mikir babagan logika bisnis sing saiki nyoba ditindakake. EJB minangka komponen piranti lunak tartamtu yaiku kelas Java kanthi siji utawa luwih anotasi saka spesifikasi EJB sing ngemot sawetara logika bisnis aplikasi kasebut. Anotasi saka spesifikasi EJB menehi kakuwasan, kekuwatan, lan superpower tartamtu marang kelas sing diwenehi tag. Waca liyane babagan iki ing ngisor iki.

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.
Sing terakhir (buncis sesi) dipérang dadi sawetara subtipe:
  • stateless (tanpa negara);
  • stateful (kanthi dhukungan kanggo kahanan sesi saiki);
  • singleton (siji obyek kanggo kabeh aplikasi; wiwit saka EJB 3.1).
Ngenalake EJB - 2Ing ngisor iki kita bakal nliti saben jinis kacang kanthi luwih rinci.

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).
Tembung "sesi" nuduhake yen buncis mung kasedhiya nalika server nindakake tugas tartamtu lan ora bisa dirusak yen ana kegagalan utawa mati server. Siklus urip saka conto kacang sesi dikontrol dening wadhah EJB (sampeyan bisa maca liyane babagan wadhah EJB ing kuliah pertama seri ). Kacang buncis tanpa negara ora nyimpen informasi babagan negarane. Jinis komponen iki bisa digunakake dening macem-macem klien. Kacang buncis stateless digunakake kanggo ngleksanakake proses bisnis sing bisa rampung ing siji operasi. Contone, mriksa riwayat kredit klien. Amarga conto kacang siji bisa digunakake dening pirang-pirang klien, pangembang kudu nyedhiyakake akses aman kanggo data kacang. Nggawe kacang jinis iki (uga kabeh kacang sesi liyane) cukup prasaja. Iki minangka kelas Jawa biasa kanthi anotasi @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
Kanggo nggawe EJB, sampeyan kudu nggunakake anotasi saka 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 MessageDrivenndadekake 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 MessageListenerlan 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 .
  1. Nggawe proyek Maven anyar ing IntelliJ IDEA.

    File -> New -> Project...

    Ngenalake EJB - 3
  2. Klik Sabanjure .

  3. Isi parameter proyek Maven:

    Ngenalake EJB - 4
  4. Klik Rampung

  5. Proyèk wis digawe lan nduweni struktur ing ngisor iki:

    Ngenalake EJB - 5
File pom.xml katon kaya iki: Ngenalake EJB - 6Kaping pisanan, kita kudu nambah ketergantungan ing Java EE API, lan uga nemtokake kemasan proyek kita ing wangun arsip aplikasi web (perang). Kanggo nindakake iki, sampeyan kudu ngganti kode pom.xml menyang formulir 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 DemoServleting 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 - @EJBnindakake 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 - HttpServletRequestlan HttpServletResponse. HttpServletRequestserves kanggo njupuk informasi babagan panjalukan HTTP sing mlebu. HttpServletResponsedibutuhake kanggo ngasilake respon kanggo panjaluk. Ing metode kasebut, kita entuk obyek PrintWritersaka 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 PrintWriterobyek -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: Ngenalake EJB - 7Sawise nggawe konfigurasi peluncuran, bukak aplikasi nggunakake Run -> Run 'ejb_demo' menu utawa nggunakake Shift+F10 hotkey . Sawise diluncurake, sampeyan bisa ndeleng log: Ngenalake EJB - 8Lan uga browser sing mbukak: Ngenalake EJB - 9Kabeh 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
Elinga yen EJB kasedhiya ing jinis ing ngisor iki:
  • 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)
Kita uga nulis aplikasi HelloWorld cilik nggunakake EJB. Minangka PD, sampeyan bisa mbaleni bagean praktis saka artikel iki dhewe. Banjur tambahake rong servlet menyang aplikasi sampeyan sing bakal nggunakake kacang buncis stateful lan singleton kanggo nampa nilai kasebut.
Komentar
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION