使用GET提交JSF表单

时间:2011-01-27 23:33:59

标签: forms jsf jsf-2 http-get viewparams

如何将表单提交到同一页面并使用GET参数?

JSF页面内容:

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

...

<h:form>
  <h:inputText value="#{bean.item1}"/>
  <h:inputText value="#{bean.item2}"/>

  <h:button value="Submit" >
      <f:param name="item1" value="#{bean.item1}"/>
      <f:param name="item2" value="#{bean.item2}"/>
  </h:button>
</h:form>

如果我请求页面:form.jsf?item1 = foo&amp; item2 = bar,它将填充文本字段,但表单提交到自身似乎不起作用。

2 个答案:

答案 0 :(得分:14)

<h:button>替换为

<h:commandButton value="Submit" action="form?faces-redirect=true&amp;includeViewParams=true"/>

它有效地触发PRG(Post-Redirect-Get),它将在查询字符串中包含<f:viewParam>参数。注意到目标页面必须具有完全相同的<f:viewParam>

另一个解决方案是使用纯HTML <form>而不是<h:form>,为输入元素提供与参数名称匹配的id并使用普通<input type="submit">。您当然也可以在这里使用纯HTML <input type="text">

<form>
    <h:inputText id="item1" value="#{bean.item1}"/>
    <h:inputText id="item2" value="#{bean.item2}"/>

    <input type="submit" value="Submit" />
</form>

你仍然应该保持<f:viewParam>双方。您只需要意识到转换/验证无法以此形式完成,必须通过目标页面上的<f:viewParam>执行。

另见:

答案 1 :(得分:0)

您还可以注册处理“self”之类关键字的NavigationHandler,并重定向到当前视图并添加必要的查询参数。