【问题标题】:PrimeFaces 3.2 selsectOneMenu valueChangeListener not workingPrimeFaces 3.2 selsectOneMenu valueChangeListener 不起作用
【发布时间】:2012-05-28 06:15:38
【问题描述】:

我希望根据下拉列表项的选择来检索列表。为此,我正在使用以下不起作用的代码:

<p:selectOneMenu style="width: 150px" value="#{watchBean.exchange}">
                <f:selectItem itemLabel="NSE" itemValue="nse"/>
                <f:selectItem itemLabel="BSE" itemValue="bse"/>            
                <p:ajax event="change" update=":frm" listener="#{watchBean.doScripList}" />
            </p:selectOneMenu> 

豆码:

    public void doScripList(ValueChangeEvent e)
{

    sl=getAllScripByExchange((String)e.getNewValue());  //sl is of type List<MasterScrip>
}

当我调试时,我看到事件没有被触发并且我得到以下错误:

javax.el.MethodNotFoundException: Method not found: beans.watchBean@9ac2e4.doScripList(javax.faces.event.AjaxBehaviorEvent)
at com.sun.el.util.ReflectionUtil.getMethod(ReflectionUtil.java:155)...

当我省略 p:ajax 时,'exchange' 类型也不是 get/set 是什么导致了这个问题?它的解决方案是什么?

已编辑 将方法重命名为 wow() 仍然是同样的错误:

 javax.el.MethodNotFoundException: Method not found: beans.watchBean@1732d83.wow(javax.faces.event.AjaxBehaviorEvent)

已编辑:托管 bean 代码

 import java.util.List;
import javax.inject.Named;
import javax.enterprise.context.RequestScoped;
import javax.faces.context.FacesContext;
import javax.faces.event.ValueChangeEvent;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;
import javax.xml.ws.WebServiceRef;
import service.MasterScrip;
import service.StatelessWebService_Service;
@Named(value = "watchBean")
@RequestScoped
public class watchBean {
    @WebServiceRef(wsdlLocation = "WEB-INF/wsdl/localhost_8080/StatelessWebService/StatelessWebService.wsdl")
    private StatelessWebService_Service service;

    /** Creates a new instance of watchBean */
    public watchBean() {
    }
    String uname,scripSym,exchange;
    Integer scripID;
    List<UserTrack> ut;
List<MasterScrip> sl;
    public List<MasterScrip> getSl() {
        return sl;
    }

    public void setSl(List<MasterScrip> sl) {
        this.sl = sl;
    }


    public String getExchange() {
        return exchange;
    }

    public void setExchange(String exchange) {
        sl=getAllScripByExchange(exchange);
        this.exchange = exchange;
    }
public void wow(ValueChangeEvent e)
{    
    sl=getAllScripByExchange((String)e.getNewValue());
   // setSl(sl);
    //FacesContext.getCurrentInstance().renderResponse();

    // sl=getAllScripByExchange(exchange);
}

【问题讨论】:

  • 进行完整性检查:尝试将您的doScripList 重命名为wow 并尝试使用&lt;p:ajax listener="#{watchBean.wow}"...。(重新启动您的网络服务器...)
  • 您可以看到@Sai Ye Yan Naing Aye 下面给出的答案,它说它是 primefaces 3.2 中的一个错误。是真的吗?还是我应该选择你的解决方案?
  • 如果没有打开问题的链接,我不会指望“它是一个错误”+他给出的解决方案来自 JSF 1...
  • 将方法重命名为 wow() 还是一样的错误:javax.el.MethodNotFoundException: Method not found: beans.watchBean@1732d83.wow(javax.faces.event.AjaxBehaviorEvent)
  • 检查你的进口,像这样的东西? import javax.faces.bean.ManagedBean; import javax.faces.bean.SessionScoped;

标签: java jakarta-ee primefaces


【解决方案1】:

尝试改变

<p:ajax event="change" update=":frm" listener="#{watchBean.doScripList}" />

<p:ajax event="change" update=":frm" listener="#{watchBean.doScripList()}" />

在方法末尾添加括号。

JSF 正在您的支持 bean 中寻找方法 setDoScripList,但在末尾添加括号时,您将显式调用此方法 doScripList

【讨论】:

    【解决方案2】:

    遇到了和你一样的问题,但我发现 valueChangeListener

    public void doScripList(ValueChangeEvent e)
    

    仅在您使用&lt;f:ajax&gt; 标签时有效,而在您使用&lt;p:ajax&gt; 时无效。 但是由于 selectOneMenu 的类型是 &lt;p:selectOneMenu&gt;,所以 &lt;f:ajax&gt; 不起作用。

    我通过删除参数ValueChangeEvent e 进行了计算,并且成功了。 所以在&lt;p:ajax&gt;标签的情况下尝试一个无参数的监听器。

    public void doScripList()
    {
        sl=getAllScripByExchange(getExchangeName());
    }
    

    注意:这里你没有事件参数,所以它通过调用各自的setter方法来设置新的值,你可以在监听器中访问更新的值。 对于这种情况,您还需要像这样向 selectOneMenu 提供 id:

    <p:selectOneMenu id="exchangeName" style="width: 150px" value="#{watchBean.exchange}">
      ...
    </p:selectOneMenu>
    

    然后在 Bean 类中为 exchangeName 添加 get 和 set 方法:

    private String exchangeName;
    
    public String getExchangeName(){
       return exchangeName;
    }
    
    public void setExchangeName(String exchangeName) {
        this.exchangeName = exchangeName;
    }
    

    【讨论】:

      【解决方案3】:

      这是primefaces 3.2的错误,请将您的代码替换为如下。

        <h:selectOneMenu style="width: 150px" value="#{watchBean.exchange}" valueChangeListener="#{watchBean.doScripList}" onchange="submit()">
             <f:selectItem itemLabel="NSE" itemValue="nse"/>
             <f:selectItem itemLabel="BSE" itemValue="bse"/>            
         </h:selectOneMenu> 
      

      在这里改变你喜欢的方法;

        public void doScripList(ValueChangeEvent e){
           sl = getAllScripByExchange((String)e.getNewValue());
           setAllScriptExchange(sl);  //please write setAllScriptExchange method yourself
           FacesContext.getCurrentInstance().renderResponse();
        }
      

      由于 onchange 事件,您的页面被重新加载。

      【讨论】:

      • 这样做了,现在方法被调用了,但是页面被重新加载了我不知道为什么,并且列表变量再次设置为null
      • 我正在根据您的解决方案处理级联 droprown n,第二个下拉列表的填充意味着列表再次设置为 null 我猜,该怎么办?
      • 您的意思是 sl 是 List 的一种类型,所以请将 sl 更改为 String 数据类型。 selectOneMenu 一次只接受一个值。我的意思是“String sl = getAllScriptByExchange((String)e.getNewValue())”请试试这个。
      猜你喜欢
      • 2013-05-02
      • 1970-01-01
      • 2012-07-25
      • 1970-01-01
      • 2014-04-19
      • 2023-03-25
      • 1970-01-01
      • 1970-01-01
      • 2011-11-11
      相关资源
      最近更新 更多