Gewusst wie: abrufen von Bild aus der Datenbank und die Anzeige in der JSP über Servlet?
Meine ImageDAO sieht wie folgt aus:
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;
}
Meine ImageServlet sieht wie folgt aus:
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();
}
}
Wie sollte mein JSP-image src Aussehen
<img src="What to put here">
Offenlegung:
Den servlet-code ist kopiert aus diesem link http://balusc.blogspot.com/2007/04/imageservlet.html
Fragen:
- Wie retreive Bild in JSP aus ImageServlet. Jemand in Stackoverflow sagte zu setzen
<img src="URL to Servlet" />
. Aber ich weiß nicht, was es bedeutet. - Ist die oben genannte Methode die richtige Art und Weise zu retreive Bild aus der Datenbank? Oder ist es besser so.
EDIT: Meine Web.xml sieht so aus
<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>
Du musst angemeldet sein, um einen Kommentar abzugeben.
Den
src
des HTML -<img>
element sollte nur eine URL. Eine URL ist eine web-Adresse wie die, die Sie geben Sie in der Adresszeile Ihres Browsers. Servlets zugeordnet werden kann, die auf eine bestimmte URL-Muster vonweb.xml
so, dass beim aufrufen einer URL, das entspricht der servlet-mapping, dass das servlet aufgerufen wird. Siehe auch unsere Servlets Wiki.Sie zugeordnet haben, den servlet auf ein URL-Muster der
/Photos
. Die Eingabe einer URL wiein der Adressleiste des Browsers sollte das Bild angezeigt. Also im Grunde, unter der Annahme, dass die JSP-läuft im gleichen Kontext-Pfad, sollte dies tun:
Oder, wenn Sie wollen, um es relativ zum domain-root, dann müssen Sie den Kontext-Pfad dynamisch:
Gesagt, es gibt einige Probleme in Ihrem servlet. Sie haben nicht die content-type-header. Auf diese Weise werden die browser nicht wissen, was zu tun mit der HTTP-Antwort. Es erscheint ein Speichern Als popup, wenn Sie geben Sie die entsprechende URL direkt in die Adresszeile ein und es erscheint nichts, wenn Sie es nennen in
<img>
. Wenn es ein JPG-Bild, dann fügen Sie die folgende Zeile vor rufen Sieresponse.getOutputStream()
.Diese Weise wird der browser versteht, dass es ein JPG-Bild und es erscheint Sie als solche. Siehe auch den blog, den du verlinkt für die richtige Methode zum festlegen der Kopfzeilen.
Ein weiteres problem ist, dass Sie anrufen
request.getSession(false)
potenziell zurücknull
wenn es keine Mittel für eine Sitzung. Aber Sie sind nicht die Kontrolle für Sie, dass Sie auf die nächste Zeile! So verwenden Sie entwederso, dass es nie
null
oder fügen Sie einWürden Sie gerne tun das gleiche für
userId
undphotoStream
. Wenn es fehlt, dann zeigt ein Standard-Bild oder erzeugen einen 404.Befestigen web.xml um zu sehen, wie Sie sind (wenn Sie überhaupt) servlet-mapping, so können wir Ihnen die URL.
web.xml ist der Weg zum tie-URLs mit den servlets.
Ihre Art und Weise mit Gepufferter Ausgang zum Servlet-output-stream ist IMHO eine richtige und gute Art und Weise des Schreibens von Daten auf Ausgang. Es wäre besser, verwenden Sie Filter, um die cache-Ausgabe wenn Sie anstelle des Schreibens der Antwort die ganze Zeit.
UPDATE:
Basierend auf dem blog, den Sie erwähnt als Quelle und web.xml in es, die richtige url sollte
wo my_image.jpg ist ein Beispiel name der hochgeladenen Bild.
Registrieren Sie Ihre serlvet für das Muster
/Photos