JSF2中如何将xhtml间传递的参数传入对应托管ManagedBean
问题根因
<f:param>仅会在和UICommand类组件(比如p:commandButton)配合使用时,随组件触发的请求提交参数。你直接把它放在<p:dataTable>标签下,页面渲染阶段调用fetchQueryList时,该参数不会被加入当前请求参数Map,所以取值始终为null。- 你当前
fetchQueryList方法定义为void,而<p:dataTable>的value属性需要接收列表类型的返回值用来渲染表格行,当前定义本身就不符合组件要求。 - 你使用了
@SessionScoped作用域的托管Bean,如果多个页面复用这个通用组件,会出现多页面数据冲突的问题。
解决方案(按推荐优先级排序)
方案1:直接传递参数到方法(实现最简单,无额外依赖)
你通过<ui:param>传递的cache变量在genericTag.xhtml的EL上下文中是直接可用的,直接在调用方法时传入即可:
- 修正托管Bean的方法定义,添加入参、调整返回值类型:
@ManagedBean(name = "genericManagedBean") // 建议改为ViewScoped避免多标签页数据冲突 @ViewScoped public class GenericManagedBean implements Serializable { private static final long serialVersionUID = -1L; // 添加入参接收cache值,返回值改为对应的数据列表类型 public List<QueryRow> fetchQueryList(String cacheName) { try { // 直接使用入参即可,无需再从请求参数中读取 System.err.println(cacheName); // 这里写你的数据查询逻辑,返回对应列表 List<QueryRow> result = 你的查询方法(cacheName); System.out.println("fetchQueryList() - ended...."); return result; } catch (Exception e) { Throwable cause = e.getCause(); throw new ELException(cause); } } }
- 修改
genericTag.xhtml中dataTable的value属性,直接传入cache参数,同时删除多余的<f:param>行:
<p:dataTable id="genericId" var="queryRow" value="#{genericManagedBean.fetchQueryList(cache)}" style="margin-bottom:40px" scrollable="true" scrollWidth="100%" scrollHeight="350" rows="10" paginator="true" paginatorTemplate="{Previous} {Next}"> <!-- 其余代码保持不变,删掉<f:param name="cacheName" id="cacheName" value="#{cache}" />这一行 -->
方案2:用@ManagedProperty注入变量
如果后续分页按钮的方法也需要用到cache值,可以直接在托管Bean中注入EL上下文的cache变量:
@ManagedBean(name = "genericManagedBean") // 必须改为ViewScoped/RequestScoped,SessionScoped会导致注入失败、数据混乱 @ViewScoped public class GenericManagedBean implements Serializable { private static final long serialVersionUID = -1L; // 直接注入ui:param传递的cache值 @ManagedProperty("#{cache}") private String cacheName; // 必须提供setter方法,注入才能生效 public void setCacheName(String cacheName) { this.cacheName = cacheName; } public List<QueryRow> fetchQueryList() { try { // 直接使用注入的cacheName即可 System.err.println(cacheName); // 其余逻辑不变 } catch (Exception e) { Throwable cause = e.getCause(); throw new ELException(cause); } } }
内容的提问来源于stack exchange,提问作者Jerry
相关产品推荐
相关产品推荐

