Pengenalan kepada Apache Tapestry

1. Gambaran keseluruhan

Pada masa kini, dari rangkaian sosial hingga perbankan, penjagaan kesihatan hingga perkhidmatan kerajaan, semua aktiviti tersedia dalam talian. Oleh itu, mereka sangat bergantung pada aplikasi web.

Aplikasi web membolehkan pengguna menggunakan / menikmati perkhidmatan dalam talian yang disediakan oleh syarikat. Pada masa yang sama, ia berfungsi sebagai antara muka ke perisian backend.

Dalam tutorial pendahuluan ini, kita akan meneroka kerangka web Apache Tapestry dan membuat aplikasi web sederhana menggunakan ciri asas yang disediakannya.

2. Permadani Apache

Apache Tapestry adalah kerangka kerja berdasarkan komponen untuk membangun aplikasi web yang berskala.

Ia mengikuti paradigma konvensyen-over-konfigurasi dan menggunakan anotasi dan konvensyen penamaan untuk konfigurasi.

Semua komponen adalah POJO sederhana. Pada masa yang sama, mereka dikembangkan dari awal dan tidak bergantung pada perpustakaan lain.

Bersama dengan sokongan Ajax, Tapestry juga mempunyai kemampuan pelaporan pengecualian yang hebat. Ia juga menyediakan perpustakaan komponen umum terpasang yang luas.

Di antara ciri-ciri hebat lain, yang menonjol adalah memuat semula kod yang panas. Oleh itu, dengan menggunakan ciri ini, kita dapat melihat perubahan secara langsung dalam persekitaran pembangunan.

3. Persediaan

Apache Tapestry memerlukan satu set alat yang mudah untuk membuat aplikasi web:

  • Java 1.6 atau lebih baru
  • Alat Binaan (Maven atau Gradle)
  • IDE (Gerhana atau IntelliJ)
  • Pelayan Aplikasi (Tomcat atau Jeti)

Dalam tutorial ini, kita akan menggunakan gabungan Java 8, Maven, Eclipse, dan Jetty Server.

Untuk menyiapkan projek Apache Tapestry terbaru, kami akan menggunakan pola dasar Maven dan mengikuti arahan yang diberikan oleh dokumentasi rasmi:

$ mvn archetype:generate -DarchetypeCatalog=//tapestry.apache.org

Atau, jika kita mempunyai projek yang ada, kita hanya boleh menambahkan kebergantungan inti permadani ke pom.xml :

 org.apache.tapestry tapestry-core 5.4.5 

Setelah kami siap dengan penyediaan, kami dapat memulakan aplikasi apache-tapestry dengan perintah Maven berikut:

$ mvn jetty:run

Secara lalai, aplikasi akan dapat diakses di localhost: 8080 / apache-tapestry :

4. Struktur Projek

Mari terokai susun atur projek yang dibuat oleh Apache Tapestry:

Kita dapat melihat struktur projek seperti Maven, bersama dengan beberapa pakej berdasarkan konvensyen.

Kelas Java ditempatkan dalam src / main / java dan dikategorikan sebagai komponen , halaman , dan perkhidmatan.

Begitu juga, src / main / resource memegang templat kami (serupa dengan fail HTML) - ini mempunyai sambungan .tml

Untuk setiap kelas Java yang diletakkan di bawah direktori komponen dan halaman , fail templat dengan nama yang sama harus dibuat.

Direktori src / main / webapp mengandungi sumber seperti gambar, helaian gaya, dan fail JavaScript. Begitu juga, fail ujian diletakkan dalam src / test .

Terakhir, src / laman web akan mengandungi fail dokumentasi.

Untuk idea yang lebih baik, mari kita lihat struktur projek yang dibuka di Eclipse IDE:

5. Anotasi

Mari kita bincangkan beberapa anotasi berguna yang disediakan oleh Apache Tapestry untuk penggunaan sehari-hari. Ke depan, kami akan menggunakan anotasi ini dalam pelaksanaan kami.

5.1. @Suntik

The @Inject anotasi adalah tersedia di org.apache.tapestry5.ioc.annotations pakej dan menyediakan cara yang mudah untuk menyuntik kebergantungan dalam kelas Java.

Anotasi ini cukup berguna untuk memasukkan aset, blok, sumber, dan perkhidmatan.

5.2. @InjectPage

Terdapat dalam pakej org.apache.tapestry5.annotations , anotasi @InjectPage membolehkan kami menyuntik halaman ke komponen lain. Juga, halaman yang disuntikkan selalu menjadi harta baca sahaja.

5.3. @InjectComponent

Begitu juga, anotasi @InjectComponent membolehkan kita memasukkan komponen yang ditentukan dalam templat.

5.4. @Log

The @Log anotasi adalah tersedia di org.apache.tapestry5.annotations pakej dan berguna untuk membolehkan pembalakan tahap DEBUG pada mana-mana kaedah. Ini log masuk dan keluar kaedah, bersama dengan nilai parameter.

5.5. @Properti

Available in the org.apache.tapestry5.annotations package, the @Property annotation marks a field as a property. At the same time, it automatically creates getters and setters for the property.

5.6. @Parameter

Similarly, the @Parameter annotation denotes that a field is a component parameter.

6. Page

So, we're all set to explore the basic features of the framework. Let's create a new Home page in our app.

First, we'll define a Java class Home in the pages directory in src/main/java:

public class Home { }

6.1. Template

Then, we'll create a corresponding Home.tml template in the pages directory under src/main/resources.

A file with the extension .tml (Tapestry Markup Language) is similar to an HTML/XHTML file with XML markup provided by Apache Tapestry.

For instance, let's have a look at the Home.tml template:

  apache-tapestry Home   

Voila! Simply by restarting the Jetty server, we can access the Home page at localhost:8080/apache-tapestry/home:

6.2. Property

Let's explore how to render a property on the Home page.

For this, we'll add a property and a getter method in the Home class:

@Property private String appName = "apache-tapestry"; public Date getCurrentTime() { return new Date(); }

To render the appName property on the Home page, we can simply use ${appName}.

Similarly, we can write ${currentTime} to access the getCurrentTime method from the page.

6.3. Localization

Apache Tapestry provides integrated localization support. As per convention, a page name property file keeps the list of all the local messages to render on the page.

For instance, we'll create a home.properties file in the pages directory for the Home page with a local message:

introMsg=Welcome to the Apache Tapestry Tutorial

The message properties are different from the Java properties.

For the same reason, the key name with the message prefix is used to render a message property — for instance, ${message:introMsg}.

6.4. Layout Component

Let's define a basic layout component by creating the Layout.java class. We'll keep the file in the components directory in src/main/java:

public class Layout { @Property @Parameter(required = true, defaultPrefix = BindingConstants.LITERAL) private String title; }

Here, the title property is marked required, and the default prefix for binding is set as literal String.

Then, we'll write a corresponding template file Layout.tml in the components directory in src/main/resources:

  ${title} 
     

© Your Company

Now, let's use the layout on the home page:

${message:introMsg}

${currentTime}

Note, the namespace is used to identify the elements (t:type and t:body) provided by Apache Tapestry. At the same time, the namespace also provides components and attributes.

Here, the t:type will set the layout on the home page. And, the t:body element will insert the content of the page.

Let's take a look at the Home page with the layout:

7. Form

Let's create a Login page with a form, to allow users to sign-in.

As already explored, we'll first create a Java class Login:

public class Login { // ... @InjectComponent private Form login; @Property private String email; @Property private String password; }

Here, we've defined two properties — email and password. Also, we've injected a Form component for the login.

Then, let's create a corresponding template login.tml:

Please sign in

Now, we can access the login page at localhost:8080/apache-tapestry/login:

8. Validation

Apache Tapestry provides a few built-in methods for form validation. It also provides ways to handle the success or failure of the form submission.

The built-in method follows the convention of the event and the component name. For instance, the method onValidationFromLogin will validate the Login component.

Likewise, methods like onSuccessFromLogin and onFailureFromLogin are for success and failure events respectively.

So, let's add these built-in methods to the Login class:

public class Login { // ... void onValidateFromLogin() { if (email == null) System.out.println("Email is null); if (password == null) System.out.println("Password is null); } Object onSuccessFromLogin() { System.out.println("Welcome! Login Successful"); return Home.class; } void onFailureFromLogin() { System.out.println("Please try again with correct credentials"); } }

9. Alerts

Form validation is incomplete without proper alerts. Not to mention, the framework also has built-in support for alert messages.

For this, we'll first inject the instance of the AlertManager in the Login class to manage the alerts. Then, replace the println statements in existing methods with the alert messages:

public class Login { // ... @Inject private AlertManager alertManager; void onValidateFromLogin() { if(email == null || password == null) { alertManager.error("Email/Password is null"); login.recordError("Validation failed"); //submission failure on the form } } Object onSuccessFromLogin() { alertManager.success("Welcome! Login Successful"); return Home.class; } void onFailureFromLogin() { alertManager.error("Please try again with correct credentials"); } }

Let's see the alerts in action when the login fails:

10. Ajax

So far, we've explored the creation of a simple home page with a form. At the same time, we've seen the validations and support for alert messages.

Next, let's explore the Apache Tapestry's built-in support for Ajax.

First, we'll inject the instance of the AjaxResponseRenderer and Block component in the Home class. Then, we'll create a method onCallAjax for processing the Ajax call:

public class Home { // .... @Inject private AjaxResponseRenderer ajaxResponseRenderer; @Inject private Block ajaxBlock; @Log void onCallAjax() { ajaxResponseRenderer.addRender("ajaxZone", ajaxBlock); } }

Also, we need to make a few changes in our Home.tml.

First, we'll add the eventLink to invoke the onCallAjax method. Then, we'll add a zone element with id ajaxZone to render the Ajax response.

Last, we need to have a block component that will be injected in the Home class and rendered as Ajax response:

Call Ajax


Rendered through Ajax

The current time is: ${currentTime}

Let's take a look at the updated home page:

Then, we can click the Call Ajax button and see the ajaxResponseRenderer in action:

11. Logging

To enable the built-in logging feature, the instance of the Logger is required to be injected. Then, we can use it to log at any level like TRACE, DEBUG, and INFO.

Oleh itu, mari buat perubahan yang diperlukan di kelas Rumah :

public class Home { // ... @Inject private Logger logger; void onCallAjax() { logger.info("Ajax call"); ajaxResponseRenderer.addRender("ajaxZone", ajaxBlock); } }

Sekarang, apabila kita mengklik butang Call Ajax, logger akan log pada tahap INFO:

[INFO] pages.Home Ajax call 

12. Kesimpulannya

Dalam artikel ini, kami telah meneroka kerangka web Apache Tapestry.

Sebagai permulaan, kami telah membuat aplikasi web permulaan cepat dan menambahkan Halaman Utama menggunakan ciri asas Apache Tapestry, seperti komponen , halaman , dan templat .

Kemudian, kami telah memeriksa beberapa anotasi berguna yang disediakan oleh Apache Tapestry untuk mengkonfigurasi harta dan komponen / suntikan halaman.

Terakhir, kami telah meneroka sokongan Ajax dan logging yang disediakan oleh rangka kerja.

Seperti biasa, semua pelaksanaan kod tersedia di GitHub.