在JSF2.x中,如何使用DI将请求对象传递给Managed Bean?

时间:2012-08-14 13:33:14

标签: jsf jsf-2 request

我知道如何在处理bean方法时请求对象:

@ManagedBean        
public class HomeAction {
    ....
    public String getHtmlFormattedCookiesInfo(){
        FacesContext facesCtx = FacesContext.getCurrentInstance();
        ExternalContext extCtx = facesCtx.getExternalContext();
        HttpServletRequest req = (HttpServletRequest) extCtx.getRequest();
        ....
        // now do something with the req object such as read cookie
        //    or pass req object to another another function 
        //    that knows nothing about JSF
        ....
        }
    }
}

但是,我不喜欢将Faces特定代码放在我的bean对象中。

有没有办法使用DI和faces-config.xml传递请求?

当你想要传递请求对象上的内容时,

Question number 9337433开始回答它。但是,我想要整个请求对象。

2 个答案:

答案 0 :(得分:1)

FacesContext#{facesContext}的EL范围内。

所以,如果托管bean本身也是请求范围的话,这应该这样做。

@ManagedProperty("#{facesContext.externalContext.request}")
private HttpServletRequest request;

然而,在您的JSF代码中导入javax.servlet通常表明代码气味,并且特定的功能需求也可以通过JSF方式解决。根据评论,您似乎对收集请求cookie感兴趣。您应该使用ExternalContext类的非特定于Servlet-API的方法。有关完整概述,请参阅javadoc。 Cookie仅在ExternalContext#getRequestCookieMap()提供:

Map<String, Object> cookies = externalContext.getRequestCookieMap();

EL中的#{cookie}也可以使用(在这里,托管bean必须是请求范围的):

@ManagedProperty("#{cookie.cookieName}")
private String cookieValue;

或者,您可以查看JSF实用程序库FacesOmniFaces类来保存一些常见的样板文件。

String cookieValue = Faces.getRequestCookie("cookieName");

答案 1 :(得分:0)

假设bean是请求作用域,您可以使用托管属性注入另一个请求范围的值。例如:

@ManagedBean
@RequestScoped
public class Alfa {
  @ManagedProperty("#{paramValues.foo}")
  private String[] foo;

  public String[] getFoo() {
    return foo;
  }

  public void setFoo(String[] foo) {
    this.foo = foo;
  }

// remainder elided

这也可以通过faces-config.xml指定。要将请求范围的人工制品注入更广泛的范围,您必须使用level of indirection