将 Arraylist 从 Servlet 返回到 DAO,然后返回到 Servlet,然后返回到 Jsp

Posted

技术标签:

【中文标题】将 Arraylist 从 Servlet 返回到 DAO,然后返回到 Servlet,然后返回到 Jsp【英文标题】:Return Arraylist from Servlet to DAO back to Servlet then to Jsp 【发布时间】:2014-01-11 10:11:12 【问题描述】:

我的目标是要求用户输入一个日期,我的应用程序将检索该日期的所有数据并显示在 jsp 的表格中。

此时,arraylist 返回为 null,因此将进入错误页面。 但是在我的数据库中,有。

我们将不胜感激。 :)

以下是我的代码..

search.jsp

<form method="post" action="SearchServlet">
Date:<input name="rdate">
<input type="submit" value="Search">
</form>

SearchServlet

protected void doPost(HttpServletRequest request, HttpServletResponse response) throws   ServletException, IOException 
String rdate = request.getParameter("rdate");
PersonBean pb = new PersonBean();
pb.setDate(rdate);
PersonDAO pd = new PersonDAO();

ArrayList personarraylist = pd.getDatePerson(pb);
System.out.println(personarraylist);
if (personarraylist.isEmpty() == true) 
response.sendRedirect("error.jsp");
 else 
request.setAttribute("person", rd.getDatePerson(pb));
RequestDispatcher view = request.getRequestDispatcher("success.jsp");
view.forward(request, response);


PersonDAO

public ArrayList getDatePerson(PersonBean pb) 

ArrayList<PersonBean> listdateperson = new ArrayList<PersonBean>();
String rdate = pb.getDate();
System.out.print(rdate);

int pendingcount = 0;

try 
currentCon = ConnectionManager.getConnection();
Statement statement = currentCon.createStatement();
String count = "SELECT COUNT(*) FROM person where date='" + rdate + "'";

PreparedStatement countstmt = currentCon.prepareStatement(count);
ResultSet countrs = countstmt.executeQuery();

while (countrs.next()) 
pendingcount = countrs.getInt(1);
System.out.print(pendingcount);


if (pendingcount == 0) 
PersonBean pbb = null;
pbb.setDate("0");
listdateperson.add(pbb);


else 

ResultSet rs = statement.executeQuery("SELECT name, date FROM person WHERE date='" + rdate + "'");
PersonBean pbbb = null;

while (rs.next()) 
PersonBean = new PersonBean();
pbbb.setName(rs.getString("name"));
pbbb.setDate(rs.getString("date"));




 catch (Exception asd) 
System.out.println(asd.getMessage());

return listdateperson;

【问题讨论】:

你试过调试吗? 【参考方案1】:

1) PersonDAO 中的代码 if 抛出 NullPointerException

if (pendingcount == 0) 
 PersonBean pbb = null;  //assign null reference
 pbb.setDate("0");  //setting value to null reference throws NPE
 listdateperson.add(pbb);

2) 缺少分配对象引用

PersonBean pbbb = null; 
while (rs.next()) 
 PersonBean = new PersonBean(); //how can you assign object reference to class PersonBean?

应该是

pbbb = new PersonBean();

你正在使用 PreparedStatement,然后使用占位符(?) 将参数传递给查询,这将Prevent SQL injection

另见

PreparedStatement java docs

【讨论】:

【参考方案2】:

因为pendingcount != 0时你没有在while循环中将pbbb添加到数组列表中

【讨论】:

以上是关于将 Arraylist 从 Servlet 返回到 DAO,然后返回到 Servlet,然后返回到 Jsp的主要内容,如果未能解决你的问题,请参考以下文章

如何将两个不同的 ArrayList 从 Servlet 发送到 JSP

如何将 ArrayList 从 Java 类传递给 jsp

Servlet ArrayList 到 JSP(从 Object 到 ArrayList 的未经检查的强制转换)

将数组与 bean 一起从 servlet 传递到 jsp

在 AJAX 中处理 servlet 输出

Firebase/Android:将检索到的值从 Firebase 添加到 arraylist 会返回空指针异常