在 JSF 中执行 h:commandLink 操作后重定向我的页面
Redirect my page after h:commandLink action in JSF
我有两个页面:
- listMedicalJourneys.xhtml
- listAffectedEmployees.xhtml
从第一页开始:
<h:form>
<h:commandLink action="#{MedicalJourneyController.listAffectedEmployees()}" value="Manage">
<f:setPropertyActionListener value="#{element.id}" target="#{MedicalJourneyController.medicalJourneyId}" />
</h:commandLink>
</h:form>
@RequestScoped
bean #{MedicalJourneyController}
有这个方法:
public String listAffectedEmployees() {
MedicalJourney m = medicalJourneyBean.getMedicalJourneyById(medicalJourneyId);
setMesList(new ArrayList<MedicalJourneyEmployeeService>(m.getMedicalJourneyEmployeeServices()));
setSelectedMedicalJourney(m);
return "listAffectedEmployees.faces?faces-redirect=true";
}
当我使用重定向更改 URL 时,下一页不显示所选值。
如果我没理解错的话,您想 select 一个视图中的项目,并在下一个视图中显示其子项目。如果是这种情况,那么有多种方法可以解决这个问题,在这里我将根据上面的 Concept/Code 向您展示一种方法,因此让我们假设以下内容:
listMedicalJourneys.xhtml
您 select 一个项目的视图
listAffectedEmployees.xhtml
显示预selected 项目 的子项目的视图
并且我假设您每个视图都有自己的 Controller/ManagedBean,
所以让我们调用第一个 medicalJourneysManager
和第二个视图 affectedEmployeesManager
,两者都是 requestScoped
Beans
在 medicalJourneysManager
中,您的 "selection Methode" 操作事件应该只获取 selected ItemId,并将此 selected id 传递到下一页。 Next Page Controller 然后应该加载 SubItems 列表。因为 requestScoped Bean 仅在这个单一请求期间可用,并且一旦您导航到任何地方,您的 bean 将被重新初始化,这意味着此时加载的数据丢失。
所以在您的 medicalJourneysManager
中定义一些像这样的 ActionMethode:
//JSF 2.+
public String selectMedicalJourny(int medicalJourneyId) {
// do what ever you want before redirect, i.e. any validations, ...etc if required
return "listAffectedEmployees.faces?faces-redirect=true&medicalJourneyId="+medicalJourneyId;
}
这会将您重定向到下一个视图,您将在其中显示 AffectedEmployees
的列表
这个新视图需要其控制器“affectedEmployeesManager
”来加载受影响的员工列表。
所以在这个托管 Bean 中做这样的事情:
@PostConstruct
private void init(){
try{
String medicalJourneyId = FacesContext.getCurrentInstance().getExternalContext().getRequestParameterMap().get("medicalJourneyId");
// now do whatever you want with it, load its subNodes/affectedEmployeesList, ...etc
MedicalJourney m = medicalJourneyBean.getMedicalJourneyById(medicalJourneyId);
setMesList(new ArrayList<MedicalJourneyEmployeeService>(m.getMedicalJourneyEmployeeServices()));
setSelectedMedicalJourney(m);
}catch(Exception e){
e.printStackTrace();
}
}
commandLink 的一个更简单的替代方法是使用直接 link 和该参数,而不使用任何操作命令。
这里有一个有用的 link。
我有两个页面:
- listMedicalJourneys.xhtml
- listAffectedEmployees.xhtml
从第一页开始:
<h:form>
<h:commandLink action="#{MedicalJourneyController.listAffectedEmployees()}" value="Manage">
<f:setPropertyActionListener value="#{element.id}" target="#{MedicalJourneyController.medicalJourneyId}" />
</h:commandLink>
</h:form>
@RequestScoped
bean #{MedicalJourneyController}
有这个方法:
public String listAffectedEmployees() {
MedicalJourney m = medicalJourneyBean.getMedicalJourneyById(medicalJourneyId);
setMesList(new ArrayList<MedicalJourneyEmployeeService>(m.getMedicalJourneyEmployeeServices()));
setSelectedMedicalJourney(m);
return "listAffectedEmployees.faces?faces-redirect=true";
}
当我使用重定向更改 URL 时,下一页不显示所选值。
如果我没理解错的话,您想 select 一个视图中的项目,并在下一个视图中显示其子项目。如果是这种情况,那么有多种方法可以解决这个问题,在这里我将根据上面的 Concept/Code 向您展示一种方法,因此让我们假设以下内容:
listMedicalJourneys.xhtml
您 select 一个项目的视图listAffectedEmployees.xhtml
显示预selected 项目 的子项目的视图
并且我假设您每个视图都有自己的 Controller/ManagedBean,
所以让我们调用第一个 medicalJourneysManager
和第二个视图 affectedEmployeesManager
,两者都是 requestScoped
Beans
在 medicalJourneysManager
中,您的 "selection Methode" 操作事件应该只获取 selected ItemId,并将此 selected id 传递到下一页。 Next Page Controller 然后应该加载 SubItems 列表。因为 requestScoped Bean 仅在这个单一请求期间可用,并且一旦您导航到任何地方,您的 bean 将被重新初始化,这意味着此时加载的数据丢失。
所以在您的 medicalJourneysManager
中定义一些像这样的 ActionMethode:
//JSF 2.+
public String selectMedicalJourny(int medicalJourneyId) {
// do what ever you want before redirect, i.e. any validations, ...etc if required
return "listAffectedEmployees.faces?faces-redirect=true&medicalJourneyId="+medicalJourneyId;
}
这会将您重定向到下一个视图,您将在其中显示 AffectedEmployees
的列表这个新视图需要其控制器“affectedEmployeesManager
”来加载受影响的员工列表。
所以在这个托管 Bean 中做这样的事情:
@PostConstruct
private void init(){
try{
String medicalJourneyId = FacesContext.getCurrentInstance().getExternalContext().getRequestParameterMap().get("medicalJourneyId");
// now do whatever you want with it, load its subNodes/affectedEmployeesList, ...etc
MedicalJourney m = medicalJourneyBean.getMedicalJourneyById(medicalJourneyId);
setMesList(new ArrayList<MedicalJourneyEmployeeService>(m.getMedicalJourneyEmployeeServices()));
setSelectedMedicalJourney(m);
}catch(Exception e){
e.printStackTrace();
}
}
commandLink 的一个更简单的替代方法是使用直接 link 和该参数,而不使用任何操作命令。
这里有一个有用的 link。