如何修改JSF代码使Managed Bean方法仅在点击提交按钮时触发
解决JSF GET表单自动触发方法的问题
哦,这个坑我之前踩过!你现在的代码里,dictionary.search()会自动执行,是因为你把方法表达式直接写在了GET表单的action属性里。JSF处理GET请求时,会把表单action里的方法表达式当成页面加载时就要执行的逻辑,不管用户有没有点击提交按钮——这完全不符合咱们的预期。
修改后的代码
<html xmlns="http://www.w3.org/1999/xhtml" xmlns:jsf="http://xmlns.jcp.org/jsf"> <head> <title>Search for Word</title> </head> <body> <div> <!-- 表单action指向当前页面,避免加载时触发方法 --> <form method="get" action="#{request.requestURI}" id="search"> <input jsf:id="keyword" value="#{dictionary.keyword}" /> <!-- 把方法绑定到提交按钮上,只有点击才触发 --> <button type="submit" form="search" jsf:action="#{dictionary.search()}">Submit</button> </form> </div> </body> </html>
关键改动说明
- 调整表单的
action:把原来的#{dictionary.search()}换成#{request.requestURI},让表单提交时指向当前页面,这样页面初始化的GET请求就不会触发方法了。 - 绑定方法到按钮:把
#{dictionary.search()}移到提交按钮的jsf:action属性上,这样只有当用户点击按钮提交表单时,JSF才会调用这个方法。
另外提一句,因为你用的是GET方法,提交后搜索关键词会出现在URL里,这很符合搜索表单的常规行为。如果之后需要改成POST,只需要把表单的method改成post就行,逻辑是一样的。还有记得确保你的dictionary Managed Bean用的是合适的作用域(比如@RequestScoped),避免出现奇怪的状态问题。
内容的提问来源于stack exchange,提问作者Rui
相关产品推荐
相关产品推荐

