我有一个简单的表单,您可以在其中输入String
。在提交表单时,用户被重定向到响应用户输入的另一个页面。第一页使用的是RequestScoped
bean,而第二页使用的是ViewScoped
bean。
第一页:
<h:form>
Type a String: <h:inputText value="#{requestScopedBean.property}"></h:inputText>
<h:commandButton value="To View" action="#{requestScopedBean.toViewScopedBean}">
<f:setPropertyActionListener target="#{viewScopedBean.property}" value="#{requestScopedBean.property}" />
<f:ajax execute="@form" />
</h:commandButton>
</h:form>
第二页:
This is the property passed by the requestScoped bean: <h:outputText value="#{viewScopedBean.property}"></h:outputText><br/>
This is the property created in the PostConstruct: <h:outputText value="#{viewScopedBean.otherProperty}"></h:outputText>
我明白为什么它不起作用。当提交表单时,将viewScopedBean.property
设置为正确的值,但随后我们切换到另一个视图,因此创建了一个新的ViewScopedBean
。这就是丢失请求值的原因。
或者,您可以在触发requestScopedBean操作时将字符串放在请求映射上
public String toViewScopedBean(String string){
Map<String,Object> requestMap = FacesContext.getCurrentInstance().getExternalContext().getRequestMap();
requestMap.put("StringKey", string);
return "toViewScopedBean";
}
,然后从valueScopedBean
中检索值public String getProperty(){
Map<String, Object> requestMap = FacesContext.getCurrentInstance().getExternalContext().getRequestMap();
return (String) requestMap.get("StringKey");
}