4

以下のコードでは、selectOneRadio でリスナーを使用して、URL にクエリ文字列を含むページにリダイレクトしています。

問題は、リダイレクトされたときに と の値newsTitleselectedNewsnull になることです。どうしてこれなの?FacesContext を使用してリダイレクトを行っているためですか?

news.xhtml

<h:outputLabel for="title" value="Title" style="font-weight: bold;"/>
<p:inputText id="title" required="true" value="#{contentEditorBacking.newsTitle}" >
    <p:ajax event="blur"/>
</p:inputText>
<h:outputLabel value="Site" style="font-weight: bold;" />
<p:selectOneRadio value="#{contentEditorBacking.selectedNews}" layout="pageDirection">
    <f:selectItem itemLabel="Public" itemValue="Public" />
    <f:selectItem itemLabel="Member" itemValue="Member" />
    <p:ajax event="change" listener="#{contentEditorBacking.addNewsArticle}" update="path"/>
</p:selectOneRadio>

contentEditorBacking.java

@ManagedBean
@ViewScoped
public class ContentEditorBacking {
  private String newsTitle = null;
  private String selectedNews = null;

  public String getNewsTitle() {
    return newsTitle;
  }

  public void setNewsTitle(String newsTitle) {
    this.newsTitle = newsTitle;
  }

  public String getSelectedNews() {
    return selectedNews;
  }

  public void setSelectedNews(String selectedNews) {
    this.selectedNews = selectedNews;
  }

  public void addNewsArticle() throws Exception {

    String year = String.valueOf(Calendar.getInstance().get(Calendar.YEAR)).length() < 2 ? "0"+Calendar.getInstance().get(Calendar.YEAR) : String.valueOf(Calendar.getInstance().get(Calendar.YEAR));
    String month = String.valueOf(Calendar.getInstance().get(Calendar.MONTH)).length() < 2 ? "0"+(Calendar.getInstance().get(Calendar.MONTH)+1) : String.valueOf(Calendar.getInstance().get(Calendar.MONTH));
    String day = String.valueOf(Calendar.getInstance().get(Calendar.DAY_OF_MONTH)).length() < 2 ? "0"+Calendar.getInstance().get(Calendar.DAY_OF_MONTH) : String.valueOf(Calendar.getInstance().get(Calendar.DAY_OF_MONTH));
    String newsPath = null;

    newsPath = "/" + selectedNews + "/News/" + year + "/" + month + "/" + day + "/" + newsTitle;

    FacesContext.getCurrentInstance().getExternalContext().redirect("news.xhtml?path="+ newsPath);
    }

}
4

1 に答える 1

3

リダイレクトは基本的に、Web ブラウザーに新しい GET 要求を作成するように指示します。これにより、新しいビューが作成され、関連するビュー スコープ Bean の新しいインスタンスも作成されます。nullビュー スコープ Bean は、通常、返されているかvoid、(ajax) ポストバックを実行している限り存続します(ビュー スコープは、非表示のリクエスト パラメータによって識別/追跡されますjavax.faces.ViewState)。それが動作するように指定されている方法です。

<f:viewParam>/を使用<f:event type="preRenderView">して、新しい GET 要求で初期化ジョブを実行します。必要に応じて、コマンド リンクを通常の GET リンクにして、SEO フレンドリーにすることもできます (検索ボットは POST フォームをまったくインデックスしません)。

以下も参照してください。

于 2012-08-01T19:15:39.813 に答える