Pengenalan kepada ActiveWeb

Java Teratas

Saya baru sahaja mengumumkan kursus Learn Spring yang baru , yang berfokus pada asas-asas Spring 5 dan Spring Boot 2:

>> SEMAK KURSUS

1. Gambaran keseluruhan

Dalam artikel ini, kami akan menggambarkan Activeweb - kerangka web tumpukan penuh dari JavaLite - menyediakan semua yang diperlukan untuk pengembangan aplikasi web dinamik atau perkhidmatan web REST-ful.

2. Konsep dan Prinsip Asas

Activeweb memanfaatkan "konvensyen atas konfigurasi" - yang bermaksud ia dapat dikonfigurasi, tetapi mempunyai default yang masuk akal dan tidak memerlukan konfigurasi tambahan. Kita hanya perlu mengikuti beberapa konvensyen yang telah ditetapkan, seperti kelas penamaan, kaedah, dan bidang dalam format yang ditentukan sebelumnya.

Ia juga mempermudah pembangunan dengan mengumpulkan dan memuatkan semula sumber ke dalam wadah yang sedang berjalan (Jeti secara lalai).

Untuk pengurusan pergantungan, ia menggunakan Google Guice sebagai kerangka DI; untuk mengetahui lebih lanjut mengenai Guice, lihat panduan kami di sini.

3. Persediaan Maven

Untuk memulakan, mari tambahkan kebergantungan yang diperlukan terlebih dahulu:

 org.javalite activeweb 1.15  

Versi terbaru boleh didapati di sini.

Selain itu, untuk menguji aplikasi, kami memerlukan pergantungan pengujian web aktif :

 org.javalite activeweb-testing 1.15 test 

Lihat versi terkini di sini.

4. Struktur Aplikasi

Seperti yang telah kita bincangkan, struktur aplikasi perlu mengikuti konvensyen tertentu; inilah yang kelihatan seperti aplikasi MVC biasa:

Seperti yang kita lihat, pengawal , perkhidmatan , konfigurasi , dan model harus berada di sub-paket mereka sendiri dalam pakej aplikasi .

Pandangan harus terletak di direktori WEB-INF / paparan , masing-masing mempunyai subdirektori sendiri berdasarkan nama pengawal. Contohnya app.controllers.ArticleController harus mempunyai artikel / sub-direktori yang mengandungi semua fail paparan untuk pengawal tersebut.

Penerangan penyebaran atau web.xml biasanya mengandungi adan yang sesuai . Oleh kerana kerangka kerja adalah servlet filter, bukankonfigurasi terdapat konfigurasi penapis:

...  dispatcher org.javalite.activeweb.RequestDispatcher ...  ...

Kami juga memerlukan root_controller untuk menentukan pengawal lalai untuk aplikasi - serupa dengan pengawal rumah :

...  root_controller home  ...

5. Pengawal

Pengawal adalah komponen utama Aplikasi ActiveWeb; dan, seperti yang disebutkan sebelumnya, semua pengendali harus berada di dalam pakej app.controllers

public class ArticleController extends AppController { // ... }

Perhatikan bahawa pengawal memperluas org.javalite.activeweb.AppController.

5.1. Pemetaan URL Pengawal

Pengawal dipetakan ke URL secara automatik berdasarkan konvensyen. Contohnya, ArticleController akan dipetakan ke:

//host:port/contextroot/article

Sekarang, ini akan dipetakan ke tindakan lalai lalai dalam pengawal. Tindakan hanyalah kaedah di dalam pengawal. Namakan kaedah lalai sebagai indeks ():

public class ArticleController extends AppController { // ... public void index() { render("articles"); } // ... }

Untuk kaedah atau tindakan lain tambahkan nama kaedah ke URL:

public class ArticleController extends AppController { // ... public void search() { render("search"); } }

URL:

//host:port/contextroot/article/search

Kita bahkan boleh melakukan tindakan pengawal berdasarkan kaedah HTTP. Cukup beri penjelasan kaedah dengan salah satu daripada @POST, @PUT, @DELETE, @GET, @HEAD. Sekiranya kami tidak memberi penjelasan mengenai tindakan, tindakan ini dianggap sebagai GET secara lalai.

5.2. Resolusi URL Pengawal

Rangka kerja menggunakan nama pengawal dan nama sub-paket untuk menghasilkan URL pengawal. Contohnya app.controllers.ArticleController.java URL:

//host:port/contextroot/article

Sekiranya pengawal berada di dalam sub-paket, URL menjadi:

//host:port/contextroot/baeldung/article

Untuk nama pengawal yang mempunyai lebih daripada satu perkataan (contohnya app.controllers.PublishedArticleController.java ), URL akan dipisahkan menggunakan garis bawah:

//host:port/contextroot/published_article

5.3. Mengambil Parameter Permintaan

Di dalam pengawal, kami mendapat akses ke parameter permintaan menggunakan kaedah param () atau params () dari kelas AppController. Kaedah pertama mengambil argumen String - nama param untuk mendapatkan:

public void search() { String keyword = param("key"); view("search",articleService.search(keyword)); }

Dan kita boleh menggunakan kemudian untuk mendapatkan semua parameter jika kita perlu:

public void search() { Map criterion = params(); // ... }

6. Pandangan

Dalam terminologi ActiveWeb, paparan sering disebut sebagai templat; ini kebanyakannya kerana menggunakan mesin templat Apache FreeMarker dan bukannya JSP. Anda boleh membaca lebih lanjut mengenai FreeMarker dalam panduan kami, di sini.

Letakkan templat di direktori WEB-INF / paparan . Setiap pengawal harus mempunyai sub-direktori dengan namanya yang memegang semua templat yang diperlukan olehnya.

6.1. Pemetaan Paparan Pengawal

When a controller is hit, the default action index() gets executed and the framework will choose the WEB-INF/views/article/index.ftl template the from views directory for that controller. Similarly, for any other action, the view would be chosen based on the action name.

This isn't always what we would like. Sometimes we might want to return some views based on internal business logic. In this scenario, we can control the process with the render() method from the parent org.javalite.activeweb.AppController class:

public void index() { render("articles"); }

Note that the location of the custom views should also be in the same view directory for that controller. If it is not the case, prefix the template name with the directory name where the template resides and pass it to the render() method:

render("/common/error");

6.3. Views With Data

To send data to the views, the org.javalite.activeweb.AppController provides the view() method:

view("articles", articleService.getArticles());

This takes two params. First, the object name used to access the object in the template and second an object containing the data.

We can also use assign() method to pass data to the views. There is absolutely no difference between view() and assign() methods – we may choose any one of them:

assign("article", articleService.search(keyword));

Let's map the data in the template:

Articles ...  ${article.title}${article.author}${article.words}${article.date}

7. Managing Dependencies

In order to manage objects and instances, ActiveWeb uses Google Guice as a dependency management framework.

Let's say we need a service class in our application; this would separate the business logic from the controllers.

Let's first create a service interface:

public interface ArticleService { List getArticles(); Article search(String keyword); }

And the implementation:

public class ArticleServiceImpl implements ArticleService { public List getArticles() { return fetchArticles(); } public Article search(String keyword) { Article ar = new Article(); ar.set("title", "Article with "+keyword); ar.set("author", "baeldung"); ar.set("words", "1250"); ar.setDate("date", Instant.now()); return ar; } }

Now, let's bind this service as a Guice module:

public class ArticleServiceModule extends AbstractModule { @Override protected void configure() { bind(ArticleService.class).to(ArticleServiceImpl.class) .asEagerSingleton(); } }

Finally, register this in the application context and inject it into the controller, as required:

public class AppBootstrap extends Bootstrap { public void init(AppContext context) { } public Injector getInjector() { return Guice.createInjector(new ArticleServiceModule()); } }

Note that this config class name must be AppBootstrap and it should be located in the app.config package.

Finally, here's how we inject it into the controller:

@Inject private ArticleService articleService;

8. Testing

Unit tests for an ActiveWeb application are written using the JSpec library from JavaLite.

We'll use the org.javalite.activeweb.ControllerSpec class from JSpec to test our controller, and we'll name the test classes following a similar convention:

public class ArticleControllerSpec extends ControllerSpec { // ... }

Notice, that the name is similar to the controller it is testing with a “Spec” at the end.

Here's the test case:

@Test public void whenReturnedArticlesThenCorrect() { request().get("index"); a(responseContent()) .shouldContain("Introduction to Mule"); }

Notice that the request() method simulates the call to the controller, and the corresponding HTTP method get(), takes the action name as an argument.

We can also pass parameters to the controller using the params() method:

@Test public void givenKeywordWhenFoundArticleThenCorrect() { request().param("key", "Java").get("search"); a(responseContent()) .shouldContain("Article with Java"); }

To pass multiple parameters, we can chain method as well, with this fluent API.

9. Deploying the Application

Ada kemungkinan menyebarkan aplikasi di mana-mana bekas servlet seperti Tomcat, WildFly atau Jetty. Sudah tentu, kaedah paling mudah untuk menggunakan dan menguji adalah menggunakan plugin Maven Jetty:

...  org.eclipse.jetty jetty-maven-plugin 9.4.8.v20171121  manual 10000   ...

Versi terbaru pemalam ada di sini.

Sekarang, akhirnya - kita boleh menghidupkannya:

mvn jetty:run

10. Kesimpulannya

Dalam artikel ini, kami belajar mengenai konsep asas dan konvensyen kerangka ActiveWeb. Di samping itu, kerangka ini mempunyai lebih banyak ciri dan kemampuan daripada apa yang telah kita bincangkan di sini.

Sila rujuk dokumentasi rasmi untuk maklumat lebih lanjut.

Dan, seperti biasa, contoh kod yang digunakan dalam artikel tersebut terdapat di GitHub.

Bahagian bawah Java

Saya baru sahaja mengumumkan kursus Learn Spring yang baru , yang berfokus pada asas-asas Spring 5 dan Spring Boot 2:

>> SEMAK KURSUS