引入Bootstrap后XHTML页面部分JSF action按钮无法正常触发如何解决?
问题原因与修复方案
两处逻辑核心差异
- 表单包裹缺失:正常工作的新增页面,所有输入组件、
h:commandButton都包裹在<h:form>标签内;故障的删除页面,ID输入框、删除按钮未被<h:form>包裹,JSF的命令组件必须放在表单内才能触发后台动作,这是按钮无响应的核心原因。 - 命名空间不统一:新增页面
f标签的命名空间用的是新版JSF标准地址http://xmlns.jcp.org/jsf/core,删除页面用的是旧版地址http://java.sun.com/jsf/core,高版本JSF容器下会出现监听器、校验器不生效的兼容问题。 - 变量绑定不规范:新增页面的输入值绑定到了托管Bean
product_bean的属性,删除页面的deleteID未明确绑定到托管Bean属性,无对应作用域的情况下提交时无法正确传值。 - 校验逻辑不匹配:ID输入框使用了仅允许字母的校验器
#{inputValidators.OnlyLetter},而产品ID为数字,输入ID时会触发校验失败,JSF流程在校验阶段就会中断,不会执行后续的删除动作,且无全局错误提示的情况下会表现为按钮无响应。
修复步骤
- 给删除页面的ID输入框、删除按钮外层添加
<h:form>包裹,和新增页面结构保持一致:
<h:form> 产品ID号 <h:inputText value="#{products_controller.deleteId}" id="id" required="true" requiredMessage="ID不能为空!" validator="#{inputValidators.OnlyNumber}"/> <h:message for="id" styleClass="error"/> <h:commandButton value="删除" action="#{products_controller.delete(products_controller.deleteId)}"> <f:actionListener binding="#{products_controller.setFactory()}"/> </h:commandButton> </h:form>
- 在
ProductsController类中添加deleteId属性的get/set方法,确保值可以正确绑定传递。 - 将删除页面的
f标签命名空间替换为和新增页一致的http://xmlns.jcp.org/jsf/core,避免兼容问题。 - 替换ID输入框的校验器为数字校验逻辑,或者根据业务需求调整校验规则,避免合法ID被校验拦截。
- 可选优化:修改删除方法的HQL为参数绑定写法,避免SQL注入风险:
@Override public void delete(int id) { Session session = factory.openSession(); session.beginTransaction(); session.createQuery("delete from Product where id=:id") .setParameter("id", id) .executeUpdate(); session.getTransaction().commit(); session.close(); }
内容的提问来源于stack exchange,提问作者Deivid Crathle
相关产品推荐
相关产品推荐

