JavaRush /Blog Java /Random-MS /Memperkenalkan EJB
Анзор Кармов
Tahap
Санкт-Петербург

Memperkenalkan EJB

Diterbitkan dalam kumpulan
Dalam artikel ini kita akan melihat EJB - Enterprise JavaBeans. Teknologi ini adalah sebahagian daripada spesifikasi Java EE. Kami akan menyentuh isu seperti:
  • apa itu EJB;
  • apakah sejarah EJB;
  • apakah jenis EJB yang ada?
Kami juga akan menulis aplikasi HelloWorld kecil menggunakan EJB dan servlet. Memperkenalkan EJB - 1Artikel ini akan berguna kepada pembaca yang telah selesa dengan Java SE dan mula mempelajari Java EE. Untuk memahami sepenuhnya bahagian praktikal artikel ini, anda disyorkan supaya membaca artikel " Menyediakan persekitaran setempat " terlebih dahulu.

Sejarah Ringkas EJB

Pada tahun 1996, ketika pengarang artikel ini berumur 5 tahun, Java sudah popular di kalangan pembangun. Sebabnya ialah API yang mesra, kutipan sampah automatik, dsb. Java digunakan secara meluas dalam sistem yang bertanggungjawab untuk bahagian belakang. Walau bagaimanapun, di sebalik semua keseronokan bahasa itu, pengaturcara pada masa itu memerlukan fungsi tertentu yang belum dilaksanakan dalam JDK. Keperluan ini ialah:
  • memastikan kegigihan data;
  • integriti transaksi
  • akses kompetitif kepada data (kawalan berbilang benang);
  • dan kemungkinan besar sesuatu yang lain.
Semua ini membawa kepada pertumbuhan semula jadi dalam populasi perpustakaan yang ditanam sendiri, ditulis sendiri, dan tertutup. Dengan kata lain, setiap orang memenuhi keperluan mereka dengan sebaik mungkin. Itu sehingga IBM keluar dengan slogan, "Setiap orang harus memenuhi keperluan mereka dengan cara yang sama," dan mengeluarkan spesifikasi Enterprise Java Bean (EJB) pada tahun 1997. Ini yang memungkinkan untuk menyatukan proses pembangunan dan mengambil penyelesaian kepada masalah biasa (diterangkan di atas sebagai keperluan) ke rangka kerja. Sun telah menyesuaikan idea IBM selama 2 tahun, dan pada tahun 1999 mengeluarkan spesifikasi EJB 1.0. Ini adalah bagaimana teknologi itu dilahirkan, yang akan dibincangkan lebih lanjut dalam urat yang lebih diterapkan.

Apa itu EJB

EJB dalam erti kata lain ialah istilah kolektif yang, bergantung pada konteks, boleh bermaksud sama ada teknologi Enterprise JavaBeans itu sendiri secara umum, atau beberapa komponen perisian JavaBean Enterprise tertentu (kacang) yang merupakan sebahagian daripada teknologi EJB. Takrifan EJB sebagai teknologi diberikan di Wikipedia: Enterprise JavaBeans (juga sering digunakan sebagai singkatan EJB) ialah spesifikasi teknologi untuk menulis dan menyokong komponen pelayan yang mengandungi logik perniagaan. Ia adalah sebahagian daripada Java EE. Teknologi ini biasanya digunakan apabila logik perniagaan memerlukan sekurang-kurangnya satu daripada perkhidmatan berikut, dan selalunya kesemuanya:
  • sokongan untuk kegigihan data: data harus selamat walaupun selepas menghentikan program. Paling kerap dicapai menggunakan pangkalan data;
  • sokongan untuk transaksi yang diedarkan;
  • sokongan untuk pengubahsuaian data selari dan multithreading;
  • sokongan acara;
  • sokongan penamaan dan direktori (JNDI);
  • keselamatan dan sekatan akses kepada data;
  • sokongan untuk pemasangan automatik pada pelayan aplikasi;
  • akses jauh.
Perkhidmatan yang disenaraikan di atas adalah kelebihan teknologi EJB yang tidak diragui. Satu lagi kelebihan sedemikian ialah semua yang disenaraikan di atas berfungsi di luar kotak, serta-merta. Itu. pengaturcara tidak perlu memikirkan tentang menyokong transaksi yang diedarkan. Pengaturcara hanya perlu memikirkan logik perniagaan yang sedang dia cuba laksanakan. EJB sebagai komponen perisian khusus ialah kelas Java dengan satu atau lebih anotasi daripada spesifikasi EJB yang mengandungi beberapa logik perniagaan aplikasi. Anotasi daripada spesifikasi EJB memberikan kelas yang diberi tag kuasa, kuasa dan kuasa besar tertentu. Baca lebih lanjut mengenai perkara ini di bawah.

jenis EJB

Mari kita ringkaskan. EJB ialah kelas Java biasa yang ditandakan dengan salah satu anotasi khas. Kelas sedemikian dipanggil kacang. Bergantung pada anotasi kelas yang ditandakan, ia akan menjadi wakil satu atau satu lagi jenis EJB (kacang). Terdapat tiga jenis utama kacang:
  • Kacang Message Driven (kacang yang dipandu mesej);
  • Kacang Entiti - ditakrifkan dalam spesifikasi JPA (Java Persistence API) dan digunakan untuk menyimpan data;
  • Kacang Sesi.
Yang terakhir (kacang sesi) dibahagikan kepada beberapa subjenis:
  • tanpa negara (tanpa negara);
  • stateful (dengan sokongan untuk keadaan sesi semasa);
  • singleton (satu objek untuk keseluruhan aplikasi; bermula dari EJB 3.1).
Memperkenalkan EJB - 2Di bawah ini kita akan melihat setiap jenis kacang dengan lebih terperinci.

Kacang Sesi

Kacang Sesi, atau kacang sesi, adalah jenis kacang tertentu. Mereka merangkum logik perniagaan yang pelanggan boleh menggunakan pemrograman dengan memanggil kaedah kacang. Panggilan kaedah boleh dilakukan:
  • secara tempatan, oleh kelas lain dalam JVM yang sama dengan kacang sesi;
  • dari jauh, melalui rangkaian, dari JVM lain, menggunakan teknologi Java RMI (Remote Method Invocation).
Perkataan "sesi" membayangkan bahawa kacang tersedia hanya semasa pelayan menjalankan tugas tertentu dan musnah tidak dapat diperoleh semula sekiranya berlaku kegagalan atau penutupan pelayan. Kitaran hayat contoh kacang sesi dikawal oleh bekas EJB (anda boleh membaca lebih lanjut tentang bekas EJB dalam kuliah pertama siri ). Kacang sesi tanpa kewarganegaraan tidak menyimpan maklumat tentang keadaan mereka. Komponen jenis ini boleh digunakan oleh pelbagai pelanggan. Kacang tanpa kewarganegaraan digunakan untuk melaksanakan proses perniagaan yang boleh diselesaikan dalam satu operasi. Contohnya, menyemak sejarah kredit pelanggan. Oleh kerana contoh kacang tunggal boleh digunakan oleh berbilang pelanggan, pembangun mesti menyediakan akses selamat benang kepada data kacang. Mencipta kacang jenis ini (serta semua kacang sesi lain) agak mudah. Ini ialah kelas Java biasa dengan anotasi @Stateless. Mari kita berikan contoh di bawah:
import javax.ejb.Stateless;

@Stateless
public class StatelessEjbExample {
    public String sayHi() {
        return "Hi, I'm Stateless EJB!";
    }
}
Biji sesi yang menyokong keadaan sesi semasa (Stateful) mengekalkan maklumat tentang keadaan mereka antara panggilan kepadanya daripada pelanggan yang sama dan menamatkan kewujudannya atas permintaan eksplisit daripada pelanggan. Ini dicapai kerana fakta bahawa kacang stateful adalah unik untuk setiap pelanggan. Contoh tugas yang boleh dipertanggungjawabkan oleh kacang jenis ini ialah memastikan troli beli-belah di kedai dalam talian dikemas kini untuk setiap pengguna. Kitaran hayat kacang ini diuruskan oleh bekas EJB. Kacang ini juga musnah apabila pelanggan keluar. Kacang sedemikian juga agak mudah dibuat. Ini ialah kelas Java yang ditandakan dengan anotasi Stateful. Contoh di bawah:
import javax.ejb.Stateful;

@Stateful
public class StatefulEjbExample {
    public String sayHi() {
        return "Hi, I,m Stateful EJB";
    }
}
Kacang sesi singleton dimulakan sekali sepanjang hayat permohonan dan wujud sepanjang hayat permohonan. Kacang sedemikian direka untuk situasi di mana satu keadaan mesti dikongsi di kalangan semua pelanggan. Seperti kacang tanpa negara, dalam kacang kendiri pembangun perlu memastikan bahawa persekitaran di dalam kacang diatur dengan cara yang selamat dari benang. Mari kita berikan contoh kacang Singleton, yang semudah dibuat sebagai rakan sejawatannya, yang telah dibincangkan di atas. Sangat mudah untuk meneka bahawa ini adalah kelas Java dengan anotasi @Singleton. Walau bagaimanapun, dalam kes ini anda perlu berhati-hati. Terdapat dua anotasi, sama dalam sintaks, tetapi berbeza dalam tujuan dan terletak dalam pakej yang berbeza:
  • javax.ejb.Singleton
  • javax.inject.Singleton
Untuk membuat EJB, anda mesti menggunakan anotasi daripada javax.ejb. Contoh di bawah:
import javax.ejb.Singleton;

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

Kacang Message Driven

Kacang Didorong Mesej, atau MDB, atau kacang dipacu mesej, melaksanakan beberapa logik perniagaan, seperti kacang sesi. Tetapi tidak seperti saudara-maranya, MDB mempunyai satu perbezaan penting. Pelanggan tidak pernah menghubungi kaedah MDB secara langsung. Kacang sedemikian paling kerap bertindak sebagai pendengar untuk mesej JMS (Java Message Service) dan berfungsi untuk mengatur pertukaran mesej tak segerak antara bahagian sistem. Contoh mesej sedemikian ialah permintaan untuk penghantaran inventori daripada sistem runcit automatik kepada sistem pengurusan bekalan. Di bawah adalah contoh kacang MDB. Tidak seperti kacang sesi, penciptaannya sedikit lebih 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 MessageDrivenmenjadikan kelas MDB kami sebagai kacang. Di dalam anotasi, menggunakan JNDI (baca tentang JNDI di sini ), nama pengedaran JMS ditentukan, yang mana kelas kami menjadi pendengar. Di samping itu, kelas kami melaksanakan antara muka MessageListenerdan kaedahnya onMessage. Kaedah ini akan dipanggil apabila beberapa mesej tiba dari baris gilir/pengedaran dengan nama yang ditakrifkan di dalam anotasi MessageDriven.

Kacang entiti

Sebahagian daripada teknologi EJB ialah spesifikasi JPA. JPA, atau Java Persistence API, ialah spesifikasi yang menyediakan Pemetaan Perhubungan Objek (ORM) objek Java (kacang Entiti) dan menyediakan API untuk menyimpan, mendapatkan semula dan mengurus objek tersebut. JPA membolehkan anda mewakili data daripada pangkalan data sebagai objek Java, serta menyimpan objek Java sebagai rekod dalam pangkalan data. Tidak setiap kelas boleh bertindak sebagai objek sedemikian, tetapi kacang Entiti. Entity Bean ialah kelas Java yang mewakili jadual dalam pangkalan data. Paparan (pemetaan) dicapai melalui penggunaan anotasi khas. Dengan bantuan mereka, kelas Java dibandingkan dengan jadual dalam pangkalan data, serta medan kelas Java dibandingkan dengan medan jadual pangkalan data. Berikut ialah contoh kacang Entiti, dengan ulasan dalam kod:
@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...
}
Perlu diingat bahawa jenis kacang ini masuk akal untuk dikaji hanya dalam konteks mengkaji spesifikasi JPA.

Menulis permohonan: EJB HelloWorld

Dalam bahagian ini, kami akan menulis aplikasi Java EE HelloWorld kecil, yang akan kami gunakan pada pelayan GlassFish. Sebelum membaca artikel ini, amat disyorkan anda membaca artikel tentang menyediakan persekitaran setempat anda .
  1. Cipta projek Maven baharu dalam IntelliJ IDEA.

    Fail -> Baharu -> Projek...

    Memperkenalkan EJB - 3
  2. Klik Seterusnya .

  3. Isikan parameter projek Maven:

    Memperkenalkan EJB - 4
  4. Klik Selesai

  5. Projek ini telah dibuat dan mempunyai struktur berikut:

    Memperkenalkan EJB - 5
Fail pom.xml kelihatan seperti ini: Memperkenalkan EJB - 6Pertama sekali, kami perlu menambah kebergantungan pada Java EE API, dan juga menentukan pembungkusan projek kami dalam bentuk arkib aplikasi web (perang). Untuk melakukan ini, anda perlu menukar kod pom.xml kepada borang berikut:
<?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>
Seterusnya, anda boleh beralih ke kod Java. Permohonan kami akan menjadi yang paling mudah. Kami akan mempunyai 1 servlet dan 1 EJB. Ini akan menjadi kacang sesi tanpa negara. Di dalam EJB kami akan menentukan hanya 1 kaedah yang akan mengembalikan rentetan "Hello World". Pertama sekali, mari kita buat pakej com.javarush.lectures. Kemudian, di dalam pakej com.javarush.lectures, kami akan mencipta kacang kami - DemoEJB. Kod kacang diberikan di bawah:
import javax.ejb.Stateless;

@Stateless
public class DemoEJB {
    public String helloWorld() {
        return "Hello world!";
    }
}
Seperti yang dikatakan sebelum ini, semuanya agak mudah. Langkah seterusnya kami ialah mencipta servlet yang akan menghantar nilai dari EJB sebagai tindak balas kepada permintaan HTTP. Perlu diingat bahawa servlet bukan topik artikel ini, tetapi anda masih perlu menggunakannya untuk menunjukkan EJB. Untuk melakukan ini, mari kita cipta servlet baharu DemoServletdalam pakej yang sama dengan EJB. Kodnya adalah di bawah:
@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());
    }
}
Berikut adalah beberapa ulasan ringkas tentang kod tersebut. Abstrak @WebServlet("/helloWorld")- mentakrifkan kelas kami sebagai servlet yang akan memproses permintaan HTTP ke titik akhir /helloWorld. Kelas kami ada satu bidang - DemoEJB ejb. Ini adalah kacang kami yang ditakrifkan sebelum ini. Anotasi pada medan kelas— @EJBmelaksanakan suntikan kebergantungan (DI). Itu. Pembolehubah ejb dimulakan secara automatik dengan kejadian baharu apabila diperlukan. Kelas kami adalah keturunan HttpServlet dan mengatasi salah satu kaedah superclass - doGet. Kaedah ini memproses permintaan HTTP GET dan mengambil dua parameter - HttpServletRequestdan HttpServletResponse. HttpServletRequestberfungsi untuk mendapatkan maklumat tentang permintaan HTTP yang masuk. HttpServletResponsediperlukan untuk menghasilkan respons kepada permintaan. Di dalam kaedah, kita mendapat objek PrintWriterdaripada objek tindak balas ( HttpServletResponse), menggunakan getWriter(). Seterusnya, kita boleh menulis beberapa nilai pada objek yang dihasilkan menggunakan write. Yang, sebenarnya, adalah apa yang kami gunakan dengan menulis ke dalam PrintWriterobjek -a nilai yang diperoleh daripada EJB yang kami takrifkan (nilainya ialah rentetan "Hello World!"). Pelanggan yang menghantar permintaan HTTP akan menerima nilai ini sebagai respons kepada permintaannya. Langkah seterusnya ialah melancarkan aplikasi pada pelayan GlassFish Java EE. Untuk melakukan ini, kami akan membuat konfigurasi baharu, seperti yang diterangkan dalam artikel tentang menyediakan persekitaran setempat . Di bawah ialah tangkapan skrin konfigurasi siap untuk projek semasa. Pastikan anda memasang pelayan GlassFish sebelum memulakan: Memperkenalkan EJB - 7Selepas membuat konfigurasi pelancaran, lancarkan aplikasi menggunakan menu Run -> Run 'ejb_demo' atau menggunakan kekunci pintas Shift+F10 . Selepas pelancaran, anda boleh melihat lognya: Memperkenalkan EJB - 8Dan juga penyemak imbas yang dibuka: Memperkenalkan EJB - 9Semua ini menunjukkan bahawa aplikasi berfungsi seperti yang dimaksudkan.

Kesimpulan

Dalam artikel ini kami berkenalan dengan EJB - Enterprise JavaBeans. Kami mempertimbangkan soalan seperti:
  • Apa itu EJB?
  • Sejarah EJB
  • Pelbagai jenis EJB
Ingat bahawa EJB datang dalam jenis berikut:
  • Kacang Message Driven (kacang yang dipandu mesej);
  • Kacang Entiti - ditakrifkan dalam spesifikasi entiti JPA (Java Persistence API) dan digunakan untuk menyimpan data;
  • Kacang Sesi:
    • tanpa negara (tanpa negara)
    • stateful (dengan sokongan untuk keadaan sesi semasa)
    • singleton (satu objek untuk keseluruhan aplikasi; bermula dari EJB 3.1)
Kami juga menulis aplikasi HelloWorld kecil menggunakan EJB. Sebagai PD, anda boleh mengulangi bahagian praktikal artikel ini sendiri. Dan kemudian tambah dua lagi servlet pada aplikasi anda yang akan menggunakan kacang stateful dan singleton untuk menerima nilai.
Komen
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION