我的豆有这个:
@ManagedBean
@ViewScoped
public class BookBean implements Serializable
{
@ManagedProperty(value = "#{param.id}") // does not work with @ViewScoped
private String id;
public void init()
{
id = FacesContext.getCurrentInstance().getExternalContext().getRequestParameterMap().get("id")
if (id != null) {
System.out.println("ID: " + id);
currentBook = bookService.find(id);
}
}
@PostConstruct
public void post()
{
// does not work with @ViewScoped
System.out.println("ID: " + id);
currentBook = bookService.find(id);
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
}
目的地Facelet有这个:
<f:metadata>
<f:viewParam name="id" value="#{bookBean.id}">
<f:event type="preRenderView" listener="#{bookBean.init}" />
</f:viewParam>
</f:metadata>
通过测试,我注意到@ManagedProperty
和@PostConstruct
仅适用于@RequestScoped
bean。
对于@ViewScoped
bean,我发现必须执行此操作FacesContext.getCurrentInstance().getExternalContext().getRequestParameterMap().get("id")
才能获取id
参数的值。
这是使用@ViewScoped
获取请求参数值的唯一方法吗?
有什么想法吗?
答案 0 :(得分:5)
视图范围比请求范围更广。 @ManagedProperty
只能设置与托管bean范围相比具有相同或更宽范围的属性。
继续使用<f:viewParam>
<f:event>
。你不应该把它们彼此嵌套。
<f:metadata>
<f:viewParam name="id" value="#{bookBean.id}" />
<f:event type="preRenderView" listener="#{bookBean.init}" />
</f:metadata>
与
@ManagedBean
@ViewScoped
public class BookBean implements Serializable {
private String id;
public void init() {
if (id != null) {
currentBook = bookService.find(id);
}
}
// ...
}
<f:viewParam>
将设置请求参数,<f:event>
将在设置这些参数后执行侦听器方法。
@PostConstruct
也适用于视图范围内的bean,但它只在bean构造之后直接运行,并且所有依赖注入都已设置(例如@ManagedProperty
,@EJB
,{{ 1}},@Inject
等)。但@Resource
之后会设置属性,因此<f:viewParam>
中无法使用该属性。
答案 1 :(得分:1)
这是在ViewScoped bean中获取请求参数的另一种方法。这将是#{param.device}将在RequestScoped bean中获得的内容。这样做的好处是不需要表示层中的任何标记。
private int deviceID;
public int getDeviceID() {
if (deviceID == 0) {
String s = FacesContext.getCurrentInstance().getExternalContext().
getRequestParameterMap().get("device");
try {
deviceID = Integer.parseInt(s);
} catch (NumberFormatException nfe) {
}
}
return deviceID;
}