2013-05-07 40 views
0

我搜索了很多關於這個主題,但我沒有找到解決方案,幫助我解決我的問題。 我有一個表格,它包含了作爲selectItems放置在selectOneMenu中的「Kategorie」對象列表和一個outputText(使用與selectOneMenu相同的bean)。轉換器使他的工作和所有分類名稱正確顯示。使用ajax-tag,表單會更改selectOneMenu onchange中的值。這也適用,bean屬性更新!但是現在我想在更改後立即在outputText中顯示選定的Kategorie。我需要做什麼???h:h:selectOneMenu,h:outputText和f:ajax形式的執行順序

要查看outputText中的新值,我必須刷新頁面。 (KategorieBean是SessionScoped)

在更新bean的Kategorie-property之前,總是調用outputText-value的getter。

view.xhtml:

<h:form> 
     Wähle eine Kategorie: 
     <h:selectOneMenu 
          value="#{kategorieBean.kategorie}"> 
      <f:selectItem 
          itemLabel="Wählen..." 
          itemValue="#{null}"/> 
      <f:selectItems 
          value="#{kategorieBean.allKategories}" 
          var="k" 
          itemLabel="#{k.name}" 
          itemValue="#{k}" />  
      <f:ajax 
          event="change" 
          execute="@form" 
          render="result" 
          listener="#{kategorieBean.kategorieChangeListener}"/> 
     </h:selectOneMenu> 
     Ausgewählte Kategorie:  
     <h:outputText id="result" value="#{kategorieBean.kategorie.name}" /> 
    </h:form> 

我也試過在Ajax的標籤使用監聽器。監聽器的工作,但我仍然有與執行順序:(

KategorieBean問題:

package xxx.bean; 

import java.util.List; 

import javax.annotation.PostConstruct; 
import javax.faces.bean.ManagedBean; 
import javax.faces.bean.SessionScoped; 

import xxx.hibernate.entity.Kategorie; 
import xxx.hibernate.dao.KategorieDao; 

@ManagedBean(name="kategorieBean") 
@SessionScoped 
public class KategorieBean{ 

private Kategorie kategorie; 
private KategorieDao kategorieDao; 
private List<Kategorie> allKategories; 

@PostConstruct 
public void init(){ 
    kategorie = null; 
    kategorieDao = new KategorieDao(); 
    allKategories = kategorieDao.getAllKategories(); 
} 

public List<Kategorie> getAllKategories() { 
    return allKategories; 
} 
public void setAllKategories(List<Kategorie> allKategories) { 
    this.allKategories = allKategories; 
} 

public Kategorie getKategorie() { 
    if (kategorie != null) 
     System.out.println("getter kategorie: name=" + kategorie.getName()); 
    else 
     System.out.println("getter kategorie: kategorie=null"); 
    return kategorie; 
} 
public void setKategorie(Kategorie kategorie) { 
    System.out.println("setter kategorie: name=" + kategorie.getName()); 
    this.kategorie = kategorie; 
} 
    public void kategorieChangeListener(AjaxBehaviorEvent e) { 
     System.out.println("kategoriename: " + kategorie.getName()); 
    } 

KategorieConverter:

package xxx.converter; 

import javax.faces.component.UIComponent; 
import javax.faces.context.FacesContext; 
import javax.faces.convert.Converter; 
import javax.faces.convert.FacesConverter; 

import xxx.bean.KategorieBean; 
import xxx.hibernate.entity.Kategorie; 

@FacesConverter(forClass = Kategorie.class) 
public class KategorieConverter implements Converter{ 

    public Object getAsObject(FacesContext context, UIComponent component, String value) { 
     System.out.println("Converter: getAsObject"); 
     KategorieBean kB = (KategorieBean) FacesContext.getCurrentInstance(). 
       getExternalContext().getSessionMap().get("kategorieBean"); 
     for (Kategorie k : kB.getAllKategories()){ 
      if (k.getKategorieId() == Long.valueOf(value)) 
       return k; 
     } 
     return null; 
    } 

    public String getAsString(FacesContext context, UIComponent component, Object value) { 
     System.out.println("Converter: getAsString"); 
     return String.valueOf(((Kategorie) value).getKategorieId()); 
    } 
} 

控制檯輸出(首字母):

  • 休眠:選擇this_.kategorie_id作爲kategori1_1_0_, this_.beschreibung as beschre i2_1_0_,this_.liferay_company_id爲 liferay3_1_0_,this_.liferay_group_id爲liferay4_1_0_,this_.name爲 name5_1_0_,this_。PARENT_ID從usushop_kategorie THIS_
  • 吸氣kategorie parent6_1_0_:kategorie = NULL
  • 轉換器:符getAsString
  • 轉換器:符getAsString
  • 轉換器:符getAsString
  • 轉換器:符getAsString
  • 轉換器:符getAsString
  • 轉換器:getAsString
  • getter kategorie:kategorie = null
在selectOneMenu用於值之後

控制檯輸出改變:

  • 轉換器:的getAsObject
  • 吸氣劑類別:kategorie = NULL
  • 設定器類別:名稱= Kategorie4
  • kategoriename:Kategorie4
  • getter kategorie:name = Kategorie4

回答

0

您可以使用Richface的A4J(Ajax4jsf的)

<%@taglib prefix="a4j" uri="http://richfaces.org/a4j"%> 



<h:form> 
    <h:selectOneMenu value="#{kategorieBean.kategorie}"> 
      <f:selectItem 
          itemLabel="Wählen..." 
          itemValue="#{null}"/> 
      <f:selectItems 
          value="#{kategorieBean.allKategories}" 
          var="k" 
          itemLabel="#{k.name}" 
          itemValue="#{k}" />  
      <a4j:support event="onchange" action="#{bean.SomeAction}" reRender="result"/> 
     </h:selectOneMenu> 
<h:panelGroup id="result"> 
    <h:outputText value="#{kategorieBean.kategorie.name}" /> 
</h:panelGroup> 
</h:form> 
+0

或者您可以使用渲染標籤 – Archana 2013-05-07 12:04:46

+0

感謝的財產! 但我忘了說我會在我的項目中使用icefaces。那裏是否還有冰面的解決方案? 渲染屬性的標記不會改變執行順序:(我使用的是liferay-faces-bridge 3.1.1,因爲我想爲liferay編寫一個portlet – marc0o 2013-05-07 12:06:41

+0

我不知道是不是可以使用icefaces :(順便說一下,你有outputText的ID(即結果)作爲渲染屬性的值嗎? – Archana 2013-05-07 12:18:17