JSF Primefaces:如何在focus事件触发时修改输入框的值
问题根因
<p:ajax>默认未指定更新目标,后端修改folioExam属性后不会自动同步到前端输入框- 仅触发监听器执行后端逻辑不会自动触发前端组件重渲染,必须显式指定需要更新的组件
修复方案
方案1:添加update属性(优先推荐)
在<p:ajax>标签中新增update属性,指定要更新的输入框id即可,修改后的前端代码如下:
<dcisc:textfield id="folioExam" autocomplete="off" value="#{customerInfo.folioExam}" editable="true" mandatory="NON_MANDATORY"> <p:ajax event="inputFocus" listener="#{customerInfo.unMaskFolioExam}" update="folioExam" /> </dcisc:textfield>
该方案逻辑最轻量,ajax请求完成后会自动刷新对应组件,同步后端最新值到输入框。
方案2:后端手动触发组件更新
如果自定义组件对update属性兼容不好,可以在后端监听器中手动调用API触发组件更新,代码如下:
// 引入对应包:PrimeFaces 6.x及以下用org.primefaces.context.RequestContext,10.x及以上用org.primefaces.PrimeFaces public void unMaskFolioExam(){ // 原有解密/处理逻辑 folioExam = unmaskedValue; // PrimeFaces 10+写法 PrimeFaces.current().ajax().update("folioExam"); // 低版本写法 // RequestContext.getCurrentInstance().update("folioExam"); }
异常排查
如果修改后仍未生效,可按以下顺序排查:
- 确认组件事件命名是否正确,部分组件的焦点事件命名为
focus而非inputFocus,可替换event属性值测试 - 确认
customerInfo类中folioExam属性存在完整的get、set方法 - 确认你使用的PrimeFaces版本和自定义组件的ajax事件支持规则
内容的提问来源于stack exchange,提问作者Luis Enrique
相关产品推荐
相关产品推荐

