如何从Servlet设置请求属性并从JSF(xhtml)页面检索它们

时间:2012-08-28 15:33:47

标签: jsf servlets

我一直在阅读this similar SO question,但有些方法似乎对我不起作用。我的堆栈是 JSF2.0 (+ PrimeFaces),我部署到 JBoss 7 AS

有一个 Servlet 会将请求发送到 xhtml 页面(在同一个 war 中),但后者无法检索那里设置的属性的值。

这是Servlet代码片段:

protected void doPost(HttpServletRequest request, HttpServletResponse response)
 throws ServletException, IOException {
    (...)
    request.setAttribute("foo", "foo test");
    RequestDispatcher dispatcher = getServletContext().getRequestDispatcher(url);
    dispatcher.forward(request, response);                                    
}

这是 xhtml 页面上的代码:

<p><h:outputText value="#{sessionScope['foo']}" /></p>   
<p><h:outputText value="#{param['foo']}" /></p>                          
<p><h:outputText value="#{request.getParameter('foo')}" /></p>

其中在三种情况中都没有出现任何内容。

DID的工作原理是使用支持bean(如对参考SO文章的回复中所建议的),其中属性是在 @PostConstruct 方法中获得的,如下所示:

@PostConstruct
public void init() {
    HttpServletRequest request = (HttpServletRequest)FacesContext.getCurrentInstance()
                                               .getExternalContext().getRequest();
    message = (String) request.getAttribute("foo");
}  

...其中检索到的值随后可在 xhtml 页面中使用。

但为什么一种方法有效但另一种方法无效?

1 个答案:

答案 0 :(得分:3)

问题是您在servlet中的请求范围中设置了一个属性,但是在xhtml页面中,您正在编写request.getParameter("foo")sessionScope['foo']来访问它。

在xhtml页面中写下:#{requestScope.foo},它将显示属性foo的值。