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

时间:2016-02-20 11:08:34

标签: jsf redirect commandlink

我有两页:

  • 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";
}

当我使用重定向更改网址时,下一页不会显示所选的值。

1 个答案:

答案 0 :(得分:2)

如果我理解你,你想在一个视图中选择一个项目,并在下一个视图中显示它的子项目。如果这是案例那么,有一些单一的方法可以解决这个问题,在这里我将根据您的概念/代码向您展示一种方式,所以让我们假设如下:

  1. listMedicalJourneys.xhtml您选择项目的视图
  2. listAffectedEmployees.xhtml视图显示预选项目的子项目的位置
  3. 我假设每个View都有自己的Controller / ManagedBean,

    所以我们调用第一个medicalJourneysManager,第二个视图affectedEmployeesManager,都是requestScoped

    medicalJourneysManager你的选择Methode&#34; action事件应该只获取选定的ItemId,并将此选定的id传递给下一页。然后,下一页控制器应该加载子项列表。因为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;
        }
    

    这会将您重定向到显示受影响的员工

    列表的下一个视图

    这个新视图需要其控制器&#34; affectedEmployeesManager&#34;加载受影响的员工列表。

    所以在这个托管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