我的ImageDAO看起来像这样:
public InputStream getPhotos(Long userid) throws IllegalArgumentException, SQLException, ClassNotFoundException { Connection connection = null; PreparedStatement preparedStatement = null; ResultSet resultset = null; Database database = new Database(); InputStream binaryStream = null; try { connection = database.openConnection(); preparedStatement = connection.prepareStatement(SQL_GET_PHOTO); preparedStatement.setLong(1, userid); preparedStatement.executeUpdate(); while(resultset.next()) { binaryStream = resultset.getBinaryStream(4); } } catch (SQLException e) { throw new SQLException(e); } finally { close(connection, preparedStatement, resultset); } return binaryStream; }
我的ImageServlet看起来像这样:
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // Getting user id from session HttpSession session = request.getSession(false); Long userid = (Long) session.getAttribute("user"); try { InputStream photoStream = imageDAO.getPhotos(userid); // Prepare streams. BufferedInputStream input = null; BufferedOutputStream output = null; try { // Open streams input = new BufferedInputStream(photoStream, DEFAULT_BUFFER_SIZE); output = new BufferedOutputStream(response.getOutputStream(), DEFAULT_BUFFER_SIZE); // Write file contents to response. byte[] buffer = new byte[DEFAULT_BUFFER_SIZE]; int length; while ((length = input.read(buffer)) > 0) { output.write(buffer, 0, length); } } finally { output.close(); input.close(); } //Redirect it to profile page RequestDispatcher rd = request.getRequestDispatcher ("/webplugin/jsp/profile/photos.jsp"); rd.forward(request, response); } catch (Exception e) { e.printStackTrace(); } }
我的JSP映像src应该如何
<img src="What to put here">
披露:
Servlet代码是从此链接http://balusc.blogspot.com/2007/04/imageservlet.html复制的
问题:
<img src="URL to Servlet" />
编辑:我的Web.xml看起来像这样
<servlet> <servlet-name>Photo Module</servlet-name> <servlet-class>app.controllers.PhotoServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>Photo Module</servlet-name> <url-pattern>/Photos</url-pattern> </servlet-mapping>
该src的HTML <img>元素应该只是指向一个URL。URL是一个网址,就像您在浏览器地址栏中输入的网址一样。可以通过以下方式将Servlet映射到某些URL模式web.xml:当您调用与Servlet映射匹配的URL时,将调用Servlet。
src
<img>
web.xml
您已将servlet映射到的URL模式/Photos。输入如下网址
/Photos
http:// localhost:8080 / YourContextPath /照片
在浏览器的地址栏中应该显示图像。因此,基本上,假设JSP在相同的上下文路径中运行,则应该这样做:
<img src="Photos" />
或者,当您要使其相对于域根目录时,则需要动态包含上下文路径:
<img src="${pageContext.request.contextPath}/Photos" />
就是说,您的servlet中存在一些问题。您尚未设置内容类型标头。这样,浏览器将不知道如何处理HTTP响应。直接在地址栏中输入其URL时,它将显示“ 另存为” 弹出窗口,而在中调用它时则不显示 任何 内容<img>。如果是JPG图片,请 在 致电 之前 添加以下行response.getOutputStream()。
response.getOutputStream()
response.setContentType("image/jpeg");
这样,浏览器就会知道这是JPG图像,并会这样显示。另请参阅链接的博客,以获取设置标题的正确方法。
另一个问题是您正在呼叫request.getSession(false),null如果没有会话,它可能会返回。但是您不会在下一行进行检查!所以要么使用
request.getSession(false)
null
HttpSession session = request.getSession();
使其永远不会null,或添加一个
if (session == null) { // Display some default image or return a 404 instead. return; }
您想对userId和做同样的事情photoStream。如果不存在,则显示默认图像或返回404。
userId
photoStream