`
iloveflower
  • 浏览: 76531 次
社区版块
存档分类
最新评论
  • iloveflower: 呵呵。好好学习。。。。。。。。。。。。
    java 读书
  • Eric.Yan: 看了一点,不过是电子版的……你这一说到提醒我了,还要继续学习哈 ...
    java 读书

使用一个PhaseListener来熟悉JSF 生命周期

    博客分类:
  • JSF
 
阅读更多
作者: cschalk 

翻译: icess http://blog.matrix.org.cn/page/icess

JSF新手可能常常听到  "JSF Request Processing Lifecycle" ,但是不一定知道在生命周期中都发生了什么事情.



这里有一点代码, 一个  PhaseListener, 我们可以用她来了解  JSF's Request Processing Lifecycle如何工作的.

下面是一个在生命周期开始和结束时执行的一个简单的PhaseListener



package com.jsf;
import javax.faces.event.PhaseListener;
import javax.faces.event.PhaseEvent;
import javax.faces.event.PhaseId;

public class MyPhaseListener  implements PhaseListener
{

  public MyPhaseListener()
  {
  }

  public void beforePhase(PhaseEvent pe)
  {
   if (pe.getPhaseId() == PhaseId.RESTORE_VIEW)
      System.out.println("Processing new  Request!");
       
   System.out.println("before - " + pe.getPhaseId().toString());
  }

  public void afterPhase(PhaseEvent pe)
  {
  System.out.println("after - " + pe.getPhaseId().toString());
 
  if (pe.getPhaseId() == PhaseId.RENDER_RESPONSE)
     System.out.println("Done with Request!\n");
  }

  public PhaseId getPhaseId()
  { 
    return PhaseId.ANY_PHASE;
  }
}


当每一个阶段开始和结束的时候,她 在控制台上打印出一些东西. 你需要在 faces-config.xml中来注册该listener



<lifecycle>
<phase-listener>com.jsf.MyPhaseListener />
</lifecycle>



一旦你注册了  PhaseListener, 你就可以开始写个小程序来测试了. 我们使用一个简单的程序,一个输入表单和按钮:



<h:commandButton value="button" action="#{backingbean.button_action}"/<



按钮绑定了一个manage bean的动作方法.:

public String button_action()
  {
    System.out.println("Action event processed...");
    return "success";
  }

运行该页面可以看到下面的输出,.:

05/08/31 20:32:46 Processing new  Request!
05/08/31 20:32:46 before - RESTORE_VIEW 1
05/08/31 20:32:46 after - RESTORE_VIEW 1
05/08/31 20:32:46 before - RENDER_RESPONSE 6
05/08/31 20:32:46 after - RENDER_RESPONSE 6
05/08/31 20:32:46 Done with Request!

05/08/31 20:32:57 Processing new  Request!
05/08/31 20:32:57 before - RESTORE_VIEW 1
05/08/31 20:32:57 after - RESTORE_VIEW 1
05/08/31 20:32:57 before - APPLY_REQUEST_VALUES 2
05/08/31 20:32:57 after - APPLY_REQUEST_VALUES 2
05/08/31 20:32:57 before - PROCESS_VALIDATIONS 3
05/08/31 20:32:57 after - PROCESS_VALIDATIONS 3
05/08/31 20:32:57 before - UPDATE_MODEL_VALUES 4
05/08/31 20:32:57 after - UPDATE_MODEL_VALUES 4
05/08/31 20:32:57 before - INVOKE_APPLICATION 5
05/08/31 20:32:57 Action event processed...
05/08/31 20:32:57 after - INVOKE_APPLICATION 5
05/08/31 20:32:57 before - RENDER_RESPONSE 6
05/08/31 20:32:57 after - RENDER_RESPONSE 6
05/08/31 20:32:57 Done with Request!

注意在第一个请求 (non-postback) ,只有两个阶段, RESTORE_VIEW and RENDER_RESPONSE..这说明她只是创建  UI component tree然后显示她 . 下一步,你点击按钮,注意打印的消息. 这次她通过了整个jsf生命周期. 注意,按钮点击的动作事件在 INVOKE_APPLICATION phase处理...

现在,作为一个实验,把   commandButton 的 immediate  属性改变为 true ,看看如何影响动作事件的处理的.

下一步你可能想添加一个输入表单,并且添加一个  ValueChangeListener 来显示一个值变化事件.

A new input field...

<h:inputText value="foo">
<f:valueChangeListener type="com.jsf.MyValueChangeListener"/>
</h:inputText>

下面是ValueChangeListener代码..

package com.jsf;
import javax.faces.event.ValueChangeListener;
import javax.faces.event.ValueChangeEvent;
import javax.faces.event.AbortProcessingException;

public class MyValueChangeListener implements ValueChangeListener
{

  public MyValueChangeListener()
  {
  }

  public void processValueChange(ValueChangeEvent vce) throws AbortProcessingException
  {
     System.out.println("A value has changed!");
  }
}

这里你不需要在faces配置文件中注册 ValueChangeListener,你可以直接运行程序,看看有什么信息打印出来.

05/08/31 20:41:33 Processing new  Request!
05/08/31 20:41:33 before - RESTORE_VIEW 1
05/08/31 20:41:33 after - RESTORE_VIEW 1
05/08/31 20:41:33 before - RENDER_RESPONSE 6
05/08/31 20:41:33 after - RENDER_RESPONSE 6
05/08/31 20:41:33 Done with Request!

输入一个值在输入表单中, 看看有什么发生.

5/08/31 20:42:42 Processing new  Request!
05/08/31 20:42:42 before - RESTORE_VIEW 1
05/08/31 20:42:42 after - RESTORE_VIEW 1
05/08/31 20:42:42 before - APPLY_REQUEST_VALUES 2
05/08/31 20:42:42 after - APPLY_REQUEST_VALUES 2
05/08/31 20:42:42 before - PROCESS_VALIDATIONS 3
05/08/31 20:42:42 A value has changed!
05/08/31 20:42:42 after - PROCESS_VALIDATIONS 3
05/08/31 20:42:42 before - UPDATE_MODEL_VALUES 4
05/08/31 20:42:42 after - UPDATE_MODEL_VALUES 4
05/08/31 20:42:42 before - INVOKE_APPLICATION 5
05/08/31 20:42:42 Action event processed!
05/08/31 20:42:42 after - INVOKE_APPLICATION 5
05/08/31 20:42:42 before - RENDER_RESPONSE 6
05/08/31 20:42:42 after - RENDER_RESPONSE 6
05/08/31 20:42:42 Done with Request!

As you play with adding input fields, and later validations etc. you'll be able to see exactly where each portion of code is being executed!

Have fun!

-Chris http://jroller.com/page/cschalk?entry=getting_familiar_with_the_jsf

*******************************************************
http://hongsoft.iteye.com/blog/287384
JSF Phase extension

1)faces-config.xml的编辑
<lifecycle>
            <phase-listener>com.primeton.jsf.FlowPhaseListener</phase-listener>
</lifecycle>
就可以了。

2)listener的编辑
因为马上就要从 自己的代码中把这个多余的代码去掉,所以,还是把code全部copy出来吧。

public class FlowPhaseListener implements PhaseListener {

    public void afterPhase(PhaseEvent event) {
        // TODO Auto-generated method stub        
    }

    public void beforePhase(PhaseEvent event) {
        FacesContext context=event.getFacesContext();
        HttpServletRequest request=(HttpServletRequest)( context.getExternalContext().getRequest());       
        UIViewRoot root=context.getViewRoot();       
        String theActionString=getActionString(root);
        if(theActionString==null)
            return ;
        else
        {//下面是我们想在listener中做的事情
            int i=theActionString.indexOf(".flow");
            request.setAttribute("_eosFlowID", theActionString.substring(0, i+5));
            request.setAttribute("_eosFlowAction", theActionString.substring(i+6,theActionString.length()));
        }

    }
    //访问组件树哦,这个功能不错
    private String getActionString(UIComponent comp)
    {   
        String theActionString=null;
        for (Iterator it = comp.getFacetsAndChildren(); it.hasNext(); )
        {
            UIComponent childOrFacet = (UIComponent)it.next();           
            if(childOrFacet instanceof ActionSource)
            {
                ActionSource source = (ActionSource) childOrFacet;               
                theActionString=source.getAction().toString();
                if(null!=theActionString&&theActionString.length()>0&&theActionString.indexOf(".flow")>0)
                    return theActionString;
            }
            theActionString=getActionString(childOrFacet);
        }
        return theActionString;
    }
   //指定某个阶段
    public PhaseId getPhaseId() {
        // TODO Auto-generated method stub
        return PhaseId.PROCESS_VALIDATIONS;
    }

PhaseListener的思路和在JSF中的地位大家应该都已经清楚的,否则应该也不会看这个文章,这里就不说了。
分享到:
评论

相关推荐

    论文研究-基于JSF的Web应用中的身份认证研究 .pdf

    基于JSF的Web应用中的身份认证研究,陆秀吉,杨春金,本文针对JSF Web应用中身份认证问题,提出了五种可行的解决方案,着重讨论了使用Servlet Filter和PhaseListener来实现身份认证的方法,并提��

    arcgis 气泡显示

    通过使用MapToolAction、Arcgis javascript库和PhaseListener来实现气泡提示功能。考虑到通过点击地图时,如地理位置为x=124,y=85,很难保证鼠标能精确点击到该点上。地理位置与实际点击点的位置有一定的偏差。所以...

    Library-javaEE:使用 JPAHibernate ORM 和验证器、JUnit、Criptografia MD5、PrimeFaces 5.1、Facelets、EL、Ajax

    库-javaEE 使用 JPA/Hibernate ORM 和验证器、JUnit、PhaseListener Criptografia MD5、PrimeFaces 5.1、Facelets、EL、Ajax。

    Java Server Faces API 组件标签 API Reference 速查手册

    f:phaseListener f:selectItem f:selectItems f:setPropertyActionListener f:subview f:validateDoubleRange f:validateLength f:validateLongRange f:validator f:valueChangeListener f:verbatim f:...

    2024-2030全球及中国控制膨胀合金箔行业研究及十五五规划分析报告.docx

    2024-2030全球及中国控制膨胀合金箔行业研究及十五五规划分析报告

    通信历年真题选择题汇总1.(DOC).doc

    通信历年真题选择题汇总1.(DOC).doc

    电子通信设计资料电子万年历设计与制作论文资料

    电子通信设计资料电子万年历设计与制作论文资料提取方式是百度网盘分享地址

    JSP-SSM健身俱乐部客户关系管理系统可升级SpringBoot源码.7z

    前台框架基于Bootstrap这一HTML5响应式框架,能够自适应不同终端设备的屏幕大小,为用户提供良好的浏览体验。开发环境兼容myEclipse、Eclipse、Idea等多种工具,配合mysql数据库,实现数据的存储与管理。后台则采用SSM(SpringMVC + Spring + Mybatis)框架,保证系统的稳定与高效运行。 系统主要包括会员信息管理、员工信息管理、设备信息管理以及退出模块。会员信息管理模块详细记录了会员的基本信息、健身目标、消费记录以及健身习惯等,同时设有会员投诉管理模块,用于收集和处理会员的意见与建议。员工信息管理模块则涵盖了员工的基本信息、工资发放情况等,帮助俱乐部进行人事管理。设备信息管理模块则负责建立器械档案,跟踪维修情况,并合理安排器械摆放位置,以延长器械使用寿命。 数据库设计方面,会员表记录了会员的各项基本信息,包括姓名、性别、职业等;部门表与员工表则分别用于记录俱乐部的组织机构和员工信息;会员消费表记录了会员的消费详情;员工工资表则用于记录员工的工资发放情况;留言表用于收集会员的留言及回复;设备类别表与设备表则详细记录了会所内器械的分类与具

    2024-2030全球及中国超级殷钢 32-5行业研究及十五五规划分析报告.docx

    2024-2030全球及中国超级殷钢 32-5行业研究及十五五规划分析报告

    2023年贴剂行业竞争格局与市场机会.pptx

    行业分析报告

    linux nginx免安装文件

    linux环境不能上网,用这个文件可以实现nginx免安装

    按点击量排序-基于内容的课程推荐网站的设计与实现(SSM+html).zip

    “按点击量排序-基于内容的课程推荐网站的设计与实现(SSM+html)”是一个基于内容推荐概念的在线学习平台,旨在为用户提供个性化的课程推荐体验。系统的核心功能包括用户注册登录、课程浏览搜索、个性化推荐和热门课程按点击量排序展示。在技术架构方面,该系统采用SSM框架作为后端开发技术,包括Spring、Spring MVC和MyBatis,用于处理业务逻辑和数据持久化。前端界面则采用HTML设计实现,展示课程信息和用户交互界面。这样的技术选择不仅提供了稳定的后端支持,还保证了良好的前端用户体验。通过SSM框架以及HTML的结合,该课程推荐网站在功能性和性能方面表现优异。SSM框架提供了高效的业务处理和数据交互,HTML则赋予网站美观友好的用户界面,使用户能够轻松使用课程推荐功能。热门课程的点击量排序功能提高了用户浏览体验,使用户更快速地找到感兴趣的课程,从而提升整体用户满意度和学习效率。

    OSP项目施工组织方案.docx

    行业分析报告

    小型婚礼(可动态添加祝福语)程序文件jquery

    1:场景一主要有两个功能,第一个是控制左边图片,第二个是让右边文字逐一显示。 2:场景二功能简单一点,只控制左边人物出现,紧接着是文字显示。 3:场景三功能控制图片弹跳显示,我用for循环控制弹跳距离。 4:场景四控制图片从顶部往下滑落,停留1秒然后滑向右侧直至消失。 5:场景五慢慢显现,可点击进入婚礼。 6:场景六显现停留1.6秒,然后以碎片的形式向外散开。 7:场景七祝福贴纸随机排布,并且可拖动祝福贴纸。 8:添加祝福语中,需填写祝福语,否则不让提交。可提交的祝福语便随机散布在祝福墙中,可实现随意拖动功能,

    AI相关领域论文+英文中文+论文攻读

    AI论文体系建设是指建立一个完善的AI领域的论文研究框架和体系,以促进学术交流和知识积累。这一体系包括但不限于以下几个方面: 1. **研究主题界定**:明确AI领域的研究主题和范围,包括机器学习、深度学习、自然语言处理、计算机视觉等方向。 2. **文献综述**:对AI领域相关研究文献进行综述和分类,总结研究现状和发展趋势,为后续研究提供参考。 3. **研究方法论**:探讨AI研究的方法论,包括实验设计、数据采集、模型构建等方面的方法和技巧。 4. **实验验证**:强调实验验证在AI研究中的重要性,提倡开放数据和代码,以促进研究结果的可复现性和可验证性。 5. **学术交流**:倡导学术交流和合作,包括参加学术会议、发表论文、组织研讨会等方式,促进学术成果的传播和交流。 6. **学术评价**:建立科学的学术评价体系,包括SCI、EI等学术期刊和会议的评价标准,以及学术成果的评价指标和方法。 通过建设完善的AI论文体系,可以促进AI领域的学术研究和技术创新,推动人工智能技术的发展和应用。

    2024年硬件嵌入式系统咨询行业分析报告.pptx

    行业分析报告

    智慧医院大健康全院信息化建设解决方案.pptx

    围绕着医疗安全与医疗机构管理精细化目标,借鉴HIMSS评级标准、JCI评审、等级医院评审标准规范,基于统一的技术平台架构下的医教研人财物六位一体的信息化管理解决方案,实现医疗卫生机构医务、护理、人力资源、科研、教学、医患关系、设备与物资供应链等日常管理运营信息化。 利用移动互联网技术构建专业的分享服务平台,以为会员提供相关知识、专家在线服务、法律咨询服务,并为医生、医疗机构和健康管理会所提供宣传服务等众多增值服务。 4 大目标: 高效诊疗、智慧医疗、精细管理、信息便民; 1 卡通: 一张诊疗卡。 1 个平台: 一个医院信息集成平台; 6 大应用: 医疗管理、临床信息、运营管理、移动物联、医疗协作、对外服务。

    基于PHP的轻量级MVC框架设计源码

    本项目是基于PHP的轻量级MVC框架设计源码,包含56个文件,其中主要包含50个php源代码文件。系统采用了PHP编程语言,实现了基于PHP7+的轻量级MVC框架。该框架适用于博客系统、新闻管理系统、企业官网和Api系统等多种应用场景,是这些系统的最佳选择。项目结构清晰,代码可读性强,易于理解和维护。

    飞行器机动飞行质点弹道仿真-侧向和纵向-龙格库塔/欧拉法

    本Matlab程序的主要功能是实现飞行器的侧向和纵向的机动,通过设计横向和纵向的控制指令实现。系统状态(微分方程)的解算提供了两种方式,龙格库塔法和欧拉法。 主程序main_cexiang:实现飞行器的侧向机动; 主程序main_zongxiang:实现飞行器的纵向机动。

    基于ssm+vue学生学籍管理系统源码数据库文档.zip

    基于ssm+vue学生学籍管理系统源码数据库文档.zip

Global site tag (gtag.js) - Google Analytics