1

我知道如何在处理 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 传递请求?

当您想传递请求对象上的某些内容时,问题编号 9337433开始回答它。但是,我想要整个请求对象。

4

2 回答 2

1

FacesContextEL 范围内可用#{facesContext}

因此,只要托管 bean 本身也是请求范围的,就应该这样做。

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

但是javax.servlet在您的 JSF 代码中导入更多地表明代码有异味,并且特定的功能需求也可以通过 JSF 方式来解决。根据评论,您似乎对收集请求 cookie 感兴趣。为此,您应该使用ExternalContext该类的非 Servlet-API 特定方法。有关完整概述,请参阅javadoc。Cookie 也可以通过以下方式获得ExternalContext#getRequestCookieMap()

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

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

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

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

String cookieValue = Faces.getRequestCookie("cookieName");
于 2012-08-14T13:55:16.590 回答
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。要将请求范围的人工制品注入更广泛的范围,您必须采用一定程度的间接性

于 2012-08-14T13:52:53.650 回答