【问题标题】:JSF ViewScoped variable not surviving redirect to same pageJSF ViewScoped 变量无法重定向到同一页面
【发布时间】:2012-08-01 19:10:16
【问题描述】:

通过下面的代码,我使用 selectOneRadio 上的侦听器重定向到 url 中带有查询字符串的页面。

问题是,当我被重定向时,newsTitleselectedNews 的值为 null。为什么是这样?是因为我正在使用 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);
    }

}

【问题讨论】:

    标签: java jsf jsf-2 primefaces


    【解决方案1】:

    重定向基本上指示网络浏览器创建一个新的 GET 请求。这将创建一个新视图,因此也将创建一个关联视图范围 bean 的新实例。只要您在 (ajax) 回发上返回 nullvoid,视图范围 bean 通常就会存在(视图范围即由隐藏请求参数 javax.faces.ViewState 识别/跟踪)。这就是它指定的工作方式。

    使用&lt;f:viewParam&gt;/&lt;f:event type="preRenderView"&gt; 对新的 GET 请求执行初始化工作。如有必要,您可以将命令链接设为普通的 GET 链接,以便对 SEO 更友好(搜索机器人根本不索引 POST 表单)。

    另见:

    【讨论】:

    • 或者有没有办法让 p:ajax 调用刷新页面或至少更新 url 栏中的 url?
    • 另外,我认为我不能在 facescontext 重定向中执行?faces-redirect=true
    • 您可以使用update="@all" 更新整个页面,但如果不告诉浏览器在给定的 URL 上发送新请求(通过重定向完成),则无法更改地址栏。 ?faces-redirect=true 在幕后做同样的事情,它只是在可以返回字符串结果的操作方法中使用时很方便。只需使用&lt;f:viewParam&gt;,这就是它的用途。
    猜你喜欢
    • 1970-01-01
    • 2012-04-23
    • 1970-01-01
    • 2016-02-21
    • 1970-01-01
    • 2012-03-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多