2016-11-03 30 views
0

當此頁面加載時,需要一個viewparam並使用轉換器來獲取對象。JSF - 在ViewScoped bean中使用paginator時傳遞f:param

即時得到當使用分頁程序,因爲viewParam沒有被傳遞到轉換器

在java.lang.Long.parseLong(來源不明) 在com.civi.HelloWorld.controller以下錯誤。 UserConverter.getAsObject(UserConverter.java:36)

每次頁面刷新時都需要一個傳遞給它的參數。

所以在數據表中使用pagintor當我需要發送F:PARAM序爲viewParam使用轉換器來加載對象

<f:metadata> 
    <f:viewParam 
     name="idUser" 
     value="#{userBean.tipTourUser}" 
     converter="#{userConverter}" 
     required="true" 
     requiredMessage="Bad request. Please use a link from within the system." /> 
</f:metadata> 


<h:form id="abc" styleClass="simpleformstyle"> 
<p:dataTable id="transactionsTable" 
    var="transaction" 
    resizableColumns="true" 
    value="#{userBean.tipTourUser.tips}" 
    rendered="#{not empty userBean.tipTourUser.tips}" 

    rows="2" 
    paginator="true" 
    paginatorTemplate="{CurrentPageReport} {FirstPageLink} {PreviousPageLink} {PageLinks} {NextPageLink} {LastPageLink} {RowsPerPageDropdown}" 
    rowsPerPageTemplate="1,2,3" 
    paginatorPosition="bottom" > 

//SOMETHING LIKE THIS!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! 
    <f:param name="idUser" value="#{userBean.tipTourUser.idUser}" />  
//SOMETHING LIKE THIS!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! 

    <p:column> 
     <f:facet name="header"> 
      <h:outputText style="float: left;" value="Date received" />  
     </f:facet> 
     <h:outputText value="#{transaction.received}" > 
      <f:convertDateTime pattern="d-M-yyyy" /> 
     </h:outputText> 
    </p:column> 
</p:dataTable> 
</h:form> 

的UserBean

@ViewScoped 
@Named 
public class UserBean implements Serializable { 

    private static final long serialVersionUID = 1L; 

    @EJB 
    private UserService userService; 

    private User tipTourUser; 

    private boolean editmode; 


    //sets the edit mode and stores the original values 
    public void edit() { 
     editmode = true;  
    } 


    //resets the original values and leaves the edit mode 
    public void cancel() { 
     editmode = false; 
    } 


    //saves updated values and leavers the edit mode 
    public void save(User user) {       
     tipTourUser = userService.updateUser(user); 

     editmode = false;  
    } 


    public boolean isEditmode() { 
     return editmode; 
    } 


    public User getTipTourUser() { 
     return tipTourUser; 
    } 


    public void setTipTourUser(User tipTourUser) { 
     this.tipTourUser = tipTourUser; 
    } 

} 

轉換

@Named 
@RequestScoped 
public class UserConverter implements Converter 
{ 
    @EJB 
    private UserService userService; 


    public UserConverter() { 
    } 

    //get User object from idUser, key = idUser 
    @Override 
    public Object getAsObject(FacesContext arg0, UIComponent arg1, String key) throws ConverterException {   
     return userService.getUser(Long.parseLong(key)); 
    } 


    @Override 
    public String getAsString(FacesContext arg0, UIComponent arg1, Object arg2) throws ConverterException { 
     return arg2.toString(); 
    } 
} 
+0

什麼時候你正在重新加載頁面?是否有必要或者不能使用ajax? – djmj

+0

當我在數據表中使用分頁(改變頁面或使用RowsPerPageDropdown),頁面然後重新加載並試圖獲取viewParam,但f:param不傳遞任何東西,因爲 – blitzeus

+0

您有一個'h:form'圍繞數據表? PrimeFaces數據表分頁不默認刷新頁面。它是一個AJAX組件。 – djmj

回答

1

你需要一個h:form你的數據表,然後它是一個AJAX組件,而不是重新加載頁面上的分頁。

對於基本的GET頁面鏈接,您必須將查看參數傳遞給每個重定向。否則它會丟失。事情是這樣的:

<h:link> 
    <o:param name="idUser" value="#{userBean.tipTourUser}" converter="#{userConverter}" /> 
    <f:param name="page" value="#{userBean.page}" /> 
</h:link> 

提示:

使用omnifaces○:PARAM,因爲它提供了一個轉換器屬性,讓您的轉換邏輯乾燥。

+0

通常你不需要它。你嘗試使用'o:viewParam'。否則,您必須展示更多的bean代碼才能獲得更多幫助。 – djmj