我遇到一个使用Primefaces dataTable的问题,即jsf将调用我的托管bean init(),它将从数据库进行搜索。
在我的jsf中,用户可以执行另一个在String中传递参数的搜索。
<p:commandButton id="btnChild" type="Submit" icon="ui-icon-plus" styleClass="action-buttons" value="Child" update=":frmSysMenu:messages dtSysMenu" ajax="false" action="#{Controller.doParent('C')}" process="dtSysMenu" />
我的托管bean能够执行 doParent(String)并再次返回搜索屏幕但是一旦我的屏幕加载,它将调用 init()哪个:
@PostConstruct
@Override
public void init(){
try {
doSearch(nodeValue,"root");
setParentNode(nodeValue);
} catch (Exception e) {
addErrorMessage(e.getMessage());
e.printStackTrace();
Messages.addGlobalError(e.getMessage());
LOG.error(e.toString(), e);
}
}
它将返回第一个查询。 还有其他方法吗?
RequestScoped有帮助吗?
答案 0 :(得分:0)
从规格(或其他地方,OP没有提到它)
<强> @ViewScoped 强>
只要您在浏览器窗口/选项卡中与相同的JSF视图进行交互,此范围内的bean就会存在。它得到了 在HTTP请求中创建,并在回发到a后被销毁 不同的看法。它不会立即被破坏 通过GET请求离开/关闭视图,但是无法访问它 通常的方式。 JSF将bean存储在UIViewRoot#getViewMap()中 将托管bean名称作为键,然后将其存储在 会话。 您需要从操作(侦听器)返回null或void 保持bean活着的方法。将此范围用于更复杂的表单 它使用ajax,数据表和/或几个渲染/禁用 需要在后续请求中保留其状态的属性 在同一浏览器窗口/标签(视图)中。
在函数中我只是改为void而jsf不再调用init()。