JSF 中的“请求作用域变量”是什么

aus*_*ser 2 java jsf-2

我正在阅读一篇标题为“ JSF 2 GETs Bookmarkable URLs ”的文章。

文章中有这样一段话:

视图参数简介
API 文档描述了视图参数,由 javax.faces.component.UIViewParameter 组件类表示,作为请求参数和模型属性之间的声明性绑定。与模型属性的绑定使用 EL 值表达式(例如,#{blog.entryId})来表达。如果省略表达式,则请求参数将绑定到具有相同名称的请求范围变量。

有人可以提供请求范围变量的示例吗?

Bal*_*usC 5

“请求范围变量”是作为HttpServletRequest.

request.setAttribute("foo", foo);
Run Code Online (Sandbox Code Playgroud)

该属性在 EL 中可以通过#{foo}. 它HttpServletRequest本身的生命周期正好是一个 HTTP 请求-响应周期。一旦与 HTTP 请求关联的 HTTP 响应完全到达客户端(Web 浏览器),该HttpServletRequest实例(包括其所有属性)就会被丢弃。顺便说一句,JSF 请求范围内的托管 bean 也存储为HttpServletRequest.

由于 JSF 在基本 HTTP Servlet API“之上”运行,如果您还了解 HTTP 和 Servlet API 的工作原理,那么这一切都会更容易理解。这个答案可能会给人一些启示:servlet 是如何工作的?实例化、会话、共享变量和多线程


您接下来的问题可能是“那么这与引用的段落有何关系?” 嗯,它基本上告诉我们,当您省略value的属性时<f:viewParam>,它会被作为变量放在请求范围中。

所以,如果你使用

request.setAttribute("foo", foo);
Run Code Online (Sandbox Code Playgroud)

代替

<f:viewParam name="entryId" />
Run Code Online (Sandbox Code Playgroud)

#{entryId}然后它在请求范围内变得可用。

<f:viewParam name="entryId" value="#{blog.entryId}" />
Run Code Online (Sandbox Code Playgroud)

然而,这不是通常使用视图参数的方式。或者,您也可以只使用#{param}地图,从而使整个过程<f:viewParam>变得多余。

<p>The entry ID view parameter is: #{entryId}</p>
Run Code Online (Sandbox Code Playgroud)

也可以看看: