【问题标题】:Redirect my page after h:commandLink action in JSF [duplicate]在 JSF 中的 h:commandLink 操作后重定向我的页面 [重复]
【发布时间】:2016-06-02 00:47:29
【问题描述】:

我有两页:

  • 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 时,下一页不显示所选值。

【问题讨论】:

    标签: jsf redirect commandlink


    【解决方案1】:

    如果我理解正确,您想在一个视图中选择一个项目,并在下一个视图中显示其子项目。如果是这种情况,那么有几种方法可以实现这一点,在这里我将根据您上面的概念/代码向您展示一种方法,因此让我们假设以下内容:

    1. listMedicalJourneys.xhtml 选择项目的视图
    2. listAffectedEmployees.xhtml 显示预选项目的子项目的视图

    我假设您对每个 View 都有自己的 Controller/ManagedBean,

    所以让我们调用第一个 medicalJourneysManager 和第二个视图 affectedEmployeesManager,两者都是 requestScoped Beans

    medicalJourneysManager 中,您的“选择方法”操作事件应该只获取选定的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;
        }
    

    这会将您重定向到下一个视图,您会在其中显示 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

    【讨论】:

    • 谢谢拉米,我用第二种方法解决了问题。
    猜你喜欢
    • 2015-02-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-17
    • 1970-01-01
    • 2019-02-01
    • 1970-01-01
    相关资源
    最近更新 更多