Java JSF VIEWSCOPE变量无法重定向到同一页面

Java JSF VIEWSCOPE变量无法重定向到同一页面,java,jsf,jsf-2,primefaces,Java,Jsf,Jsf 2,Primefaces,使用下面的代码,我使用selectOneRadio上的侦听器重定向到url中带有查询字符串的页面 问题是,当我被重定向时,newsttitle和selectedNews的值为空。为什么会这样?是因为我正在使用FacesContext进行重定向吗 news.xhtml <h:outputLabel for="title" value="Title" style="font-weight: bold;"/> <p:inputText id="title" required="tru

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

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

}
@ManagedBean
@视域
公共类ContentEditorBacking{
私有字符串newsttitle=null;
私有字符串selectedNews=null;
公共字符串getNewsTitle(){
返回新闻标题;
}
公共无效setNewsTitle(字符串newsTitle){
this.newsttitle=新闻标题;
}
公共字符串getSelectedNews(){
返回所选新闻;
}
public void setSelectedNews(字符串selectedNews){
this.selectedNews=selectedNews;
}
public void addNewsArticle()引发异常{
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/u/u MONTH)).length()<2?“0”+Calendar.getInstance().get(Calendar.day/u MONTH):String.valueOf(Calendar.getInstance().get(Calendar.day/u MONTH));
字符串newsPath=null;
newsPath=“/”+所选新闻+“/News/”+年+“/”+月+“/”+日+“/”+新闻标题;
FacesContext.getCurrentInstance().getExternalContext().redirect(“news.xhtml?path=“+newsPath”);
}
}

重定向基本上指示webbrowser创建一个新的GET请求。这将创建一个新视图,从而也创建一个关联视图范围bean的新实例。只要您在(ajax)回发上返回
null
void
(视图范围即由隐藏的请求参数
javax.faces.ViewState
标识/跟踪),视图范围bean就正常存在。这就是它的工作方式

使用
/
对新的GET请求执行初始化作业。如果有必要,您可以将命令链接设置为普通的GET链接,这样对SEO更友好(搜索机器人根本不为帖子表单编制索引)

另见:

或者是否有方法使p:ajax调用刷新页面或至少更新url栏中的url?此外,我认为我不能在facescontext重定向中执行
?faces redirect=true
?您可以使用
update=“@all”
更新整个页面,但是,如果不告诉浏览器在给定URL上发送新请求(通过重定向完成),则无法更改地址栏。
?faces redirect=true
在封面下也做了同样的事情,它只是在可以返回字符串结果的action方法中使用时的一种方便。只要使用
,就可以了。