【问题标题】:CommandButton lose action when I use the PickList当我使用 PickList 时,CommandButton 失去动作
【发布时间】:2014-04-02 04:57:59
【问题描述】:

我遇到了一个奇怪的问题。我正在使用选项列表组件,但是当我使用选项列表时,我的命令按钮似乎停止工作:代码如下:

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://xmlns.jcp.org/jsf/html"
  xmlns:p="http://primefaces.org/ui">
<h:head>
    <title>PickList Test</title>
</h:head>
<h:body>
            <h:form id="form">
                     <p:pickList value="#{pickListBean.employeeList}" var="employee" itemLabel="#{employee.employeeName}" itemValue="#{employee.employeeCode}" />  
                     <p:commandButton value="Save" action="#{pickListBean.message}" style="margin-left: 12px;"/>
            </h:form>


</h:body>
</html>

@ManagedBean
@RequestScoped
public class PickListBean {
@EJB
private BussinessList bl = new BussinessList();
private DualListModel<Employee> employeeList;

private Employee employee;
/**
 * Creates a new instance of PickListBean
 */
public PickListBean() {
    List<Employee> source = new ArrayList<Employee>();
    List<Employee> target = new ArrayList<Employee>();
    source = bl.getEmployee();
    employeeList = new DualListModel<Employee>(source, target);
}
public void message(){
    System.out.println("CommandButton is working");
}
public DualListModel<Employee> getEmployeeList() {
    return employeeList;
}

public void setEmployeeList(DualListModel<Employee> employeeList) {
    this.employeeList = employeeList;
}
public Employee getEmployee() {
    return employee;
}

public void setEmployee(Employee employee) {
    this.employee= employee;
}
}

当我单击命令按钮时,不会调用消息方法,但是当我从 xhtml 中删除选择列表时,命令按钮会调用消息方法。

我正在使用 jsf 2.2,primefaces 4.0...

【问题讨论】:

  • 在浏览器的 javascript 控制台中查看 js 错误
  • Kolossus,javascript 控制台没有显示任何错误...

标签: java jsf jsf-2 primefaces


【解决方案1】:

这段代码有很多错误

在从错误开始之前,我可以在名为 getEmployeePickList 的方法中看到 2 个非常糟糕的命名选择

  • 首先它不是一个 PickList。它是一个数据列表
  • 与 EmployeeList 的不同之处在于它保留了 Employee 的实例而不是 Functionario。您选择的名称给人的印象是其中一个是 PickList,而另一个是 ArrayList,并且它们保留相同类的实例

现在,您的 xhtml 可能在声明中缺少某些内容。我试过你的代码,即使我删除了pickList,你的命令按钮也不会触发。尝试从这里开始(删除 xml 声明)

<!DOCTYPE html PUBLIC "-W3CDTD XHTML 1.0 TransitionalEN" "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:ui="http://java.sun.com/jsf/facelets"
    xmlns:p="http://primefaces.org/ui">

此外,Employee 类不是字符串,因此如果没有 converter,您的 pickList 将无法工作。看到这个example

最后,您的 PickList 将在您的类中搜索 setEmployeePickList() 方法。我尝试使用您的 pickList 与 String 而不是 Employee 一起使用,以解决转换器问题,很自然地,我得到了这个错误:

javax.el.PropertyNotFoundException: test.xhtml @21,140 value="#{pickListBean.employeePickList}": Property 'employeePickList' not writable on type org.primefaces.model.DualListModel

解决方案是,用#{pickListBean.employeeList} 而不是#{pickListBean.employeePickList} 提供pickList。您可以在其他地方填充您的员工列表,例如在 PickListBean 构造函数中,而不是在 getEmployeePickList 中重新创建。

【讨论】:

  • yannicular,我用另一种语言(葡萄牙语)编写代码并将代码翻译成英文,抱歉错误...我已经编辑了代码...
  • 好的,那么你的问题仍然是没有setter方法。当您使用'value="#{pickListBean.employeePickList}"'时,pickList 组件将查找名为'setEmployeePickList( DualListModel list)'的方法
  • yannicular,选项列表工作正常,选项列表中没有问题。问题出在按钮上,当我点击按钮时,没有调用消息方法
  • 如果你尝试
  • 与 PickList 交互时是否有任何错误消息?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-10-04
  • 2011-07-16
  • 1970-01-01
相关资源
最近更新 更多