0

データベースからイメージを取得した後、jsp ページにイメージを表示するためのサーブレットを手伝ってくれる人がいますか。以下の画像サーブレットは、ブラウザに画像をまったく表示していないようで、画像アイコンが壊れているだけです。

@WebServlet(name = "ImageServlet", urlPatterns = {"/Image"})
public class ImageServlet extends HttpServlet {

private DatabaseConnector dataManager;
BufferedInputStream input = null;
BufferedOutputStream output = null;

@Override
public void init() {
    dataManager = new DatabaseConnector();
}

@Override
public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    // Prepare.
    String name = request.getPathInfo().substring(1); // Returns "foo.gif". You may want to do nullchecks here to avoid NPE's.
    ResultSet resultSet = null;

    try {
        // Query DB.
        resultSet = dataManager.getPhotos(1);

        if (resultSet.next()) {
            // Image found, prepare response and send it.
            response.setContentType(resultSet.getString("contentType"));
            response.setContentLength(resultSet.getInt("contentLength"));
            response.setHeader("Content-Disposition", "inline;filename=\"" + name + "\"");
            input = null;
            output = null;

            try {
                input = new BufferedInputStream(resultSet.getBinaryStream("content"));
                output = new BufferedOutputStream(response.getOutputStream());
                byte[] buffer = new byte[1024];

                for (int length; (length = input.read(buffer)) > -1;) {
                    output.write(buffer, 0, length);
                }
            } finally {
                if (output != null) {
                    try {
                        output.close();
                    } catch (IOException logOrIgnore) {
                    }
                }
                if (input != null) {
                    try {
                        input.close();
                    } catch (IOException logOrIgnore) {
                    }
                }
            }
        } else {
            // No image found, send HTTP 404.
            response.sendError(HttpServletResponse.SC_NOT_FOUND);
        }
    } catch (ClassNotFoundException ex) {
        Logger.getLogger(ImageServlet.class.getName()).log(Level.SEVERE, null, ex);
    } catch (IllegalArgumentException ex) {
        Logger.getLogger(ImageServlet.class.getName()).log(Level.SEVERE, null, ex);
    } catch (SQLException e) {
        throw new ServletException("Something failed at SQL/DB level.", e);
    } finally {
        if (resultSet != null) {
            try {
                resultSet.close();
            } catch (SQLException logOrIgnore) {
            }
        }
    }
}
}

私のjspページの画像は次のようになります。

<img src="/Image/<%= h.getHomeID() %>">

最後に、結果セットの元になるデータベース コネクタ クラスは次のとおりです。

public ResultSet getPhotos(String photoID) throws
        IllegalArgumentException, SQLException, ClassNotFoundException {

    createConnection();


    ResultSet rs = null;
    PreparedStatement preparedStatement = null;

    String strQuery = "SELECT home_photo.photo "
            + "FROM home_photo "
            + "WHERE home_photo.home_id = ?";

    try {
        preparedStatement = conn.prepareStatement(strQuery);
        preparedStatement.setString(1, photoID);
        rs = preparedStatement.executeQuery();

    } catch (SQLException e) {
        throw new SQLException(e);
    } finally {
        closeConnection();
        return rs;
    }
}

私の web.xml も次のようになります。

<servlet>
    <servlet-name>ImageServlet</servlet-name>
    <servlet-class>DB.ImageServlet</servlet-class>
</servlet>
<servlet-mapping>
    <servlet-name>ImageServlet</servlet-name>
    <url-pattern>/Image/*</url-pattern>
</servlet-mapping>

画像が表示されない理由を誰かが知っているなら、私は感謝します

4

2 に答える 2

2

2 つの潜在的な問題があります。

  1. 画像のURLが間違っています。Web ブラウザーの開発者ツールセットの HTTP トラフィック モニターを調べます (Chrome/IE9/Firebug で F12 を押し、Net(work)セクションを調べます)。HTTP 応答コードは、404 ではなく 2nn/3nn である必要があります。adarshr の回答がそれをカバーしています。

    <img src="${pageContext.request.contextPath}/Image/<%= h.getHomeID() %>">
    

    以下も参照してください。


  2. 結果セットを返す前に DB 接続を閉じていますが、その後も結果セットにアクセスしようとしています。SQLExceptionこれにより、HTTP 500 エラー ページとして表示されるがスローされます。これは、HTTP トラフィック モニターや、ブラウザーのアドレス バーで画像の URL を直接指定した場合でも、そのまま表示されるはずです。

    ResultSetを返さず、画像のコンテンツを として返すようにコードを書き直すbyte[]か、DB ジョブをサーブレット内に移動する必要があります。いずれにせよ、ResultSetインスタンスを取得または返すパブリック メソッドを作成することは絶対にしないでください。

    以下も参照してください。

于 2013-01-17T16:23:09.640 に答える
1

画像サーブレットへのURLが間違っているようです。で開始すると/、コンテキストのルートに移動します。

<img src="${pageContext.request.contextPath}/Image/<%= h.getHomeID() %>">
于 2013-01-17T16:03:26.290 に答える