Servlet日記(1999/08/28)

本日の成果

 少し中断していましたが、Servletの勉強の再開です。簡易掲示板もどきは、前回までに作ったところで一応よしとして(本当は試したいことがあるのですが、ちょっと経験値が足りない)、今回は別のことをやってみます。

 この本の中でも同じような内容を取り上げましたが、画像を動的に生成して返すServletを作ってみます。Javaの本を色々見てみましたが、画像を表示するプログラムを示したものは多々あるものの、画像を生成するプログラムを示したものは見つかりませんでした(例えば、イメージエディタなんかを作るには必須だと思ったのですが)。が、ちょっと別件を調べるのに「やかん本」を見ていると、なんとそのもののプログラムを発見!これをベースに、アナログ時計を表示するServletを作りました。

 内容は、時刻から針の座標を計算して描画し、それをGIF形式に変換して出力するものです。GIF形式への変換はやかん本のサンプル通り、ACME Labsからありがたく頂戴して使っています。本当はJPEG形式に変換したいのですが、どうもうまく動かないようなので、あきらめました。JDK1.2ではJPEG形式に変換できるらしいのですが、サンプルがなく、くじけました。また、本当は針の太さを変えて描画したいのですが、そのやり方もわからず、めげました。

 という、プログラムは動くにも関わらず、落ち込んでいる状態で ^^;;;

import java.io.*;
import java.util.*;
import javax.servlet.*;
import javax.servlet.http.*;
import java.awt.*;
import Acme.JPM.Encoders.GifEncoder;

public class AnalogClock extends HttpServlet {
  private double hourToRadian(int h, int m) {
    return Math.PI * (90.0 - ((h % 12) + m/60.0)*30.0)/180.0;
  }

  private double minuteToRadian(int m, int s) {
    return Math.PI * (90.0 - (m + s/60.0)*6.0)/180.0;
  }

  public void doGet(
      HttpServletRequest request,
      HttpServletResponse response
  ) throws ServletException, IOException {
    ServletOutputStream out = response.getOutputStream();

    Frame frame = new Frame();
    frame.addNotify();
    Image image = frame.createImage(200, 200);
    Graphics g = image.getGraphics();

    GregorianCalendar calendar = new GregorianCalendar();
    int cHour   = calendar.get(Calendar.HOUR);
    int cMinute = calendar.get(Calendar.MINUTE);
    int cSecond = calendar.get(Calendar.SECOND);

    g.drawLine(
      100,
      100,
      100+(int)(Math.cos(hourToRadian(cHour, cMinute))*40),
      100-(int)(Math.sin(hourToRadian(cHour, cMinute))*40));
    g.drawLine(
      100,
      100,
      100+(int)(Math.cos(minuteToRadian(cMinute, cSecond))*60),
      100-(int)(Math.sin(minuteToRadian(cMinute, cSecond))*60));
    g.drawLine(
      100,
      100,
      100+(int)(Math.cos(minuteToRadian(cSecond, 0))*90),
      100-(int)(Math.sin(minuteToRadian(cSecond, 0))*90));

    response.setContentType("image/gif");
    GifEncoder encoder = new GifEncoder(image, out);
    encoder.encode();

    g.dispose();
    frame.removeNotify();
    out.close();
  }

本日の教訓

 昔はJavaといえばAppletだったので、描画のための機能がもっと揃っているのかと思っていましたが、案外貧弱なのだと思いました。もちろん、単に知らないだけの可能性も大なのですが ^^;

Servlet日記(1999/08/01) Servlet日記の目次 Servlet日記(1999/09/05)