Java Server Face介绍

本文介绍了JavaServer Faces(JSF),一种用于快速开发Web应用程序的框架。对比MVC架构,阐述了JSF的设计特点及其实现机制,并通过示例展示了如何使用JSF进行分层开发。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Java Server Face是快速开发web应用的一个框架和解决方案。他改变了以往基于java web应用的request-response处理机制,采用了事件驱动处理机制。这为在java平台上快速开发web应用提供了可能。JSF框架简化了web form有效性检查、request参数解析,状态管理,多线程支持等任务。开发人员只需实现具体的事件处理器和事务逻辑(在JSF中分别称为Handlers和Components)。<o:p></o:p>

在采用JSF框架进行开发时,不需要继承实现JSF的任何API,应用各组件之间的关系通过一个XML(faces-config.xml)配置文件实现。他的实现方式与以往介绍过的Spring框架有些类似。<o:p></o:p>

Java Server FaceMVC架构比较<o:p></o:p>

与现在较为流行的MVC 架构有所不同,JSF在设计结构上并没有将视图和逻辑事务严格的分开,而是依赖于程序设计人员的具体实现。比如Handlers和Components在 实际的开发中可以在一个类中实现,这样就会使视图层和逻辑处理层紧密的偶合在一起。建议在进行JSF项目时应严格要求程序设计人员将Handlers和 Components分离。<o:p></o:p>

<o:wrapblock><v:shapetype coordsize="21600,21600" o:spt="75" o:preferrelative="t" path="m@4@5l@4@11@9@11@9@5xe" filled="f" stroked="f" id="_x0000_t75"><v:stroke joinstyle="miter"></v:stroke><v:formulas><v:f eqn="if lineDrawn pixelLineWidth 0"></v:f><v:f eqn="sum @0 1 0"></v:f><v:f eqn="sum 0 0 @1"></v:f><v:f eqn="prod @2 1 2"></v:f><v:f eqn="prod @3 21600 pixelWidth"></v:f><v:f eqn="prod @3 21600 pixelHeight"></v:f><v:f eqn="sum @0 0 1"></v:f><v:f eqn="prod @6 1 2"></v:f><v:f eqn="prod @7 21600 pixelWidth"></v:f><v:f eqn="sum @8 21600 0"></v:f><v:f eqn="prod @7 21600 pixelHeight"></v:f><v:f eqn="sum @10 21600 0"></v:f></v:formulas><v:path o:extrusionok="f" gradientshapeok="t" o:connecttype="rect"></v:path><o:lock v:ext="edit" aspectratio="t"></o:lock></v:shapetype></o:wrapblock>
以下是MVC(以Struts为例)和JSF框架在结构设计上的比较<o:p></o:p>

 <o:p></o:p>


从上图可以看出,MVC和JSF的开发结构有很大的区别。MVC主要关注于开发应用各层的松散偶合;JSF则关注于事件处理。从应用上分析,MVC重视结构的划分而JSF致力于为快速开发提供基础解决方案。笔者建议不能简单的比较两种架构的优劣,应结合实际的开发和应用选择。<o:p></o:p>

Java Server Face的技术实现<o:p></o:p>

JSF框架的实现依赖于以下几种技术:Java Tag LibIoC type2setter and getter,xml

JSF的表示层使用Tag lib技术处理webform object

使用IoC type2xmlform object和具体的handlercomponent关联起来

Java Server Face的示例<o:p></o:p>

示例应用需求说明:实现一个用户管理功能,要求将视图层、逻辑层、数据访问层分开,降低各层的偶合度。<o:p></o:p>

<o:wrapblock><v:shape type="#_x0000_t75" style="margin-top: 18.2pt; z-index: 2; left: 0px; margin-left: 0px; width: 415.5pt; position: absolute; height: 430.5pt; text-align: left;" id="_x0000_s1027"><v:imagedata src="file:///F:/DOCUME%7E1/ADMINI%7E1/LOCALS%7E1/Temp/msoclip1/04/clip_image003.wmz" o:title=""></v:imagedata><w:wrap type="topAndBottom"></w:wrap></v:shape></o:wrapblock>
下图是示例的简单类图,其中数据层采用DAO+Hibernate技术<o:p></o:p>

 <o:p></o:p>


UserForm代码:<o:p></o:p>

package jsfdemo.forms;<o:p></o:p>

 <o:p></o:p>

 <o:p></o:p>

/**<o:p></o:p>

 * Created date:2004-8-19<o:p></o:p>

 * @author genstone<o:p></o:p>

 *<o:p></o:p>

 */<o:p></o:p>

public class UserForm<o:p></o:p>

{<o:p></o:p>

    private String username;<o:p></o:p>

    private Long userid;<o:p></o:p>

    private String password;<o:p></o:p>

    <o:p></o:p>

    /**<o:p></o:p>

     * @return Returns the username.<o:p></o:p>

     */<o:p></o:p>

    public String getUsername()<o:p></o:p>

    {<o:p></o:p>

        return username;<o:p></o:p>

    }<o:p></o:p>

    /**<o:p></o:p>

     * @param username The username to set.<o:p></o:p>

     */<o:p></o:p>

    public void setUsername(String username)<o:p></o:p>

    {<o:p></o:p>

        this.username = username;<o:p></o:p>

    }<o:p></o:p>

    /**<o:p></o:p>

     * @return Returns the password.<o:p></o:p>

     */<o:p></o:p>

    public String getPassword()<o:p></o:p>

    {<o:p></o:p>

        return password;<o:p></o:p>

    }<o:p></o:p>

    /**<o:p></o:p>

     * @param password The password to set.<o:p></o:p>

     */<o:p></o:p>

    public void setPassword(String password)<o:p></o:p>

    {<o:p></o:p>

        this.password = password;<o:p></o:p>

    }<o:p></o:p>

    /**<o:p></o:p>

     * @return Returns the userid.<o:p></o:p>

     */<o:p></o:p>

    public Long getUserid()<o:p></o:p>

    {<o:p></o:p>

        return userid;<o:p></o:p>

    }<o:p></o:p>

    /**<o:p></o:p>

     * @param userid The userid to set.<o:p></o:p>

     */<o:p></o:p>

    public void setUserid(Long userid)<o:p></o:p>

    {<o:p></o:p>

        this.userid = userid;<o:p></o:p>

    }<o:p></o:p>

}<o:p></o:p>

 <o:p></o:p>

UserHandler代码:<o:p></o:p>

package jsfdemo.handlers;<o:p></o:p>

 <o:p></o:p>

import jsfdemo.components.BaseComponent;<o:p></o:p>

 <o:p></o:p>

/**<o:p></o:p>

 * Created date:2004-9-20<o:p></o:p>

 * @author genstone<o:p></o:p>

 *<o:p></o:p>

 */<o:p></o:p>

public class UserHandler<o:p></o:p>

{<o:p></o:p>

    private BaseComponent component;<o:p></o:p>

    <o:p></o:p>

    /**<o:p></o:p>

     * @return Returns the component.<o:p></o:p>

     */<o:p></o:p>

    public BaseComponent getComponent()<o:p></o:p>

    {<o:p></o:p>

        return component;<o:p></o:p>

    }<o:p></o:p>

    /**<o:p></o:p>

     * @param component The component to set.<o:p></o:p>

     */<o:p></o:p>

    public void setComponent(BaseComponent component)<o:p></o:p>

    {<o:p></o:p>

        this.component = component;<o:p></o:p>

    }<o:p></o:p>

    <o:p></o:p>

    public void save()<o:p></o:p>

    {<o:p></o:p>

        component.save();<o:p></o:p>

    }<o:p></o:p>

    <o:p></o:p>

    public void delete()<o:p></o:p>

    {<o:p></o:p>

        component.delete();<o:p></o:p>

    }<o:p></o:p>

    <o:p></o:p>

    public void modify()<o:p></o:p>

    {<o:p></o:p>

        component.modify();<o:p></o:p>

    }<o:p></o:p>

}<o:p></o:p>

 <o:p></o:p>

 <o:p></o:p>

UserComponent代码:<o:p></o:p>

package jsfdemo.components;<o:p></o:p>

 <o:p></o:p>

 <o:p></o:p>

import net.sf.hibernate.HibernateException;<o:p></o:p>

 <o:p></o:p>

import jsfdemo.beans.UserInfo;<o:p></o:p>

import jsfdemo.daos.BaseDAO;<o:p></o:p>

import jsfdemo.forms.UserForm;<o:p></o:p>

import jsfdemo.util.ValueObejctUtil;<o:p></o:p>

import util.Logger;<o:p></o:p>

 <o:p></o:p>

/**<o:p></o:p>

 * Created date:2004-9-20<o:p></o:p>

 * @author genstone<o:p></o:p>

 *<o:p></o:p>

 */<o:p></o:p>

public class UserComponent implements BaseComponent<o:p></o:p>

{<o:p></o:p>

    private UserForm userForm =null;<o:p></o:p>

    private BaseDAO dao = null;<o:p></o:p>

    <o:p></o:p>

    /**<o:p></o:p>

     * @return Returns the userForm.<o:p></o:p>

     */<o:p></o:p>

    public UserForm getUserForm()<o:p></o:p>

    {<o:p></o:p>

        return userForm;<o:p></o:p>

    }<o:p></o:p>

    /**<o:p></o:p>

     * @param userForm The userForm to set.<o:p></o:p>

     */<o:p></o:p>

    public void setUserForm(UserForm userForm)<o:p></o:p>

    {<o:p></o:p>

        this.userForm = userForm;<o:p></o:p>

    }<o:p></o:p>

    <o:p></o:p>

    public boolean save()<o:p></o:p>

    {<o:p></o:p>

        UserInfo info = ValueObejctUtil.getPersistObject((UserForm)userForm);<o:p></o:p>

        try<o:p></o:p>

        {<o:p></o:p>

            //insert into database<o:p></o:p>

            info.userid = (Long)dao.save(info);<o:p></o:p>

        }<o:p></o:p>

        catch (HibernateException e)<o:p></o:p>

 &n

如果您是从使用的角度来看 JSF,则您不用理会HTTP、数据转换等细节,JSF 将细节 都隐藏起来了,无论您是网页设计人员或是应用程序设计人员,都可以使用自己熟悉的方式 来看JSF。 • 入门 藉由以下的几个主题,可以大致了解JSF 的轮廓与特性,我们来看看网页设计人员 与应用程序设计人员各负责什么。 o 简介 JSF o 第一个 JSF 程序 o 简单的导航 Navigation o 导航规则设置 o JSF Expression Language o 国际化讯息 • Managed Beans JSF 使用 Bean 来达到逻辑层与表现层分离的目的,Bean 的管理集中在组态档 案中,您只要修改组态档案,就可以修改 Bean 之间的相依关系。 o Backing Beans o Beans 的组态与设定 o Beans 上的 List, Map • 数据转换与验证 转换器(Converter)协助模型与视图之间的数据转换,验证器(Validator)协助 进行语意检验(Semantic Validation)。 o 标准转换器 o 自订转换器 o 标准验证器 o 自订验证器 o 错误讯息处理 o 自订转换, 验证标签 • 事件处理 JSF 的事件模型提供一个近似的桌面GUI 事件模式,让熟悉GUI 设计的人员也能 快速上手Web 程序设计。 o 动作事件 o 实时事件 o 值变事件 o Phase 事件 JSF 标签 Tellixu 整理 2005-12-16 JSF 教程 2 网页设计人员要作的就是了解JSF 的标签的使用方式,这就像是学习进阶的HTML 标 签,另一件事就是与程序设计人员沟通好各个Bean 的名称绑定。 • 标签入门 卷标的相关属性查询,您可以参考 Tag Library Documentation,这边的介绍只 是一些简单的入门实例。 o 简介 JSF 标准标签 o 输出类标签 o 输入类标签 o 命令类标签 o 选择类标签一 o 选择类标签二 o 其它标签 • 表格处理 对于必须使用表格方式呈现的数据,JSF 的 <h:dataTable> 卷标协助您进行动 态表格数据的输出。 o 简单的表格 o 表头, 表尾 o TableModel 类别 自订组件 JSF 让您可以自订组件,每个组件都是可替换的,这使得组件在搭配时更有弹性,但 相对的却使开发组件的过程复杂的多,这边对自订JSF 组件只是个入门砖,更多有关自订 组件的细节可得要专书来说明。 • JSF 生命周期与组件概述 要开发 JSF 组件,您需要更深入了解 JSF 的一些处理细节,包括了 JSF 生命周 期以及 JSF 框架。 o JSF 生命周期 o 概述自订组件 • 简单实例 在不考虑组件有子组件的情况下,这边以实际的一个例子来说明开发组件的过程, 至于考虑子组件的情况请参考专书介绍。 o 编码, 解碼 o 组件卷标 o 使用自订组件 o 自订 Renderer
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值