0

MongodbGridFSに保存している画像を提供するための単純な画像サーブレットがあります。ただし、サーブレットが呼び出されていないようです。

以下に、私のweb.xmlの一部と、ブラウザーのxhtmlおよびhtmlソースを示します。jsfコードは正常に機能しているようで、正しいIDを取得しています。私のログから、ページが表示されているときにサーブレットの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>

これが私のサーブレットの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());
   }
4

1 に答える 1

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;
}

(パラメータ自体をチェックしている他の場所でもそれを行います)

于 2012-11-24T12:03:21.920 に答える