2012-11-24 109 views
0

我有一个简单的图像servlet来提供我在Mongodb GridFS中存储的图像。但是,我的servlet似乎没有被调用。未在Tomcat中调用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()); 
    } 
+0

使用Firebug的或类似的检查正在作出实际的http请求的东西,我怀疑网址web.xml中的模式是错误的。你正在寻找/ images/* - 那将不匹配'“image?id = 50add3b09383f7b98d0f6e66”'你的html需要''images/image?id = 50add3b09383f7b98d0f6e66“' –

+0

谢谢 - 修正了它 – Ramesh

回答

1

相对路径在<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; 
} 

(做它在其他地方,以及你在哪里检查帕拉姆本身)

+0

谢谢 - this修复它。关于IM – Ramesh

+0

谢谢 - 这固定它。 关于image == null执行路径,我还没有决定如何处理这个。如果图像为空,则数据库中可能存在数据完整性问题,因此将其作为404错误发送给用户没有多大意义。我想我会想抛出一个数据异常,但之后我需要处理它,所以我仍然必须面对这条道路。感谢你指出了这一点 - 有时你拖延了决定,然后忘记了,并且错误情况被埋在日志中。我现在可能抛出异常,并找出稍后处理的地方。 – Ramesh