【问题标题】:primefaces how to retrieve changed values from picklistprimefaces如何从选择列表中检索更改的值
【发布时间】:2012-11-22 14:46:07
【问题描述】:

我已经实现了以下选择列表:

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

【问题讨论】:

标签: java jsf primefaces


【解决方案1】:

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

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

也许这就是你的模型没有更新的原因?

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

【讨论】:

  • 如果我尝试删除 immediate="true",那么如果我调用“#{reportConfiguratorBean.readMyAssocImTypVariables}”,我的整个 portlet 就会崩溃。
  • 我的日志中唯一的信息是:org.apache.catalina.core.ApplicationDispatcher 调用严重:Servlet.service() for servlet ImageViewer Servlet throw exception javax.portlet.faces.BridgeException :javax.faces.FacesException:javax.el.PropertyNotWritableException:/views/report-configurator.xhtml @269,45 value="#{reportConfiguratorBean.getAssocImTypVariables()}":集合操作的非法语法----
  • 这些消息与picklist value="#{reportConfiguratorBean.getAssocImTypVariables()}" 方法相关,但是可以工作!
  • 我已经更新了我的初始帖子并添加了 getAssocImTypVariables()
  • 对于PropertyNotWritableException:您的reportConfiguratorBean 上有assocImTypVariables 属性吗?您不需要显式调用getset 方法。只需写value="#{reportConfiguratorBean.assocImTypVariables}"。很难遵循代码中的所有内容。您应该尝试简化问题,并为这个问题创建一个小示例。这将帮助您自己追踪它,并使 stackoverflow 上的每个人都更容易跟踪问题并为您提供帮助。
【解决方案2】:

仔细查看 primefaces 展示: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 多次调用它们。

【讨论】:

  • 问题是当我用“ 调用选择列表时,源值和目标值没有被填充(他们应该!) ... dualListModel 作为属性存在,在 backbean 中有 getter + setter
  • nope... reportConfiguratorBean.readMyAssocImTypVariables 无法从选项列表中检索 ALTERED 值...它检索初始选项列表值(在将初始源值添加到目标之前)...
  • 就像 Jens 所暗示的那样,直接属性可能是问题所在。
  • 将 @PostConstruct 添加到您的 getAssocImTypVariables 函数。并在选择列表中调用 value="#{reportConfiguratorBean.dualListVars}"。
  • 已添加,但如果我这样称呼它,我的选择列表仍然是空的:alue="#{reportConfiguratorBean.dualListVars}"
【解决方案3】:

一个正在运行的选项列表示例 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());


   }


}

【讨论】:

  • 这个例子是怎么回答的?在Primefaces Showcase 上也可以找到一个正在运行的选项列表示例。试着回答这个问题。
猜你喜欢
  • 1970-01-01
  • 2019-11-03
  • 1970-01-01
  • 2012-12-09
  • 1970-01-01
  • 1970-01-01
  • 2023-03-17
  • 1970-01-01
相关资源
最近更新 更多