解开JSF生命周期之谜(1)

1、在恢复视图阶段,如果组件指定了binding属性,如:

 

<rich:dataTable id="myTable" binding="#{myForm.uiData}" 
    value="#{myForm.details}" columns="7" var="detail">

 

那么JSF在恢复组件的时候,会初始化binding属性中指定的bean,假如bean的scope为request则会重新new一个该bean的实例(上面这个例子就是myForm),并根据faces-config.xml中指定的managed-property初始化该bean的各个属性;假如bean的scope为session则直接从session中获取bean的实例。

 

2、在恢复视图阶段,除了恢复组件树中的各个组件外,还会恢复与各个组件关联的事件监听器、验证器以及转换器。

 

3、在应用请求值阶段,事件会广播给对应的事件监听器。当事件源为UIData中的某条记录中的一个组件时,如:

 

 

<rich:dataTable id="myTable" binding="#{myForm.uiData}" 
    value="#{myForm.details}" columns="7" var="detail">
<h:column>
<h:commandButton value="remove" action="#{myForm.remove}"/>
</h:column>
.......
</rich:dataTable>

 

UIData会调用value属性指定的bean(上面这个例子为myForm对象)对应属性(上面这个例子为details属性)的get方法获取数据,如果数据为null或元素数为0,则不会广播该事件,即不会调用action或actionListener属性中指定的方法(上面这个例子为myForm的remove方法),并直接到呈现响应阶段。

 

4、结合上面第1和第3点可以得出以下结论。当事件源为UIData中的某条记录中的一个组件时,如果UIData有指定binding属性,则UIData的value属性指定的bean在faces-config.xml中指定的scope必须为session或application,否则不会执行action或者actionListener属性指定的方法。如果UIData没有指定binding属性,则UIData的value属性指定的bean在faces-config.xml中指定的scope可以为session、application,也可以为request,但要保证可以在request中找到对应的属性。

 

5、<a4j:keepAlive/>是在恢复视图阶段后才将属性值放到request中的。

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值