4

我有一个简单的 login.xhtml facelet,其中包含用户名和密码输入以及一个命令按钮。命令按钮只是有一个action="welcome"显示welcome.xhtml facelet 的结果。

我对 JSF 很陌生。当我阅读 JSF 生命周期时,当我单击按钮时,调用应用程序生命周期会处理导航并渲染(??)welcome.xhtml。如果welcome.xhtml 是否会开始一个新的facelet 生命周期,我仍然感到困惑。

PS:我注意到网址没有更改为welcome.xhtml。jsf 生命周期是否与请求绑定?

4

1 回答 1

3

是的,JSF 生命周期是请求绑定的。是的,默认情况下,结果将在同一个请求中呈现。

就 HTTP servlet 请求而言,让您感到困惑的关键可能是“转发”与“重定向”。

JSF 默认将请求转发到目标页面。如果您非常了解 Servlet API,您就会明白它在幕后执行以下操作:

request.getRequestDispatcher("welcome.xhtml").forward(request, response);

这样,目标页面就可以访问相同的请求对象。如果目标页面与提交表单的页面不同(login.xhtml实际),那么您将不会看到更改反映在浏览器地址栏中。

<redirect/>但是,您可以通过向导航案例添加 a 或通过调用bean 的操作方法或通过向按钮的操作ExternalContext#redirect()添加参数以一种不错的 JSF 2.0 方式来配置 JSF 以将请求重定向到目标页面:faces-redirect=true

<h:commandButton value="login" action="welcome?faces-redirect=true" />

无论哪种方式,它都是在 Servlet API 术语中执行以下操作:

response.sendRedirect("welcome.xhtml");

它基本上指示客户端向给定位置发出全新的 GET 请求。请注意,通过这种方式,初始请求的任何请求和视图范围的 bean 都将被丢弃并重新创建。

于 2010-07-27T16:46:29.673 回答