如何在h:form submit期间将查询参数附加到POST请求

时间:2013-10-01 13:53:41

标签: jsf primefaces get commandbutton

当我在下面提到的页面中点击<h:form>标签的命令按钮时,我希望在我点击提交按钮后将查询参数作为请求参数发送,因为我的页面网址为../index.xhtml?cid=12&ctype=video

我希望在我的操作方法中应该打印CID=12,但是,它会打印CID=NULL。有什么问题,如何解决?

我的观点:

<h:body id="body">
    <h:form id="form">    
        <p:commandButton action="#{authorizationBean.getParameters()}" value="Ajax Submit" id="ajax" />   
    </h:form> 
</h:body>

我的托管bean:

@ManagedBean
@SessionScoped
public class AuthorizationBean {

    public boolean getParameters(){
        Map<String, String> parameterMap = (Map<String, String>) FacesContext.getCurrentInstance()
                    .getExternalContext().getRequestParameterMap();
        String cid = parameterMap.get("cid");
        System.out.println("CID="+cid);
        return true;
    }

}

2 个答案:

答案 0 :(得分:6)

默认情况下,您的代码(尤其是您的<h:form>标记)会生成以下HTML输出:

<form id="form" name="form" method="post" action="/yourApp/yourPage.xhtml" enctype="application/x-www-form-urlencoded">
    <input type="submit" name="j..." value="Ajax Submit" />
    <input id="javax.faces.ViewState" ... />
</form>

请注意,生成的action元素的<form>是当前视图ID,没有附加任何get参数,尽管初始页面可能已经拥有它们。因此,它们也不会在表单上设置。

要处理这种情况,你可以:

  1. 在初次访问时使用保存这些参数值的@ViewScoped bean;
  2. 在表单中添加一些隐藏的输入字段,以便在表单提交时发送或在<f:param>内嵌套<h:commandButton>;
  3. 使用OmniFaces的<o:form includeViewParams="true">代码(Tag documentation / Showcase example)代替<h:form>,因为它会提交到附加了视图参数的当前网址,前提是它们是使用<f:viewParam>设置(例如,请参阅BalusC对Retain original GET request parameters across postbacks的回答了解详情)。

答案 1 :(得分:1)

这是我的方式,我不能告诉你它是否是最好的方式......

客户端:

<h:outputLink target="_blank" value="detalhepesquisa.jsf">
        <h:outputText value="#{te.empresa.nome}" />
        <f:param name="id" value="#{te.empresa.id}"></f:param>
</h:outputLink>

在你的bean中:

String parametroID = FacesContext.getCurrentInstance().getExternalContext().getRequestParameterMap().get("id");