我正在尝试在页面加载时初始化辅助bean。已经寻找了许多解决方案,但大多数都使用链接,按钮或根本没有参数。
情形: 客户登录到某个站点,然后应该在下一页上看到他的所有数据。
支持bean:
loginDetailsController - 支持 登录过程。可以访问用户的 密码和用户名。支持豆 对于Login.xhtml。
customerController - 访问 其余的用户详细信息。它还有一个customer_id字段。它是Backing bean 对于Home.xhtml。可以完全从customer_id初始化customerController。
在Home.xhtml上,可以通过这种方式获得customer_id:
#{loginDetailsController.customer_id}
有没有办法在页面加载时使用上面的值初始化customerController?
此致
丹尼尔
答案 0 :(得分:10)
JSF 2.0具有preRender支持,可以解决您的问题。
JSF 2包含一个PreRenderViewEvent,它在视图参数处理完毕后但在渲染视图之前触发。可以使用标记注册预渲染视图侦听器,例如:
<f:metadata>
<f:viewParam name="foo" value="#{bean.foo}"/>
<f:event type="preRenderView" listener="#{bean.doSomething}"/>
</f:metadata>
答案 1 :(得分:4)
您的bean的范围是什么?无论如何,标有@PostConstruct
的方法
在创建bean时,将调用一次注释。
@ManagedBean
@ViewScoped
public class LoginDetailsController() {
private String customer_id;
// getters and setters for customer_id
@PostConstruct
public void init() {
this.customer_id = fetch_the_value_from_somewhere;
}
}
如果您希望页面始终执行此方法,无论是否已创建bean,请使用正确建议的Tarun PreRenderViewEvent
。但请注意,每次呈现页面时都会触发此事件;即使用户刷新页面。
如果您想在LoginDetailsController
中使用customerController
中的此值,可以按如下方式将其注入
@ManagedBean
@ViewScoped
public class CustomerController() {
@ManagedProperty(value="#{loginDetailsController}")
private LoginDetailsController loginDetailsController;
private String customer_id;
// getters and setters for customer_id
@PostConstruct
public void init() {
this.customer_id = loginDetailsController.getCustomer_id();
}
答案 2 :(得分:1)
这就是我解决它的方法:
因为LoginDetailsController是会话作用域,所以始终初始化customer_id。
所以 - 我添加了
@ManagedProperty(value="#{loginDetailsController.customer_id}")
private String customer_id;
Plus - customer_id的getter和setter。
在LoginDetailsController上,正如Nikhil所说 - 稍微改变一下。
然后,可以在Home.xhtml上使用#{customerController.customer_id}
和customerController的其余customerController初始化元素。
谢谢大家!