繁体   English   中英

primefaces如何从选择列表中检索更改的值

[英]primefaces how to retrieve changed values from 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());
    }       
    }

因此,例如,如果我有一个INITIAL源=(Obj1,Obj2,Obj3,Obj5,Obj7)的选择列表,而目标=(Obj4,Obj6),则在控制台中将“ Obj1”从源移动到目标BUT上,我得到:

---------输入了[] []

因此,我的dualListVars(源和目标)未填充! 我有两个空的来源和目标清单...

所以我的方法无法感知选择列表的更改...有什么想法吗? 我是java + primeface的新手,所以它可能是真正的基础:(

我还附加了方法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();
    }
}

仔细看一下primefaces展示柜: Primefaces选择列表

直接调用dualListVars #{reportConfiguratorBean.dualListVars}解析为reportConfiguratorBean.getDualListVars()因为dualListVars是属性(例如,具有getter和setter的属性)。

<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> 

action属性用于业务逻辑。 您可以在此处捕获源和目标列表。 process属性告诉JSF要处理哪些组件。 在您的情况下,您希望处理组件picklistcommandButton 您也可以使用process="@form"处理整个表单。

<p:commandButton id='varassociate' action="#{reportConfiguratorBean.readMyAssocImTypVariables}" value='Associate' ajax='false' process="@this,pickList" immediate="true" />

readMyAssocImTypVariables函数:

 public void readMyAssocImTypVariables() {      
    List<CRVariable> sourceVariables = this.dualListVars.getSource();
    List<CRVariable> targetVariables = this.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());
     }       
  }

无关的 :不要将业务逻辑放入getter / setter中! JSF将它们多次调用。

为什么在commandButton上使用commandButton immediate=true属性?

如果我没记错的话,根据balusC上的一篇文章在此处 检查出来,在 commandButton上的Instant immediate=true应该跳过apply model to values phase

也许这就是原因,为什么您的模型未更新?

(只是通过查看代码来猜测-我没有重现此内容。)

运行中的选择列表示例picklist.xhtml

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" 
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:f="http://java.sun.com/jsf/core"
xmlns:p="http://primefaces.org/ui"
xmlns:ui="http://java.sun.com/jsf/facelets">


<h:head></h:head>

<h:body>
<h:form>
    <h3>Basic PickList</h3>
    <p:pickList value="#{pickListBean.cities}" var="city"
        itemLabel="#{city}" itemValue="#{city}" />
<p:commandButton  value="Submit" action="#{pickListBean.displayList}" />    


</h:form>

</h:body>
</html>   

PickListBean.java

import java.util.ArrayList;
import java.util.List;

import javax.faces.bean.ManagedBean;
import org.primefaces.model.DualListModel;

@ManagedBean
public class PickListBean {

   private DualListModel<String> cities;

   public PickListBean() {

  //Cities
  List<String> citiesSource = new ArrayList<String>();
  List<String> citiesTarget = new ArrayList<String>();

  citiesSource.add("Istanbul");
  citiesSource.add("Ankara");
  citiesSource.add("Izmir");
  citiesSource.add("Antalya");
  citiesSource.add("Bursa");
//  citiesTarget.add("T1");


  cities = new DualListModel<String>(citiesSource, citiesTarget);
   }

   public DualListModel<String> getCities() {
      return cities;
   }
   public void setCities(DualListModel<String> cities) {
      this.cities = cities;
   }
   public void displayList(){

     System.out.println("values in list are" +cities.getTarget());


   }


}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM