MyFaces 4.0.2的h:commandScript是否仍可用?参数传递异常求助
<h:commandScript> 参数无法传递到后端Bean的解决方法 我搭建了一个极简测试用例,验证<h:commandScript>是否能将参数传递至后端Bean,结果发现参数无法正常传递。点击页面按钮后,后端的commandScript方法确实被调用了,但requestParameterMap中找不到提交的参数值。触发逻辑是:按钮调用JavaScript函数,再由该函数调用commandScript生成的JS函数。
问题原因
<h:commandScript>生成的JS函数并非直接接收键值对参数,而是要求传入一个配置对象,需要传递的参数必须嵌套在params属性下,否则JSF无法正确解析并传递到后端。
解决步骤
- 调整JS参数传递格式:将参数放入
params属性中传递给commandScript生成的函数 - 添加
render="@none"优化:避免无意义的页面渲染,提升请求效率
修改后的前端代码
<!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xhtml" xmlns:h="jakarta.faces.html" > <h:head> <title>Minimal test</title> </h:head> <h:body> <h:form id="form1"> <h:commandScript id="jsFunction" name="jsFunction" actionListener="#{commandScriptBean.commandScript}" render="@none" /> <script> function testFunction() { console.log("testFunction"); // 正确的参数传递格式:嵌套在params属性中 jsFunction({params: {"test": "value"}}); } </script> This is a form<br/> <h:commandButton id="button" onclick="testFunction(); return false;" value="#{commandScriptBean.buttonName}"/> </h:form> </h:body> </html>
后端Bean优化(可选)
除了通过requestParameterMap获取参数,还可以利用CDI的@RequestParameter注解直接注入参数,代码更简洁:
@Log4j2 @Named @SessionScoped public class CommandScriptBean implements Serializable { @Inject @RequestParameter("test") private String testParam; public String getButtonName() { log.info("getButtonName"); return "button"; } public void commandScript() { log.info("CommandScriptBean"); log.info("Passed value: 'test'='{}'", testParam); } }
内容的提问来源于stack exchange,提问作者Milo van der Zee
相关产品推荐
相关产品推荐

