使用 GET 提交 JSF 表单

Posted

技术标签:

【中文标题】使用 GET 提交 JSF 表单【英文标题】:Submit a JSF form using GET 【发布时间】:2011-06-16 22:20:09 【问题描述】:

如何将表单提交到同一页面并使用 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&item2=bar,它将填充文本字段,但提交给自身的表单似乎不起作用。

【问题讨论】:

【参考方案1】:

&lt;h:button&gt; 替换为

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

它有效地触发了一个 PRG(Post-Redirect-Get),它将在查询字符串中包含 &lt;f:viewParam&gt; 参数。注意应该是目标页面必须具有完全相同的&lt;f:viewParam&gt;

另一种解决方案是使用纯 html &lt;form&gt; 而不是 &lt;h:form&gt;,为输入元素提供与参数名称匹配的 id,并使用纯 &lt;input type="submit"&gt;。当然你也可以在这里使用纯 HTML &lt;input type="text"&gt;

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

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

您仍应在两侧保留&lt;f:viewParam&gt;。您只需要意识到这种形式无法进行转换/验证,必须通过目标页面上的&lt;f:viewParam&gt;进行。

另见:

What can <f:metadata>, <f:viewParam> and <f:viewAction> be used for?

【讨论】:

【参考方案2】:

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

【讨论】:

以上是关于使用 GET 提交 JSF 表单的主要内容,如果未能解决你的问题,请参考以下文章

JSF 2.0;我的脸;仅使用 POST 提交表单

JSF 2.2 多部分表单未提交[重复]

会话到期时的授权重定向不适用于提交 JSF 表单,页面保持不变

JSF PrimeFaces overlayPanel 提交值

用于防止双重提交的纯 Java/JSF 实现

使用 Java 提交表单