[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[jfriends] ちゃっとApplet-Servlet



-----------------------------------------------------------

えんどう@ServletとJSP入門中 です。

Applet-Servlet 通信のサンプルを作るという名目で、
超ダサダサ版のちゃっとモドキを作ったので投稿します。

このサンプルでは、自分が書き込んだタイミングで
それまでのサーバー側の全部の行が返信されます。(ださー)

Perl CGI とかだと、タイマーで一定時間ごとにリフレッシュして
全ページ書き直したりということをやるみたいですが、
Java でエレガントにやろうとすると、

RMI を使ってクライアント側のメソッドをいんぼけーしょんする 

とかになるんでしょうか>ちゃっとのえらいひと

// Selvlet と通信するアプレット
// SevltetApplet.java

import java.applet.Applet;
import java.awt.BorderLayout;
import java.awt.TextArea;
import java.awt.TextField;
import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;
import java.net.URL;
import java.net.URLConnection;
import java.io.DataOutputStream;
import java.io.DataInputStream;

public class ServletApplet extends Applet {
  private String servleturl = null;
  private TextField field_ = new TextField(); // メッセージ入力
  private TextArea area_ = new TextArea();    // サーバーの返信

  public ServletApplet() {
    // GUI 構築
    this.setLayout( new BorderLayout() );

    field_.addActionListener( new ActionListener() {
      public void actionPerformed(ActionEvent e) {
        String message = e.getActionCommand(); // 入力文字列
        field_.setText("");                    // クリアする
        try {
          URL url = new URL(servleturl);
          URLConnection conn = url.openConnection();
          conn.setDoOutput(true);
          conn.setUseCaches(false);
          DataOutputStream out =
            new DataOutputStream(conn.getOutputStream());
          out.writeUTF(message); // メッセージ送信
          out.flush();
          out.close();
          
          DataInputStream in =
            new DataInputStream(conn.getInputStream());
          String reply = in.readUTF(); // 返信
          in.close();
          area_.setText(reply);
        } catch (Exception ex) {
          area_.append(ex.toString());
          ex.printStackTrace();
        }
      }
    });
    this.add(field_, "North");

    this.add(area_, "Center");
  }
  
  public void init() {
    servleturl = getParameter("servleturl"); // <PARAM> タグからServlet URL取得
  }
}

// Applet と通信する Selvlet
// MessageLogServlet.java

package endo;

import java.util.Vector;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import javax.servlet.*;

public class MessageLogServlet extends GenericServlet {
  private static Vector messages = new Vector();
  
  public void service( ServletRequest req,
                       ServletResponse res )
    throws ServletException, IOException
  {
    DataInputStream in =
      new DataInputStream(req.getInputStream());
    String message = in.readUTF(); // アプレットからの送信
    messages.addElement(message);  // Vector に追加

    DataOutputStream out = 
      new DataOutputStream(res.getOutputStream());
    int length = messages.size();
    StringBuffer lines = new StringBuffer();
    for (int i=0; i<length; i++) {
      lines.append(Integer.toString(i + 1)); // メッセージ番号
      lines.append(": ");
      lines.append(messages.elementAt(i));   // 今までのメッセージ
      lines.append('\n');                    // 改行
    }
    out.writeUTF(lines.toString()); // 現在保持しているすべてを返信
    out.flush();
    out.close();
  }
}

---
ENDO Yasuyuki <yasuyuki@xxxxxxxxxx>
http://www.javaopen.org/jfriends/index.html (Japanese Only)