長久以來,JSF一直沒有成為WEB框架的主流,不僅是遺留系統的原因,JSF原始的標準并沒有使得開發簡化和清晰。一直不斷有這樣或者那樣的小問題阻礙著JSF成為絕對主流。

??????? 事實上,JSF的目標是相當不錯的,希望代碼人員能和美工分離,并且能夠快速的開發。但是其中的一些有待解決的問題,貌似與初衷相違背:煩瑣的配置,比較依賴開發工具,不夠靈活等等。直到Frails這個JSF框架的誕生,JSF以往的煩惱都解決了。Frails能幫助你快速的開發JSF,效率可以和ROR媲美!

??????? 你可以在Souceforge找到這個項目 https://sourceforge.net/projects/frails?。中文站為http://frails.hexiao.cn/?。 目前Frails的最新版本是1.2,不過馬上2.0就要發布了。
??
? Frails的特性如下:
  • Frails 讓開發者使用約定(習慣)和注解(annotations)來省略在 faces-config.xml 文件中 managed-bean 和 navigation-rule的配置.
  • Frails 提供一個更簡單的方法來使用 Faces API.
  • Frails 重定向非 faces 請求為一個 faces 請求,這樣可以避免因為URL輸入的疏忽導致的異常.
  • Frails 提供一些預定義的 Managed Bean 基類讓開發者擴展 .
  • Frails 可以讓開發者在 Managed Bean 中使用注解(Annotation)來支持AOP功能 ,如 函數攔截(method interception).
  • Frails 提供 Managed Bean 屬性的injection 和 outjection
  • Frails 中的Hibernate GenericDao 對象提供了基本的 CRUD 函數 和 其他一些有用(常用)的數據訪問函數.
  • Frails 還提供了一些有用的注解(annotations)來簡化JSF的開發.
  • Frails 完全支持 jsf 1.1 和 jsf 1.2 規范,并且可以自動的探測你使用的版本.
  • Frails 提供了對action Method 和 Listener 函數的增強,在這些函數中現在你可以傳遞參數了.

??????? 作為一名Frails的開發人員,我會繼續寫很多關于Frails的文章。不過先在這里簡單的展示一下Frails的幾個特性,如果你要詳細的察看使用方法,請到 http://frails.hexiao.cn/user-guide.html

不需要配置faces-config.xml
?????? 再也不需要在faces-config.xml里一個個的寫導航規則,注冊ManageBean了。在Frails框架下注冊一個ManageBean只需要在Bean的Class文件前加上@DefMbean這樣的Annotation就可以了。而導航會根據一定的導航規則實現。比如導航去index.jsp就可以直接返回"index"就可以了,當然,還有更靈活的方式。


輕松實現GET
??????? URL里加上參數-值對能夠輕松的解析出來了,甚至不需要寫方法。在一個String屬性前加上@Param(name=paramName)后,這個屬性就自動獲得來自URL里paramName的值。如:

@Param(name="paraName")
String?paVa;

URL是./xxx.jsp?paraName=Yes 那么paVa的值就是Yes。
???????
??????? 而在一個無返回方法前加上@PreRender后,這個方法將回在頁面渲染前調用,提前獲取一些相關的信息。如:

@PreRender
public?void?preRender()
{
????
//do?something?for?rendering?the?page
}


  當然了,Frails提供了讓方法在各個聲明周期得到調用的Annotations,不僅僅是預渲染。


從煩瑣的驗證中解脫
??????? Frails使得你能在申明一個屬性的時候就能快速簡單的加上一些限制條件,成為這個屬性的驗證器。如下

@Prop
????@ValidateNumber(required?
=?true,?max?=?"33",?id?=?"indexForm:id",?message?=?"error.id.invalid")
????
int?id;

?????? 這樣就使得在setID的時候根據需要進行驗證,而不必再寫validate方法。


使用簡單、功能強大的JSFHelper
??????? 例如,如果一個對象要放入HttpSession. 使用標準的 Faces API, 代碼如下:

??FacesContext.getCurrentInstance().getExternalContext()
??.getSessionMap().put(name,?val);?

??????? 如果使用 JSFHelper,代碼是如此的簡單:

JSFHelper.putIntoSession(name,?val);

??????? 當然,JSFHelper還有很多其他的功能。如導航功能,能將頁面之間的數據最大化獨立開,之間的聯系只需要規定有什么屬性就可以了。(以后會詳細介紹:Frails下網站快速開發模式)

還有很多特性,幫助你快速開發JSF。當你真正體驗過Frails后,你就回發現JSF一統天下的時代的來臨!