`
wangxinasy
  • 浏览: 19347 次
  • 性别: Icon_minigender_1
  • 来自: 南京
文章分类
社区版块
存档分类
最新评论

基于JSF的框架解析

阅读更多
  Jsf 本身是很多问题的。当然,jsf不是一项技术,而是标准。看看 javax.faces.* 包里的内容,不是抽象类就是接口,是没有实现的。 jsf 出来的时候目的也不是面向应用开发者的,而是面向组件供应商的,从这点意义上来说,jsf是成功的。Sun提供了一个reference implementation, 但是那更像是教组件供应商如何做组件的一个demo,而非真正意义上的给应用开发人员用的成型的组件。

  标准因为要融合各方需求,所以内容只能是各方能力的交集。至于标准之外的东西,则需要各方去发挥。

  JSF标准因为是先于成型的应用出来的(不同于EJB3的借鉴hibernate和spring,jsf299的借鉴seam),难免会有预见不足的地方。在某些地方可能作了过分的限制,而另外某些地方则完全没有规定放得太开导致标准实现商完全忽略了它们。

  但是 Jsf 的初衷是不错的,而且标准本身也足够的可扩展。 所以现在才会诞生如此多的基于 jsf 的框架。 这些框架在不同程度上修复了 JSF 初始制定时的不足。

  Ajax4Jsf, Facelets, Seam 是这其中三个独立的方向。

  1. A4J: 用网络检测工具可以清晰地看到,每次在JSF postback 的时候,虽然可能只有部分页面需要刷新,但整个页面都会被从服务器送往浏览器。这是非常浪费的。 JSF的event-driven模型实际上非常适合部分页面刷新(试想如果没有事件模型,每晃一下鼠标显示器就把整屏幕重画,现在也就没有 windows了),但是因为ajax出来的时候JSF标准已经final了,就没有把Ajax考虑进去。对于事件模型来说,把整屏幕重画改为部分组件重画是件相对容易的事情,这也就是 Ajax4Jsf 这个项目的目的。是否开启AJAX,可以不需要javascript,只是更改页面中的某个开关(tag)就行了。

  2. Facelets: JSF是建立在JSP上的,但这是完全没有必要的。JSP不是模板语言,它只是简单得把嵌入在html里的java语言原样放入Java的源文件里,实际上是混合的html和java。这种模型和JSF的事件模型没有任何互补的关系。相反,它给JSF加入了不必要的限制。Facelets的目的在于取代 jsp在jsf里的地位。它是真正的模板语言,el表达式可以嵌入在页面的任何位置,比如写成:

  Hi,I'm Jordan, I think the winner of this cup isA4j Facelets, is that right?

  Facelets不需要编译,页面是hot-deploy的,性能比jsp快。另外,facelets本身提供了加参模板的功能,定制新的组件可以完全不写java,只把页面里的需要提成组件的内容扔进分离的页面,并且在taglib.xml里面加入tag指向分离的页面,并指定参数名字就可以了。 JSF最为人诟病的组件缺乏的问题,在facelets这里得到了缓解,实际上是不怎么需要第三方组件就可以快速写出舒服的代码来。Facelets还有其它的功能,比如debug页面显示facelets页面出错的行号,比如无限嵌套的模板,等等。

  Seam 其实本身是无关JSF的,但是因为它从一开始就建在JSF上面,所以也不得不对JSF的一些问题进行修复。

  Seam的工作需要分开来细说:

  3.1 page行为 //TODO

  3.2 Context-filter //TODO

  3.3 RESTful(重建页面参数) //TODO

  3.4 异常处理 //TODO

  3.5 跨越重定向的状态 //TODO

  现在我们有了JSF的加减法:

  JSF - (全页面刷新) + Ajax4Jsf - Jsp + Facelets + 全局Page行为 + Context-filter + Restful参数绑定 + 可定制异常 + 跨越重定向的状态 = “ -_- ! 一大碗炸酱面”

  就好像一件黄金圣衣,经过无数次修补,虽然还能再用,但是实在不如重铸了。

  JSF 需要一套整合的模型,使这些各个分散的部分重新以一种整体的局面展现出来。它需要把多余的东西抛弃掉,把新的内容以更集成的方式融在一起,因为光是熟悉这些不同分散的部分,理解它们之间的关系,知道哪里会有BUG,哪里则可以避免这些BUG,并且在运用的时候总是用对该用的东西,这已经使人非常头大了。 JSF作为标准来说是成功的,在这一标准下有了如此多的可以插拔的第三方软件。 但是该是时候对这些零散的东西统一了。就好像ubuntu在统一的指导思想下集合了尽可能多的零散的开源软件,使它们可以被一种简单并且相似的方式获取,使我不需要像在Gentoo里安装任何一个东西都要搜索搜索再搜索,了解它的来源,了解它的BUG,了解我的硬件是否支持。作为用户,我不想学习,我想有明白的人替我作决定,那是最好的,特别是当这些决定make sense的时候。

  现在的Seam正是朝这个方向走的。能走这样的路,得有两个条件,一是有众多零散的可用的东西,但是它们缺乏统一的形式(但它们得有能够统一的背景,比如ubuntu下是posix标准,Seam下是jsf标准);二是有对该领域非常熟悉的人来做这样的事情。上面提到的Seam对JSF的改进其实只是Seam框架下非常小的一部分,是Seam在向这个目标前进的必须的一个步骤,是在Seam内核基础上水到渠成的东西,而远非Seam的全部。正如Seam的名字所示:缝合;正如ubuntu的名字所示:分享与同在。它们的制定者在决定之初即是向着这一目标前进的。

  已经early draft review的JSR 299, 即是借鉴了Seam(以及其它比如Guice)的一个标准,试图把这一方向推得更远。

  至于对于缝合所需要的本事,Seam的conversation模型,CoC理念,元注解配置+xml补充方式,动态双向注入模型(不同于spring的静态单向注入),扩展了的EL等,是其基础。内部事件和监听模型,和drools的安全集成模型,和hibernate-seach, hibernate-validation, seam-remoting, jbpm,groovy,itext的集成,是其在基础之上的应用。这些则需要另外的文章来写了。
分享到:
评论

相关推荐

    基于Ajax的新MVC框架的研究与实现

    新框架的请求处理流程借鉴了JSF的请求生命周期,但对它进行了改造,从而简化了流程。本文还将Java反射机制与Velocity技术相结合,实现了在VTL文件中直接存取Container的相关属性。由于引入了jQuery,极大简化了DOM以及...

    SpringMvc源码

    另外还有一种基于组件的、事件驱动的Web框架在此就不介绍了,如Tapestry、JSF等。 Spring Web MVC也是服务到工作者模式的实现,但进行可优化。前端控制器是DispatcherServlet;应用控制器其实拆为处理器映射器...

    蝙蝠在线考试系统v2.2.6 JSF2+SPRING+JPA

    蝙蝠在线考试系统基于JSF2、Spring3、JPA2等JAVA技术构建,系统使用MYSQL数据库,可以部署于WINDOWS、LINUX、UNIX等各种操作系统,内置了无处不在的AJAX能力,简洁易用,支持单选题、多选题、填空题、判断题、问答题...

    J2EE应用开发详解

    325 18.4.2 配置数据库连接池 327 18.5 HQL简介 328 18.6 小结 330 第19章 权限管理系统(Struts+Spring+Hiberante+Ajax) 331 19.1 需求分析 331 19.2 系统总体流程设计 331 19.3 系统设计 332 19.4 系统总体解析 ...

    跟我学SpringMVC

    另外还有一种基于组件的、事件驱动的Web框架在此就不介绍了,如Tapestry、JSF等。 Spring Web MVC也是服务到工作者模式的实现,但进行可优化。前端控制器是DispatcherServlet;应用控制器其 实拆为处理器映射器...

    Spring MVC 员工管理系统

    和众多其它Web框架一样,它基于MVC设计理念,此外,由于它采用了松散耦合可插拔组件结构,具有比其它MVC框架更多的扩展性和灵活性。 Spring MVC框架围绕DispatcherServlet这个核心展开,DispatcherServlet的作用是...

    java开源包1

    GWT Advanced Table 是一个基于 GWT 框架的网页表格组件,可实现分页数据显示、数据排序和过滤等功能! Google Tag Library 该标记库和 Google 有关。使用该标记库,利用 Google 为你的网站提供网站查询,并且可以...

    java开源包11

    GWT Advanced Table 是一个基于 GWT 框架的网页表格组件,可实现分页数据显示、数据排序和过滤等功能! Google Tag Library 该标记库和 Google 有关。使用该标记库,利用 Google 为你的网站提供网站查询,并且可以...

    java开源包2

    GWT Advanced Table 是一个基于 GWT 框架的网页表格组件,可实现分页数据显示、数据排序和过滤等功能! Google Tag Library 该标记库和 Google 有关。使用该标记库,利用 Google 为你的网站提供网站查询,并且可以...

    java开源包3

    GWT Advanced Table 是一个基于 GWT 框架的网页表格组件,可实现分页数据显示、数据排序和过滤等功能! Google Tag Library 该标记库和 Google 有关。使用该标记库,利用 Google 为你的网站提供网站查询,并且可以...

    java开源包6

    GWT Advanced Table 是一个基于 GWT 框架的网页表格组件,可实现分页数据显示、数据排序和过滤等功能! Google Tag Library 该标记库和 Google 有关。使用该标记库,利用 Google 为你的网站提供网站查询,并且可以...

    java开源包5

    GWT Advanced Table 是一个基于 GWT 框架的网页表格组件,可实现分页数据显示、数据排序和过滤等功能! Google Tag Library 该标记库和 Google 有关。使用该标记库,利用 Google 为你的网站提供网站查询,并且可以...

    java开源包10

    GWT Advanced Table 是一个基于 GWT 框架的网页表格组件,可实现分页数据显示、数据排序和过滤等功能! Google Tag Library 该标记库和 Google 有关。使用该标记库,利用 Google 为你的网站提供网站查询,并且可以...

    java开源包4

    GWT Advanced Table 是一个基于 GWT 框架的网页表格组件,可实现分页数据显示、数据排序和过滤等功能! Google Tag Library 该标记库和 Google 有关。使用该标记库,利用 Google 为你的网站提供网站查询,并且可以...

    java开源包8

    GWT Advanced Table 是一个基于 GWT 框架的网页表格组件,可实现分页数据显示、数据排序和过滤等功能! Google Tag Library 该标记库和 Google 有关。使用该标记库,利用 Google 为你的网站提供网站查询,并且可以...

    java开源包7

    GWT Advanced Table 是一个基于 GWT 框架的网页表格组件,可实现分页数据显示、数据排序和过滤等功能! Google Tag Library 该标记库和 Google 有关。使用该标记库,利用 Google 为你的网站提供网站查询,并且可以...

    java开源包9

    GWT Advanced Table 是一个基于 GWT 框架的网页表格组件,可实现分页数据显示、数据排序和过滤等功能! Google Tag Library 该标记库和 Google 有关。使用该标记库,利用 Google 为你的网站提供网站查询,并且可以...

    java开源包101

    GWT Advanced Table 是一个基于 GWT 框架的网页表格组件,可实现分页数据显示、数据排序和过滤等功能! Google Tag Library 该标记库和 Google 有关。使用该标记库,利用 Google 为你的网站提供网站查询,并且可以...

    Java资源包01

    GWT Advanced Table 是一个基于 GWT 框架的网页表格组件,可实现分页数据显示、数据排序和过滤等功能! Google Tag Library 该标记库和 Google 有关。使用该标记库,利用 Google 为你的网站提供网站查询,并且可以...

    SpringMVC入门——跟开涛学SpringMVC

    另外还有一种基于组件的、事件驱动的Web框架在此就不介绍了,如Tapestry、JSF等。SpringWebMVC也是服务到工作者模式的实现,但进行可优化。前端控制器是DispatcherServlet;应用控制器其实拆为处理器映射器...

Global site tag (gtag.js) - Google Analytics