web-dev-qa-db-ja.com

サーブレットからJSPページへの画像の取得を支援する

現在、文字列のテキストを表示する画像を生成する必要があります。この画像をサーブレットで作成してから、何らかの方法で画像をJSPページに渡して表示できるようにする必要があります。画像の保存を避け、代わりに画像をJSPにストリーミングしようとしています。

サーブレットからJSPに画像を渡す方法を見つけ始めてから、画像を生成する方法が見つかりませんでした。

編集:jspページはすでに作成されており、サーブレットによって作成されていません。既存のjspに画像を渡す必要があります

どんな助けでも大歓迎です。

13
ChronoXIII

画像をバイト配列として応答の出力ストリームに書き込む必要があります。このようなもの:

byte[] imageBytes = getImageAsBytes();

response.setContentType("image/jpeg");
response.setContentLength(imageBytes.length);

response.getOutputStream().write(imageBytes);

次に、JSPでは、標準のimg要素を使用します。

<img src="url to your servlet">
31
Nick Holt

あなたできません1 異なるタイプ(たとえば、タイプtext/htmlのHTMLページとタイプimage/jpegの画像)を返すため、同じ応答で両方を返します。

この種のことのために、私は最初のサーブレットリクエストの間に画像を生成します(それを含むHTMLページのために)。サーブレットのキャッシュに保存し、ハンドルを使用してその画像へのURLを含む画像タグを使用してHTMLページを記述します。

例えばブラウザはhttp://whatever/pageを要求します

サーブレットは画像を生成し、次のようにページにHTMLタグを書き込みます。

<img src="http://whatever/image/unique_handle_to_image">

ブラウザはHTMLページをレンダリングし、その一部として、画像のハンドルを使用してサーブレットに新しいリクエストを発行します。

例えばブラウザがhttp://whatever/image/unique_handle_to_imageを要求するようになりました

次に、画像をコンテンツタイプimage/jpegまたは同様のものとして返します。

つまり、2つのリクエストが進行中です。 1つは画像をレンダリングして一時的に保存するページ用で、もう1つは画像を返すページ用です。画像キャッシュをクリアすることを忘れないでください、しかしそれはすべて簡単です。通常、ブラウザからの2つのリクエスト(!)はすぐに連続して発生するため、大量の画像を保存する必要はありません。

  1. ブラウザがサポートしていれば data uri を使用して、次のようなものを作成することは可能だと思います。

    <img src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAoAAAAKCAYAAACNMs+9AAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAALEwAACxMBAJqcGAAAAAd0SU1FB9YGARc5KB0XV+IAAAAddEVYdENvbW1lbnQAQ3JlYXRlZCB3aXRoIFRoZSBHSU1Q72QlbgAAAF1JREFUGNO9zL0NglAAxPEfdLTs4BZM4DIO4C7OwQg2JoQ9LE1exdlYvBBeZ7jqch9//q1uH4TLzw4d6+ErXMMcXuHWxId3KOETnnXXV6MJpcq2MLaI97CER3N0vr4MkhoXe0rZigAAAABJRU5ErkJggg==" alt="Red dot" />
    

これらを取り巻くいくつかの警告があることに注意してください。リンク先のページをご覧ください。

7
Brian Agnew

私はこれを達成するためにこの線に沿って何かをします:

JSPページで、画像へのリンクを配置します。

<imgsrc = "servlet/path?word = value">残り</ img>

このリンクはサーブレットを指し、リクエストパラメータを使用して画像を生成します。保存する必要はなく、応答の出力ストリームに直接配置するだけです。このサーブレットのブラウザキャッシュを無効にすることを忘れないでください。

最初にJSPページが表示され、次にすべての画像が要求されます。問題なく動作するはずです。

もちろん、このようなパラメータに表示するテキストを配置するべきではありません。適切に暗号化するか、HTTPセッションに保存する必要があります。

お役に立てれば。

3
Ula Krukar
...
response.setContentType("image/jpeg");
response.setContentLength(imageBytes.length); // imageBytes - image in bytes
response.getOutputStream().write(imageBytes);// 
outStream.flush();   
outStream.close();  
1
tenen

私があなたの問題を正しく理解している場合、イベントのシーケンスは次のようになります。

  1. HTMLページを生成します。
  2. そのHTMLページがクライアントに送信されます。そして
  3. クライアントのブラウザは画像のURLを読み取り、別のリクエストとしてリクエストします。

したがって、imageを生成してJSPに渡すことはできません。ただし、[〜#〜] url [〜#〜]を生成して画像を取得し、それをJSPに配置することはできます。これは、サーブレットをHttpServletRequestオブジェクト(JSPのリクエストスコープ)に配置するのに十分簡単です。たとえば、次を生成します。

<a href="http://myhost.com/image_servlet?id=1234"/>

そのテキストが何であるか、または画像を生成するためにどのような情報が必要であるかを実際に言うことはありません。それをGETURLにカプセル化できない場合は、次のget imageリクエストで取得できるように、追加情報を追加してHttpSessionに配置する必要があります。

1
cletus