Panduan untuk Pola Pengawal Depan di Jawa

1. Gambaran keseluruhan

Dalam tutorial ini kita akan menggali lebih jauh ke dalam Pola Pengawal Depan , bagian dari Pola Perusahaan seperti yang didefinisikan dalam buku Martin Fowler "Pola Arsitektur Aplikasi Perusahaan".

Pengawal Depan didefinisikan sebagai "pengawal yang menangani semua permintaan untuk laman web". Ini berdiri di hadapan aplikasi web dan mendelegasikan permintaan ke sumber seterusnya. Ini juga menyediakan antara muka untuk tingkah laku biasa seperti keselamatan, pengantarabangsaan dan menyampaikan pandangan tertentu kepada pengguna tertentu.

Ini membolehkan aplikasi mengubah tingkah lakunya pada waktu berjalan. Selain itu, ia membantu membaca dan menyelenggara aplikasi dengan mengelakkan penduaan kod.

Pengawal Depan menyatukan semua pengendalian permintaan dengan menyalurkan permintaan melalui satu objek pengendali.

2. Bagaimana Ia Berfungsi?

The Pengawal Front corak terutamanya dibahagikan kepada dua bahagian. Pengawal penghantaran tunggal dan hierarki arahan. UML berikut menggambarkan hubungan kelas pelaksanaan Pengawal Depan generik:

Pengawal tunggal ini mengirimkan permintaan ke perintah untuk mencetuskan tingkah laku yang berkaitan dengan permintaan.

Untuk menunjukkan pelaksanaannya, kami akan menerapkan pengawal di FrontControllerServlet dan memerintahkan sebagai kelas yang diwarisi dari FrontCommand abstrak .

3. Persediaan

3.1. Ketergantungan Maven

Pertama, kami akan menyediakan projek Maven WAR baru dengan javax.servlet-api termasuk:

 javax.servlet javax.servlet-api 4.0.0-b01 provided  

serta plugin jetty-maven :

 org.eclipse.jetty jetty-maven-plugin 9.4.0.M1   /front-controller   

3.2. Model

Seterusnya, kami akan menentukan kelas Model dan model Repositori . Kami akan menggunakan kelas Buku berikut sebagai model kami:

public class Book { private String author; private String title; private Double price; // standard constructors, getters and setters }

Ini akan menjadi repositori, anda boleh mencari kod sumber untuk pelaksanaan konkrit atau memberikannya sendiri:

public interface Bookshelf { default void init() { add(new Book("Wilson, Robert Anton & Shea, Robert", "Illuminati", 9.99)); add(new Book("Fowler, Martin", "Patterns of Enterprise Application Architecture", 27.88)); } Bookshelf getInstance();  boolean add(E book); Book findByTitle(String title); }

3.3. ServController Depan

Pelaksanaan Servlet itu sendiri agak mudah. Kami mengekstrak nama perintah dari permintaan, membuat secara dinamis contoh baru kelas perintah dan melaksanakannya.

Ini membolehkan kita menambah perintah baru tanpa mengubah asas kod Pengawal Depan kita .

Pilihan lain adalah melaksanakan Servlet menggunakan logik bersyarat, bersyarat. Ini mempunyai kelebihan pemeriksaan ralat waktu kompilasi:

public class FrontControllerServlet extends HttpServlet { @Override protected void doGet(HttpServletRequest request, HttpServletResponse response) { FrontCommand command = getCommand(request); command.init(getServletContext(), request, response); command.process(); } private FrontCommand getCommand(HttpServletRequest request) { try { Class type = Class.forName(String.format( "com.baeldung.enterprise.patterns.front." + "controller.commands.%sCommand", request.getParameter("command"))); return (FrontCommand) type .asSubclass(FrontCommand.class) .newInstance(); } catch (Exception e) { return new UnknownCommand(); } } }

3.4. Perintah Depan

Mari kita laksanakan kelas abstrak yang disebut FrontCommand , yang memegang tingkah laku yang biasa untuk semua perintah.

Kelas ini mempunyai akses ke ServletContext dan objek permintaan dan responsnya. Selanjutnya, ia akan menangani resolusi paparan:

public abstract class FrontCommand { protected ServletContext context; protected HttpServletRequest request; protected HttpServletResponse response; public void init( ServletContext servletContext, HttpServletRequest servletRequest, HttpServletResponse servletResponse) { this.context = servletContext; this.request = servletRequest; this.response = servletResponse; } public abstract void process() throws ServletException, IOException; protected void forward(String target) throws ServletException, IOException { target = String.format("/WEB-INF/jsp/%s.jsp", target); RequestDispatcher dispatcher = context.getRequestDispatcher(target); dispatcher.forward(request, response); } }

Pelaksanaan konkrit dari FrontCommand yang abstrak ini adalah SearchCommand . Ini akan merangkumi logik bersyarat untuk kes di mana buku dijumpai atau ketika buku hilang:

public class SearchCommand extends FrontCommand { @Override public void process() throws ServletException, IOException { Book book = new BookshelfImpl().getInstance() .findByTitle(request.getParameter("title")); if (book != null) { request.setAttribute("book", book); forward("book-found"); } else { forward("book-notfound"); } } }

Sekiranya aplikasi berjalan, kita dapat mencapai perintah ini dengan mengarahkan penyemak imbas kita ke // localhost: 8080 / front-controller /? Command = Search & title = pattern.

The SearchCommand ketetapan kepada dua pandangan, pandangan kedua boleh diuji dengan permintaan berikut // localhost: 8080 / front-pengawal / arahan = Search & title = apa-apa hakmilik?.

Untuk melengkapkan senario kami, kami akan melaksanakan perintah kedua, yang diaktifkan sebagai fallback dalam semua keadaan, permintaan perintah tidak diketahui oleh Servlet:

public class UnknownCommand extends FrontCommand { @Override public void process() throws ServletException, IOException { forward("unknown"); } }

Paparan ini dapat dicapai di // localhost: 8080 / front-controller /? Command = Order & title = any-title atau dengan meninggalkan parameter URL sepenuhnya .

4. Penyebaran

Kerana kami memutuskan untuk membuat projek fail WAR , kami memerlukan deskriptor penyebaran web. Dengan web.xml ini kami dapat menjalankan aplikasi web kami di mana-mana wadah Servlet:

   front-controller  com.baeldung.enterprise.patterns.front.controller.FrontControllerServlet    front-controller /  

Sebagai langkah terakhir kami akan menjalankan 'mvn install jetty: run' dan memeriksa pandangan kami di penyemak imbas.

5. Kesimpulan

Seperti yang telah kita lihat sejauh ini, kita sekarang harus mengenal Pola Pengawal Depan dan pelaksanaannya sebagai hierarki Servlet dan perintah.

Seperti biasa, anda akan menemui sumber di GitHub.