JSF点滴积累--页面间参数的传递

 

      为了避免使用Session的一些弊病,除了保存用户信息等公用数据的BackingBean外,对于业务逻辑处理最好使用request 类型的BackingBean。 因此,以下的相关说明都是以request 类型的BackingBean为基础的。

1、 具有导航规则的两个JSF页面之间交互,如果两个页面使用同一个BackingBean的,只需要在页面中加入<x:saveState>就可以,如下:

< x:saveState  id ="save1"  value ="#{calcForm.number1}"  

 

本次request的number1的当前值会被自动保存,在紧接着的一次request中会被自动恢复,于是就达到了两个页面间参数的传递。当然也可以直接保存整个Bean的信息,达到页面参数传递的作用,如:

< x:saveState  id ="saveCalcForm"  value ="#{calcForm}" />  

 

注:使用UISaveState组件必须安装Myface,saveState保存的对象类必须实现serializable接口,saveState保存的对象的生存期介于request和session之间。

2、对于使用a.jsp?param1形式传递参数的页面,在backingBean中采用读取requestParameter参数的方式获得。

FacesContext facesContext  =  FacesContext.getCurrentInstance();
HttpServletRequest request 
=  (HttpServletRequest) facesContext.getExternalContext().getRequest();
String value 
=  request .getParameter(parameterName);

 

值得注意的是,在目标页面中上获得的Parameter很容易丢失,特别在backingBean与该页面交互的Aciton操作,因此可以将其作为变量并结合saveState保存起来(或者页面放置InputHidden,并与Bean中的UIInput绑定起来,获得Parameter时候将其保存在UIInput的value中;也可利用客户端javascript来管理)。

以上是种解决方法,不过我们想到是否能在JSF页面利用inputText(或InputHidden)和RequestParameterMap访问并保存参数呢?这样的好处是将参数置于form中的input上,由于我们设置了forceId="true",因此,再次提交该页面的时候我们又可以用param['parameterName']访问该参数,服务端也可以用getParameter取得参数。

< h:inputText  id ="parameterName"   forceId ="true"  value ="#{param['parameterName']}"   />

 

但是因为RequestParameterMap是只读的,对其的Set写入操作是不允许的,因此上面的代码在验证阶段会提示错误。但是我们可以经过变通将其进行复制到一个可读写的Map中: 

    HashMap _requestParameterMap = new  HashMap();
    
public  Map getParam()  {
        
if (_requestParameterMap.isEmpty())
            _requestParameterMap.putAll(FacesContext.getCurrentInstance().getExternalContext()
                .getRequestParameterMap());
        
return _requestParameterMap;
    }

 

将该代码所在的backingBean注册为requestParam,然后就可以在页面上调用了: 

< h:inputText  id ="parameterName"   forceId ="true"  value ="#{requestParam.param['parameterName']}"   />

或者

< h:inputText  id ="parameterName"   forceId ="true"  value ="#{requestParam.param.parameterName}"   />

 还有一种方法是借助在config.xml文件中配置进行参数传递:

< managed-bean >
   
< managed-bean-name > customer </ managed-bean-name >
   
< managed-bean-class > foo.Customer </ managed-bean-class >
   
< managed-bean-scope > request </ managed-bean-scope >
        
< managed-property >
            
< property-name > userId </ property-name >
            
< property-class > java.lang.String </ property-class >
            
< value > #{param.userid} </ value >
        
</ managed-property >
</ managed-bean >

通过#{param.userid}就将参数传递并保存在了Bean的变量userId中,完全通过配置达到了目的,也是一种不错的方法。

3、 对于需要从一个bean向其他bean传递参数的,如果前面两种方式都无法实现,请采用<x: updateActionListener >作为参数传递。 代码示例:

< h:commandLink  value ="#{letter.docName}"  action ="#{letterOutBean.loadLetter}" >  
        
< x:updateActionListener  property ="#{letterOutBean.selectedLetterId}"  value ="#{letter.id}"   />  
</ h:commandLink >  


注意:x:updateActionListener必须放在动作里面才能使用,例如上面代码或者commandButton

 4、获得同一页面不同BackingBean的值,可以使用EL表达式和getValueBinding函数结合的方式:

OrderBean order  =  (OrderBean) getValueBinding( " #{orderBean} " )  .getValue(facesContext); 
ShoppingCartBean cart 
=  (ShoppingCartBean) getValueBinding(  " #{shoppingCartBean} " ).getValue(facesContext); 

 

或者直接找组件,然后取得值

UIInput com = (UIInput) FacesContext.getCurrentInstance()getViewRoot().findComponent("area:Form1:identifier");

 

原文:转载,根据本人经验作了较大修订。

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值