JSF ViewScoped变量无法幸存重定向到同一页面

使用下面的代码,我在selectOneRadio上使用一个监听器来重定向到url中带有查询字符串的页面。

问题是,当我被重定向时, newsTitleselectedNews的值为null。 为什么是这样? 是因为我正在使用FacesContext进行重定向?

news.xhtml

  

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); } } 

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

使用 / 在新的GET请求上执行初始化作业。 你可以根据需要使命令链接成为一个普通的GET链接,这样它就更友好了(搜索机器人根本不会索引POST表单)。

也可以看看:

  • 如何选择合适的bean范围?
  • 什么可以使用
  • ViewParam vs @ManagedProperty(value =“#{param.id}”)
  • 我什么时候应该使用h:outputLink而不是h:commandLink?