Servlet日記(1999/02/20)

本日の成果

 以前Servlet日記(1999/02/02)で、画像ファイルを出力するservletを作成しました。そこでは画像データをFileInputStreamから1バイトずつ読み込んでいましたが、BufferedInputStreamというのがあることを知り、書き直してみました。

 せっかくなので、単なる書き直しではなく、Webブラウザに応じて返す画像を変えるようにしています。QueryStringにcmdという名前が含まれない場合、HTTPヘッダのUser-Agentの値を見て、MSIEが含まれていればMicrosoft Internet Explorer、そうでなければNetscape Navigatorとみなして、それぞれに対応する画像へのURLを含むドキュメントを返します。cmdが含まれる場合、その値をファイル名とみなして、そのファイルの内容を返します。

 doGet()メソッドを次のように記述しました。HTMLドキュメントを返す処理と画像を返す処理を一つのservletで実現していて、画像を返すservletのURLを生成するために、servlet名をgetRequestURI()メソッドで取り出しています。

String fname = req.getParameter("cmd");

if (fname == null) {
    res.setContentType("text/html");
    PrintWriter out = res.getWriter();
    out.print("<html><head><title>User-Agent test</title></head>");
    out.print("<body>User-Agent test:<br>");
    out.print("<img src=\"" + req.getRequestURI());
    if (req.getHeader("User-Agent").indexOf("MSIE") == -1)
        out.print("?cmd=c:/nn.gif\">");
    else
        out.print("?cmd=c:/ie.gif\">");
    out.print("</body></html>");
} else {
    int c;
    res.setContentType("image/gif");
    ServletOutputStream out = res.getOutputStream();
    BufferedInputStream bis = new BufferedInputStream(
                                 new FileInputStream(fname));
    while ((c = bis.read()) != -1)
        out.write(c);
}

本日の教訓

 ストリームから大量にデータを入力するには、BufferedInputStreamを使おう。

Servlet日記(1999/02/15) Servlet日記の目次 Servlet日記(1999/02/21)