2012-11-24 50 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