如何仅在单击提交按钮时调用表单操作

How to invoke a form action only when clicking the submit button

向页面发送不带任何查询参数的jsf请求时,jsf代码如下:

<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:jsf="http://xmlns.jcp.org/jsf">
    <head>
        <title>Search for Word</title>
    </head>
    <body>
        <div>
            <form method="get" action="#{dictionary.search()}" id="search">
                <input jsf:id="keyword" value="#{dictionary.keyword}" />
            </form>
            <button type="submit" form="search" value="Submit">Submit</button>
        </div>
    </body>
</html>

动作 dictionary.search() 总是被调用,即使没有点击提交按钮。但是,在单击 提交 按钮之前不会调用该操作。

问题:如何更改 jsf 代码 没有任何其他额外的标签库,只有提供的 jsf 选项卡库,即传递元素 以便托管 bean 方法 dictionary.method() 仅在单击 提交 按钮时调用?

首先 - 您的提交按钮必须位于表单标记内。然后尝试在按钮上设置动作,而不是在表单上以避免提交。

希望对您有所帮助。

<body>
    <div>
        <h:form>
            ...
            <h:commandLink action="#{dictionary.search()}" value="Submit" />
        </h:form>
    </div>
</body>

@BalusC 评论我最好的是:

<form method="get" id="search" jsf:action="#{bean.search}" >
    <input jsf:id="keyword" value="#{bean.keyword}" />
    <input type="submit" jsf:action="#{bean.search}" value="SUBMIT"
</form>

但仅将 jsf:action 放在 forminput 这两个标签上是可能让它工作。

也许@BalusC 可以告诉我们正确的方法。

最终我自己找到了答案:

            <form jsf:id="form">
                <input type="text" jsf:value="#{dictionary.keyword}" />
                <button jsf:action="#{dictionary.search}">Search</button>
            </form>

这里的nitty-gritty是h:commandButton

生成的等价组件树

基于 jsf 2.2 教程 8.5 HTML5-Friendly Markup,

To make an element that is not a JavaServer Faces element a pass-through element, specify at least one of its attributes using the http://xmlns.jcp.org/jsf namespace

整个表单必须作为 jsf 组件传递给 jsf<form> 元素必须像这样 <form jsf:id="form">,其中值id 实际上可能是随机的

<input><button> 元素也是如此,至于 <input> 元素,type 属性必须赋值,此处是 text