我正在阅读一篇标题为“JSF 2 GETs Bookmarkable URLs”的文章。
该文章有以下段落:
介绍视图参数
API文档描述了一个视图参数,由javax.faces.component.UIViewParameter组件类表示,作为请求参数和模型属性之间的声明性绑定。使用EL值表达式(例如,#{blog.entryId})表示对模型属性的绑定。如果省略表达式,则将request参数绑定到具有相同名称的请求范围变量。
有人可以提供请求范围变量的示例。
答案 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)
答案 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被实例化两次,一次显示表单,一次提交时。