0

表示モードと編集モードが適用されるポートレットを作成しています。更新によって、ポートレットが編集モードから表示モードに切り替わる状況が必要です。以下は私のコードスニペットです

@ManagedBean(name = "portletBackingBean")
@ViewScoped
public class FirstPortlet extends GenericFacesPortlet implements Serializable {


private transient Logger logger = LoggerFactory.getLogger(getClass());

private void doActionResponse(PortletMode mode){
    FacesContext facesContext = FacesContext.getCurrentInstance();
    ExternalContext externalContext =
    facesContext.getExternalContext();
    ActionResponse actionresponce = (ActionResponse) externalContext.getResponse();
    try {
        actionresponce.setPortletMode(mode);
    } catch (PortletModeException e) {
        // TODO Auto-generated catch block
        LiferayFacesContext.getCurrentInstance().addMessage(null, new FacesMessage("Error setting property"));
    }
}


private String userName;

/**
 * @return the userName
 */
public String getUserName() {
    return userName;
}

/**
 * @param userName the userName to set
 */
public void setUserName(String userName) {
    this.userName = userName;
}


//submitting the values
public void doSubmit(){
    if(this.userName != null) {
        logger.debug("value of property in backing bean set to " + getUserName());
        doActionResponse(PortletMode.VIEW);
    }


}

ここまでは問題ありませんが、ポートレットがビュー モードでレンダリングされると、値#{portletBackingBean.userName}が null になります。

これを行うよりエレガントな方法はありますか

前もって感謝します

4

1 に答える 1

3

このコードには重大な欠陥がいくつかあります。

@ManagedBean(name = "portletBackingBean")
@ViewScoped
public class FirstPortlet extends GenericFacesPortlet implements Serializable {
//...
  private String userName;

ポートレットは...

  • 常にアプリケーション スコープ
  • スレッドセーフでなければならない
  • 管理対象の Bean にすることはできません
  • ユーザーごとの状態を持つことはできません (例: userName)

が解決されるたびにportletBackingBean、JSF フレームワークがクラ​​スの新しいインスタンスを作成しますFirstPortlet。それを含むポートレット インスタンスへの参照は返されません。

さらに、編集ポートレット モードとビュー ポートレット モードに異なるビューを使用する場合@ViewScoped、この状態の適切な範囲ではありません。

要するに、モデルの設計をもう一度見直して、ポートレットの機能から状態を分離する方法を理解する必要があると思います。

于 2012-12-31T16:22:37.093 に答える