是的,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 都将被丢弃并重新创建。