在 JSF 中执行 h:commandLink 操作后重定向我的页面

Redirect my page after h:commandLink action in JSF

我有两个页面:

从第一页开始:

<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 向您展示一种方法,因此让我们假设以下内容:

  1. listMedicalJourneys.xhtml 您 select 一个项目的视图
  2. listAffectedEmployees.xhtml 显示预selected 项目
  3. 的子项目的视图

并且我假设您每个视图都有自己的 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