当我不使用 中的<redirect/>
标签时faces-config.xml
,它不会更新浏览器 URL,但从支持 bean 成功加载数据。当我使用<redirect/>
时,浏览器 URL 会更新,但数据不会从支持 bean 加载。在这种情况下,如何从支持 bean 加载数据?
3 回答
您可以faces-redirect=true
在导航 URL中
使用例如
<h:form>
<h:commandLink value="MyValue" action="MyPage?faces-redirect=true" />
</h:form>
没有<redirect/>
在你的faces-config.xml
现在 定义
- 浏览器 URL 将被更新
- 数据从支持 bean 成功加载。
只需在与目标页面关联的支持 bean 的(后)构造函数中执行加载工作,如有必要,基于某些请求参数。
例如
@ManagedBean
@RequestScoped
public class Bean {
private Data data;
@PostConstruct
public void init() {
data = loadItSomehow();
}
// ...
}
如果目标页面通过 引用 bean #{bean}
,那么它将自动构造,并且您可以在构造函数或@PostConstruct
方法中完成所有工作,甚至可以在附加的侦听器方法中完成所有工作,<f:event type="preRenderView">
如果您碰巧有<f:viewParam>
而不是@ManagedProperty
。
也可以看看:
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 请求。
干杯