为JSF定做的应用程序框架(一)-程序员宅基地

技术标签: JBoss  企业应用  Seam  JSF  框架  

JavaServer Faces (JSF) 是用于 Java Web 应用程序的第一个标准化的用户界面框架。

而 Seam 是一个扩展 JSF 的强大的应用程序框架。在这个由三部分组成的新系列中的第一篇文章中,发现这两种框架之间的互补性。Dan Allen 介绍了 Seam 对 JSF 生命周期的增强,包括上下文状态管理、 RESTful URL、Ajax remoting、适当的异常处理和约定优于配置。

JSF 正开始凭借其 Java Web 标准的地位主导 Java Web 应用程序市场。随着更多的开发人员受托使用 JSF 作为基础来架构应用程序,他们发现 JSF 的核心规范中清楚地说明: JSF 不是为成为一个完整的 Web 应用程序框架而设计的。相反,它提供一个健壮的、事件驱动的 API 和 UI 组件库,用于构建更复杂的应用程序框架。

我在寻找用于弥补 JSF 的组件驱动架构的扩展时,发现 Shale 和 Struts 2 都有不足之处。我排除了 Struts 2,因为它将 JSF 看作是面向更大范围的设计。而 Shale 似乎更靠近一些,它基本上是基于 JSF,但是 对此我持保留意见。相反,JBoss Seam 是一个全面的应用程序框架,它构建在 JSF 的基础上,但是并没有损害它的核心目标。

这个由三部分组成的系列将介绍 Seam 应用程序框架,演示它的优点,并希望使您相信它与 JSF 是开发 Java 企业应用程序的极好的组合。在阅读本系列之前,如果您想下载 Seam,那么请阅读 参考资料 一节。

寻找 Seam

刚刚阅读到关于 JBoss Seam 的文章(见 参考资料)的第一页,我就知道 Seam 正是我要找的项目。Seam 的开发人员,尤其是 Gavin King,在经过足够多的、实际的开发之后,知道一个 Web 应用程序框架必须从一开始就攻破难题,包括上下文状态管理、RESTful 和用户友好的 URL、Ajax remoting、适当的异常处理和约定优于配置。令 Java 开发人员欣喜的是,Seam 可以满足所有这些需求,甚至可以满足更多需求。如果您正使用 JSF,并且还没听说过 Seam,那么我强烈建议您看看 Seam 的参考文档(见 参考资料)。Seam 附带的手册就是最好的资料!

尽管 Seam 显然非常适合作为 JSF 的补充,但是在激烈的竞争环境中,它遭到了一定程度的轻视。当今市场中充斥着各种各样的 Web 应用程序框架 —— 包括 Shale 和 Struts 2,新来者往往不受重视,Seam 还没有在主流行列站稳脚跟。 Seam 没有很快流行的另一个原因是关于这种框架的某些流言使 Java 开发人员没能认识到它的直接优点。

我要粉碎的一个流言是:Seam 只有和 EJB 3 一起使用时才有用,或者说在使用 Seam 开发应用程序时需要一个 EJB3 容器。实际上,Seam 的文档清楚地驳斥了这种误解:"Seam 并不要求组件是 EJB,甚至在没有兼容 EJB 3.0 的容器时也能使用。" 如果说只有在使用 EJB 3 的同时才能使用 Seam,那么无异于说只有在使用 Hibernate 的同时才能使用 Spring。虽然这两对都有很强的互补性,但是每一对的两者之间都不是相互依赖的。

对 EJB3 的考虑

正如我将要解释的那样,Seam 通过一些有价值的 hook 和组件管理进程 扩展默认 JSF 生命周期。还可以完全独立于 EJB3 使用 Seam。但是要记住,和 EJB3 一样,Seam 依赖于 JDK 5 注释元数据进行组件声明,因此使用 Seam 时,还需要同时使用兼容 Java 5 的 JVM。图 1 显示了一个 Seam POJO 实现的应用程序堆栈:

图 1. 一个 Seam POJO 应用程序堆栈
[img]http://img.68design.net/art/images/u8ITEO0EfjWxhz4.jpg[/img]

实际上,即使完全不引用 EJB 3 jar 或描述符文件,也可以使用 Seam 的很多功能。当和 POJO 一起使用 Seam 时,该框架保留对组件实例化的完全控制,并且不要求任何专门的配置。Seam 负责大多数 Java 5 注释处理,而不需要依赖于 EJB 3 中的任何机制。的确 依赖于 EJB3 容器的一组有限的注释则是专用于那个环境的。在某些情况下,将 Seam 集成到一个没有 EJB 3 耦合的 IT 投资中可以获得更好的成本效益。如何使用 Seam 视个人偏好而定。

配置并使用

如今有那么多种 Java 框架,每天只有有限的那么多小时,显然,如果 Seam 难于集成的话,它就无立足之地。幸运的是,将 Seam 添加到项目中很简单。因为 JSF 生命周期仍然是 Seam 应用程序的中心部分,所以不需要经历一个再训练时期。只需添加 4 个 jar 文件,注册一个 servlet 监听器和一个 JSF phase 监听器,最后再加上一个空白的 Java 属性文件。完成这些设置后,就可以一次性地将本地 JSF 应用程序转移到 Seam 管理的 bean 上。

要开始使用 Seam,首先需要将所需的 jar 文件添加到项目中。如果您当前不是使用 Hibernate,或者还没有升级到最新的版本,那么在设置时需要执行一个额外的步骤。这里需要包含来自 Hibernate 3.2 distribution 的 jar,以及它的众多的依赖项。Seam 还使用 Hibernate 注释用于数据验证,所以除了主 Hibernate jar 之外,还必须包括那个扩展 jar。需要的 Seam 发行版中的库有 jboss-seam.jar 和 jboss-seam-ui.jar,以及两个支持库:Javassist(用于 Java 的加载时反射系统)和 Java Persistence API。图 2 中的项目树说明了一个 Seam 项目中的 jar 集合。该图中显示的大多数附加库支持 JSF 的 MyFaces 实现。

图 2. Seam 项目中的 jar 库
[img]http://img.68design.net/art/images/dv04BZwOLWJyolJ.jpg[/img]

配置 Seam

接下来的步骤是在 web.xml 文件中安装 servlet 监听器类。该监听器在部署应用程序时初始化 Seam。

清单 1. Seam servlet 监听器配置

<listener>
<listener-class>org.jboss.seam.servlet.SeamListener</listener-class>
</listener>

接下来,将 JSF phase 监听器添加到 faces-config.xml 文件中,如清单 2 所示。该监听器将 Seam 集成到标准 JSF 生命周期中。(图 3 大致描绘了集成到这个生命周期中的 Seam 增强。)

清单 2. Seam phase 监听器配置

<lifecycle>
<phase-listener>org.jboss.seam.jsf.SeamPhaseListener</phase-listener>
</lifecycle>

最后,将一个空的 seam.properties 文件放在类路径的根下,以便指示 Seam 进行加载,如清单 3 所示。这个空白文件被用作一个 JVM 类加载器优化,使 Seam 在类路径下更小的区域内搜索组件,从而大大减少加载时间。

清单 3. Seam 属性文件

# The mere divsence of this file triggers Seam to load

# It can also be used to tune parameters on configurable Seam components

当然,在这种最小设置中,Seam 的很多特性是不可用的。以上说明只是为了演示 Seam 很少涉足入门级使用。例如,Seam 包括一个 servlet 过滤器,该过滤器扩展 JSF 生命周期以外的 Seam 特性。 servlet 过滤器的用法包括与非 JSF 请求集成,通过重定向传播 conversation,以及管理文件上传。请参阅 参考资料,看看 Seam 参考文档,其中讨论了用于控制附加功能的配置文件 —— 特别是 EJB3 集成。
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/kksxl/article/details/83365898

智能推荐

oracle 12c 集群安装后的检查_12c查看crs状态-程序员宅基地

文章浏览阅读1.6k次。安装配置gi、安装数据库软件、dbca建库见下:http://blog.csdn.net/kadwf123/article/details/784299611、检查集群节点及状态:[root@rac2 ~]# olsnodes -srac1 Activerac2 Activerac3 Activerac4 Active[root@rac2 ~]_12c查看crs状态

解决jupyter notebook无法找到虚拟环境的问题_jupyter没有pytorch环境-程序员宅基地

文章浏览阅读1.3w次,点赞45次,收藏99次。我个人用的是anaconda3的一个python集成环境,自带jupyter notebook,但在我打开jupyter notebook界面后,却找不到对应的虚拟环境,原来是jupyter notebook只是通用于下载anaconda时自带的环境,其他环境要想使用必须手动下载一些库:1.首先进入到自己创建的虚拟环境(pytorch是虚拟环境的名字)activate pytorch2.在该环境下下载这个库conda install ipykernelconda install nb__jupyter没有pytorch环境

国内安装scoop的保姆教程_scoop-cn-程序员宅基地

文章浏览阅读5.2k次,点赞19次,收藏28次。选择scoop纯属意外,也是无奈,因为电脑用户被锁了管理员权限,所有exe安装程序都无法安装,只可以用绿色软件,最后被我发现scoop,省去了到处下载XXX绿色版的烦恼,当然scoop里需要管理员权限的软件也跟我无缘了(譬如everything)。推荐添加dorado这个bucket镜像,里面很多中文软件,但是部分国外的软件下载地址在github,可能无法下载。以上两个是官方bucket的国内镜像,所有软件建议优先从这里下载。上面可以看到很多bucket以及软件数。如果官网登陆不了可以试一下以下方式。_scoop-cn

Element ui colorpicker在Vue中的使用_vue el-color-picker-程序员宅基地

文章浏览阅读4.5k次,点赞2次,收藏3次。首先要有一个color-picker组件 <el-color-picker v-model="headcolor"></el-color-picker>在data里面data() { return {headcolor: ’ #278add ’ //这里可以选择一个默认的颜色} }然后在你想要改变颜色的地方用v-bind绑定就好了,例如:这里的:sty..._vue el-color-picker

迅为iTOP-4412精英版之烧写内核移植后的镜像_exynos 4412 刷机-程序员宅基地

文章浏览阅读640次。基于芯片日益增长的问题,所以内核开发者们引入了新的方法,就是在内核中只保留函数,而数据则不包含,由用户(应用程序员)自己把数据按照规定的格式编写,并放在约定的地方,为了不占用过多的内存,还要求数据以根精简的方式编写。boot启动时,传参给内核,告诉内核设备树文件和kernel的位置,内核启动时根据地址去找到设备树文件,再利用专用的编译器去反编译dtb文件,将dtb还原成数据结构,以供驱动的函数去调用。firmware是三星的一个固件的设备信息,因为找不到固件,所以内核启动不成功。_exynos 4412 刷机

Linux系统配置jdk_linux配置jdk-程序员宅基地

文章浏览阅读2w次,点赞24次,收藏42次。Linux系统配置jdkLinux学习教程,Linux入门教程(超详细)_linux配置jdk

随便推点

matlab(4):特殊符号的输入_matlab微米怎么输入-程序员宅基地

文章浏览阅读3.3k次,点赞5次,收藏19次。xlabel('\delta');ylabel('AUC');具体符号的对照表参照下图:_matlab微米怎么输入

C语言程序设计-文件(打开与关闭、顺序、二进制读写)-程序员宅基地

文章浏览阅读119次。顺序读写指的是按照文件中数据的顺序进行读取或写入。对于文本文件,可以使用fgets、fputs、fscanf、fprintf等函数进行顺序读写。在C语言中,对文件的操作通常涉及文件的打开、读写以及关闭。文件的打开使用fopen函数,而关闭则使用fclose函数。在C语言中,可以使用fread和fwrite函数进行二进制读写。‍ Biaoge 于2024-03-09 23:51发布 阅读量:7 ️文章类型:【 C语言程序设计 】在C语言中,用于打开文件的函数是____,用于关闭文件的函数是____。

Touchdesigner自学笔记之三_touchdesigner怎么让一个模型跟着鼠标移动-程序员宅基地

文章浏览阅读3.4k次,点赞2次,收藏13次。跟随鼠标移动的粒子以grid(SOP)为partical(SOP)的资源模板,调整后连接【Geo组合+point spirit(MAT)】,在连接【feedback组合】适当调整。影响粒子动态的节点【metaball(SOP)+force(SOP)】添加mouse in(CHOP)鼠标位置到metaball的坐标,实现鼠标影响。..._touchdesigner怎么让一个模型跟着鼠标移动

【附源码】基于java的校园停车场管理系统的设计与实现61m0e9计算机毕设SSM_基于java技术的停车场管理系统实现与设计-程序员宅基地

文章浏览阅读178次。项目运行环境配置:Jdk1.8 + Tomcat7.0 + Mysql + HBuilderX(Webstorm也行)+ Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。项目技术:Springboot + mybatis + Maven +mysql5.7或8.0+html+css+js等等组成,B/S模式 + Maven管理等等。环境需要1.运行环境:最好是java jdk 1.8,我们在这个平台上运行的。其他版本理论上也可以。_基于java技术的停车场管理系统实现与设计

Android系统播放器MediaPlayer源码分析_android多媒体播放源码分析 时序图-程序员宅基地

文章浏览阅读3.5k次。前言对于MediaPlayer播放器的源码分析内容相对来说比较多,会从Java-&amp;amp;gt;Jni-&amp;amp;gt;C/C++慢慢分析,后面会慢慢更新。另外,博客只作为自己学习记录的一种方式,对于其他的不过多的评论。MediaPlayerDemopublic class MainActivity extends AppCompatActivity implements SurfaceHolder.Cal..._android多媒体播放源码分析 时序图

java 数据结构与算法 ——快速排序法-程序员宅基地

文章浏览阅读2.4k次,点赞41次,收藏13次。java 数据结构与算法 ——快速排序法_快速排序法