我知道如何在处理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开始回答它。但是,我想要整个请求对象。
答案 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实用程序库Faces
的OmniFaces类来保存一些常见的样板文件。
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。