JSF点滴积累--Dynamic JSF subviews

 

同一JSF主页面下,如果要在几个subviews之间切换,最简单的方法是:

 

< jsp:include  page ="#{myBean.currentInclude}"   />

 

但是该方法只能用于JSF 1.2 + JSP 2.1环境下,在更早的版本下,以上的表达式是不合法的。

最常用的方法是利用f:subview和Rendered属性进行硬编程,如下:

 

< f:subview  id ="includePage1"  rendered ="#{myBean.currentInclude == 'includePage1'}" >
    
< jsp:include  page ="includePage1.jsp"   />
</ f:subview >
< f:subview  id ="includePage2"  rendered ="#{myBean.currentInclude == 'includePage2'}" >
    
< jsp:include  page ="includePage2.jsp"   />
</ f:subview >
< f:subview  id ="includePage3"  rendered ="#{myBean.currentInclude == 'includePage3'}" >
    
< jsp:include  page ="includePage3.jsp"   />
</ f:subview >

 

当MyBean.java中getCurrentInclude()方法被调用的时候,返回所要include的页面,这种方法的最大问题是你必须将每个可能include到的页面都硬编程到主页面中。

另外一种常用的方法是利用h:panelGroup标签,这种方法要求include的页面中必须已经使用f:subview标签,这种方法和上一种大同小异,所以仍然摆脱不了上面的缺点:  

< h:panelGroup  rendered ="#{myBean.currentInclude == 'includePage1'}" >
    
< jsp:include  page ="includePage1.jsp"   />
</ h:panelGroup >
< h:panelGroup  rendered ="#{myBean.currentInclude == 'includePage2'}" >
    
< jsp:include  page ="includePage2.jsp"   />
</ h:panelGroup >
< h:panelGroup  rendered ="#{myBean.currentInclude == 'includePage3'}" >
    
< jsp:include  page ="includePage3.jsp"   />
</ h:panelGroup >

 

小技巧:

使用scriptlets,jsp:include 标签可以使用scriptlets,一个必要条件是managed bean 的作用域是session。如果managed bean的作用域是request,所遇到的问题和上面两种有些类似。

在faces-config文件中进行配置:

< managed-bean >
    
< managed-bean-name > myBean </ managed-bean-name >
    
< managed-bean-class > mypackage.MyBean </ managed-bean-class >
    
< managed-bean-scope > session </ managed-bean-scope >
</ managed-bean >

 

主页面中的代码如下:

<%
    mypackage.MyBean myBean 
=  (mypackage.MyBean) session.getAttribute( " myBean " );
    
if  (myBean  ==   null ) {  //  First - time  initialization of bean  not  done yet.
        myBean 
=   new  mypackage.MyBean();
    }
    
String  includePage  =  myBean.getIncludePage()  +   " .jsp " ;
%>

< f:view >
    
< html >
        
< head >
        
</ head >
        
< body >

            
< h:panelGroup  rendered ="#{myBean.includePage != null}" >
                
< jsp:include  page ="<%= includePage %>"   />
            
</ h:panelGroup >

        
</ body >
    
</ html >
</ f:view >

 

注意:不要用f:subview替换掉例子中的h:panelGroup,每个include页面的f:subview标签的id属性必须是唯一的。

backing bean:MyBean.java的相关代码如下:

private  String includePage;

public  String getIncludePage() {
    
if  (...) {  //  Do your thing, this is just a basic example.
        includePage  =   " includePage1 " ;
    } 
else   if  (...) {
        includePage 
=   " includePage2 " ;
    } 
else   if  (...) {
        includePage 
=   " includePage3 " ;
    }
    
return  includePage;

}

 

翻译自:http://balusc.blogspot.com/2007/01/dynamic-jsf-subviews.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值