gpt4 book ai didi

image - Tomcat 中未调用 Servlet

转载 作者:行者123 更新时间:2023-11-28 23:03:50 24 4
gpt4 key购买 nike

我有一个简单的图像 servlet 来提供存储在 Mongodb GridFS 中的图像。但是,我的 servlet 似乎没有被调用。

下面你可以看到我的web.xml的一部分,以及浏览器中的xhtml和html源码。 jsf 代码似乎工作正常,并且正在提取正确的 ID。从我的日志来看,似乎在显示页面时未调用 servlet 的 doGet 方法。

如有任何想法,我们将不胜感激。

这是我的 web.xml 片段:

<servlet>
<servlet-name>imageServlet</servlet-name>
<servlet-class>com.iLearn.view.servlet.ImageServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>imageServlet</servlet-name>
<url-pattern>/image/*</url-pattern>
</servlet-mapping>

这是一个 xhtml 文件的片段:

    <h:panelGrid id="resourcePanel" columns="4">
<a4j:repeat value="#{resourceUpload.resources}" var="res"
rowKeyVar="rowKey">
<h:panelGrid columns="1" style="width:100px; height:150 px;">
<h:graphicImage
value="image?id=#{res.idAsString}"
style="width:100px; height:100px;"
/>
<h:outputText value="#{res.name}" />
<h:outputText value="#{res.mimeType}" />
<h:outputText value="#{res.bytes}" />
</h:panelGrid>
</a4j:repeat>
</h:panelGrid>

这是我从浏览器获得的来源:

<table style="width:100px; height:150 px;">
<tbody>
<tr>
<td><img src="image?id=50ad879f93839043ffc4f156" style="width:100px; height:100px;" /></td>
</tr>
<tr>
<td>headshot.JPG</td>
</tr>
<tr>
<td>image/jpeg</td>
</tr>
<tr>
<td></td>
</tr>
</tbody>
</table>
<table style="width:100px; height:150 px;">
<tbody>
<tr>
<td><img src="image?id=50add3b09383f7b98d0f6e66" style="width:100px; height:100px;" /></td>
</tr>
<tr>
<td>workon.JPG</td>
</tr>
<tr>
<td>image/jpeg</td>
</tr>
<tr>
<td></td>
</tr>
</tbody>
</table>

这是我的 servlet 中的 doGet 方法。因为它没有命中第一个日志语句,所以我很确定它永远不会进入这个方法。为什么不呢??

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String idString = request.getParameter("id");
getLogger().debug("ImageServlet got request to serve up image id = " + idString);
if((idString == null) || (idString.isEmpty())) {
getLogger().debug("Image id was null, so image not displayed");
return;
}
ObjectId id = new ObjectId(idString);
Resource image = getResourceRecordDao().load(id);
if(image == null) {
getLogger().warn("Could not find image with id: " + id);
return;
}
response.reset();
response.setContentType(image.getMimeType());
response.setHeader("Content-Length", String.valueOf(image.getSize()));
response.setHeader("Content-Disposition", "inline; filename=\"" + image.getName() + "\"");
image.render(response.getOutputStream());
}

最佳答案

<h:graphicImage> 中的相对路径是相对于当前请求的 URL。因此,如果当前请求的页面本身位于这样的文件夹中 http://examlpe.com/context/folder/page.xhtml , 然后图像将从 http://example.com/context/folder/image?id=123 下载, 虽然您想从上下文根中引用它,如 http://example.com/context/image?id=123 .

在 URL 前加上 / 前缀使其成为绝对路径和<h:graphicImage>将呈现相对于上下文根的 URL。

<h:graphicImage value="/image?id=#{res.idAsString}" />

与具体问题无关,当找不到图像时,您应该返回 404,而不是空响应。否则会让客户感到困惑。

if (image == null) {
getLogger().warn("Could not find image with id: " + id);
response.sendError(HttpServletResponse.SC_NOT_FOUND);
return;
}

(在检查参数本身的其他地方也这样做)

关于image - Tomcat 中未调用 Servlet,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13539597/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com