Bal*_*usC 66
让我们看看应该发生什么:
<img>
元素.src
属性.src
属性需要指向有效的http://
URL,因此不是本地磁盘文件系统路径file://
,因为当服务器和客户端在物理上不同的机器上运行时,该路径将永远不会工作.http://example.com/context/images/foo.png
)或请求参数(例如http://example.com/context/images?id=1
)中具有图像标识符./images/*
,这样您就可以在特定的URL上执行某些Java代码.byte[]
或InputStream
从DB中,JDBC API提供ResultSet#getBytes()
与ResultSet#getBinaryStream()
此,和JPA API提供@Lob
用于此.byte[]
或者InputStream
到OutputStream
响应的常用的Java IO方式.Content-Type
需要设置响应头.通过您可以获得正确的ServletContext#getMimeType()
基于图像文件的扩展,你可以扩展和/或通过覆盖<mime-mapping>
在web.xml
.那应该是它.它几乎写了代码本身.让我们从HTML开始(在JSP中):
<img src="${pageContext.request.contextPath}/images/foo.png">
<img src="${pageContext.request.contextPath}/images/bar.png">
<img src="${pageContext.request.contextPath}/images/baz.png">
Run Code Online (Sandbox Code Playgroud)
<c:forEach items="${imagenames}" var="imagename">
<img src="${pageContext.request.contextPath}/images/${imagename}">
</c:forEach>
Run Code Online (Sandbox Code Playgroud)
然后定义/创建一个servlet,它在URL模式上监听GET请求/images/*
,下面的例子使用普通的vanilla JDBC作为工作:
@WebServlet("/images/*")
public class ImageServlet extends HttpServlet {
// content=blob, name=varchar(255) UNIQUE.
private static final String SQL_FIND = "SELECT content FROM Image WHERE name = ?";
@Resource(name="jdbc/yourDB") // For Tomcat, define as <Resource> in context.xml and declare as <resource-ref> in web.xml.
private DataSource dataSource;
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String imageName = request.getPathInfo().substring(1); // Returns "foo.png".
try (Connection connection = dataSource.getConnection(); PreparedStatement statement = connection.prepareStatement(SQL_FIND)) {
statement.setString(1, imageName);
try (ResultSet resultSet = statement.executeQuery()) {
if (resultSet.next()) {
byte[] content = resultSet.getBytes("content");
response.setContentType(getServletContext().getMimeType(imageName));
response.setContentLength(content.length);
response.getOutputStream().write(content);
} else {
response.sendError(HttpServletResponse.SC_NOT_FOUND); // 404.
}
}
} catch (SQLException e) {
throw new ServletException("Something failed at SQL/DB level.", e);
}
}
}
Run Code Online (Sandbox Code Playgroud)
而已.如果您担心HEAD和缓存标头并正确响应这些请求,请将此抽象模板用于静态资源servlet.
归档时间: |
|
查看次数: |
79135 次 |
最近记录: |