如何在重定向后从后台bean加载数据



当我在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/>
现在

  1. 浏览器URL将被更新
  2. 从备份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请求。

欢呼

最新更新