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");

 

原文:轉載,根據本人經驗作了較大修訂。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章