什么是JSF中的“请求范围变量”

时间:2012-09-17 08:41:45

标签: java jsf-2

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

该文章有以下段落:

  

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

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

4 个答案:

答案 0 :(得分:3)

“请求范围变量”是一个存储为HttpServletRequest属性的变量。

request.setAttribute("foo", foo);

#{foo}通常以EL方式提供此属性。 HttpServletRequest本身的生命周期恰好是一个HTTP请求 - 响应周期。一旦与HTTP请求关联的HTTP响应完全到达客户端(webbrowser),那么HttpServletRequest实例(包括其所有属性)就会被攻击。顺便说一句,JSF请求范围的托管bean也存储为HttpServletRequest的属性。

由于JSF在基本HTTP Servlet API的“顶部”运行,如果您也了解HTTP和Servlet API的工作方式,这一点都更容易理解。这个答案可能会给你一些启示:How do servlets work? Instantiation, sessions, shared variables and multithreading


您的后续问题可能是“这与引用的段落有什么关系呢?”嗯,基本上说,当您省略value <f:viewParam>属性时1}},它被替换为请求范围中的变量。

所以,如果你使用

<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>

另见:

答案 1 :(得分:0)

请求范围变量针对每个单个请求进行实例化。因此,在另一个请求的上下文中不存在请求范围的变量实例。

答案 2 :(得分:0)

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

在jsp中读取相同的变量

实施例(的servlet)

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

例(JSP)     

Hello $ {greeting}

答案 3 :(得分: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被实例化两次,一次显示表单,一次提交时。