我正在阅读一篇题为:“ JSF 2 GETs Bookmarkable URLs ”的文章。
文章有以下段落:
介绍视图参数
API 文档描述了一个视图参数,由 javax.faces.component.UIViewParameter 组件类表示,作为请求参数和模型属性之间的声明性绑定。与模型属性的绑定使用 EL 值表达式(例如,#{blog.entryId})来表示。如果省略表达式,则请求参数将绑定到具有相同名称的请求范围变量。
有人可以提供一个请求范围变量的示例。
我正在阅读一篇题为:“ JSF 2 GETs Bookmarkable URLs ”的文章。
文章有以下段落:
介绍视图参数
API 文档描述了一个视图参数,由 javax.faces.component.UIViewParameter 组件类表示,作为请求参数和模型属性之间的声明性绑定。与模型属性的绑定使用 EL 值表达式(例如,#{blog.entryId})来表示。如果省略表达式,则请求参数将绑定到具有相同名称的请求范围变量。
有人可以提供一个请求范围变量的示例。
“请求范围变量”是存储为HttpServletRequest
.
request.setAttribute("foo", foo);
此属性在 EL 中以通常的方式可用#{foo}
。它HttpServletRequest
本身的生命周期正好是一个 HTTP 请求-响应周期。一旦与 HTTP 请求关联的 HTTP 响应完全到达客户端(Web 浏览器),则该HttpServletRequest
实例(包括其所有属性)将被丢弃。顺便说一下,JSF 请求范围的托管 bean 也存储为HttpServletRequest
.
由于 JSF 在基本 HTTP Servlet API 的“顶部”运行,如果您还了解 HTTP 和 Servlet API 的工作原理,这一切都更容易理解。这个答案可能会带来一些启示:servlet 是如何工作的?实例化、会话、共享变量和多线程。
您接下来的问题可能是“这与引用的段落有什么关系?” 好吧,它基本上是在告诉你,当你省略 的value
属性时<f:viewParam>
,它会被作为变量放在请求范围内。
所以,如果你使用
<f:viewParam name="entryId" />
代替
<f:viewParam name="entryId" value="#{blog.entryId}" />
#{entryId}
然后它在请求范围内变得可用。
<p>The entry ID view parameter is: #{entryId}</p>
然而,这不是通常使用视图参数的方式。您也可以只使用#{param}
地图,从而使整个过程变得<f:viewParam>
多余。
<p>The entry ID view parameter is: #{param.entryId}</p>
为每个单独的请求实例化一个请求范围的变量。因此,请求范围的变量实例不存在于另一个请求的上下文中。
一个请求范围的变量,顾名思义,只在当前的 http 请求中有效。请求变量的一个很好的用途是在将请求从 servlet 转发到 jsp 时。例如在 servlet 中设置变量,稍后在 jsp 中用 ${myvar} 读取相同的变量
示例(小服务程序)
request.setAttribute ("greeting", "world");
getServletConfig().getServletContext().getRequestDispatcher("/jsp/page.jsp").forward(request, response);
示例(jsp)
id 与 Managed-bean 配置中的 entryId 映射,或者您可以使用注释。
<managed-bean>
<managed-bean-name>blog</managed-bean-name>
<managed-bean-class>com.acme.Blog</managed-bean-class>
<managed-property>
<property-name>entryId</property-name>
<value>#{param['id']}</value>
</managed-property>
</managed-bean>
@RequestScope:(这是托管 bean 的默认范围)。这会将 bean 置于请求范围内。它为每个 HTTP 请求创建一个新实例。通常,bean 被实例化两次,一次是在显示表单时,一次是在提交时。