我很高兴地宣布Seam Faces 3.0.1.Final版本的可用性。Seam Faces模块负责人Brian Leathem在此版本中解决了一些问题,并对视图配置功能进行了多项增强,我相信这会让很多人感到兴奋。在(希望继续)每周模块亮点特写的传统中,Brian也撰写了本周的文章,我很高兴现在就向您展示!

Seam模块亮点:Seam Faces

作者:Brian Leathem

在本系列第二篇关于Seam模块的亮点文章中,我们将深入了解Seam Faces的“视图配置”功能。

Seam Faces旨在通过解决一些JSF的痛点,紧密集成CDI,并提供与Seam其他模块和第三方库的即插即用集成,为JSF开发者提供真正值得信赖的Web开发框架。实现这一目标的部分涉及提供一种集中配置每个看似不同的关注点的手段,而无需创建任何JSF阶段监听器,也无需维护大量XML文件。

遵循CDI核心原则类型安全,Seam Faces提供了一种类型安全的机制来配置JSF视图的行为。到目前为止,这些可配置的行为包括

  1. 通过集成 Seam Security 限制视图访问
  2. 通过集成 PrettyFaces(或任何其他可插拔URL重写框架)配置URL重写
  3. 通过 Seam Persistence 配置事务
  4. 以及我个人最喜欢的:在导航到视图时设置“?faces-redirect=true”

注意:上述集成是可选的,您必须在应用程序中包含相关jar文件,才能使相应的配置产生任何效果

让我们更详细地查看Seam Faces示例“faces-viewconfig”中的视图配置

@ViewConfig
public interface Pages {

  static enum Pages1 {

      @ViewPattern("/admin.xhtml")
      @Admin
      ADMIN,

      @ViewPattern("/item.xhtml")
      @UrlMapping(pattern="/item/#{id}/")
      @Owner
      ITEM,

      @ViewPattern("/*")
      @FacesRedirect
      @AccessDeniedView("/list.xhtml")
      @LoginView("/login.xhtml")
      ALL;

  }
}

乍一看,上述配置的结构可能看起来有些奇怪。其中@ViewConfig注解位于接口上,而接口不过是一个静态枚举的容器。这种安排遗憾的是由当前的CDI规范要求的,用于扫描视图配置注解,并希望在CDI规范的后续迭代中得到修正。

枚举的属性使用@ViewPattern注解进行了标注,指定了相邻的注解应用于哪些视图。ViewPatterns支持通配符,匹配是根据匹配的特定视图的特定性进行加权;因此,如果两个注解与不同的@ViewPattern冲突,则与更具体的@ViewPatternt注解配对的注解具有优先级。

通过@ViewConfig

Seam Security进行安全防护现在让我们看看Seam Security注解@Admin@Owner。这些注解是由用户提供的,这意味着它们仅为此示例构建,并且带有Seam Security限定符@SecurityBindingType@ViewConfig。当请求的视图与带有此类注解的注解中的模式匹配时,Seam Faces会调用Seam Security以确定是否应授予访问权限。授权使用以下类进行评估

public class SecurityRules {
    public @Secures @Owner boolean ownerChecker(Identity identity, @Current Item item) {
       if (item == null || identity.getUser() == null) {
           return false;
       } else {
           return item.getOwner().equals(identity.getUser().getId());
       }
    }

    public @Secures @Admin boolean adminChecker(Identity identity) {
       if (identity.getUser() == null) {
           return false;
       } else {
           return "admin".equals(identity.getUser().getId());
       }
    }
}

这样,使用注解标注的视图通过@Secures方法进行安全防护,该方法也使用相同的注解。结合参数注入,这实际上是一种用于保护视图访问的声明性语法。

此外,现在让我们看看Seam Security注解注解还定义了一个额外的限定符

@RestrictAtPhase(PhaseIdType.RESTORE_VIEW)
这个注解导致安全限制在“恢复视图”阶段而不是默认阶段(“调用应用程序”和“渲染响应”)应用。选择默认阶段是为了确保应用程序数据存在并允许访问限制具有上下文。默认阶段还意味着安全限制在每个生命周期中评估两次,因为视图通常在“调用应用程序”阶段结束时发生变化。

通过@ViewConfig

视图配置还允许我们使用@UrlMapping注解配置视图的URL重写。在上面的@ViewConfig中,像/item.jsf?item=1这样的URL通过PrettyFaces和/item/1/映射,这归功于@UrlMapping(“/item/\#{id}”)注解,其中“#{id}”告诉重写引擎将URL的最后部分视为应用程序中的值,这将是查询参数“id”。通过将URL重写的配置与视图配置的其他部分集成,Seam Faces试图使这项强大的技术更容易访问,并成为JSF应用程序开发的核心部分。

设置faces-redirect=true

看似简单的@FacesRedirect注解非常实用。当此注解与@ViewPattern存在时,任何导航到匹配视图的操作都会被拦截,并激活faces-redirect属性。在提供的示例中,@FacesRedirect注解应用于模式“/*”,这将对所有视图应用配置。可以选择在更具体的模式或单个视图中覆盖此捕获所有设置,使用注解@FacesRedirect(false)。这个注解在我心中占有特殊位置——不再需要在任何应用程序中散布“?faces-redirect=true”了!

通过@ViewConfig

Seam Persistence进行安全防护@ViewConfig最后但同样重要的是,可以在

中应用SeamManagedTransaction注解。这允许根据每个视图定义事务行为。探索这里的可能性将是后续文章的主题。@ViewConfigSeam Faces组件的未来前景光明,将添加更多功能。此外,@ViewConfig这里展示的只是一个视图配置数据的内部存储的前端。这为提供替代方法来填充视图配置数据存储、编写扩展以执行针对您特定应用程序的视图配置数据的自定义操作等提供了可能性。正在探索的一种解决方案是在f:metadata标签中引入子标签,这将允许在视图本身内定义与视图相关的问题。此外,还可以结合xml和数据库持久性配置源,为开发者提供更多选项。

Seam Faces提供了一个集中化、类型安全的配置您的JSF视图行为的方式。尝试使用ViewConfig,并请务必提供您的反馈。这个功能还处于早期阶段,所有反馈都非常受欢迎!


回到顶部