2013-05-26 53 views
0

我想從數據表中傳遞的數據使用相同的支持bean與requestscope另一個頁面,JSF的傳球這是可能的,而無需使用數據模型?我使用的Servlet 3.0數據到其他頁面不能正常工作

這裏是我的數據表頁面

<p:dataTable var="entity" value="#{collegeController.allCollege}"> 
     <p:column headerText="Code"> 
      #{entity.collegeCode} 
     </p:column> 
     <p:column headerText="Description"> 
      #{entity.collegeDesc} 
     </p:column> 
     <p:column headerText=""> 
      <p:commandLink value="Edit" action="#{collegeController.prepareEdit(entity)}"/> 
     </p:column> 
    </p:dataTable> 

,這裏是我支持bean

@ManagedBean 
@RequestScoped 
public class CollegeController implements Serializable { 

    private String redirect = ".jsf?faces-redirect=true"; 
    private CollegeCatalog entity; 

    public CollegeController() { 
    } 

    public String prepareEdit(CollegeCatalog selectedEntity) { 
     Session s = NewHibernateUtil.getSessionFactory().getCurrentSession(); 
     s.beginTransaction(); 

     entity = (CollegeCatalog) s.load(CollegeCatalog.class, selectedEntity.getCollegeKey()); 

     return "update" + redirect; 
    } 

    public List getAllCollege() { 
     Session s = NewHibernateUtil.getSessionFactory().getCurrentSession(); 
     Transaction tx = s.beginTransaction(); 

     String query = "" 
       + "FROM CollegeCatalog entity " 
       + "WHERE entity.deleted = FALSE"; 

     Query q = s.createQuery(query); 

     List l = q.list(); 

     tx.commit(); 

     return l; 
    } 

    /** 
    * @return the entity 
    */ 
    public CollegeCatalog getEntity() { 
     if (entity == null) { 
      entity = new CollegeCatalog(); 
     } 
     return entity; 
    } 

    /** 
    * @param entity the entity to set 
    */ 
    public void setEntity(CollegeCatalog entity) { 
     this.entity = entity; 
    } 
} 

,這是我更新頁面(這是我想要展示選定的數據)

<h:form> 
    <p:outputLabel value="Code:" for="txtCode"/> 
    <p:inputText id="txtCode" value="#{collegeController.entity.collegeCode}"/> 
    <br/> 
    <p:outputLabel value="Description:" for="txtDesc"/> 
    <p:inputText id="txtDesc" value="#{collegeController.entity.collegeDesc}"/> 
    <br/><br/> 
    <p:commandButton value="Update" action="#{collegeController.update()}"/> 
    <p:commandButton value="Back" action="index.jsf?faces-redirect=true"/> 
</h:form> 

它總是返回null

回答

0

嘗試用f:setPropertyActionListener@ViewScoped

像這樣的事情

<p:column headerText=""> 
    <p:commandLink value="Edit" action="#{collegeController.action" > 
     <f:setPropertyActionListener value="#{collegeController.entity}" target="#{collegeController.targetEntity}"> 
    </p:commandLink> 
</p:column> 
+0

它也不起作用。 – borj

+0

看http://stackoverflow.com/questions/4994458/how-can-i-pass-a-parameter-to-a-commandlink-inside-a-datatable我使用#3從鏈接 –

+0

你給我正如你在我的數據表中看到的,不幸的是它不適合我。 – borj

3

您發送到您的collegeController.action方法的參數不會丟失,因爲你有一個@RequestScoped管理bean和整個管理bean將被創建在每一個請求。此外,在您的實際設計中,將在每個collegeController.allCollege方法調用中重新創建列表。

解決你的問題:

  1. 您的託管bean範圍更改範圍較廣。在這種情況下,@ViewScoped就好了。有關管理bean作用域更多信息:Communication in JSF 2 - Managed Bean Scopes

  2. 移動,吸氣以外的所有業務邏輯。由於您正在使用JSF 2並希望在創建bean時加載列表,因此可以使用@PostConstruct方法並在其中加載列表。在JSF中使用託管bean時,請記住不要在您的getter/setter中放置任何業務邏輯。更多信息:Why JSF calls getters multiple times

考慮到這些意見並將它們應用到你的代碼,管理bean將類似於此:

@ManagedBean 
@ViewScoped 
public class CollegeController implements Serializable { 

    private String redirect = ".jsf?faces-redirect=true"; 
    private CollegeCatalog entity; 
    private List<CollegeCatalog> collegeCatalogList; 

    public CollegeController() { 
    } 

    @PostConstruct 
    public void init() { 
     Session s = NewHibernateUtil.getSessionFactory().getCurrentSession(); 
     Transaction tx = s.beginTransaction(); 
     String query = "" 
       + "FROM CollegeCatalog entity " 
       + "WHERE entity.deleted = FALSE"; 
     Query q = s.createQuery(query); 
     collegeCatalogList = (List<CollegeCatalog>)q.list(); 
     tx.commit(); 

     entity = new CollegeCatalog(); 
    } 

    public String prepareEdit(CollegeCatalog selectedEntity) { 
     Session s = NewHibernateUtil.getSessionFactory().getCurrentSession(); 
     s.beginTransaction(); 

     entity = (CollegeCatalog) 
      s.load(CollegeCatalog.class, selectedEntity.getCollegeKey()); 

     return "update" + redirect; 
    } 

    public List<CollegeCatalog> getAllCollege() { 
     return collegeCatalogList; 
    } 

    /** 
    * @return the entity 
    */ 
    public CollegeCatalog getEntity() { 
     return entity; 
    } 

    /** 
    * @param entity the entity to set 
    */ 
    public void setEntity(CollegeCatalog entity) { 
     this.entity = entity; 
    } 
} 

不過,請注意,這種方法只是幫助你發送entity您的<p:commandLink action="#{collegeController.prepareEdit(entity)}"/>中的參數添加到託管bean。如果不是重定向您剛纔轉發的頁面,那會更好。

如果你還是喜歡做這個使用重定向,這種做法不會幫助你將數據發送到另一個頁面。這將是更好,如果你使用,而不是<h:button>(甚至更好,一個<h:link>)將重定向到其他頁面,您可以處理參數存在。這裏更好地解釋:Communication in JSF 2 - Processing GET Request Parameters

+0

tnx的澄清,我更新了我的託管bean,仍然沒有傳遞任何數據要被目標頁面讀取。 – borj

+0

@borj你讀過整個答案嗎?就你而言,它將套裝最後一段。 –

相關問題