[当我不使用<redirect/>
中的faces-config.xml
标记时,它不会更新浏览器URL,但已成功从后备bean加载数据。当我使用<redirect/>
时,浏览器URL会更新,但不会从后备bean加载数据。在这种情况下,如何从备份bean加载数据?
您可以在导航URL中使用faces-redirect=true
例如
<h:form>
<h:commandLink value="MyValue" action="MyPage?faces-redirect=true" />
</h:form>
没有在<redirect/>
中定义faces-config.xml
现在
仅在必要时基于某些请求参数,才在与目标页面关联的后备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
中创建导航规则来使用redirect方法(就像您所做的那样),或者可以通过告诉动作组件(commandLink / Button)destination-viewId并附加使用隐式导航?faces-redirect=true
。如果不需要为该页面添加书签(或需要GET请求的任何其他类型的操作),则可以省去这个问题,而只需坚持标准的POST请求即可。
欢呼声