java primefaces如何从picklist检索更改的值
我已实施以下选择列表:
<p:pickList id="pickList" value="#{reportConfiguratorBean.dualListVars}" var="cRVariable" itemValue="#{cRVariable}" itemLabel="#{cRVariable.varName}" converter="#{cRImageTypeConverter}" immediate="true" rendered="true" >
<f:facet name="sourceCaption">Available Variables</f:facet>
<f:facet name="targetCaption">Associated Variables</f:facet>
</p:pickList>
<f:facet name="footer">
<p:commandButton id='varassociate' action="#{reportConfiguratorBean.setAssocImTypVariables()}" value='Associate' process="@this,pickList" />
</f:facet>
已正确填充选取列表(使用数据库中的getAssocImTypVariables())。但我的问题是我无法捕获用户更改源列表和目标列表时更改的拾取列表值。我尝试使用commandButton方法“setAssocImTypVariables”捕获更改,如下所示:
public void setAssocImTypVariables() {
System.out.println(">>>>>>>>>>>>>>> entered");
List<CRVariable> sourceVariables = this.dualListVars.getSource();
List<CRVariable> targetVariables = this.dualListVars.getTarget();
System.out.println(dualListVars.getSource());
System.out.println(dualListVars.getTarget());
for (CRVariable sourceVariable:sourceVariables) {
System.out.println(">>>>>>>>>>>>> I am a source variable: " + sourceVariable.getVarName());
}
for (CRVariable targetVariable:targetVariables) {
System.out.println(">>>>>>>>>>>>> I am a target variable: " + targetVariable.getVarName());
}
}
例如,如果我有一个初始源=(Obj1,Obj2,Obj3,Obj5,Obj7)和目标=(Obj4,Obj6)的选取列表,我将“Obj1”从一个源移动到另一个目标,但在控制台中我得到:
------输入 [] []
所以我的dualListVars(源和目标)没有填充!我有两个源和目标的空列表
所以我的方法无法感知挑选名单的变化。。。有什么想法吗? 我不熟悉java+primefaces,因此它可能是真正基础的东西:(
我还附加了getAssocImTypesOnLoad()方法:
public void getAssocImTypesOnLoad() {
Long imTypeId = Long.parseLong(virtualId);
List<CRVariable> source;
List<CRVariable> target;
Session session = HibernateUtil.getSessionFactory().openSession();
Transaction tx = null;
try
{
tx = session.beginTransaction();
String hq3 = "select distinct v from CRVariable v join v.crimagetypes t where t.id in (:itid)";
Query query3 = session.createQuery(hq3);
query3.setParameter("itid",imTypeId);
target = query3.list();
String hq4 = "select v FROM CRVariable v WHERE v.id not in (" +
"select distinct v1.id " +
"from CRVariable v1 " +
"join v1.crimagetypes t2 " +
"where t2.id in (:itid))";
Query query4 = session.createQuery(hq4);
query4.setParameter("itid",imTypeId);
source = query4.list();
dualListVars = new DualListModel<CRVariable>(source, target);
tx.commit();
}
catch (Exception e)
{
if (tx != null)
{
e.printStackTrace();
}
}
finally
{
session.close();
}
}
# 1 楼答案
正在运行的选择列表示例 挑选名单。xhtml
菜豆。爪哇
# 2 楼答案
仔细看看primefaces showcase:Primefaces picklist
直接调用
dualListVars
#{reportConfiguratorBean.dualListVars}
解析为reportConfiguratorBean.getDualListVars()
,因为dualListVars是一个属性(例如,一个带有getter和setter的属性)action属性用于业务逻辑。你可以在这里找到源和目标列表。 process属性告诉JSF要处理哪些组件。在本例中,您希望处理组件
picklist
和commandButton
。您还可以使用process="@form"
处理整个表单readMyAssocImTypVariables函数:
无关的: 不要将业务逻辑放入getter/setter中!JSF多次调用它们
# 3 楼答案
为什么在
commandButton
上使用immediate=true
属性根据balusC的一篇文章,如果我没记错的话 check it out here命令按钮上的
immediate=true
应该跳过apply model to values phase
也许这就是为什么你的模型没有更新的原因
(只是通过查看代码进行猜测——我没有复制这个。)