Symfoware Parallel Server JDBCドライバユーザーズガイド
目次 索引 Back Next

Up 付録B サンプルアプリケーション

B.4 サーブレット

Interstage Apworksを使って、サーブレットを開発することができます。サーブレットとは、Webサーバへのアクセスによって起動され、サーバ上のJava VM上で実行されるJavaプログラムです。サーブレットは、1つのWebページ内に入力されたデータをWebブラウザから受け取り、処理結果を新しいWebページに構成してWebブラウザに出力する機能を持っています。

Interstage Apworksを使用して、以下の手順でサーブレットを作成します。
ここでは、データベースにアクセスして住所録一覧を表示するサーブレットの作成を例に説明していきます。

(1) Webアプリケーションプロジェクトの作成


(2) SPTファイルの編集

次に、サーブレットが出力する画面構成を定義します。定義内容は、サーブレットページテンプレートと呼ぶファイル(以降、SPTファイルと呼びます)に保存します。SPTファイルは、HTMLファイルと同様に、ページエディタを用いて作成することができます。作成したSPTファイルからは、その画面を出力することができるサーブレットプログラムのソースコードを生成することができます。

  1. コンポーネントデザイナのツリー表示域に表示されている「AddressListPage.spt」をダブルクリックすると、「ページエディタ」が起動します。
    下の画面と同じになるように編集してください。

    image

    テキストモードでも編集することができます。

    image


(3) パラメータクラスのソースコード生成

パラメータクラスは、ページ内の入力フォームから入力されたデータを参照するためのクラスです。サーブレットが実行されると、サーブレットクラスによってこのクラスのインスタンスが生成されます。このクラスでは、FORM内のINPUTタグによって与えられたパラメータを、文字列型のインスタンス変数として参照することができます。

  1. 「AddressListParameter.java」の修正を行います。コンポーネントデザイナのツリー表示域の「AddressListParameter.java」をダブルクリックし、ソースエディタを起動します。

    /*
    * AddressListParameter.java
    *
    * Copyright (c)
    */
    import javax.servlet.*;
    import javax.servlet.http.*;

    import java.io.*;
    import java.util.Hashtable;
    import java.sql.*;

    /**
    * パラメータクラス
    *
    * @author
    * @version
    */
    class AddressListParameter implements ServletParameter
    {
         //{{SRVWIZ_GENERATE(DATA)
         String text1;
         //{{SRVWIZ_GENERATE

         HttpServletRequest _req;
         String _charset;

         /**
         * コンストラクタ
         */
         AddressListParameter() {
          _charset = "JISAutoDetect";
         }

         /**
         * 入力されたデータを設定します
         * 必要に応じて、取得した各入力データに'<'、'>'、'&' が
         * 含まれていないかどうかのチェックをする必要があります。
         *
         * @param  req  サーブレットへの要求
         * @exception Exception 例外
         */
         public void setRequest(HttpServletRequest req) throws Exception {
              _req = req;
              //{{SRVWIZ_GENERATE(DATAINIT)
              if ((text1 = getParameter("text1")) == null) {
                   text1 = "";
              }
              //{{SRVWIZ_GENERATE
         }

         /**
         * 入力されたデータをハッシュテーブルとして返します
         *
         * @return 入力されたデータ
         */
         public Hashtable getValues() {
              Hashtable tbl = new Hashtable();

              //{{SRVWIZ_GENERATE(GETDATA)
              if (text1 != null) {
                   tbl.put("text1", text1);
              }
              //{{SRVWIZ_GENERATE
              return tbl;
         }

         /**
         * 入力されたデータを返します
         *
         * @param  name パラメタの名前
         * @return  パラメタの値
         * @exception Exception 例外
         */
         protected String getParameter(String name) throws Exception {
              String value = _req.getParameter(name);
              if (value == null)
                   return null;
              return new String(value.getBytes("8859_1"), _charset);
         }

         /**
         * サーブレットへの要求を返します
         *
         * @return  サーブレットへの要求
         */
         public HttpServletRequest getRequest() {
              return _req;
         }

         /**
         * 表示するページクラスを決定します
         *
         * @return  ページクラス
         * @exception Exception 例外
         */
         public ServletPage getPage(HttpSession session)  throws Exception, SQLException {
              /* ここからユーザ定義 */
              PersonalInfo _application = (PersonalInfo) session.getAttribute("application.AddressList");

              if (_application == null) {
                   String errorMessage = "アプリケーションオブジェクトが取得できませんでした(application.AddressList)";
                   throw new Exception(errorMessage);
             }
             try {
                   _application.setAllInfo();
             } catch (SQLException ex) {
                   throw ex;
             } catch (Exception e) {
                   throw e;
             }

              return new AddressListPage();
              /* ここまで */
         }
    }


    太字の部分を追加します。


(4) ページクラスのソースコード生成

ページクラスは、画面デザインの情報とJava変数の情報をもち、ページとしてWebブラウザに出力するためのクラスです。サーブレットが実行されると、パラメータクラスのgetPage()メソッドによってこのクラスのインスタンスが生成されます。
ページクラスのソースは、SPTファイルから生成することができます。

  1. SPTファイル「AddressListPage.spt」をページエディタで開きます。

  2. [ツール]メニューの[ページクラスの生成]を選択します。

  3. 「ページクラスの生成」画面が表示されます。
    生成するページクラス名を入力します。

    image

    クラス名に「AddressListPage」と指定し、[OK]ボタンをクリックします。
    プロジェクト内に同名のファイルが存在する場合は以下の確認画面が出力されます。

    image

    ここでは、[はい]ボタンをクリックします。
    クラスの生成が終了すると以下の画面が表示されます。

    image

    [OK]ボタンをクリックすると、ページクラスの生成が終了します。

  4. 「AddressListPage.java」が再作成されます。

  5. 「AddressListPage.java」の修正を行います。コンポーネントデザイナのツリー表示域の「AddressListPage.java」をダブルクリックし、ソースエディタを起動します。

    /*
    * AddressListPage.java
    *
    * Copyright (c)
    */
    import javax.servlet.*;
    import javax.servlet.http.*;

    import java.io.*;
    import java.util.Hashtable;
    import java.util.Vector;
    import java.util.Enumeration;

    /**
    * ページクラス
    *
    * @author
    * @version
    */
    class AddressListPage implements ServletPage
    {
         //{{SRVWIZ_GENERATE(DATA)
         String _title;
         String _contenttype;
         String _charset;
         Vector id;
         Vector name;
         Vector address;
         Vector tel;
         //{{SRVWIZ_GENERATE

         HttpServletResponse _res;

         /**
         * コンストラクタ
         */
         public AddressListPage() {
              //{{SRVWIZ_GENERATE(DATAINIT)
              _contenttype = "";
              _charset = "";
              _title = "";
              id = new Vector();
              name = new Vector();
              address = new Vector();
              tel = new Vector();
              //{{SRVWIZ_GENERATE

              _title = "住所録";
              _contenttype = "text/html";
              _charset = "iso-2022-jp";
         }

         /**
         * 出力するデータをハッシュテーブルとして返します
         *
         * @return 出力するデータ
         */
         public Hashtable getValues() {
              Hashtable tbl = new Hashtable();
              //{{SRVWIZ_GENERATE(GETDATA)
              if ( _title != null) {
                   tbl.put("_title", _title);
              }
              if ( _contenttype != null) {
                   tbl.put("_contenttype", _contenttype);
              }
              if ( _charset != null) {
                   tbl.put("_charset", _charset);
              }
              if ( id != null) {
                   tbl.put("id", id);
              }
              if ( name != null) {
                   tbl.put("name", name);
              }
              if ( address != null) {
                   tbl.put("address", address);
              }
              if ( tel != null) {
                   tbl.put("tel", tel);
              }
              //{{SRVWIZ_GENERATE
              return tbl;
         }

         /**
         * 出力するデータを設定します
         *
         * @param  session HTTPセッション
         * @param  param   入力フォーム
         * @exception Exception 例外
         */
         public void setContent(HttpSession session, ServletParameter param) throws Exception {

              /* ここからユーザ定義 */
              PersonalInfo _application = (PersonalInfo) session.getAttribute("application.AddressList");

              Vector v = _application.getAllInfo();
             id = (Vector)v.elementAt(0);
             name = (Vector)v.elementAt(1);
             address = (Vector)v.elementAt(2);
             tel = (Vector)v.elementAt(3);

              /* ここまで */
         }

         /**
         * ブラウザ画面に表示します
         *
         * @exception Exception 例外
         */
         public void writeTo() throws Exception {
              _res.setContentType(_contenttype + "; charset=" + _charset);
              _res.setHeader("Pragma", "No-cache");
              _res.setHeader("Cache-Control", "no-cache");
              _res.setDateHeader("Expires",0);
              writeTo(_res.getWriter());
         }

         /**
         * データを出力ストリームに書き込みます
         *
         * @param  out 出力ストリーム
         */
         public void writeTo(PrintWriter out) {
              //{{SRVWIZ_GENERATE(OUTPUT)
              out.println("<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.0 Transitional//EN\">");
              out.println("<HTML>");
              out.println("<HEAD>");
              out.println("<TITLE>" + _title + "");
              out.println("</TITLE>");
              out.println("<META CONTENT=\"" + _contenttype + "; charset=" + _charset + "\" http-equiv=\"Content-Type\">");
              out.println("<META content=\"FUJITSU PAGE EDITOR 4.0\" name=\"GENERATOR\">");
              out.println("</HEAD>");
              out.println("<BODY>");
              out.println("<CENTER>");
              out.println("<H1>住所録");
              out.println("</H1>");
              out.println("<TABLE border=\"1\">  ");
              out.println("<TBODY>  ");
              out.println("<TR>    ");
              out.println("<TH>従業員番号");
              out.println("</TH>   ");
              out.println("<TH>名前");
              out.println("</TH>    ");
              out.println("<TH>住所");
              out.println("</TH>    ");
              out.println("<TH>電話番号");
              out.println("</TH>    ");
              out.println("</TR>  ");
              for(int _i0 = 0; _i0 < id.size(); _i0++){
              out.println("<TR> ");
              out.println("<TH>" + (Integer)id.elementAt(_i0) + "");
              out.println("</TH> ");
              out.println("<TH>" + (String)name.elementAt(_i0) + "");
              out.println("</TH> ");
              out.println("<TH>" + (String)address.elementAt(_i0) + "");
              out.println("</TH> ");
              out.println("<TH>" + (String)tel.elementAt(_i0) + "");
              out.println("</TH> ");
              out.println("</TR> ");
              }
              out.println("</TBODY>");
              out.println("</TABLE>");
              out.println("</CENTER>");
              out.println("</BODY>");
              out.println("</HTML>");
              //{{SRVWIZ_GENERATE
         }

         /**
         * サーブレットからの応答を設定します
         *
         * @param  res サーブレットからの応答
         */
         public void setResponse(HttpServletResponse res) {
              _res = res;
         }

         /**
         * サーブレットからの応答を返します
         *
         * @return サーブレットからの応答
         */
         public HttpServletResponse getResponse() {
              return _res;
         }
    }


    太字の部分を追加します。


(5) サーブレットクラスの作成

サーブレットクラスは、URLの指定先になるもので、サーブレット・コンテナにより呼び出され実行されます。

  1. 「AddressList.java」の修正を行います。コンポーネントデザイナのツリー表示域の「AddressList.java」をダブルクリックし、ソースエディタを起動します。
     
    /*
    * AddressList.java
    *
    * Copyright (c)
    */
    import java.io.*;
    import java.util.Hashtable;

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

    /**
    * サーブレットクラス
    *
    * @author
    * @version
    */
    public class AddressList extends HttpServlet
    {
         PersonalInfo _application;

         /**
         * サーブレットの初期化
         * @param  config  サーブレットのコンフィギュレーション情報
         * @exception ServletException サーブレット例外が起こった場合
         */
         public void init(ServletConfig config) throws ServletException {
              super.init(config);
              try{
              _application = new PersonalInfo();
              } catch (SQLException ex) {
                   ex.printStackTrace();
                   String strMsg = null;
                   strMsg += ex.getMessage()
                        + " SQLSTATE : <" + ex.getSQLState()
                        + ">,ERROR CODE : <"+ ex.getErrorCode() + ">";
                   throw new ServletException(strMsg);
             } catch (Exception e) {
                   e.printStackTrace();
                   throw new ServletException(e.getMessage());
             }

         }

         /**
         * HTTP リクエストの処理
         * @param  request  サーブレットへの要求
         * @param  response サーブレットからの応答
         * @exception ServletException 要求を処理できない場合
         * @exception IOException 要求の処理中に検出された場合
         */
         public void service (HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException {

              HttpSession session = req.getSession(true);

              try {
                   // アプリケーションオブジェクトの取得
                   PersonalInfo app = (PersonalInfo)session.getAttribute("application.AddressList");
                   if (app == null) { // 新規またはSessionTimeOut
                        session.setAttribute("application.AddressList", _application);
                   }
                   // 使用するパラメータクラスの決定
                   ServletParameter inform = new AddressListParameter();
                   // パラメータクラスに入力されたデータを設定
                   inform.setRequest(req);
                   // 表示するページクラスの決定
                   ServletPage outform = inform.getPage(session);
                   outform.setResponse(res);
                   // ページクラスに出力するデータを設定
                   outform.setContent(session, inform);
                   // ブラウザ画面に表示
                   outform.writeTo();

               } catch (SQLException ex) {
                   res.setContentType("text/plain; charset=ISO-2022-JP");
                   PrintWriter out = res.getWriter();
                   String strMsg = null;
                        strMsg += ex.getMessage()
                        + " SQLSTATE : <" + ex.getSQLState()
                             + ">,ERROR CODE : <"+ ex.getErrorCode() + ">";
                   ex.printStackTrace(out);
                   out.close();

                } catch (Exception e) {
                       res.setContentType("text/plain; charset=iso-2022-jp");
                       PrintWriter out = res.getWriter();
                       e.printStackTrace(out);
                       out.close();
                  }
         }

         /**
         * サーブレットの後処理
         */
         public void destroy() {
         }

         /**
         * サーブレット情報の取得
         * @return サーブレット情報
         */
         public String getServletInfo() {
              return "A AddressList";
         }
    }

    太字の部分を追加します。
     


(6) アプリケーションクラスの作成

アプリケーションクラスは、サーブレットとは独立に実行することも可能なユーザ定義のサーバアプリケーションです。パラメータクラスのgetPage()やページクラスのsetContent()メソッドの中から利用者の記述によって実行されます。

  1. 「PersonalInfo.java」の修正を行います。コンポーネントデザイナのツリー表示域の「PersonalInfo.java」をダブルクリックし、ソースエディタを起動します。

    /*
    * PersonalInfo.java
    *
    * Copyright (c)
    */
    import java.util.Vector;
    import java.io.*;
    import java.text.*;
    import java.sql.*;

    /*
    * アプリケーションクラス
    *
    * @author
    * @version
    */
    class PersonalInfo
    {
         private Connection con = null;
         private Statement stmt = null;
         private ResultSet rs = null;
         private ResultSetMetaData rmd = null;
         private Vector allInfo = null;

         /*
          * 初期値を設定しないコンストラクタ
          */

         public PersonalInfo() throws Exception, SQLException {

               String sDriver = "com.fujitsu.symfoware.jdbc.SYMDriver";
              String sUrl = "jdbc:symford://myhost:2050/COMPANY";
              String sUserid = "UID";
              String sPassword = "PSW";

              try{
                   Class.forName(sDriver);
                   con = DriverManager.getConnection(sUrl,
                                                     sUserid,
                                                     sPassword);
              } catch (SQLException ex) {
                 throw ex;
              } catch (Exception e) {
                 throw e;
              }

         }

         public void destroy()
         {
              if (con != null) {
                   try {
                            con.close();
                   } catch (SQLException ex) {
                   }
              }
         }

         /*
          * データベースからすべての個人情報を取得します
          */
         public void setAllInfo() throws Exception, SQLException{

              String query = "SELECT * FROM GENERAL.ADDRESSTABLE";
              Vector vId = new Vector();
              Vector vName = new Vector();
              Vector vAddress = new Vector();
              Vector vTel = new Vector();
      
              try{
                 stmt = con.createStatement();
                 rs = stmt.executeQuery(query);
                 rmd = rs.getMetaData();

                  while (rs.next()) {
                           vId.addElement(new Integer(rs.getInt(1)));
                           vName.addElement(rs.getString(2));
                           vAddress.addElement(rs.getString(3));
                           vTel.addElement(rs.getString(4));
                  }
                  allInfo = new Vector();
                  allInfo.addElement(vId);
                  allInfo.addElement(vName);
                  allInfo.addElement(vAddress);
                  allInfo.addElement(vTel);
              } catch (SQLException ex) {
                  throw ex;
              } catch (Exception e) {
                  throw e;
              }
         }

         /*
          * データベースからすべての個人情報を取得します
          */
         public Vector getAllInfo() {
                  return allInfo;
         }

    }


    太字の部分を追加します。
    URL、ユーザIDおよびパスワードは、接続する環境にあわせて指定してください。


(7) 構築

  1. コンポーネントデザイナの[構築/実行]メニューの[構築]を選択するか、ツールバーの[構築]ボタンをクリックするか、[F7]キーを押します。

  2. メッセージウィンドウを確認し、構築が正常終了したことを確認します。


(8) Webサーバへの配置

開発した資産をサーブレットとして動作させるためにWebサーバに配置します。
サーブレットの格納場所については、Webサーバの管理者に問い合わせてください。
Webサーバへの配置は、FTPなどを使用したファイル転送により実施します。Interstage Apworksにはファイル転送のためのFTPクライアントが付属しています。詳しくはInterstage Apworksのドキュメントを参照してください。


(9) 実行

  1. Webブラウザを起動して、Webサーバに配置した「AddressList」を開きます。
    ここでは、サーブレットが「http://(Webサーバ)/sample/servlet/*」のURLに格納されているものとします。
    サーブレットを実行するために、Webブラウザ上で以下のURLを指定します。

    image

    データベースにアクセスして取得した住所録一覧を表示します。

目次 索引 Back Next

All Rights Reserved, Copyright(C) 富士通株式会社 2006