2016-04-02 43 views
1

doGet()メソッドのServletであるStarter.javaがあります。私はPrinterWriterオブジェクトを使ってHTMLを印刷します。Java ServletからHTML <img>としてファイルに画像を出力する方法はありますか?

画像ファイルがC:/.../Entertainment_mgmt/src/images/logo.png(私のプロジェクトの中にあります)です。ローカルホストから取り出したサーブレットページをlocalhost:8084/Starterに表示したいと思います。ページには、他のHTML構造もあります。これは、私が保持したい(つまり、画面の小さな部分にイメージを収めたいと思っています)。 <img src="C:/.../Entertainment_mgmt/src/images/logo.png" />をHTMLに出力するだけではうまくいかないようです。

私は手動サーブレットマッピングを実行しておらず、Tomcatの設定ファイルも変更していません。

enter image description here

私は多くの類似の記事をチェックしてきたが、私はちょうどそれのこつを得るように見えることはできません。

EDIT:この投稿は重複していると表示されています。このポストは、他のプログラマが私がやったのと同じミスをする可能性があるという単純な事実のために意味があります。さらに、これはTomcatの/conf/server.xmlファイルの変更を必要としないソリューションを提供します

+0

HTMLはファイルへのパスを期待していません。 HTTP URLが、HTTPサーバーによって提供されるイメージを指していることを期待しています。あなたのイメージは、Webサーバーによって提供される "Webページ"の下にある必要があります。また、HTMLには、ローカルファイルパスではなく、これらのイメージへのHTTP URLが含まれている必要があります。 '' –

+0

@JBNizet:__now__を取得します。しかし、ほとんどのブラウザーがハードドライブ上のファイルパスから直接画像を開くことができるので、私は混乱しました。私はTomcatがそのギャップを埋めることを期待し、ページと共に画像を提供しました。 –

答えて

2

オーケーを使用して画像にアクセスすることができますので、私は答えを考え出しました。画像をロードするには、BufferedOutputStream経由でバイナリデータを書き出すために実際にJavaコードが必要であることが判明しました(私はTomcatがそれを世話すると思っていました)。

具体的には、HTMLの「/images/logo.jpg」のようなパスを使用可能なイメージに変換するサーブレットが必要です。サーブレットは、/ images/*のサーブレットへのサーブレットマッピングを介して呼び出されます。/images/*の一部を抽出することで、正確なイメージ名を取得でき、サーブレットはそれを読み込むことができます。私のプロジェクトでは、DisplayImageがC:/.../Entertainment_mgmt/src/servlets/DisplayImage.javaで発見されていること

... 
<servlet> 
    <servlet-name>DisplayImage</servlet-name> 
    <servlet-class>servlets.DisplayImage</servlet-class> 
</servlet> 

<servlet-mapping> 
    <servlet-name>DisplayImage</servlet-name> 
    <url-pattern>/images/*</url-pattern> 
</servlet-mapping> 
... 

注:

はここ(WEB-INF/web.xmlに追加する)サーブレットマッピングです。

もちろん、マッピングに必要なものを追加できます。マッピングは、localhost:8040/images/logo.jpgのようにURLに表示されます。または、<img src="/images/logo.jpg" />というHTMLページ内に表示されます。サーブレットの点からは、どちらも同じことです。上記のマッピングに従って、両方ともサーブレットDisplayImageによって処理されます。

DisplayImageサーブレットhereのコードが見つかりました。私はそれを少し変更した:あなたのコンピュータ上のimagesBaseへのフォルダを設定することができます

package servlets; 

import java.io.*; 
import javax.servlet.*; 
import javax.servlet.http.*; 

public class DisplayImage extends HttpServlet { 
    public final String imagesBase = "F:\\Workspaces\\Java\\Projects\\Entertainment_mgmt\\src\\images/"; 

    public void doGet(HttpServletRequest request,HttpServletResponse response) throws IOException{ 
     String URLAfterWebDomain = request.getRequestURI(); 

     //Only accept mappings as src="/images/whatever.jpg", even if web.xml has other mappings to this servlet. 
     if(URLAfterWebDomain.startsWith("/images/") == false) 
      return; 

     //get the image name, or even directory and image, e.g. /images/music/beethoven.jpg: 
     String relativeImagePath = URLAfterWebDomain.substring("/images/".length()); //will get "music/beethoven.jpg" 

     System.out.println("\nFetching image from "+imagesBase+relativeImagePath); 
     response.setContentType("image/jpeg"); //as far as I know, this works for PNG as well. You might want to change the mapping to /images/*.jpg if it's giving problems 

     ServletOutputStream outStream; 
     outStream = response.getOutputStream(); 
     FileInputStream fin = new FileInputStream(imagesBase+relativeImagePath); 

     BufferedInputStream bin = new BufferedInputStream(fin); 
     BufferedOutputStream bout = new BufferedOutputStream(outStream); 
     int ch =0; ; 
     while((ch=bin.read())!=-1) 
      bout.write(ch); 

     bin.close(); 
     fin.close(); 
     bout.close(); 
     outStream.close(); 
    } 
} 

、それはあなたのプロジェクトのフォルダ内にある必要はありません。 /images/フォルダの名前を/pics/などに変更することもできます。

ここで、<img>タグをHTMLに配置すると、src="/images/whatever.jpg"属性を使用してDisplayImageサーブレットを呼び出し、画像を表示できます。そのイメージを再配置することができます。

これは、HTMLを書き出す他のサーブレットでも行うことができます。その場合、サーブレットは独立して呼び出され、HTTP経由で独立して出力されます(これは、一部のWebページではテキストが最初にロードされ、イメージは後でロードされます)。

0

提供している画像パスは絶対パスです。 Webリソースは、ネットワーク上の通常のファイルパスではアクセスされず、WebサーバーにデプロイされたWebアプリケーションからの相対パスによって参照されます。

あなたはWebサーバのWebアプリケーションベースのフォルダに画像フォルダを入れて、localhost:8084/images/logo.png

+0

私は動作していないようです。これを実行可能にするために実装しなければならないサーブレットマッピングはありますか?相対パス(C:/.../ Entertainment_mgmtがベースであると仮定)は/src/images/logo.pngになりますが、それはどちらも動作しません。 –

+0

webappをサーバーにどのように配備していますか? –

+0

Netbeans、現在。私はTomcat8とlocalhost –

関連する問題