如何在JSF2/JPA/无状态EBJs(jsf托管控制器)中从一个视图导航到下一个视图并保留数据

如何在JSF2/JPA/无状态EBJs(jsf托管控制器)中从一个视图导航到下一个视图并保留数据,jpa,view,jsf-2,ejb,stateless,Jpa,View,Jsf 2,Ejb,Stateless,我有一个web应用程序,使用JSF2和JPA实体,无状态ejb会话bean作为我的facade/ejb对象,托管bean(请求和视图范围)作为暴露业务方法的控制器,托管控制器从注入的无状态会话bean中提取数据 但我对如何在这种环境中导航和保留控制器中的数据视图感到困惑,例如: 我有一个jsf2视图页面(departmentView.xhtml),它显示一个部门对象列表,每行有一个编辑项。单击编辑我想加载一个新页面并显示 新页面上该部门的列表或员工列表,因此我调用员工控制器将其传递给所选部门 a

我有一个web应用程序,使用JSF2和JPA实体,无状态ejb会话bean作为我的facade/ejb对象,托管bean(请求和视图范围)作为暴露业务方法的控制器,托管控制器从注入的无状态会话bean中提取数据

但我对如何在这种环境中导航和保留控制器中的数据视图感到困惑,例如:

我有一个jsf2视图页面(departmentView.xhtml),它显示一个部门对象列表,每行有一个编辑项。单击编辑我想加载一个新页面并显示 新页面上该部门的列表或员工列表,因此我调用员工控制器将其传递给所选部门

action="#{employeeController.getEmployeeListForADepartment(ithDepartment)}" 
下面是my departmentView.xhtml的一个片段

    <h:dataTable id="table" value="#{departmentController.departmentList}" 
            var="ithDepartment">
...
<h:column>              
<h:commandLink id="editId" value="Edit"
action="#{employeeController.getEmployeeListForADepartment(ithDepartment)}" />
</h:column>

...
我的员工控制员定义为

ManagedBean(name = "employeeController")
@ViewScoped
public class EmployeeController implements Serializable {
   ...
private List<Employee> employeeList = new ArrayList<Employee>();
   ...      

@EJB
private com.ejb.session.EmployeeFacade ejbEmployeeFacade;    
   ...

public List<Employee> getEmployeeListForADepartment(Department dept) 
{
    if(employeeList==null || employeeList.isEmpty())
          employeeList = ejbEmployeeFacade.findEmployeesByDepartment(dept);  

// now i want to navigate to the employee view showing these employees for the
// selected department.
// but this navigation below triggers creating a new EmployeeController 
// and i lose my employeeList 
    return "employeeView";
}
ManagedBean(name=“employeeController”)
@视域
公共类EmployeeController实现可序列化{
...
private List employeeList=new ArrayList();
...      
@EJB
私有com.ejb.session.EmployeeFacade ejbEmployeeFacade;
...
公共列表GetEmployeeListforDepartment(部门)
{
if(employeeList==null | | employeeList.isEmpty())
employeeList=ejbEmployeeFacade.findEmployeesByDepartment(部门);
//现在,我想导航到employee视图,该视图显示了
//选定的部门。
//但是下面的导航会触发创建一个新的EmployeeController
//我失去了我的雇员名单
返回“employeeView”;
}
我真的想避免使用jsf会话范围,并且相信有一种方法可以做到这一点,只是不想在我的任何jsf/ejb书籍中读到它

大声想想,也许没有
EmployeeController.GetEmployeeListforDepartment(..)
进行查找,只需从部门id创建一个参数,并通过
返回“employeeView?departmentId=X”
传递该参数,然后让构造函数在id存在时进行查找

有人能帮助我在EJB/JSF2环境中实现这一点的正确方法吗

谢谢

在源代码视图中使用一个简单的GET
来传递部门ID,在目标视图中使用一个
来转换和设置部门

例如

另见:

进一步说明,我可以在2个页面中导航到相同的“员工列表”视图/页面,1)我有一个部门id,因此只显示该部门id的员工,2)如果我没有部门id(以前没有从部门视图中选择)因此,我希望显示所有部门的所有员工。我假设我可以删除示例属性
required=“true”
然后我的EmployeeController将查看是否已设置部门id,并返回1)部门员工列表或2)所有部门的所有员工?是的,您可以这样做。删除
required=“true”
并添加一个
,相应地处理员工列表的加载。3条注释,以防对任何人都有帮助1)如果我将原始代码的EmployeeController范围放在
@RequestScoped
而不是
@ViewScoped
,那么当我从departmentView.xhtml转到employeeView.xhtml时,我会保留数据,使JSF se总数增加nse.2)实现这种方式会导致POST发生,因为使用
3)BalusC方式实现更好,因为它遵循RESTful设计,不会发布->更少的数据错误,并且可以进行书签,即。http://../employeeView.jsf?deptantmentId=1. 巴卢斯克,谢谢你成为社区的一员。圣诞快乐!
<h:link id="editId" value="Edit" outcome="employeeView">
    <f:param name="departmentId" value="#{ithDepartment.id}" />
</h:link>
<f:metadata>
    <f:viewParam name="id" value="#{editDepartmentBean.department}"
        converter="#{departmentConverter}" converterMessage="Bad request. Unknown department."
        required="true" requiredMessage="Bad request. Please use a link from within the system." />
</f:metadata>
@ManagedBean
@ViewScoped
public class EditDepartmentBean {

    private Department department;

    // ...
}