我有两个页面,customer.xhtml和detailsCustomer.xhtml每个页面都有自己的控制器。我正在将一个参数从customer传递给detailsCustomer。
customer.xhtml中的按钮:
<p:commandButton process="@this" update="@form" title="Button"
actionListener="#{customerController.showDetails(register)}"
icon="ui-icon-suitcase" />
客户控制器中的功能:
public void showDetails(Customer c){
redirect("/customer/detailsCustomer.faces?customerId=" + c.getCustomerId());
}
在细节客户控制器中
public DetailsCustomerController(){
ExternalContext context = FacesContext.getCurrentInstance().getExternalContext();
strCustomer = ((HttpServletRequest) context.getRequest()).getParameter("customerId");
}
@PostConstruct
public void Init(){
registerCustomer = customerService.loadCustomer(Long.parseLong(strCustomer));
}
第一次非常完美,但如果我关闭detailsCustomer(重定向到客户)并选择一个新客户,它会一直显示最后一个客户。因为页面已经生成。我需要每次按下按钮时,页面都会与我选择的客户一起加载,但当我调试时,我发现它只通过构造函数和第一次按下按钮时的Init。
有可能吗?你知道怎么做吗?我将感谢任何帮助。
两个选项:
a) 只需使用要持久化的信息创建一个会话bean,并将其作为托管属性包含在特定bean中,或者直接从视图中引用它。例如,我有一个会话范围的登录bean,它管理用户信息和权限。
毕竟,没有人说你必须在你的jsf页面中只使用一个bean:-)
b) 如果你正在制作一个目录/编辑器,也许你只需要两个视图和一个控制器。
这就是我所做的。这可能不是最好的解决方案,但它对我有效:
有一个用于列出的Customer.xhtml和一个用于编辑的customerdetails.xhtml(以及用于添加新客户的newcustomer.xhtml),并且在您的控制器中有一个针对该版本的managedproperty Customer对象,每当您的customerId更改时都会重置它。
(在控制器中添加一个preRenderView处理程序,将客户的id与GET参数进行比较,以便在参数更改时加载新客户的详细信息。如果您以前没有编辑客户,那么您的客户数据很可能为空,因此您还需要检查这一点)。
因此,要编辑客户,请通过将客户id作为GET参数传递给customerdetails来重定向。也许你可以在客户列表的每一行添加一个版本链接。
在您的控制器中更新客户后,向同一url发出重定向,这样它就不会被回发并刷新用户信息。
最后,不要忘记在customerdetails.xhtml.中包含一个隐藏的输入字段(纯html输入,NOT inputHidden),该字段包含您的客户id和与GET参数相同的名称
也就是说,如果您传递一个get参数custId,请使用input name="custId"value="#{param.custId}。这样,无论是否回发,您都可以确保您的参数始终存在于编辑页面中。
祝你好运。
我得出结论,每次都需要重新加载页面,所以我在DetailsCustomerController中使用了@ViewScoped注释。对于我的特定问题和工作流程,它是有效的。