`
xzcgeorge
  • 浏览: 32118 次
  • 性别: Icon_minigender_1
  • 来自: 珠海
社区版块
存档分类
最新评论

[zt]JSF生命周期实例详解

    博客分类:
  • jsf
 
阅读更多

http://lipeng3252642.blog.163.com/blog/static/101626428200811532127925/

JSF生命周期一共有6个phase.关于这六个phase的也比较好理解。大致如下:
第一阶段:恢复视图.
        仅仅重建组件树(视图). 由FacesServletr控制器进行管理的"用户请求"(内容,一般为JSP)",创建唯一视图ID(XXX.JSP). 如果是"回传",即视图存在,则直接使用.
第二阶段:应用请求值.
        用来自客户端的最新数据(即,上次输入的存放在托管Bean的属性里的值(第四阶段:更新模型值);如果是首次请求,即为Faces- config.xml里初始化的值.)更新这些服务器端组件(绑定属性的组件调用getXxx方法,从托管Bean的属性里获取其值).
        如果Manage Bean(托管Bean) 的scope 为Request,则每次"用户请求"都要初始化托管Bean(Faces-config.xml里的Bean进行初始化,按Manage-rule 进行设置属性,如果显示说明的话).更新组件值,调用getXxx,即绑定属性的组件检索其值.
        如果托管Bean 已初始化,即scope=session并已"用户请求"过,则仅更新组件值,调用getXxx,即绑定属性的组件检索其值.
        如果请求值为空,则直接返回到第六阶段:渲染响应.
第三阶段:验证请求值
        进行验证请求.
第四阶段:更新模型值
        调用setXxx方法,更新托管Bean的属性值.
第五阶段:调用应用
        对队列里的事件进行调用.
第六阶段:渲染响应
        在视图中显示所有组件(调用getXxx方法给组件赋值,然后绘制出来传给用户) .
现在我将用一个例子来说明JSF的生命周期。废话就不多说了,用实例来解释一下吧!
首先我们需要一个自定义的Listener. 实现PhaseListener接口。
package com.jsflifecycle.test;
import javax.faces.event.PhaseEvent;
import javax.faces.event.PhaseId;
import javax.faces.event.PhaseListener;
public class MyPhaseListener implements PhaseListener
{
  public void afterPhase(PhaseEvent event)
  {
    if(event.getPhaseId().equals(PhaseId.RESTORE_VIEW))
    {
       System.out.println("after restore view: phase id - " + PhaseId.RESTORE_VIEW);
    }
    if(event.getPhaseId().equals(PhaseId.APPLY_REQUEST_VALUES))
    {
      System.out.println("after APPLY_REQUEST_VALUES: phase id - " + PhaseId.APPLY_REQUEST_VALUES);
    }
    if(event.getPhaseId().equals(PhaseId.PROCESS_VALIDATIONS))
    {
      System.out.println("after PROCESS_VALIDATIONS: phase id - " + PhaseId.PROCESS_VALIDATIONS);
    }
    if(event.getPhaseId().equals(PhaseId.UPDATE_MODEL_VALUES))
    {
      System.out.println("after UPDATE_MODEL_VALUES: phase id - " + PhaseId.UPDATE_MODEL_VALUES);
    }
    if(event.getPhaseId().equals(PhaseId.INVOKE_APPLICATION))
    {
      System.out.println("after INVOKE_APPLICATION: phase id - " + PhaseId.INVOKE_APPLICATION);
    }
    if(event.getPhaseId().equals(PhaseId.RENDER_RESPONSE))
    {
      System.out.println("after RENDER_RESPONSE: phase id - " + PhaseId.RENDER_RESPONSE);
    }
  }
  public void beforePhase(PhaseEvent event)
  {
    if(event.getPhaseId().equals(PhaseId.RESTORE_VIEW))
    {
       System.out.println("before restore view: phase id - " + PhaseId.RESTORE_VIEW);
    }
    if(event.getPhaseId().equals(PhaseId.APPLY_REQUEST_VALUES))
    {
      System.out.println("before APPLY_REQUEST_VALUES: phase id - " + PhaseId.APPLY_REQUEST_VALUES);
    }
    if(event.getPhaseId().equals(PhaseId.PROCESS_VALIDATIONS))
    {
      System.out.println("before PROCESS_VALIDATIONS: phase id - " + PhaseId.PROCESS_VALIDATIONS);
    }
    if(event.getPhaseId().equals(PhaseId.UPDATE_MODEL_VALUES))
    {
      System.out.println("before UPDATE_MODEL_VALUES: phase id - " + PhaseId.UPDATE_MODEL_VALUES);
    }
    if(event.getPhaseId().equals(PhaseId.INVOKE_APPLICATION))
    {
      System.out.println("before INVOKE_APPLICATION: phase id - " + PhaseId.INVOKE_APPLICATION);
    }
    if(event.getPhaseId().equals(PhaseId.RENDER_RESPONSE))
    {
      System.out.println("before RENDER_RESPONSE: phase id - " + PhaseId.RENDER_RESPONSE);
    }
  }
  public PhaseId getPhaseId()
  {
    // TODO Auto-generated method stub
    return PhaseId.ANY_PHASE;
  }
}

注意:getPhaseId()方法的返回值,这个监听器的作用很简单,就是为了显示信息。

当然还需要在faces-config.xml中进行配置:

    <lifecycle>
        <phase-listener>
            com.jsflifecycle.test.MyPhaseListener
        </phase-listener>
    </lifecycle>

接下来,我们再准备一个自定义的Validator.和一个自定义的Convorter.他们分别实现Validator接口和Converter接口。

package com.jsflifecycle.test;
import javax.faces.component.UIComponent;
import javax.faces.context.FacesContext;
import javax.faces.convert.Converter;
import javax.faces.convert.ConverterException;
public class MyConverter implements Converter
{
  public Object getAsObject(FacesContext context, UIComponent component, String value)
      throws ConverterException
  {
    System.out.println("getAsObject :  value====>" + value);
     if(value.equals("leap")){
         value="lipeng";
         System.out.println("************value********>" + value);
     }
    return value;
  }
  public String getAsString(FacesContext context, UIComponent component, Object value)
      throws ConverterException
  {
    System.out.println("getAsString : value====>" + value);
    return (String)value;
  }
}

package com.jsflifecycle.test;
import javax.faces.component.UIComponent;
import javax.faces.context.FacesContext;
import javax.faces.validator.Validator;
import javax.faces.validator.ValidatorException;

public class MyRequiredValidator implements Validator
{
  public void validate(FacesContext context, UIComponent component, Object value)
      throws ValidatorException
  {
    System.out.println("my validdator: component id=====>" + component.getId()
        + " value====>" + value);
    String value1  = (String)value;
    if(value1.equals("123")){
        value="456";
    }
    //throw new ValidatorException(new FacesMessage("my validator failed"));
  }
}

大家可以看到。这些代码的作用就是为了打印信息,以便我们可以跟踪生命周期的过程。当然不要忘记在faces-config.xml中配置上

<converter>
        <converter-id>myConverter</converter-id>
        <converter-class>
            com.jsflifecycle.test.MyConverter
        </converter-class>
    </converter>
    <validator>
        <validator-id>myRequiredValidator</validator-id>
        <validator-class>
            com.jsflifecycle.test.MyRequiredValidator
        </validator-class>
    </validator>

当然了 还得一个 Backing Bean 来测试。

package com.jsflifecycle.test;
import javax.faces.event.PhaseId;
public class User {
private String name;
private String password;
public String login() {
     System.out.println(" ==========login============= "+ name);
     //setName("login");
    return "";
}
public String getName() {
     System.out.println(" =======getName============= "+ name);
    return name;
}
public void setName(String name) {
     System.out.println(" =======setName============= "+ name);
    this.name = name;
}
public String getPassword() {
     System.out.println(" =======getPassword============= "+ password);
    return password;
}
public void setPassword(String password) {
     System.out.println(" =======setPassword============= "+ password);
    this.password = password;
}
}

把Backing Bean加入到faces-config.xml中配置上

<managed-bean>
        <managed-bean-name>user</managed-bean-name>
        <managed-bean-class>
            com.jsflifecycle.test.User
        </managed-bean-class>
        <managed-bean-scope>session</managed-bean-scope>
        <!--  <managed-property>
            <property-name>name</property-name>
            <value>leap</value>

        </managed-property>
           -->
    </managed-bean>

最后来一个页面测试一下吧!

<%@ taglib uri="http://java.sun.com/jsf/core" prefix="f"%>
<%@ taglib uri="http://java.sun.com/jsf/html" prefix="h"%>
<f:view>
    <h:form id="form">
        <h:panelGrid columns="3" cellpadding="3" cellspacing="3"
            headerClass="login-heading">
                <h:outputText value="userName" />
            <h:inputText id="userName" value="#{user.name}" maxlength="30">
                <f:converter converterId="myConverter" />
                <f:validateLength maximum="30" minimum="3" />
            </h:inputText>
            <h:message for="userName" errorClass="errors" />

                <h:outputText value="password"/>
            <h:inputSecret id="passwordInput"  value="#{user.password}" maxlength="20" size="20">
                <f:validator validatorId="myRequiredValidator" />
            </h:inputSecret>
            <h:message for="passwordInput" errorClass="errors" />

            <h:commandButton action="#{user.login}" value="submit" />
        </h:panelGrid>
    </h:form>
</f:view>
通过以上配置,查看一下打印的信息就很清楚的理解JSF的生命周期了。暂时现些到这吧得睡觉了。



分享到:
评论

相关推荐

    JSF 生命周期 实例详解

    在深入理解JSF请求处理生命周期之前,我们先要明白JSF的核心目标是简化Web开发,尤其是处理用户输入和更新服务器端状态的过程。生命周期的概念在JSF中扮演着至关重要的角色,因为它自动化了许多传统Web技术中需要...

    JSF生命周期总结JSF生命周期总结

    JSF生命周期总结JSF生命周期总结JSF生命周期总结JSF生命周期总结JSF生命周期总结JSF生命周期总结

    JSF生命周期实例,还要多长啊

    JSF生命周期是理解其工作原理的关键,它包括六个主要阶段:恢复视图、应用请求值、处理验证、更新模型值、调用应用逻辑和渲染响应。在这些阶段中,每个阶段都有特定的任务,确保用户输入被正确处理并更新到服务器端...

    JSF生命周期及组件开发

    ### JSF生命周期及组件开发详解 #### 一、JSF生命周期概述 JavaServer Faces (JSF) 是一种基于Java EE标准的服务器端组件框架,用于简化企业级Web应用程序的开发。JSF提供了一种声明式的组件化编程模型,使得...

    jsf生命周期学习文档

    【JSF生命周期详解】 JSF(JavaServer Faces)是一种基于Java的Web应用程序开发框架,它以组件为中心,简化了服务器端应用程序的用户界面构建。JSF的核心组成部分包括预定义的UI组件、事件驱动的编程模型以及支持第...

    JSF生命周期的事件处理

    ### JSF生命周期的事件处理 JavaServer Faces(简称JSF)是Java平台提供的一种用于构建企业级Web应用程序的标准框架。JSF通过定义一套简洁而强大的API来帮助开发者更轻松地开发用户界面。其中,JSF的生命周期管理...

    JSF生命周期及组件开发P

    JSF生命周期是指从客户端发起请求到服务器响应的过程,它包括了五个主要阶段:恢复视图、应用请求的值、处理验证、更新模型值、调用程序和处理事件以及进行响应。 1. **恢复视图阶段**: 在这个阶段,JSF框架通过...

    jsf实例jsf实例 JSF学习 JSF jar包 JSF

    jsf实例 JSF学习 JSF jar包 JSF jsf实例 JSF学习 JSF jar包 JSFjsf实例 JSF学习 JSF jar包 JSF jsf实例 JSF学习 JSF jar包 JSF

    jsf生命周期和一部分标签介绍

    **JSF(JavaServer Faces)生命周期详解** JSF是一种用于构建Web应用程序的MVC(Model-View-Controller)框架,由Java Community Process定义并维护。它简化了UI开发,提供了丰富的组件库,并处理了用户输入的验证...

    jsf demo 各种实例

    **JSF生命周期** 包含6个主要阶段:恢复视图、应用请求值、处理验证、更新模型值、调用应用业务逻辑和呈现响应。在每个阶段,JSF处理用户的输入、执行验证、更新模型并生成响应。 **JSF示例** 在"jsfdemo"这个...

    JSF实例源代码下载

    JSF生命周期包括六步:恢复视图、应用请求值、处理验证、更新模型值、调用应用程序和渲染响应。 2. **JSF组件**:JSF的核心是其组件库,这些组件可以直接在页面上使用,如输入字段、按钮、表格等。每个组件都有自己...

    JSF 详解

    JSF 详解 JSF(JavaServer Faces)是一种基于Java技术的Web应用程序框架,用于简化Web应用程序的开发。JSF的核心概念是控件树,以MVC模式为基础,提供了一个灵活的Web应用程序开发框架。 结构 JSF的结构图可以分为...

    JSF标签应用实例

    这对于学习JSF的生命周期、EL(Expression Language)表达式以及组件之间的数据绑定至关重要。 总结来说,这个"JSF标签应用实例"提供了一个实际的环境来学习和实践JSF技术,包括标签的使用、组件的交互以及整个JSF...

    jsf增删改实例

    总的来说,"jsf增删改实例"展示了如何使用JSF的组件、数据绑定和生命周期来实现Web应用中的基本数据操作。实践中,开发者还需要理解JSF的事件处理机制、转换和验证,以及如何处理分页、排序等复杂需求。JSF的强项...

    jsf+spring 实例

    通过这个实例,开发者可以学习如何在JBoss上搭建一个整合了JSF和Spring的Web应用,理解两者是如何协同工作的,以及如何处理前端交互和后端服务的通信。这将有助于提升Java Web开发的能力和实践经验。

    JSF登录的实例 Eclipse

    本实例将通过Eclipse集成开发环境(IDE)来创建一个JSF登录系统,并在Tomcat服务器上进行部署和运行。 首先,我们需要在Eclipse中创建一个新的JSF项目。选择"File" -&gt; "New" -&gt; "Dynamic Web Project",然后为项目...

    jsf第一个例子 jsf架包 jsf实例

    1. **JSF生命周期**:JSF有六个主要阶段,包括恢复视图、应用请求值、处理验证、更新模型值、调用应用业务逻辑以及渲染响应。开发者可以在这些阶段插入自定义行为。 2. **JSF页面(Facelets)**:JSF使用Facelets...

    JSF实例

    ### JSF生命周期 JSF组件有六个主要阶段:恢复视图、应用请求值、处理验证、更新模型值、调用应用事件和呈现响应。在这个过程中,JSF处理用户提交的数据,进行验证,更新模型,然后渲染响应。 ### PPT演示 PPT演示...

    JSF教程(有关jsf实例的操作步骤)

    JSF组件经历了六步生命周期:恢复视图、应用请求值、处理验证、更新模型值、调用应用程序和呈现响应。每一步都提供了插入自定义行为的机会,如验证用户输入或执行业务逻辑。 **4. Facelets** Facelets是JSF的标准...

    jsf入门实例教程

    JSF的生命周期包括六个阶段:恢复视图、应用请求值、处理验证、更新模型值、调用应用业务逻辑和渲染响应。 **二、JSF环境搭建** 首先,你需要安装Java Development Kit (JDK) 和一个集成开发环境(IDE),如Eclipse或...

Global site tag (gtag.js) - Google Analytics