如何使用所有参数重定向到同一页面?

时间:2013-12-23 16:43:57

标签: jsf redirect jsf-2 parameters query-string

在我的应用程序中,我有一些带有一些参数的JSF页面

(示例页面的网址:/pages/user.xhtml?id=123&userToShowId=2

在这个页面上我有一个commandButton。点击它后,我想重定向到所有参数的同一页面。我知道,对于这个指定的页面,我可以这样手动完成:

public String redirect(){
    //extCtx - ExternalContext
    //ctx - FacesContext
    Map<String,String> param = extCtx.getRequestParameterMap();
    String currentURL = ctx.getViewRoot().getViewId();
    return currentURL+"?userToShowId="+param.get("userToShowId")+"&id="+param.get("id");
}

但是当我想通过任何参数从任何页面重定向的通用方法时该怎么办?


如果我只在页面上有视图参数,而不将其设置为bean属性:

<f:metadata>
    <f:viewParam name="backurl"/>
    <f:viewParam name="id"/>
</f:metadata>

不是value

<f:metadata>
    <f:viewParam name="backurl" value=#{bean.id}/>
    <f:viewParam name="id" value=#{bean.id}/>
</f:metadata>

我可以使用includeViewParams=true来完成我的工作吗?

1 个答案:

答案 0 :(得分:1)

您可以在不必将它们绑定到托管bean的情况下执行此操作。在JSF中有两个主要的导航案例:

  • 执行查看请求,不做任何其他操作。这是一个 HTTP GET 请求,使用h:button完成,不需要由表单包装,就像链接一样。
  • 执行表单 POST ,之后请求另一个页面( REDIRECT-GET ),这是由h:commandButton完成的。

您可以在两种情况下都包含视图参数。这就是它的完成方式:

<html xmlns="http://www.w3.org/1999/xhtml"
    xmlns:h="http://java.sun.com/jsf/html"
    xmlns:ui="http://java.sun.com/jsf/facelets"
    xmlns:f="http://java.sun.com/jsf/core">
<h:head />
<h:body>
    <f:metadata>
        <f:viewParam name="backurl" />
        <f:viewParam name="id" />
    </f:metadata>
    <h:outputText value="backurl value is #{backurl} and id value is #{id}" />
    <br />
    <h:button outcome="index" value="redirect">
        <f:param name="backurl" value="directUrl" />
        <f:param name="id" value="directId" />
    </h:button>
    <h:form>
        <h:commandButton value="action" action="#{bean.redirect}" />
    </h:form>
</h:body>
</html>
@ManagedBean
@RequestScoped
// You could also use @ViewScoped
public class Bean implements Serializable {

    private static final long serialVersionUID = 1L;

    /**
     * Performs a redirection to index destination view with the given params
     * 
     * @return
     */
    public String redirect() {
        return "index?backurl=actionUrl&id=actionId&faces-redirect=true";
    }
}

您会在最初加载页面时看到,backurlid都没有值。

第一个按钮执行具有固定视图参数值的 GET 请求。当视图再次加载时,值已存在。第二个按钮执行相同但使用操作方法。

请注意,在此处使用@RequestScoped@ViewScoped具有相同的效果,因为@RequestScoped不会维护bean的状态,@ViewScoped每次都会破坏它从方法返回String值,每次调用时都会发生这种情况。