2

我的豆子有这个:

@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只能使用@RequestScopedbean。

对于@ViewScopedbean,我发现我必须这样做FacesContext.getCurrentInstance().getExternalContext().getRequestParameterMap().get("id")才能获取id参数的值。

这是获取请求参数值的唯一方法@ViewScoped吗?

有什么想法吗?

4

2 回答 2

6

视图范围比请求范围更广。与托管 bean的@ManagedProperty范围相比,只能设置具有相同或更广泛范围的属性。

继续使用<f:viewParam>with <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>在设置这些参数后执行侦听器方法。

在视图范围的@PostConstructbean 上也可以正常工作,但它只在 bean 的构造和设置所有依赖注入后直接运行(例如@ManagedProperty, @EJB, @Inject,@Resource等)。然而<f:viewParam>,此后会设置该属性,因此它在@PostConstruct.

于 2011-04-16T15:26:10.820 回答
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;
}
于 2011-05-16T16:29:08.623 回答