- Apache Tapestry 教程
- Apache Tapestry - 首頁
- Apache Tapestry - 概述
- Apache Tapestry - 架構
- Apache Tapestry - 安裝
- Apache Tapestry - 快速入門
- Apache Tapestry - 專案佈局
- 約定優於配置
- Apache Tapestry - 註解
- 頁面和元件
- Apache Tapestry - 模板
- Apache Tapestry - 元件
- 內建元件
- 表單和驗證元件
- Apache Tapestry - Ajax元件
- Apache Tapestry - Hibernate整合
- Apache Tapestry - 儲存
- 高階特性
- Apache Tapestry 有用資源
- Apache Tapestry - 快速指南
- Apache Tapestry - 有用資源
- Apache Tapestry - 討論
Apache Tapestry - Hibernate整合
本章將討論BeanEditForm和Grid元件與Hibernate的整合。Hibernate透過Hibernate模組整合到Tapestry中。要啟用Hibernate模組,請在pom.xml檔案中新增tapestry-hibernate依賴項,並可選地新增hsqldb。現在,透過位於資原始檔夾根目錄下的hibernate.cfg.xml檔案配置Hibernate。
pom.xml (部分)
<dependency>
<groupId>org.apache.tapestry</groupId>
<artifactId>tapestry-hibernate</artifactId>
<version>${tapestry-release-version}</version>
</dependency>
<dependency>
<groupId>org.hsqldb</groupId>
<artifactId>hsqldb</artifactId>
<version>2.3.2</version>
</dependency>
Hibernate.cfg.xml
<!DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
<session-factory>
<property name = "hibernate.connection.driver_class">
org.hsqldb.jdbcDriver
</property>
<property name = "hibernate.connection.url">
jdbc:hsqldb:./target/work/sampleapp;shutdown = true
</property>
<property name = "hibernate.dialect">
org.hibernate.dialect.HSQLDialect
</property>
<property name = "hibernate.connection.username">sa</property>
<property name = "hibernate.connection.password"></property>
<property name = "hbm2ddl.auto">update</property>
<property name = "hibernate.show_sql">true</property>
<property name = "hibernate.format_sql">true</property>
</session-factory>
</hibernate-configuration>
讓我們看看如何使用BeanEditForm元件建立員工新增頁面,以及如何使用Grid元件建立員工列表頁面。持久層由Hibernate模組處理。
建立一個員工類,並用@Entity註解裝飾它。然後,為相關的欄位新增驗證註解,以及Hibernate相關的註解@Id和@GeneratedValue用於id欄位。此外,建立gender作為列舉型別。
Employee.java
package com.example.MyFirstApplication.entities;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import org.apache.tapestry5.beaneditor.NonVisual;
import org.apache.tapestry5.beaneditor.Validate;
@Entity
public class Employee {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@NonVisual
public Long id;
@Validate("required")
public String firstName;
@Validate("required")
public String lastName;
@Validate("required")
public String userName;
@Validate("required")
public String password;
@Validate("required")
public String email;
public String phone;
@Validate("required")
public String Street;
@Validate("required")
public String city;
@Validate("required")
public String state;
@Validate("required,regexp=^\\d{5}(-\\d{4})?$")
public String zip;
}
Gender.java (enum)
package com.example.MyFirstApplication.data;
public enum Gender {
Male, Female
}
在pages下的employee新資料夾中建立員工列表頁面ListEmployee.java,並在/src/main/resources/pages/employee資料夾中建立對應的模板檔案ListEmployee.tml。Tapestry透過移除重複資料為子資料夾提供簡短的URL。
例如,ListEmployee頁面可以透過正常的URL訪問– (/employee/listemployee)以及簡短的URL – (/employee/list)。
使用@Inject註解將Hibernate會話注入列表頁面。在列表頁面中定義一個屬性getEmployees,並使用注入的會話物件用員工填充它。員工類的完整程式碼如下所示。
ListEmployee.java
package com.example.MyFirstApplication.pages.employee;
import java.util.List;
import org.apache.tapestry5.annotations.Import;
import org.apache.tapestry5.ioc.annotations.Inject;
import org.hibernate.Session;
import com.example.MyFirstApplication.entities.Employee;
import org.apache.tapestry5.annotations.Import;
@Import(stylesheet="context:mybootstrap/css/bootstrap.css")
public class ListEmployee {
@Inject
private Session session;
public List<Employee> getEmployees() {
return session.createCriteria(Employee.class).list();
}
}
為ListEmployee類建立模板檔案。該模板將包含兩個主要元件:
PageLink - 建立員工連結頁面。
Grid - 用於渲染員工詳細資訊。Grid元件具有sources屬性來注入員工列表,並具有include屬性來包含要渲染的欄位。
ListEmployee.tml (列出所有員工)
<html t:type = "simplelayout" title = "List Employee"
xmlns:t = "http://tapestry.apache.org/schema/tapestry_5_4.xsd">
<h1>Employees</h1>
<ul>
<li><t:pagelink page = "employee/create">Create new employee</t:pagelink></li>
</ul>
<t:grid source = "employees"
include = "userName,firstName,lastName,gender,dateOfBirth,phone,city,state"/>
</html>
建立員工建立模板檔案幷包含BeanEditForm元件。該元件具有以下屬性:
object - 包含資料來源。
reorder - 定義要渲染的欄位的順序。
submitlabel - 表單提交按鈕的訊息
完整的程式碼如下:
<html t:type = "simplelayout" title = "Create New Address"
xmlns:t = "http://tapestry.apache.org/schema/tapestry_5_4.xsd">
<t:beaneditform
object = "employee"
submitlabel = "message:submit-label"
reorder = "userName,password,firstName,lastName,
dateOfBirth,gender,email,phone,s treet,city,state,zip" />
</html>
建立員工建立類,幷包含會話、員工屬性、列表頁面(導航連結),並定義元件的OnSuccess事件(更新資料的位置)。會話資料使用Hibernate會話持久化到資料庫中。
完整的程式碼如下:
package com.example.MyFirstApplication.pages.employee;
import com.example.MyFirstApplication.entities.Employee;
import com.example.MyFirstApplication.pages.employee.ListEmployee;
import org.apache.tapestry5.annotations.InjectPage;
import org.apache.tapestry5.annotations.Property;
import org.apache.tapestry5.hibernate.annotations.CommitAfter;
import org.apache.tapestry5.ioc.annotations.Inject;
import org.hibernate.Session;
public class CreateEmployee {
@Property
private Employee employee;
@Inject
private Session session;
@InjectPage
private ListEmployee listPage;
@CommitAfter
Object onSuccess() {
session.persist(employee);
return listPage;
}
}
新增CreateEmployee.properties檔案,幷包含要在表單驗證中使用的訊息。完整的程式碼如下:
zip-regexp=^\\d{5}(-\\d{4})?$
zip-regexp-message = Zip Codes are five or nine digits. Example: 02134 or 901251655.
submit-label = Create Employee
員工建立頁面和列表頁面的截圖如下所示: