SeamFramework.orgCommunity Documentation

第 10 章 模板

10.1. 一个模板默认的范围和部署类型
10.2. 通过模板来限制范围和类型
10.3. 模板的拦截器绑定
10.4. 模板的默认命名
10.5. 标准的模板

根据Web Bean规范:

在很多系统中,体系模式的使用会产生一套重复发生的Web Bean角色。一个模板允许一个框架开发者来识别这样的一个角色,并且在一个中心地方为拥有这个角色的Web Bean声明一些通用的元数据。

一个模板封装了下面的任何组合:

  • 一个默认的部署类型,

  • 一个默认的范围类型,

  • 一个对于Web Bean范围的限制

  • 一个Web Bean实现或者继承一个特定类型的需求,以及

  • 一套拦截器绑定注释。

一个模板也可以指定所有使用这个模板的Web Bean拥有的默认的Web Bean名称。

一个Web Bean可以声明零个,一个或者多个模板。

一个模板其实就是一个Java注释类型。这个模板在一些MVC框架中识别动作类:

@Retention(RUNTIME)

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

我们注释来让Web Bean应用模板

@Action 

public class LoginAction { ... }

一个模板可以为使用该模板的Web Bean指定一个默认的范围或者默认的部署类型。例如,如果@WebTier 部署类型识别那些只应该在系统作为一个Web应用运行时才应该部署的Web Bean,我们可以为动作类指定下面的默认值:

@Retention(RUNTIME)

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

当然,如果必要的话,一个特殊的动作类仍旧可以重载这些默认值:

@Dependent @Mock @Action 

public class MockLoginAction { ... }

如果我们想要敬爱那个所有动作类强制在某个特殊的范围,我们也可以这样做。

假定我们希望那个通过特定的范围声明来阻止一个动作。Web Bean可以让我们显式地为使用特定模板的Web Bean指定一套允许的范围。例如:

@Retention(RUNTIME)

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

如果一个特殊的动作类试图指定超越Web Bean请求范围的范围,Web Bean管理器在初始化时就会抛出一个异常。

我们也可以强制所有的使用特定模板的Web Bean实现一个接口或者继承一个类:

@Retention(RUNTIME)

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

如果一个特殊的动作类没有继承 AbstractAction,Web Bean管理器会在初始化时抛出一个异常。

一个模板指定一套拦截器绑定让使用该模板的Web Bean继承。

@Retention(RUNTIME)

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

这将能够帮助我们从业务代码中剥离技术关注点!

最后,我们可以为所有使用模板的Web Bean指定一个Web Bean名称,Web Bean管理器将其设为默认名称。JSP页面中常常引用动作类,所以它们是这个特性的最好的例子。我们所需做的就是添加一个空的 @Named 注释:

@Retention(RUNTIME)

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

现在, LoginAction 将拥有一个名为 loginAction Web Bean名称.

我们已经见到了Web Bean规范定义的两个标准的模板:@Interceptor@Decorator

Web Bean还定义了另一个标准模板:

@Named 

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

这个模板是为了JSF使用的。我们可以直接在一个Web Bean上使用 @Model 注释就可以让这个Web Bean替代JSF的管理Bean。你可以直接在JSF页面中使用这个Web Bean。