公司动态
当前位置:首页 > 公司动态 > 学术交流 > JSF框架的介绍(一)

        我现在所做的项目使用的是JSF框架,我把使用JSF框架的一些经验和理解跟大家分享一下。

 

         一、JSF的事件和生命周期

首先,Jsf包含了所有用于事件处理和组织组件的代码。应用程序编程人员完全可以忽略这些细节,而将精力投入到应用程序编辑上。在JSF里,有四类事件:值改变事件,当用户在输入框中输入数据后发生;动作事件,当用户提交Form时发生;数据模型事件,当数据表的某行被选中时发生;生命周期事件,当生命周期从一个阶段进入另一个阶段时发生。除了生命周期事件,其他事件都是桌面程序中大家所熟知的,而生命周期事件可以想象成窗口事件,例如窗口的生成、关闭、激活等等。

        关于JSF的生命周期,为什么很多人觉得JSF难学?都是生命周期惹的祸。JSP的生命周期只有一个阶段,而JSF却有6个阶段!为什么要这样呢?其实,这是JSF框架所必需的。JSF只有细分生命周期阶段,才能对Request和Response施加粒度足够细的控制,因为JSP那样粗粒度的控制,不足以支撑UI组件模型和事件模式。

 

 

       上图是正常的JSF组件的生命周期,一共12个。

       记住,所有JSF事件都在服务器上执行,当在JSF页面中提供一个事件处理程序时,就是告诉JSF实现当服务器处理页面中的用于输入时,应在生命周期的适当位置处理相应的事件.

        从"应用请求值"阶段开始,JSF实现会创建事件并在每个生命周期阶段期间将其添加到事件队列中.

        请求(一般不算在JSF生命周期中)

        第一阶段:还原视图

        第二阶段:应用请求值+过程事件

        第三阶段:过程验证+过程事件

        第四阶段:更新模型值+过程事件

        第五阶段:调用应用程序+过程事件

        第六阶段:呈现响应

        响应(一般不算在JSF生命周期中)

        首尾的请求,响应,如图所示是单独在外的.而剩下的就是真正意义上的JSF生命周期处理的步骤。

        二、JSF的导航

        1.静态导航

        在简单的Web应用程序中,网页导航是静态的。也就是说,单击特定按钮总是选择固定的JSF页面来呈现响应,如:

        <h:commandButton label=”Login” action=”welcome”>

        动作(action)的特性的值被称作结果(outcome),结果可以有选择地被映射到一个视图ID(在JSF规范中,一个JSF页面被称作视图)。

        2.动态导航

        在大多数Web应用程序中。导航不是静态的。页面流不仅取决于用户单击了那个按钮,也取决于用户的输入。例如,提交一个登录页面可能有两个结果:成功或失败。结果取决于计算,也就是说,用户名和密码是否合法。

        要实现动态导航,提交按钮必须有一个方法表达式,例如

        <h:commandButton label=”Login” action=”#{loginController.verifyUser}”/>

        在本例中,loginController引用了一个bean类,该类必须有一个名为verifyUser的方法。

        下面是一个动作方法的例子:     

        Public String verifyUser(){

        If(…)

        return “success”;

        else

        return “fail”;

        }

        该方法返回一个结果字符串,如success或fail,用于确定下一个视图。

        3.将结果映射到视图ID

        JSF的一个重要设计目标是分离表示逻辑和业务逻辑。当动态作出导航决策时,计算结果的代码并非一定要知道Web页面的确切名称。JSF提供了一种机制,用于将逻辑结果(如success和fail)映射到实际Web页面。

        通过将navigation-value条目添加到faces-config.xml中来实现该机制。下面是一个典型的实例。

        <navigation-value>

        <from-view-id>/index.xhtml</ from-view-id >

        <navigation-case>

        <from-outcome>success</ from-outcome>

        <to-view-id>/welcome.xhtml</to-view-id>

 </navigation-case>

        </ navigation-value >

        该规则规定,如果success结果在/index.xhtml中出现,就将其导航到/welcome.xhtml。

如果用户仔细地选取结果字符串,就可以将多个导航规则分组。例如,包含动作logout的按钮可能遍布于应用程序的多个页面中。使用以下的单个规则,用户能将所有这些按钮导航到loggedOut.xhtml页面。

         <navigation-value>

         <navigation-case>

         <from-outcome>success</ from-outcome>

         <to-view-id>/welcome.xhtml</to-view-id>

  </navigation-case>

         </ navigation-value >

         因为未指定from-view-id元素。该规则适用于所有页面。

         也可将导航规则与相同的from-view-id合并。下面是一个示例:

         <navigation-value>

         <from-view-id>/index.xhtml</ from-view-id >

         <navigation-case>

         <from-outcome>success</ from-outcome>

         <to-view-id>/welcome.xhtml</to-view-id>

  </navigation-case>

  <navigation-case>

         <from-outcome>fail</ from-outcome>

         <to-view-id>/newuser.xhtml</to-view-id>

  </navigation-case>

         </ navigation-value >

         4.重定向

         JSF的重定向可以将字符串?faces-redirect=true添加到结果字符串,例如

         <h:commandButton action="welcome?faces-redirect=true " label="Login"  />

         在导航规则中,在wo-view-id之后添加redirect元素,如以下代码所示:

         <navigation-case>

         <from-outcome>success</ from-outcome>

         <to-view-id>/welcome.xhtml</to-view-id>

         <redirect/>

         </navigation-case>

 

版权归威海众成信息科技股份公司所有,转载请注明出处