2016-11-12 55 views
1

这是我使用spring-mvc实现的。正如我所观察到的resultSetChildNameAccess.java中正常工作。当我在这里打印声明时,它会打印出我真正需要的选项。但下拉框重复结果集对象中的一个结果。任何人都可以跟踪这个并告诉我我的jsp有什么问题吗?下拉选项菜单重复相同的选项

controller.java

@RequestMapping(value="/my_children", method = RequestMethod.GET) 
public void viewMyChild(Model model) { 
    ChildNameAccess childNameDAO = new ChildNameAccess(); 

    try{ 
     java.util.List<Child> children = childNameDAO.getChildDataByMotherId("M-2"); 
     model.addAttribute("children",children); 

     System.out.println(children); 
    } 
    catch (SQLException e) { 
     e.printStackTrace(); 
    } 

} 

my_children.jsp

<div class="container-fluid bg-2 text-center"> 
<form:form method="get" > 
    <div class="div_box"> 
     <select> 
      <option value="top" >Select child</option> 
       <c:forEach items="${children}" var="children"> 
        <option value="" >${children.firstName} ${children.lastName}</option> 
       </c:forEach> 
     </select> 
      <br> 

    <div align ="justify"> 
     <button type="button" onclick="location.href='/web/mother/my_child_details'" class="btn btn-success active">View Details</button> 
    </div> 
     </div> 
</form:form> 

ChildNameAccess.java

package com.emidwife.web.models.dataAccess; 

import java.sql.ResultSet; 
import java.sql.SQLException; 
import java.util.List; 
import java.util.ArrayList; 

import com.emidwife.web.models.entities.Child; 
import com.emidwife.web.models.utilities.Database; 


public class ChildNameAccess { 
private Database connection = new Database(); 
Child child = new Child(); 

public List<Child> getChildDataByMotherId(String motherID) throws SQLException { 

    connection.openConnection(); 

    List<Child> children = new ArrayList<Child>(); 
    try{ 
     ResultSet resultSet = connection.getData("SELECT * FROM childdetails WHERE MotherID=\'" + motherID + "\'"); 
      while(resultSet.next()){ 
       System.out.println(resultSet.getString("FirstName")); 
      child.setChildId(resultSet.getString("ChildID"));//database column -->ChildID 
      child.setMotherId(resultSet.getString("MotherID")); 
      child.setFirstName(resultSet.getString("FirstName")); 
      child.setLastName(resultSet.getString("LastName")); 
      System.out.println(children); 
      children.add(child); 
      System.out.println(children); 
     } 
    } 
    catch (SQLException e) { 
     e.printStackTrace(); 
    } 
    finally{ 
     connection.closeConnection(); 
    } 

    return children; 
} 

}

+0

请提供您的数据库值 – ScanQR

+0

我该怎么办?只是在这里提到? – Hash

+0

我将需要什么是您执行查询时得到的结果集。另外为什么你的控制器方法是无效的它应该返回更新的模型对象,而不是使用现有的模型。 – ScanQR

回答

1

在你ChildNameAccess.java孩子以外的resultSet迭代定义,尝试创建新的子对象的循环中每次循环的时间。因为在Java中字符串是不可变的,而且你实际上不能改变字符串的值。意思是当你做child.setFirstName(resultSet.getString("FirstName")); 像明智的原始值的firstName字符串仍然在内存中,其他指向它的变量没有改变。

while(resultSet.next()){ 
        Child child = new Child(); 
        child.setChildId(resultSet.getString("ChildID"));//database column -->ChildID 
        child.setMotherId(resultSet.getString("MotherID")); 
        child.setFirstName(resultSet.getString("FirstName")); 
        System.out.println(resultSet.getString("FirstName")); 
        child.setLastName(resultSet.getString("LastName")); 

        children.add(child); 
      } 
+0

谢谢我没有得到迄今为止发生的事情。你的解释清楚。 – Hash

1

您需要为每个结果集行创建子对象。你不是在创造它。我已经修复它如下。

package com.emidwife.web.models.dataAccess; 

import java.sql.ResultSet; 
import java.sql.SQLException; 
import java.util.List; 
import java.util.ArrayList; 

import com.emidwife.web.models.entities.Child; 
import com.emidwife.web.models.utilities.Database; 


public class ChildNameAccess { 
private Database connection = new Database(); 
    Child child = null; 

public List<Child> getChildDataByMotherId(String motherID) throws SQLException { 

connection.openConnection(); 

List<Child> children = new ArrayList<Child>(); 
try{ 
    ResultSet resultSet = connection.getData("SELECT * FROM childdetails WHERE MotherID=\'" + motherID + "\'"); 
     while(resultSet.next()){ 
      child = new Child(); 
      System.out.println(resultSet.getString("FirstName")); 
     child.setChildId(resultSet.getString("ChildID"));//database column -->ChildID 
     child.setMotherId(resultSet.getString("MotherID")); 
     child.setFirstName(resultSet.getString("FirstName")); 
     child.setLastName(resultSet.getString("LastName")); 
     System.out.println(children); 
     children.add(child); 
     System.out.println(children); 
    } 
} 
catch (SQLException e) { 
    e.printStackTrace(); 
} 
finally{ 
    connection.closeConnection(); 
} 

return children; 
}} 
+0

是的,它的工作!但它重复两次相同的名称。这意味着它重复两次不同的名称(4个选项而不是两个) – Hash

+1

这可能是因为您没有将新模型对象传递给客户端视图。您可以使用控制器方法更新现有模型。 – ScanQR