-2

当我按下此按钮时,该test()方法无法打印任何值。并且System.out.println(person);总是在中打印空handleCityChange(),并且边框显示为红色,右上角跳出值无效的信息。我该如何解决?谢谢大家。

索引.xhtml

<h:body>
  <h:form>
    <p:fieldset legend="Modify" toggleable="true" toggleSpeed="200" collapsed="true">
       <h:panelGrid columns="2" cellpadding="10" id="modify_change">
          <h:outputLabel value="Department :"/> 
          <p:selectOneMenu id="modify" value="#{modify.department}" style="width: 150px">
             <f:selectItem itemLabel="Choose Department" itemValue=""/>
             <f:selectItems value="#{modify.departments}" />
             <p:ajax update="modify_delete" listener="#{modify.handleCityChange()}" />
          </p:selectOneMenu>
       <h:outputLabel value="Choose Employee" />
          <p:selectOneMenu id="modify_delete" value="#{modify.person}" style="width: 150px">
             <f:selectItem itemLabel="Choose Employee" itemValue=""/>
             <f:selectItems value="#{modify.persons}" />
          </p:selectOneMenu>
       </h:panelGrid>
       <h:commandButton value="Go to Modify !" actionListener="#{modify.test()}"/>
    </p:fieldset>
  </h:form>
</h:body>

Java 代码

@ManagedBean
@SessionScoped
public class modify {

  EntityManagerFactory emf = Persistence.createEntityManagerFactory("com.mycompany_SuneCoolingSystem_war_1.0-SNAPSHOTPU");
  EmployeeJpaController jpaController = new EmployeeJpaController(null, emf);
  EntityManager e = jpaController.getEntityManager();
  private Map<String, String> departments = new HashMap<String, String>();
  private Map<String, String> persons = new HashMap<String, String>();
  private Map<String, Map<String, String>> allocatoin = new HashMap<String, Map<String, String>>();
  private String department;
  private String person;

  public modify() {
    Query q = e.createNamedQuery("Employee.findAll");
    List resultList = q.getResultList();
    for (int i = 0; i < resultList.size(); i++) {
        Employee result = (Employee) resultList.get(i);
        departments.put(result.getDepartment(), result.getDepartment());
    }
    q = e.createNamedQuery("Employee.findByDepartment");
    q.setParameter("department", department);
    resultList = q.getResultList();
  }

  public void handleCityChange() {
    if (department != null && !department.equals("")) {
        Query q = e.createNamedQuery("Employee.findByDepartment");
        q.setParameter("department", department);
        List resultList = q.getResultList();
        persons.clear();
        for (int j = 0; j < resultList.size(); j++) {
            Employee result = (Employee) resultList.get(j);
            persons.put(result.getName(), result.getName());
        }
    } else {
        persons = new HashMap<String, String>();
    }
    System.out.println(departments);
    System.out.println(department);
    System.out.println(persons);
    System.out.println(person);
  }
  public void test() {
    System.out.println(departments);
    System.out.println(department);
    System.out.println(persons);
    System.out.println(person);
  }

         //getter() and setter()
}
4

2 回答 2

0

你做错了几件事:

  1. person 永远不会被设置!. 因此它始终为null,当getPerson()被调用时它会返回null,就这么简单。
  2. 您正在使用SessionScopedbean,我认为您应该使用ViewScopedbean。有关更多解释,请参阅此问题
  3. 您正在使用Map<String, String>应该使用 aList<String>或任何其他Collection. Maps 用于键值对。
  4. 为什么要查询一组Employees 然后遍历它来获取它们的 s Department?为什么不查询Departments 的列表?像select e.department from Employee e什么?
  5. 构造函数的最后一部分无效。TheQuery q不再使用,就像 the 一样resultlist,并且属性department为空。

    q = e.createNamedQuery("Employee.findByDepartment");
    q.setParameter("department", department);
    resultList = q.getResultList();
    
  6. 您在支持 bean 中使用持久性/数据库的东西。这通常是非常糟糕的做法。

于 2012-09-11T14:34:04.597 回答
0

改变(actionListener > action):

<h:commandButton value="Go to Modify !" actionListener="#{modify.test()}"/>

至:

<h:commandButton value="Go to Modify !" action="#{modify.test()}"/>

并将所有投入<h:form></h:form>

问候,

于 2012-09-10T15:54:37.683 回答