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