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-na开发者_JS百科me>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 src
of 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 by web.xml
so 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 like
http://localhost:8080/YourContextPath/Photos
in the browser address bar should display the image. So basically, assuming that the JSP runs in the same context path, this should do:
<img src="Photos" />
Or when you want to make it relative to the domain root, then you need to include the context path dynamically:
<img src="${pageContext.request.contextPath}/Photos" />
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 call response.getOutputStream()
.
response.setContentType("image/jpeg");
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 return null
when there's no means of a session. But you are not checking for that on the next line! So either use
HttpSession session = request.getSession();
so that it is never null
, or add a
if (session == null) {
// Display some default image or return a 404 instead.
return;
}
You would like to do the same for userId
and photoStream
. If it's absent, then display a default image or return a 404.
Attach your web.xml to see how you are (if you are at all) mapping your servlet, so we can give you the URL.
web.xml is the way to tie URLs with the servlets.
Your way with buffered output towards Servlet output stream is IMHO a correct and good way of writing data to output. It would be better to use Filter to cache output though instead of writing the response all the time.
UPDATE: Based on the blog you mentioned as source and web.xml in it, the correct url should be
<img src="/image/my_image.jpg" />
where my_image.jpg is a sample name of uploaded image.
If you register your serlvet for the pattern /Photos
<img src="/yourContextRoot/Photos" />
精彩评论