2011-07-25 2 views
0

私の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> 

コンボエントリが重複しないようにするにはどうすればよいですか?レイアウトを変更した後、同じコンボが再びレンダリングされ、コンボアイテムがサーバーから再び押し込まれることがわかりました。

+0

バッキングビーンのコードを投稿できますか?また、リストallLayoutsがBeanでどのように構築されるのかを言うことができますか?ありがとう。 –

+0

@MatthieuF:Beingが初期化された後にリストが設定されているのがわかるように、バッキングBeanのコードを私の質問に追加しました。それはセッションスコープのため、セッションに1回だけ発生します。私はクライアント側だけ、サーバー側を複製されていないチェックリストをダブルチェックするためにデバッグしました。 – jabal

+0

質問が残っているかもしれませんが、おそらく私はそれをより望ましいものにするために賞金を稼ぐつもりです – jabal

答えて

0

バッキングビーンはどのように見えますか?それはどの範囲ですか?

私はセッションスコープBeanで変数をバインドするのに似た経験がありました。変数をリクエストスコープBeanに移動すると、問題は消えました。

+0

バッキングビーンはセッションスコープですが、レイアウト選択がセッションごとにあるべきものなので変更できません。 AFAIK要求スコープは、BeanがHTTPリクエストごとにリセットされることを意味します。 – jabal