第4回 サーバーサイドJavaのソリューション・ポイント


ソリューション・ポイントを実感するために
サーブレットを知る

 さて、ここで以下のサーブレットを見てください。いままで話してきたソリューション・ポイントの話とまったく違った話をするように思えるかもしれませんが、この「スマートなサーバ・サイドJava」では、できるだけ実務に即した実践的な内容にするために、以下のサーブレットを利用しながら、前述したポイントが重要になってくる理由を説明していきたいと思います。まず皆さんは、以下のサーブレットを眺めて処理の内容を理解してください。このサーブレットの処理は、至って簡単なものです。検索の対象となるDBに対して、ブラウザで検索キーを入力します。サーブレットはその検索キーを受け取って、DBに接続し検索を行います。すべての検索が終了したら、サーブレットは検索でヒットしたレコードをすべてブラウザに送信して結果を表示させます。

図2 ブラウザからサーブレット、DBの検索の流れ

 

リスト1 あるサーブレットのリスト
 1 import java.io.*;
 2 import java.util.*;
 3 import java.sql.*;
 4 import javax.servlet.*;
 5 import javax.servlet.http.*;
 6 
 7 public class TestServlet extends HttpServlet {
 8   String RDBDRIVER ="COM.ibm.db2.jdbc.app.DB2Driver";
 9   String USERID    ="userid";
10   String PASSWORD  ="password";
11
12   String inDs  = new String();
13   String inTbl = new String();
14   String inKey = new String();
15 public void doPost(HttpServletRequest request,HttpServletResponse response){
16
17  try{
18   /* ブラウザから入力値を受け取る */    
19   inDs  = request.getParameter("DS");
20   inTbl = request.getParameter("TBL");
21   inKey = request.getParameter("KEY");
22
23   /* JDBCドライバからDB接続オブジェクトを獲得する */
24   Class.forName(RDBDRIVER).newInstance();
25   Connection dbConn=DriverManager.getConnection
26                  ("jdbc:db2:"+inDs,USERID,PASSWORD);
27
28   /* SQLステートメントを実行する */
29   String sql=("SELECT * FROM "+inTbl+
30               " WHERE NO LIKE '"+inKey+"'"); 
31   Statement stmt = dbConn.createStatement();
32   ResultSet rs=stmt.executeQuery(sql);
33   /* 検索結果を抽出する */      
34   Vector hitList = new Vector();
35   while (rs.next()) {
36       StringBuffer hitLine=new StringBuffer(rs.getString("NO"));
37       hitLine.append(rs.getString("NAME"));
38       hitLine.append(rs.getString("LAST"));
39       hitLine.append(rs.getString("FIRST"));
40       hitLine.append(rs.getString("DEPT"));
41       hitLine.append(rs.getString("CODE"));
42       hitLine.append(rs.getString("ZIP"));
43       hitLine.append(rs.getString("EXT"));
44       hitList.addElement( hitLine.toString());
45    }
46    /* DB接続オブジェクトをクローズする */
47    stmt.close();
48    dbConn.close();
49    /* HTML出力の準備 */
50    response.setContentType("text/html;charset=Shift_JIS");
51    PrintWriter out = response.getWriter();
52    out.println("<html><body>");
53    out.println("<br>入力されたキーは "+inKey+" です");
54
55    /* 1レコード分の結果を抽出しHTML出力する */   
56    int hitCnt = hitList.size();
57    for( int i=0; i<hitCnt; i++){
58        out.println("<br>"+hitList.elementAt(i));
59    } 
60    out.println("</body></html>");
61    /* HTML出力の終了 */
62    out.close();
63
64    }catch ( Exception e) {
65    /* 例外をキャッチしスタック・ダンプを出力する */
66    e.printStackTrace();
67   }
68  }
69}  
1〜5行目:Javaパッケージをインポートします。

7行目:このサーブレットのクラス名は、TestServletです。

8〜10行目:サーブレットの処理でアクセスするRDBMへの情報です。今回のサーブレットでは、IBMのDB2 UDBをアクセスしていますので、このアクセスに必要なJDBCドライバとセキュリティ情報が記述されています。

12〜14行目:サーブレットの中で使用するインスタンス変数です。inDsというのは データベース名。inTblはテーブル名。そしてinKeyというのは、検索の対象となるキーです。 15行目:サーブレットの処理は、このdoPostメソッドから始まります。

19〜21行目:ブラウザから検索の対象となるデータベース名、テーブル名、検索キーを受け取ります。

24〜26行目:JDBCドライバをインスタンス化し、検索対象となるDBに対して、DB接続を取得します。

29〜32行目:SQLステートメントのSELECTを発行します。

34〜45行目:Vectorオブジェクトを用意し、その中に検索結果のカラムを連結した文字オブジェクトを1レコードにし、全ての検索結果を格納しています。

47〜48行目:DB接続を切断します。

50〜53行目:検索結果をHTMLとしてブラウザに返すためにPrintWriterオブジェクトをインスタンス化します。

56〜60行目:Vectorオブジェクトに格納されているオブジェクトの数を求めます。 これにより検索によりヒットしたレコード数が求められます。この数を利用して、すべての検索結果をVectorオブジェクトから抜き出して、ブラウザに返送します。

62行目:PrintWriterオブジェクトをクローズし、ブラウザへのデータ転送を終了し ます。


このサーブレットの問題点は何?

 さてこのサーブレットの動きを理解したところで、皆さんに質問したいことがあります。このサーブレットには、実はいくつかの改善すべき個所が含まれています。「スマートなサーバ・サイドJava」をいつも愛読していただいている読者の中には、このサーブレットの内容を見て、あれ? これはおかしいぞ、とか、この個所は私ならこう記述するけど、といった個所があるのではないかと思います。

 そこで、このサーブレットの中から、改善の対象となる個所をすべて列挙してみてください。どのような観点で改善策を考えるかは、皆さんの開発の経験や土壌によって違うと思います。ですから、サーブレットの中から業務的に足りない機能の改善個所でも結構ですし、システムの動きとしておかしい記述の改善個所でも結構です。とにかく皆さんの思うような改善個所を挙げてみてください。

 次回は、このサーブレットに潜む改善個所を説明しながら、前述したサーバ・サイドJavaのシステム構築に必要になるソリューション・ポイントの重要性について解説していくアプローチを取ってみたいと思います。

3/3  

 INDEX

第4回 サーバーサイドJavaのソリューション・ポイント
  今回の内容の目的 
  eビジネス・システム構築の流れは?
それぞれのポイントの中身は何?
  ソリューション・ポイントを実感するためにサーブレットを知る
このサーブレットの問題点は何?
  

連載記事一覧




Java Agile フォーラム 新着記事
@ITメールマガジン 新着情報やスタッフのコラムがメールで届きます(無料)

注目のテーマ

Java Agile 記事ランキング

本日 月間