有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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();
    }
}

共 (3) 个答案

  1. # 1 楼答案

    正在运行的选择列表示例 挑选名单。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>   
    

    菜豆。爪哇

    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());
    
    
       }
    
    
    }
    
  2. # 2 楼答案

    仔细看看primefaces showcase:Primefaces picklist

    直接调用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多次调用它们

  3. # 3 楼答案

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

    根据balusC的一篇文章,如果我没记错的话 check it out here命令按钮上的immediate=true应该跳过apply model to values phase

    也许这就是为什么你的模型没有更新的原因

    (只是通过查看代码进行猜测——我没有复制这个。)