JSF/PrimeFaces selectOneMenu更改URL参数并重定向

3
我是使用JSF2和PrimeFaces。当用户更改菜单选项时,我如何编写selectOneMenu来调用JSF导航以将用户重定向到具有不同参数的相同页面? 我只需要更改颜色。
从url:
    <f:metadata>
        <f:viewParam name="vehicle" value="#{myViewController.vehicle}"/>
        <f:viewParam name="vehicle" value="#{myViewController.color}"/>
    </f:metadata>

MyView.xhtml:(不起作用)

    <h:form id="selectOneMenuEdition">
    <p:selectOneMenu id="selectOneMenuHeader"
                     value="#{selectOneMenuHeader.outcome}" >
        <f:selectItem itemValue="viewVehicles.xhtml?vehicle=#{myViewController.vehicle}&amp;color=red" itemLabel="Vehicle red " />
        <f:selectItem itemValue="viewVehicles.xhtml?vehicle=#{myViewController.vehicle}&amp;color=blue" itemLabel="Vehicle blue" />
        <p:ajax event="change" listener="#{selectOneMenuHeader.navigate}" />
    </p:selectOneMenu>
    </h:form>

托管Bean:

private String outcome;

public void navigate() throws IOException {
    FacesContext.getCurrentInstance().getExternalContext().redirect(outcome);
}

在你提到 outcome 的时候,是指 JSF 导航结果还是 URL? - kolossus
嗯...是的,也许这个例子是错误的。我不知道正确的做法是什么。 - xav56883728
这并没有真正回答我的问题:outcome变量是JSF导航结果还是完整的URL? - kolossus
是的,在这种情况下是一个完整的URL,但我认为这不是最好的选择。 - xav56883728
1
原则上你的想法没有问题,但是你的方法有些笨拙。只需将颜色保存到后端Bean中,在navigate方法中构建URL(而不是在视图中进行你目前尝试的花式操作)。 - kolossus
1个回答

3
你的<p:selectOneMenu>绑定了selectOneMenuHeader.outcome,所以你只需要在bean中获取它的值。
然后,你可以创建自己的URL,以带有所需参数重定向用户。
示例(bean):
public void navigate() throws IOException {
    String url = "yourPage.jsf?color=" + outcome;
    FacesContext.getCurrentInstance().getExternalContext().redirect(url);
}

第二种解决方案是通过添加一个JavaScript onchange事件来重定向用户,方法是获取当前所选选项。
示例(原生JS):
onchange="document.location.href='yourPage' + this.options[this.selectedIndex].value;"

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接