SeamFramework.orgCommunity Documentation

章 10. 主要探討模板(Stereotypes)

10.1. 主要探討模板的預設 scope 和建置類型
10.2. 利用主要探討模板來限制 scope 與 type
10.3. 主要探討模板的攔截器綁定
10.4. 主要探討模板的名稱預設
10.5. 標準主要探討模板

根據 Web Bean 規格:

在許多系統中,使用架構的模式會產生一組循環的 Web Bean 工作。主要探討模板能讓一個 framework 開發人員辨識出這樣的一項工作,並在一個中央位置中為含有該工作的 Web Bean 宣告一些共通 metadata。

主要探討模板包含著下列任意的各種組合:

  • 預設的建置類型、

  • 預設的 scope 類型、

  • 基於 Web Bean scope 的限制、

  • Web Bean 實做或延伸特定類型的需求,以及

  • 一組攔截器綁定標記。

主要探討模板亦可指定所有還有該主要探討模板的 Web Bean 都含有預設的 Web Bean 名稱。

Web Bean 可宣告零、一或多個主要探討模板。

主要探討模板為 Java 標記類型。這個主要探討模板可辨識一些 MVC 架構中的動作 class:

@Retention(RUNTIME)

@Target(TYPE)
@Stereotype
public @interface Action {}

我們藉由套用標記至 Web Bean 來使用主要探討模板。

@Action 

public class LoginAction { ... }

主要探討模板可為含有該主要探討模板的 Web Bean 指定預設的 scope 與/或預設的建置類型。比方說,若 @WebTier 這個建置類型將只應在系統被執行時才被建置的 Web Bean 視為一個網站應用程式的話,我們可為 action class 指定下列預設值:

@Retention(RUNTIME)

@Target(TYPE)
@RequestScoped
@WebTier
@Stereotype
public @interface Action {}

當然,若有必要的話,有個特定的動作也可置換這些預設值:

@Dependent @Mock @Action 

public class MockLoginAction { ... }

若我們希望強制所有動作依照某個特定 scope 的話,我們也可以這麼作。

假設我們希望防止動作去宣告特定 scope,Web Bean 能讓我們透過特定主要探討模板來明確地為 Web Bean 指定一組被允許的 scope。例如:

@Retention(RUNTIME)

@Target(TYPE)
@RequestScoped
@WebTier
@Stereotype(supportedScopes=RequestScoped.class)
public @interface Action {}

若有個特定 action class 嘗試指定一個非 Web Bean 所請求的 scope 的話,Web Bean 管理員便會在初始化時丟出一個 exception。

我們也能強制所有含有特定主要探討模板的 Web Bean 實做一個介面或延伸一個 class:

@Retention(RUNTIME)

@Target(TYPE)
@RequestScoped
@WebTier
@Stereotype(requiredTypes=AbstractAction.class)
public @interface Action {}

若某個特定 action class 沒有延伸 AbstractAction 這個 class 的話,Web Bean 管理員便會在初始化時丟出一個 exception。

主要探討模板可指定一組攔截器綁定來被所有含有該主要探討模板的 Web Bean 繼承。

@Retention(RUNTIME)

@Target(TYPE)
@RequestScoped
@Transactional(requiresNew=true)
@Secure
@WebTier
@Stereotype
public @interface Action {}

這可協助我們減少 business code 中技術上的問題!

最後,我們能夠指定所有含有特定主要探討模板的 Web Bean 都擁有一組 Web Bean 名稱,並且由 Web Bean 管理員來預設。動作通常參照於 JSP 頁面中,因此它們針對於此功能為完美的 use case。我們只需要新增一個空的 @Named 標記即可:

@Retention(RUNTIME)

@Target(TYPE)
@RequestScoped
@Transactional(requiresNew=true)
@Secure
@Named
@WebTier
@Stereotype
public @interface Action {}

現在,LoginAction 將會被命名為 loginAction

我們已談到了 Web Bean 規格所定義的兩個標準主要探討模板:@Interceptor@Decorator

Web Bean 還額外定義了一個標準主要探討模板:

@Named 

@RequestScoped 
@Stereotype 
@Target({TYPE, METHOD}) 
@Retention(RUNTIME) 
public @interface Model {} 

這個主要探討模板主要用於 JSF。與其使用 JSF 管理的 bean,只要標記一個 @Model Web Bean 然後直接在您的 JSF 頁面中使用它即可。