我搜索了很多關於這個主題,但我沒有找到解決方案,幫助我解決我的問題。 我有一個表格,它包含了作爲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
控制檯輸出改變:
- 轉換器:的getAsObject
- 吸氣劑類別:kategorie = NULL
- 設定器類別:名稱= Kategorie4
- kategoriename:Kategorie4
- getter kategorie:name = Kategorie4
或者您可以使用渲染標籤 –
Archana
2013-05-07 12:04:46
感謝的財產! 但我忘了說我會在我的項目中使用icefaces。那裏是否還有冰面的解決方案? 渲染屬性的標記不會改變執行順序:(我使用的是liferay-faces-bridge 3.1.1,因爲我想爲liferay編寫一個portlet –
marc0o
2013-05-07 12:06:41
我不知道是不是可以使用icefaces :(順便說一下,你有outputText的ID(即結果)作爲渲染屬性的值嗎? – Archana 2013-05-07 12:18:17