2

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

文章有以下段落:

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

有人可以提供一个请求范围变量的示例。

4

4 回答 4

4

“请求范围变量”是存储为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>

也可以看看:

于 2012-09-17T11:41:05.047 回答
0

为每个单独的请求实例化一个请求范围的变量。因此,请求范围的变量实例不存在于另一个请求的上下文中。

于 2012-09-17T08:45:47.077 回答
0

一个请求范围的变量,顾名思义,只在当前的 http 请求中有效。请求变量的一个很好的用途是在将请求从 servlet 转发到 jsp 时。例如在 servlet 中设置变量,稍后在 jsp 中用 ${myvar} 读取相同的变量

示例(小服务程序)

request.setAttribute ("greeting", "world");        
getServletConfig().getServletContext().getRequestDispatcher("/jsp/page.jsp").forward(request, response);

示例(jsp)

你好 ${问候}

于 2012-09-17T08:46:26.567 回答
0

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 被实例化两次,一次是在显示表单时,一次是在提交时。

于 2012-09-17T09:00:54.990 回答