JSF在重定向的每个页面重建控制器

时间:2014-04-14 21:53:30

标签: jsf

我有两页, customer.xhtml detailsCustomer.xhtml 。每个人都有自己的控制器。我将一个参数从customer传递给detailsCustomer。

customer.xhtml 中的按钮:

<p:commandButton process="@this" update="@form" title="Button" 
 actionListener="#{customerController.showDetails(register)}"
 icon="ui-icon-suitcase" /> 

CustomerController 中的功能:

public void showDetails(Customer c){
  redirect("/customer/detailsCustomer.faces?customerId=" + c.getCustomerId());
}

DetailsCustomerController

public DetailsCustomerController(){
  ExternalContext context = FacesContext.getCurrentInstance().getExternalContext();
  strCustomer = ((HttpServletRequest) context.getRequest()).getParameter("customerId");
}

@PostConstruct
public void Init(){
  registerCustomer = customerService.loadCustomer(Long.parseLong(strCustomer));
}

第一次工作完美,但如果我关闭detailCustomer(重定向到客户)并选择一个新客户,它会一直显示最后一个客户。因为页面已经构建完毕。 我需要每次按按钮页面加载我选择的客户,但是当我调试时,我看到它只是通过构造函数和 Init 我第一次按按钮

有可能吗?有什么想法怎么做?我会感激任何帮助。

2 个答案:

答案 0 :(得分:0)

两个选项:

a)只需创建一个包含要保留的信息的会话bean,并将其作为特定bean中的托管属性包含在内,或者直接从视图中引用它。例如,我有一个会话范围的登录bean来管理用户信息和权限。

毕竟,没有人说你必须在你的jsf页面中只使用一个bean: - )

b)如果您正在制作目录/编辑器,也许您只需要两个视图和一个控制器。

这就是我的工作。它可能不是最好的解决方案,但它对我有用:

有一个customers.xhtml用于列表,一个customerdetails.xhtml用于版本(和newcustomer.xhtml用于添加新客户),并在控制器中为该版本提供一个managedproperty Customer对象,并在您的customerId更改时重置它。

(将一个preRenderView处理程序添加到您的控制器,以将客户的ID与GET参数进行比较,这样您就可以在参数更改的情况下为新客户加载详细信息。有可能您的客户数据是如果您之前没有编辑过客户,则为null,因此您还需要检查该客户。

因此,要编辑客户,请将客户ID作为GET参数传递给customerdetails进行重定向。也许您只需在客户列表的每一行添加版本链接即可。

更新控制器中的客户后,请将重定向发送到同一网址,以便不会回发并刷新用户信息。

最后,不要忘记在customerdetails.xhtml中包含一个隐藏的输入字段(普通html输入,NOT inputHidden)和您的客户ID以及与GET参数相同的名称。

即。如果传递get参数custId,请使用输入名称=&#34; custId&#34;值=&#34;#{param.custId}。通过这种方式,您可以确保您的参数始终存在于您的编辑页面中,无论其是否回发。

祝你好运。

答案 1 :(得分:0)

我的结论是我每次都需要重新加载页面,所以我在 DetailsCustomerController 中使用了 @ViewScoped 注释。对于我的具体问题和工作流程,它可以工作。