連載
» 2004年04月17日 00時00分 公開

基礎から学ぶサーブレット/JSP(12):JavaBeansのルールを知る (1/2)

[山田祥寛,@IT]

 JavaBeansは、「ほかのプログラムから再利用することを目的」に作成された(ということは、汎用的なビジネスロジックを実装した)クラスです。それ自体が「直接にクライアントから呼び出されることはない」という意味では、これまでにご紹介してきたJSPページやサーブレットクラスとは少々異質なものだといえます。JavaBeansは、JSPページまたはサーブレットクラスを介して呼び出され、その結果を呼び出し元に返します。

 新しい技術が登場すると、多くの皆さんが「では、これによって、新しく何ができるようになるのか」という点に興味を持たれるかもしれません。しかし、第11回「JSPとサーブレットの違いを明らかにする」でもご紹介したサーブレットクラスと同様、JavaBeansはこれまでに学んできたことに対して、何か新しい機能を提供するというものでは「ありません」。恐らく本連載でこれから登場する機能のほとんどすべてが、新しい何かを可能にするというものでは「ない」はずです。

 第11回でも述べたように、サーブレット/JSPを学ぶということは、ただ単に「手軽に、ある機能を実現する」ということだけではありません。もちろん、最終的な目的は何かしらの要件を達成することにあるわけですから、それが第1段階の学習の目的であるのは間違いありません。そして、これが第10回「クラスライブラリを攻略「データベース編」」までのテーマでした。

 しかし、「ある一定以上の規模のアプリケーションを構築する場合には、ただ単に目の前のコーディングの手軽さだけではなく、アプリケーションに変更があった場合の保守性にも思いを至らせる必要がある」のです。これは今後、より実践的なアプリケーションを設計していく場合には、避けては通れない道です。機能の追加・改定、あるいは、サーバの移行などなど、さまざまな外的要件に対して「多大な改定工数が発生してしまう」、それによって「改定が思うに任せない」としたら、現実問題として、そのアプリケーションは「使えない」といわざるを得ません。

 第11回以降の目的は、アプリケーションに対して日々発生する変更要件を「効率よくこなす仕組み」を、いかに簡単に作っていくかという点にあります。JavaBeansによるビジネスロジック部品化のプロセスは、その数あるアプローチの中の1つだと思っていただければよいでしょう。

JavaBeansを利用するアプリケーション

 さて、それでは早速、具体的なJavaBeansを使ったアプリケーションを構築してみることにしましょう。冒頭で述べたように、JavaBeansはクライアントから直接に呼び出されるものではありません。JSP、またはサーブレット(もちろん、両方でも可能です)と組み合わせて利用しなければなりません。

 ここで紹介するアプリケーションは、mail.htmlから入力された情報に基づいて、メールを送信し、送信結果を画面表示するためのものです。これまでは多くのサンプルが1つのファイルから構成されていましたが、ここでは4つのファイルが絡みあっていますので、まずは相互の関係を図示し、全体像を概観したうえで個々のコードを見てみることにしましょう。なお、以下の図1は第1回「サーブレット/JSPの役割を理解する」の図3と比較してみると、それぞれのファイルの役割がより明確に理解できるはずです。

図1 メール送信アプリケーションの仕組み 図1 メール送信アプリケーションの仕組み

 各ファイルは、アプリケーションルート配下に以下のように配置されるものとします。

/アプリケーションルート
    mail.html
    result.jsp
    /WEB-INF
        web.xml
        /classes
            /to
                /msn
                    /wings
                        ServletMail.class
                        SendMail.class

 では、すべてのコードについて1つ1つ内容を見ていきましょう。

 まず、mail.htmlは、メールの送信先や本文などを入力するHTMLフォームです。サーブレットクラスへのデータ送信を行うビュー役割も持っています。

リスト mail.html
<html>
<head>
<title>Webメールアプリケーション</title>
</head>
<body>
<h1>Webメールアプリケーション</h1>
<form method="POST" action="/javatips/ServletMail">
<table border="0">
  <tr>
    <th align="right" valign="top">To:</th>
    <td><input name="toAdd" size="40" maxlength="255" /></td>
  </tr><tr>
    <th align="right" valign="top">Cc:</th>
    <td><input name="ccAdd" size="40" maxlength="255" /></td>
  </tr><tr>
    <th align="right" valign="top">Bcc:</th>
    <td><input name="bccAdd" size="40" maxlength="255" /></td>
  </tr><tr>
    <th align="right">送信者:</th>
    <td><input type="text" name="fromAdd" size="60" />
  </tr><tr>
    <th align="right">件名:</th>
    <td><input name="subject" size="40" maxlength="255" /></td>
  </tr><tr>
    <th align="right" valign="top">本文:</th>
    <td><textarea name="body" cols="70" rows="15"></textarea></td>
  </tr><tr>
    <td align="center" colspan="2">
      <input type="submit" value="送信" />
      <input type="reset" value="中止" />
    </td>
  </tr>
</table>
</form>
</body>
</html>

 ServletMail.javaは、mail.htmlからの入力を受けて、JavaBeansであるSendMail.javaを呼び出し、メールの送信を行うサーブレットクラスです。

リスト ServletMail.java
package to.msn.wings;

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

public class ServletMail extends HttpServlet {
  public void doPost(HttpServletRequest request,HttpServletResponse response)
  throws ServletException,IOException {
   // リクエストパラメータの文字エンコーディングを設定
  request.setCharacterEncoding("Windows-31J");
   // JavaBeansSendMailをインスタンス化
  SendMail objMail=new SendMail();
   /* SendMailクラスの各パラメータを設定のうえ、メール送信処理を実行
    * ただし、SMTPサーバ(setSmtpメソッド)の設定に際しては、適宜、
    * 自環境で利用可能なSMTPサーバのホスト名を指定してください */
  objMail.setSmtp("smtp.xxxxx.ne.jp");
  objMail.setToAdd(request.getParameter("toAdd"));
  objMail.setCcAdd(request.getParameter("ccAdd"));
  objMail.setBccAdd(request.getParameter("bccAdd"));
  objMail.setFromAdd(request.getParameter("fromAdd"));
  objMail.setSubject(request.getParameter("subject"));
  objMail.setBody(request.getParameter("body"));
  try {
    objMail.transform();
  } catch (Exception e) {
    throw new ServletException(e);
  }
   // SendMailクラスをリクエスト属性にセット
  request.setAttribute("SendMail",objMail);
   // 処理をresult.jspに転送
  getServletContext().getRequestDispatcher("/result.jsp").
forward(request,response);
  }
}

 SendMail.javaは、メール送信アプリケーションのコア部分です。メール情報を保持し、実際のメール送信部分のロジックを定義するJavaBeansです。

リスト SendMail.java
package to.msn.wings;

import java.io.*;
import java.util.*;
import javax.mail.*;
import javax.mail.internet.*;

public class SendMail {
   // 各種パラメータを保存するプライベート変数を定義
  private String smtp;
  private String toAdd;
  private String ccAdd;
  private String bccAdd;
  private String fromAdd;
  private String subject;
  private String body;
   // 各種プロパティのアクセサメソッド
  public String getSmtp()   {return smtp;}
  public String getToAdd()  {return toAdd;}
  public String getCcAdd()  {return ccAdd;}
  public String getBccAdd() {return bccAdd;}
  public String getFromAdd(){return fromAdd;}
  public String getSubject(){return subject;}
  public String getBody()   {return body;}
  public void setSmtp(String smtp)      {this.smtp=smtp;}
  public void setToAdd(String toAdd)    {this.toAdd=toAdd;}
  public void setCcAdd(String ccAdd)    {this.ccAdd=ccAdd;}
  public void setBccAdd(String bccAdd)  {this.bccAdd=bccAdd;}
  public void setFromAdd(String fromAdd){this.fromAdd=fromAdd;}
  public void setSubject(String subject){this.subject=subject;}
  public void setBody(String body)      {this.body=body;}
   // コンストラクタ
  public SendMail(){
  this.smtp="smtp.xxxxx.ne.jp";
  }
   // メール送信処理を行うtransformメソッドの定義
  public void transform()
    throws UnsupportedEncodingException, MessagingException {
     // メール送信に必要なプロパティをセットしたうえで、メールセッションを確立
    Properties objPrp=new Properties();
    objPrp.put("mail.smtp.host",this.smtp);
    objPrp.put("mail.host",this.smtp);
    Session objSes=Session.getInstance(objPrp,null);
     /* MimeMessageオブジェクトに一連のヘッダ情報をセット
    * 件名・本文はISO-2022-JP(JIS)コードに変換 */
    MimeMessage objMsg=new MimeMessage(objSes);
    objMsg.setRecipients(Message.RecipientType.TO,this.toAdd);
    objMsg.setRecipients(Message.RecipientType.CC,this.ccAdd);
    objMsg.setRecipients(Message.RecipientType.BCC,this.bccAdd);
    InternetAddress objFrm=new InternetAddress(this.fromAdd,"");
    objMsg.setFrom(objFrm);
    objMsg.setSubject(
    MimeUtility.encodeText(this.subject,"ISO-2022-JP","B"));
  objMsg.setContent(this.body,"text/plain; charset=ISO-2022-JP");
     // メール送信処理
    Transport.send(objMsg);
  }
}

 result.jspは、送信したメールに関する情報を表示します。サーブレット、JavaBeansの処理結果を表示するビューです。

リスト result.jsp
<%@ page contentType="text/html;charset=Windows-31J" %>
<jsp:useBean id="SendMail" class="to.msn.wings.SendMail" scope="request" />
<html>
<head>
<title>Webメールアプリケーション(送信結果)</title>
</head>
<body>
<h1>Webメールアプリケーション(送信結果)</h1>
<table border="1">
  <tr>
    <th align="right" valign="top">To:</th>
    <td><jsp:getProperty name="SendMail" property="toAdd" /></td>
  </tr><tr>
    <th align="right" valign="top">Cc:</th>
    <td><jsp:getProperty name="SendMail" property="ccAdd" /></td>
  </tr><tr>
    <th align="right" valign="top">Bcc:</th>
    <td><jsp:getProperty name="SendMail" property="bccAdd" /></td>
  </tr><tr>
    <th align="right">送信者:</th>
    <td><jsp:getProperty name="SendMail" property="fromAdd" /></td>
  </tr><tr>
    <th align="right">件名:</th>
    <td><jsp:getProperty name="SendMail" property="subject" /></td>
  </tr><tr>
    <th align="right" valign="top">本文:</th>
    <td><pre><jsp:getProperty name="SendMail" property="body" />
</pre></td>
  </tr>
</table>
</body>
</html>

 サンプルアプリケーションのコードはここまでです。本アプリケーションのデプロイメント・ディスクリプタ(web.xml)は以下の通りです。

リスト web.xml
<?xml version="1.0" encoding="Shift_JIS" ?>
<web-app xmlns="http://java.sun.com/xml/ns/j2ee"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee web-app_2_4.xsd"
  version="2.4">
  <!-- サーブレットクラスServletMailを登録します。
       サーブレットクラス動作の必須条件です -->
  <servlet>
    <servlet-name>ServletMail</servlet-name>
    <servlet-class>to.msn.wings.ServletMail</servlet-class>
  </servlet>
  <servlet-mapping>
    <servlet-name>ServletMail</servlet-name>
    <url-pattern>/ServletMail</url-pattern>
  </servlet-mapping>
</web-app>

 以降の画面がメール送信アプリケーションの実行結果です。

画面1 画面上から入力された内容をメール送信 画面1 画面上から入力された内容をメール送信
画面2 メール送信結果画面 画面2 メール送信結果画面
画面3 Webメールから送信されたメールを専用のメーラから受信 画面3 Webメールから送信されたメールを専用のメーラから受信

 なお、本サンプルを動作させるためには、以下のサイトからJavaMailとJAF(Java Activation Framework)をダウンロードし、あらかじめサーバ環境にインストールしておく必要があります。

 インストール方法は簡単です。ダウンロードしたjavamail-X_X.zip(JavaMail)、jafX_X_X.zip(JAF)を適当なフォルダに解凍したうえで(X_X、X_X_Xはバージョン番号)、解凍フォルダ配下のmail.jar、activation.jarをそれぞれアプリケーションルート配下の「/WEB-INF/lib」フォルダにコピーするだけです。「.jar」ファイルをコピーした後は、Tomcat(またはアプリケーション)を必ず再起動するようにしてください。

 以上の設定で、以下のURLからアプリケーションにアクセスすることができるようになります。ここでは、アプリケーション名は「javatips」としておくことにします。

  • http://localhost:8080/javatips/mail.html

注意

本サンプルは、Tomcat5.x環境に最適化されています。もしもTomcat4.xで動作させたい場合には、web.xmlの冒頭部を以下のように変更してください。

<?xml version="1.0" encoding="Shift_JIS" ?>
<!DOCTYPE web-app
PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
"http://java.sun.com/dtd/web-app_2_3.dtd">
<web-app>
…後略…


One Point

JSP/サーブレット/JavaBeansを組み合わせることで、ビュー/コントロール/ビジネスモデルを明確に分離した、保守性に優れたアプリケーションを作成することができます。


       1|2 次のページへ

Copyright © ITmedia, Inc. All Rights Reserved.

RSSについて

アイティメディアIDについて

メールマガジン登録

@ITのメールマガジンは、 もちろん、すべて無料です。ぜひメールマガジンをご購読ください。