My ImageDAO looks like this:
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;
}
My ImageServlet looks like this:
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();
}
}
How should my JSP image src look like
<img src="What to put here">
Disclosure:
The servlet code is copied from this link http://balusc.blogspot.com/2007/04/imageservlet.html
Questions:
- How to retreive image in JSP from ImageServlet. Someone in Stackoverflow said to put
<img src="URL to Servlet" />. But I don’t what it means. - Is the above method correct way to retreive image from database? Or is there better way.
EDIT: My Web.xml looks like this
<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>
The
srcof the HTML<img>element should just point to an URL. An URL is a web address like as the one you enter in your browser address bar. Servlets can be mapped on certain URL patterns byweb.xmlso that when you invoke an URL which matches the servlet mapping, that the servlet will be invoked. See also our Servlets Wiki.You have mapped the servlet on an URL pattern of
/Photos. Entering an URL likein the browser address bar should display the image. So basically, assuming that the JSP runs in the same context path, this should do:
Or when you want to make it relative to the domain root, then you need to include the context path dynamically:
Said that, there are some problems in your servlet. You haven’t set the content type header. This way the browser won’t know what to do with the HTTP response. It’ll display a Save As popup when you enter its URL straight in address bar and it’ll display nothing when you call it in
<img>. If it’s a JPG image, then add the following line before you callresponse.getOutputStream().This way the browser understands that it’s a JPG image and it’ll display it as such. See also the blog which you linked for the proper way of setting the headers.
Another problem is that you’re calling
request.getSession(false)which can potentially returnnullwhen there’s no means of a session. But you are not checking for that on the next line! So either useso that it is never
null, or add aYou would like to do the same for
userIdandphotoStream. If it’s absent, then display a default image or return a 404.