科技行者

行者学院 转型私董会 科技行者专题报道 网红大战科技行者

知识库

知识库 安全导航

至顶网软件频道简介Java Server Faces

简介Java Server Faces

  • 扫一扫
    分享文章到微信

  • 扫一扫
    关注官方公众号
    至顶头条

JSF(Java Server Faces)体系结构是一种Web应用程序框架,它是首个Web应用程序开发的标准框架。

作者:郭雄 来源:goCom 2007年12月26日

关键字:

  • 评论
  • 分享微博
  • 分享邮件

在本页阅读全文(共3页)

在JSF页面中添加以下代码来显示contactorsBlog的初始化值:

<p>A few well-known blogs:</p> 
<p>Bill</p>
<p>Location:
<h:outputText value="#{userBean.contactorsBlog['Bill']}"/></p>
<p>Kevin</p>
<p>Location:
<h:outputText value="#{userBean. contactorsBlog['Kevin']}"/></p>
<p> Alex </p>
<p>Location:
<h:outputText value="#{userBean. contactorsBlog['Alex']}"/></p>

在这个例子中,Map的键和值都是String类型,但有的时候我们可能需要特殊的类型,如关键字是整数型,或者值是一个日期类型。为了支持这种情况,我们可能通过使用<key-class>和<value-class>元素将关键字和值转换为特定的类型。

除了将Map和List作为一个已存在的bean的受管属性,我们还可以将任何List或Map声明为托管Bean(不支持将数组声明为独立的托管Bean)。比如我可以在faces-config.xml文件中直接创建一个”toDo” List,这是完全定义在配置文件中的一个独立的List并且不是userBean的属性:

<managed-bean> 
<managed-bean-name>toDo</managed-bean-name>
<managed-bean-class>java.util.ArrayList</managed-bean-class>
<managed-bean-scope>request</managed-bean-scope>
<list-entries>
<value>Finish the remainder of this article</value>
<value>Prepare a new article</value>
</list-entries>
</managed-bean> 

注意,managed-bean-class是一个具体的”ArrayList”而不是”List”接口。

现在我们已经可以看到JSF托管bean对于控制实例化和初始化的强大之处了,接下来,我们将看到JSF是如何处理托管bean之间的依赖。

3.2.2、依赖处理

具有处理Java对象之间依赖关系的能力也是IoC必不可少的一点。尽管JSF不能处理循环依赖,但托管bean可能使用EL表达式相互引用。例如我可以将之前定义的ToDo托管bean引用到其它地方,例如userBean的tasks属性:

<managed-property> 
<property-name>tasks</property-name>
<list-entries>
<value>Finish Module A Designing</value>
<value>Finish Coding of Module A</value>
<value>Finish Testing Module A </value>
<value>#{toDo[0]}</value>
<value>#{toDo[1]}</value>
</list-entries>
</managed-property> 

在这里需要指出的是,对于toDo托管bean与tasks属性的声明顺序是不需要关心的。不管被依赖的bean和调用bean在faces-config.xml文件中的声明顺序是怎样的,JSF托管bean工具都可以确保它是可用的。另外一个关于托管bean相互引用较重要的一点是,一个托管bean只能引用那些与它指定了相同的范围(scope)的bean,或者是生命周期比它自己长的托管bean。

3.2.3、生命周期

对于IoC必不可少的一点是对处理生命周期的支持。实际上JSF的托管bean工具对处理生命周期的支持做得非常好,因为它要求为HTTP request定义一个明确的生命周期范围,而在其它IoC容器中,对于这一点的处理则更一般。与在JSP UseBean标签中指定的范围参数类似,JSF有以下几种类型的生命周期范围:

none:这种类型的托管bean不会被存储在任何地方,只有当需要它的时候才被创建。
request:这种类型的bean只会将它的值存储在一个单独的请求的整段时期内,对于在同一对象上的并发请求,会实例化一个新的版本。
session:这种类型的bean会被存储在session中,意味着这个bean的属性在多个请求期间会一直存在。对象存储在session中无疑是线程安全的,并且如果不被应用程序显示的清除掉的话,当session过期后就会终止。
application:一个对象被创建为application范围,将在容器的整个生命周期内一直存在。

在JSF中,“page”范围是不可用的。这样做的目的是为了使托管bean不依赖于指定的页面。

下面给出各种scope的托管bean可引用到的范围:

托管Bean注册范围
只可引用的范围内的Bean
none
none
request
none,request,session.application
session
none,session,application
application
none,application

3.2.4、配置支持

通过前面的一些例子,我们已经看到JSF托管bean是如何使用一个简单的XML文件来注册和实例化一些bean的属性的。功能强大并且操作起来也很简单,当然这样的工作只有当你希望去调用一些定制的应用逻辑时才有必要,否则JSF的主要工作是呈现一个Web UI到客户端并将其自动与一些托管对象保持同步。

4、结束语

在这篇文章中主要对JSF做了一些简单的介绍,并为了向大家证明JSF的托管bean也是一个真正的IoC容器的实现而做了更加详细的说明。JSF是一个优秀的框架,它具有很好的可配置性和可扩展性。例如Ajax4JSF就是将Ajax与JSF的优势相结合,使得Web应用中前端的开发变得更加容易,功能更加强大。市场上支持JSF可视化开发的工具也很多,如:Eclipse Web Tools、Oracle Jdeveloper 10g、Sybase WorkSpace、BEA Workshop等等,另外也有一些不错的对JSF现实的开源框架,如Apache 的MyFaces、ICESoft的ICEfaces、在Sun指导下开发的Facelets。在下篇文章中,将介绍JSF的其它的一些关键部件。如:

◆验证器
◆转换器
◆事件和监听器
◆页面导航
◆呈现器

注解:托管bean,在JSF的其它文章中亦称受管bean。英文原名Managed Bean。

查看本文来源

    • 评论
    • 分享微博
    • 分享邮件
    邮件订阅

    如果您非常迫切的想了解IT领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。

    重磅专题
    往期文章
    最新文章