当我在faces-config.xml
中不使用<redirect/>
标记时,它不会更新浏览器URL,但数据从后台bean成功加载。当我使用<redirect/>
时,浏览器URL被更新,但数据没有从后台bean加载。在这种情况下,如何从后台bean加载数据?
您可以在导航URL中使用faces-redirect=true
例如
<h:form>
<h:commandLink value="MyValue" action="MyPage?faces-redirect=true" />
</h:form>
没有在faces-config.xml
中定义<redirect/>
现在
- 浏览器URL将被更新
- 从备份bean成功加载数据。
在与目标页面相关联的后台bean的(post)构造函数中执行加载工作,如果需要,根据一些请求参数。
。
@ManagedBean
@RequestScoped
public class Bean {
private Data data;
@PostConstruct
public void init() {
data = loadItSomehow();
}
// ...
}
如果目标页面通过#{bean}
引用bean,那么它将被自动构造,您可以在构造函数或@PostConstruct
方法中完成所有工作,如果您碰巧有<f:viewParam>
而不是@ManagedProperty
,甚至可以在<f:event type="preRenderView">
附加的侦听器方法中完成所有工作。
参见:
- 如何在JSF中导航?如何使URL反映当前页面(而不是前一个)
- JSF 2:直接调用托管bean
- ViewParam vs @ManagedProperty(value = "#{param.id}")
JSF将表单提交到当前页面而不是目标页面,因此地址栏中显示的URL将始终是之后的一个请求。
的例子:
Base-URL: example.org/index.jsf // now we navigate to home.jsf
URL: example.org/home.jsf | Addressbar: example.org/index.jsf
// navigate to content.jsf
URL: example.org/content.jsf | Addressbar: example.org/home.jsf
// and so on
通过使用faces-redirect=true
-参数,您告诉servlet重新路由您的请求,以便地址栏更新到您所在的实际站点。
如果用户应该能够显式地添加此站点的书签,则特别需要此行为。
如果是这样,你必须使用重定向方法,要么在
faces-config.xml
中创建一个导航规则(就像你所做的那样),要么你可以通过告诉你的操作组件(commandLink/Button) destination-viewId并将?faces-redirect=true
附加到它来使用隐式导航。如果不需要为这个页面添加书签(或者需要get请求的任何其他类型的操作),您可以放弃这个操作,只坚持使用标准的post请求。
欢呼