【发布时间】:2014-12-11 13:18:55
【问题描述】:
我正在尝试使用 Jstl 在 Jsp 页面中显示图像,并且图像路径由 servlet 传递。 Jsp页面实际上只显示了一张检索到的图片,并抛出了NullPointerException。
Jsp 看起来像这样:
<c:forEach items="${images}" var="img">
<div class="col-md-3">
<img src="displayImg?imageId=${img.imageId}">
</div>
</c:forEach>
servlet doGet 方法如下所示:
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
int imageId = Integer.parseInt(request.getParameter("imageId"));
Image img = imageDao.getImageById(imageId);
response.setContentType("image/" + img.getImageType());
File f = new File(img.getImagePath());
BufferedImage bi = ImageIO.read(f);
OutputStream out = response.getOutputStream();
ImageIO.write(bi, img.getImageType(), out);
out.close();
}
我不明白为什么当请求参数正确时,这个 servlet 设法提供一个图像而在其他图像上失败并出现 NullPointerException。我的印象是这是一个并发问题,因为 Jsp 显示任意图像。
有什么帮助吗?
这是 DAO:
public Image getImageById(int imageId) {
String query = "SELECT * FROM images WHERE imageId=?";
Image img = null;
PreparedStatement ps = null;
ResultSet rs = null;
try {
connection = ConnectionManager.getConnection();
ps = connection.prepareStatement(query);
ps.setInt(1, imageId);
rs = ps.executeQuery();
if (rs.next()) {
img = new Image();
img.setImageId(rs.getInt("imageId")); //NPE thrown here
img.setImagePath(rs.getString("imagePath"));
img.setImageType(rs.getString("imageType"));
...
img.setDescription(rs.getString("description"));
img.setCreatedOn(rs.getTimestamp("createdOn"));
}
} catch (SQLException e) {
e.printStackTrace();
} finally {
close(rs);
close(ps);
close(connection); //Removed this and problem disappears
}
return img;
}
解决了!! 这很奇怪,但我只是避免关闭与数据库的连接,并且我的所有图像都正确显示,没有错误。我猜想在每次访问数据库后关闭连接是有问题的,因为它无法在您想要的确切时间关闭,但可能在另一个调用数据库的中间。现在我想知道,根本不关闭连接也是有问题的。遇到这种情况怎么办?
【问题讨论】:
-
请跟踪堆栈。 ;-) 另外,是 JSP 还是图像 servlet 抛出了 NPE?
-
@haraldK at com.mysql.jdbc.ResultSetImpl.buildIndexMapping(ResultSetImpl.java:674) at com.mysql.jdbc.ResultSetImpl.findColumn(ResultSetImpl.java:1029) at com.mysql.jdbc .ResultSetImpl.getInt(ResultSetImpl.java:2566) 在 be.kayiranga.daoImpl.ImageDaoImpl.getImageById(ImageDaoImpl.java:114) 在 be.kayiranga.controller.ImageDisplayer.doGet(ImageDisplayer.java:32) 在 javax.servlet。 http.HttpServlet.service(HttpServlet.java:618) at javax.servlet.http.HttpServlet.service(HttpServlet.java:725)
-
@haraldK NPE 来自 DAO。 Jsp 和 Servlet 似乎都很好。但是,我仍然怀疑问题在于如何以及何时完成对业务代码的调用。
-
专业提示:不要回答 cmets 询问详情。而是更新问题。这将有助于新读者理解您的问题。 :-) 另外,我认为您还没有发布相关代码。最有可能的是,它存在于您的 DAO 中。
-
@haraldK 照你说的做了!!!