JBoss Seam:一個深度整合框架(二)

梧桐雨—168發表於2008-04-18
本文介紹了JBoss Seam如何在JSF中進行JPA延遲載入和Hibernate驗證以及JBoss Seam對Ajax的支援。

本文是《JBoss Seam:一個深度整合框架》一文的第二部分,JBoss Seam中文站將在近期釋出該文的第三部分。

支援在JSF中進行JPA延遲載入

ORM框架重要特徵之一就是支援相關物件的”延遲載入”。沒有延遲載入,即使簡單的物件查詢也有可能順帶出大量資料到結果集中,因為在對映物件圖中,可能所有的表都是潛在關聯的。

例如,在顯示訂單列表的Web應用程式中,你可能需要在控制器中查詢訂單物件。然後,當頁面被載入後,你可能需要顯示列表中相應的條目。

在頁面載入的時候,我們將”延遲載入”訂單條目到訂單物件中,而不會在控制器中查詢訂單物件時,就將所有與訂單關聯的物件都載入到訂單物件中。

然而,在傳統的MVC框架中應用”延遲載入”可不是一件容易的事情。在Seam之前的MVC框架中,控制器會在持久化環境中通過會話在事務中執行查詢,然後在事務提交時關閉會話。所以,當控制器退出、網頁顯示完成後,持久化環境將變成不可用狀態。

這樣,在以前的MVC框架中,如果想在顯示頁面中試圖”延遲載入”資料,持久化引擎將丟擲”lazy initialization exception”異常。

你可以通過”Open Session In View”模式實現”延遲載入”--在頁面生成階段保持持久會話。但是應用這種模式,需要在Web框架和持久層框架之間編寫大量的整合程式碼。

Seam預設支援”Open Session In View”。所有的Seam元件,除了EJB3中的無狀態會話Beans以外,都是有狀態的。在開始從UI事件呼叫資料庫操作一直到響應頁面生成期間, Seam將維持一個開啟的持久會話。在Seam應用中,開發人員不需要編寫額外的程式碼來實現”延遲載入”。

在JSF輸入頁面中支援Hibernate驗證

在多層企業級應用中,Web框架和ORM持久層框架通常會有不同的資料驗證機制。Web框架在Web表單被提交時驗證使用者輸入,而持久層框架在儲存資料進資料庫之前驗證資料。在大多數情況下,它們顯得多餘。

Seam允許你在實體Beans中直接註解資料驗證約束,這樣使用與實體Beans相聯絡的JSF輸入框時,同樣的驗證約束將應用於輸入資料。

下面的例子中,Person物件的名字必須由兩個單片語成,並且年齡必須在3到100歲之間。

@Entity

@Name(”person”)

@Table(name=”extperson”)

public class Person implements Serializable {

private long id;

private String name;

private int age;

@Id @GeneratedValue

public long getId() { return id;}

public void setId(long id) { this.id = id; }

@NotNull

@Pattern(regex=”^[a-zA-Z.-]+ [a-zA-Z.-]+”,

message=”Need a firstname and a lastname”)

public String getName() { return name; }

public void setName(String name) {this.name = name;}

@NotNull

@Range(min=3, max=100,

message=”Age must be between 3 and 100″)

public int getAge() { return age; }

public void setAge(int age) { this.age = age; }

}

下面的JSF頁面將自動”包裝”一些驗證邏輯。如果使用者提交無效值,將重新顯示頁面,同時高亮顯示無效的欄位。

Your name:

Your age:

你可以通過簡單的JSF facets和CSS樣式配置這些高亮顯示的錯誤資訊。也可以在無效欄位前加入有CSS樣式修飾的錯誤提示圖片。如下所示,當驗證失敗時,將顯示驗證註解中的資訊屬性。

使用基於Ajax的JSF控制元件,你無需提交任何表單,就可以進行輸入欄位的驗證。

多種方式使用Ajax

作為一個現代的應用程式框架,Seam為Ajax應用提供了最好的支援。

在Seam中,你可以通過很多方式使用Ajax。初學者可以使用Seam整合的Ajax JSF元件包,比如Ajax4jsf、RichFaces和IceFaces。它們提供了一系列Ajax功能的JSF控制元件,包括輸入框、資料表格、互動面 板、拖放皮膚等,你可以直接將它們用在你的頁面上。這些Ajax控制元件允許你開發Ajax Web應用程式,而無需寫一行JavaScript程式碼。Seam已經幫你做好了所有和Ajax整合的工作,使得建立Ajax應用比在單純的JSF環境中 更容易。下面的例子顯示瞭如何使用Ajax資料輸入框,當你離開輸入框時,資料將被驗證,同時無效的欄位將高亮顯示。

Your name:

Your age:

考慮到開發人員想直接使用JavaScript取代JSF控制元件,Seam同樣也整合了JavaScript和伺服器端元件。你可以像呼叫本地 JavaScript方法一樣呼叫Seam元件的方法並且在本地使用返回值。開發人員也可以通過Seam服務整合其他流行的JavaScript庫。例 如,下面的程式碼顯示瞭如何通過Seam元件整合Dojo的”內嵌文字編輯器”,當你雙擊”Hello World”文字時,將出現內嵌的文字編輯器;編輯完成後,輸入值將被傳回伺服器處理。

// Seam.Remoting.setDebug(true);

// don’t display the loading indicator

Seam.Remoting.displayLoadingMessage = function() {};

Seam.Remoting.hideLoadingMessage = function() {};

// Get the “manager” Seam component

var manager = Seam.Component.getInstance(”manager”);

function init () {

var commentEditor = dojo.widget.byId(”comment”);

commentEditor.onSave = submitComment;

}

function submitComment (newValue, oldValue) {

manager.setComment (newValue);

}

dojo.addOnLoad(init);

Hello Seam

下面程式碼顯示了通過JavaScript遠端呼叫訪問Manager元件。

@Name(”manager”)

public class Manager {

@In @Out

private Person person;

public void setComment (String comment) {

person.setComment (comment);

}

… …

}

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/13270562/viewspace-244008/,如需轉載,請註明出處,否則將追究法律責任。

相關文章