我的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">
披露:
从此链接http://balusc.blogspot.com/2007/04/imageservlet.html
复制servlet代码问题:
<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>
答案 0 :(得分:6)
HTML src
元素的<img>
应该只指向一个URL。 URL是您在浏览器地址栏中输入的网址。 Servlet可以通过web.xml
映射到某些URL模式,以便在调用与servlet映射匹配的URL时,将调用servlet。另请参阅our Servlets Wiki。
您已在/Photos
的网址格式上映射了servlet。输入类似
浏览器地址栏中的
应显示图像。所以基本上,假设JSP在相同的上下文路径中运行,这应该是:
<img src="Photos" />
或者当你想让它相对于域根目录时,你需要动态地包含上下文路径:
<img src="${pageContext.request.contextPath}/Photos" />
说你的servlet有一些问题。您尚未设置内容类型标头。这样浏览器就不知道如何处理HTTP响应。当您在地址栏中直接输入其URL时,它将显示另存为弹出窗口,当您在<img>
中调用它时,它将显示 nothing 。如果是JPG图片,请在之前添加以下行,然后调用response.getOutputStream()
。
response.setContentType("image/jpeg");
这样浏览器就会知道它是一个JPG图像,它会像这样显示它。另请参阅您为了设置标题的正确方法而链接的博客。
另一个问题是,当您无法进行会话时,您正在调用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。
答案 1 :(得分:0)
附上您的web.xml,看看您是如何映射您的servlet的,以便我们为您提供URL。
web.xml是将URL与servlet联系起来的方法。
缓冲输出对Servlet输出流的方式是恕我直言,这是一种将数据写入输出的正确方法。最好使用Filter来缓存输出,而不是一直写入响应。
<强>更新强> 基于您提到的博客作为源和web.xml,正确的URL应该是
&lt; img src =“/ image / my_image.jpg”/&gt;
其中my_image.jpg是上传图片的示例名称。
答案 2 :(得分:0)
如果您为模式/Photos
<img src="/yourContextRoot/Photos" />