点击<p:commandLink>页面切换但URL未更新的技术问题咨询
解决PrimeFaces点击搜索按钮后URL不更新的问题
这个问题我之前也碰到过,核心原因是PrimeFaces的<p:commandLink>默认是通过AJAX提交请求的,这种方式下即使服务器端完成了导航,浏览器地址栏也不会跟着更新——因为AJAX是在后台异步处理请求,不会触发浏览器的地址栏刷新。
下面给你两种可行的解决方法:
方法1:关闭commandLink的AJAX功能
直接给<p:commandLink>添加ajax="false"属性,让它发起普通的同步HTTP请求,这样浏览器就会像处理常规页面跳转一样更新地址栏:
<p:commandLink id="btnSearch" action="#{customerRegistrationBean.search()}" ajax="false"> <i class="topbar-icon material-icons"></i> </p:commandLink>
这种方式简单直接,你的search()方法不需要做任何修改,返回原有的导航字符串即可。
方法2:在导航结果中添加重定向参数
如果需要保留AJAX功能(比如页面有其他局部更新需求),可以在search()方法返回的导航字符串末尾加上?faces-redirect=true,触发服务器发送重定向响应,强制浏览器更新地址栏:
public String search() { comesFromTopBar = true; System.out.println("Global search"); CustomerProfileRegistrationModel db = new CustomerProfileRegistrationModel(); System.out.println(this.searchStr); if (searchStr.trim().equals("")) { System.out.println("Wrong input for search."); } else { profiles = db.getCustomersProfiles(this.searchStr); setProfiles(profiles); } // 添加重定向参数 return "CustomerProfileSearchResults?faces-redirect=true"; }
这种方式下,AJAX请求完成后,服务器会告诉浏览器跳转到目标页面,地址栏自然就会更新为目标页面的URL。
补充说明
- 你的
<p:defaultCommand target="btnSearch"/>配置在两种方法下都能正常工作,不会受到影响。 - 如果选择方法1,页面会做完整的刷新;方法2则是先通过AJAX处理业务逻辑,再触发浏览器重定向,体验上更流畅一些,可以根据你的实际需求选择。
内容的提问来源于stack exchange,提问作者sarfaraz ahmed
相关产品推荐
相关产品推荐

