私のIceFaces 1.8ベースのアプリケーションは、Beanのプロパティに基づいて別のものを含む非常に単純なxhtmlで始まります。このプロパティは、すべてのページに含まれるコンボの項目にバインドされています。ユーザがこのコンボからレイアウトを選択すると、ページは新しいレイアウトに更新されます。IceFacesは、コンボの重複エントリ、レイアウト変更後のメニュー
すべての単一ページのレイアウト変更後に、レイアウトセレクタのコンボの項目が重複し、3倍になるなどの点を除いて、すべて問題はありません。
これは "マルチプレクサ" XHTMLです:
<?xml version="1.0" encoding="UTF-8"?>
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:ui="http://java.sun.com/jsf/facelets"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:f="http://java.sun.com/jsf/core"
xmlns:ice="http://www.icesoft.com/icefaces/component">
<ui:include src="#{system.layout}">
</ui:include>
</html>
そして、これはすべてのレイアウトXHTMLに含まれているレイアウトの選択である:ここで
<ice:form id="layoutSelectForm">
<ice:outputLabel for="layoutSelector">#{msgs['LayoutSelect.Label']}: </ice:outputLabel>
<ice:selectOneMenu id="layoutSelector" binding="#{layoutSelect.som}" value="#{layoutSelect.selectedLayout}"
valueChangeListener="#{layoutSelect.processValueChange}" partialSubmit="true">
<f:selectItems value="#{layoutSelect.allLayouts}" />
</ice:selectOneMenu >
</ice:form>
はLayoutSelectのバッキングBeanのコードです:
public class JSFLayoutSelect implements InitializingBean, ValueChangeListener {
private EventManager eventManager;
private String mainApplFrmURL;
private HtmlSelectOneMenu som;
public List<SelectItem> allLayouts;
private String selectedLayout;
@Override
public void processValueChange(ValueChangeEvent event)
throws AbortProcessingException {
eventManager.publish("layout-select/change", event.getNewValue());
logger.info("Layout changed event occured: " + event.getNewValue());
try {
FacesContext.getCurrentInstance().getExternalContext().redirect(mainApplFrmURL);
} catch (IOException e) {
logger.error(e.getMessage());
}
}
@Override
public void afterPropertiesSet() throws Exception {
allLayouts = new ArrayList<SelectItem>();
allLayouts.add(new SelectItem("dev", "Core Dev"));
allLayouts.add(new SelectItem("classic", "Core Classic"));
allLayouts.add(new SelectItem("modern", "Core Modern"));
selectedLayout = "dev";
}
public List<SelectItem> getAllLayouts() {
return allLayouts;
}
public String getSelectedLayout() {
return selectedLayout;
}
/* some unimportant methods are not here */
}
<bean name="layoutSelect" class="hu.hgap.comp.impl.JSFLayoutSelect" scope="session">
<property name="eventManager" ref="SessionEventManager"/>
<property name="mainApplFrmURL" value="/ICEFacesSpringDemoV2/secured/ApplFrm.faces" />
</bean>
コンボエントリが重複しないようにするにはどうすればよいですか?レイアウトを変更した後、同じコンボが再びレンダリングされ、コンボアイテムがサーバーから再び押し込まれることがわかりました。
バッキングビーンのコードを投稿できますか?また、リストallLayoutsがBeanでどのように構築されるのかを言うことができますか?ありがとう。 –
@MatthieuF:Beingが初期化された後にリストが設定されているのがわかるように、バッキングBeanのコードを私の質問に追加しました。それはセッションスコープのため、セッションに1回だけ発生します。私はクライアント側だけ、サーバー側を複製されていないチェックリストをダブルチェックするためにデバッグしました。 – jabal
質問が残っているかもしれませんが、おそらく私はそれをより望ましいものにするために賞金を稼ぐつもりです – jabal