【 Webアプリケーション用のコア JavaBeans の作成 】

1. パッケージソースとコンパイル
2. リクエストデータの日本語化(shift_jis)を実装
3. getProperty 用 として Hashtable の一覧文字列を作成するメソッド
4. Hashtable へのアクセス
5. ログ出力の実装
6. DB 接続用文字列のセッティング
7. DB 処理用メソッドの実装

環境
  • アプリケーションとして登録した d:\tomcat に 以下のディレクトリを作成します

  • d:\tomcat\WEB-INF\classes\lightbox

  • lightbox はパッケージ名になります

  • lightbox ディレクトリ内に webapp.java として以下のようなソースコードを配置
    します


  • package lightbox;
     
    import javax.servlet.*;
    import javax.servlet.http.*;
    import java.util.*;
    import java.io.*;
    import java.sql.*;
     
    public class webapp {
     
    	private Hashtable hashRequest = null;
    	private ServletContext application = null;
    	private String appName = "";
    	private String debug = "";
    	private Connection con;
    	private Statement stm;
     
    	// *****************************************************
    	// フォームから受け取った文字列が、ISO_8859_1でデコード
    	// されてしまったているので、文字列を元へ戻す為に、いっ
    	// たんISO_8859_1でエンコードし、それを再びShift_JISで
    	// デコードする
    	// *****************************************************
    	public String toShiftjis( String strData ) {
     
    		String ret;
     
    		if ( strData != null ) {
    			try {
    				ret = new String( 
    					strData.getBytes( "ISO_8859_1" ),
    					 "Shift_JIS"
    				);
    			}
    			catch( UnsupportedEncodingException e ) {
    				ret = "UnsupportedEncoding";
    			}
    		}
    		else {
    			ret = "";
    		}
     
    		return ret;
     
    	}
     
    }
    


    コンパイル
  • 同じディレクトリに、comp.bat を作成します

  • comp.bat は以下のような内容となります


  • javac -classpath "C:\Tomcat5.0\common\lib\servlet-api.jar" webapp.java
    
  • コマンドプロンプトより、そのディレクトリに入り実行させます


  • 解説
  • パッケージソースとコンパイル で実装した toShiftjis メソッドは、shift_jis
    としての日本語処理で一般的なものです

  • しかし、いちいちデータを日本語化する処理をコーデングしなくても済むように
    リクエストデータを全て変換して Hashtable に保存しておきます

  • Beans は、session スコープとして使用するので、Hashtable はセッション間で
    有効なテータの保存エリアとなります


  • // *****************************************************
    // リクエストを日本語化
    // *****************************************************
    public void createShiftjisRequest( HttpServletRequest request ) {
     
    	Enumeration enumData;
    	String strName;
    	String strData;
     
    	if ( hashRequest == null ) {
    		hashRequest = new Hashtable();
    	}
     
    	enumData = request.getParameterNames();
    	while( enumData.hasMoreElements() ) {
    		strName = enumData.nextElement().toString();
    		strData = toShiftjis( request.getParameter( strName ) );
    		hashRequest.put( appName + "_" + strName, strData );
    	}
     
    }
    

    解説
  • <jsp:getProperty 〜 /> として使用する為のメソッドです。常に Hashtable の
    内容を監視する事ができます


  • // *****************************************************
    // デバッグ用表示 ( getProperty 用 )
    // *****************************************************
    public String getDebug() {
     
    	String strName;
    	String ret = "";
     
    	Set KeySet = hashRequest.keySet();
    	Object KeyArray[] = KeySet.toArray();
    	Arrays.sort( KeyArray );
     
    	ret = "<TABLE border=1 cellpadding=5><TH>Keys</TH><TH>Values</TH>";
    	for( int i = 0 ; i < KeyArray.length; i++ ) {
    		strName = KeyArray[i].toString();
    		ret = ret + "<TR>";
    		ret = ret + "<TD>" + strName + "</TD>";
    		ret = ret + "<TD>" + hashRequest.get( strName ) + "</TD>";
    		ret = ret + "</TR>";
    	}
    	ret = ret + "</TABLE>";
     
    	return ret;
     
    }
    


  • 使用例を以下に示します

  • <%@ page
    	language="java"
    	contentType="text/html;charset=shift_jis" %>
    <jsp:useBean id="my" scope="session" class="lightbox.webapp" />
    <%
    // *********************************************************
    // 内部データ用初期処理
    // *********************************************************
    	my.createShiftjisRequest( request );
    %>
     
    <HTML>
    <BODY>
     
    <FORM method=post>
    Field1 <INPUT type=text name=Field1><br>
    <HR size=1 color=black>
    Field2 <INPUT type=text name=Field2><br>
    Field3 <INPUT type=text name=Field3><br><br>
    <INPUT type=submit name=send value="送信"><br>
    <INPUT type=submit name=send value="キャンセル"><br>
    </FORM>
     
    <TEXTAREA cols=80 rows=10>
    </TEXTAREA>
     
    </BODY>
    </HTML>
     
    <%-- ************************************************** --%>
     
    <jsp:getProperty name="my" property="debug" />
    

    解説
  • この Hashtable は、session スコープで使用するので、session 変数と同じ
    ような役目をします

  • その為、Key には、appName + _ という識別子を自動的に付加するように
    しています

  • 別の appName で実行されている アプリケーションのデータを取り出す為に
    getAppData を実装しています

  • clear メソッドでは、Hashtable をクリアします

  • appName は、後述のメソッドで実装されます


  • // *****************************************************
    // 取り出し
    // *****************************************************
    public String get( Object key ) {
     
    	String ret;
     
    	if ( hashRequest.get( appName + "_" + key ) != null ) {
    		ret = hashRequest.get( appName + "_" + key ).toString();
    	}
    	else {
    		ret = "";
    	}
     
    	return ret;
     
    }
     
    // *****************************************************
    // 登録
    // *****************************************************
    public void put( Object key, Object value ) {
     
    	hashRequest.put( appName + "_" + key, value );
     
    }
     
    // *****************************************************
    // 取り出し2
    // *****************************************************
    public String getAppData( Object key ) {
     
    	String ret;
     
    	if ( hashRequest.get( key ) != null ) {
    		ret = hashRequest.get( key ).toString();
    	}
    	else {
    		ret = "";
    	}
     
    	return ret;
     
    }
    // *****************************************************
    // Hashtable クリア
    // *****************************************************
    public void clear( ) {
     
    	hashRequest.clear();
     
    }
    


  • 使用例を以下に示します

  • <%@ page
    	language="java"
    	contentType="text/html;charset=shift_jis" %>
    <jsp:useBean id="my" scope="session" class="lightbox.webapp" />
    <%
    // *********************************************************
    // 内部データ用初期処理
    // *********************************************************
    	my.createShiftjisRequest( request );
     
    	if ( my.get( "send" ).equals( "キャンセル" ) ) {
    		my.clear();
    		response.sendRedirect( "sample1.jsp" );
    		return;
    	}
     
    %>
     
    <HTML>
    <BODY>
     
    <FORM method=post>
    Field1 <INPUT type=text name=Field1 value="<%= my.get("Field1") %>"><br>
    <HR size=1 color=black>
    Field2 <INPUT type=text name=Field2 value="<%= my.get("Field2") %>"><br>
    Field3 <INPUT type=text name=Field3 value="<%= my.get("Field3") %>"><br><br>
    <INPUT type=submit name=send value="送信"><br>
    <INPUT type=submit name=send value="キャンセル"><br>
    </FORM>
     
    <TEXTAREA cols=80 rows=10>
    </TEXTAREA>
     
    </BODY>
    </HTML>
     
    <%-- ************************************************** --%>
     
    <jsp:getProperty name="my" property="debug" />
    

    解説
  • ログは、C:\Tomcat5.0\logs\localhost_log.日付.txt に出力されるものです
    ( 例 : localhost_log.2003-12-21.txt )

  • このログには、エラーも書き込まれるので問題があった時は必ず見る必要が
    あります。ブラウザ上で日本語が表示されない場合も、ログには正しく書き込
    まれています

  • setApplication は、アプリケーションの最初に実行させます


  • // *****************************************************
    // ServletContext 保存
    // *****************************************************
    public void setApplication( ServletContext app, String curName ) {
     
    	application = app;
    	appName = curName;
    	app.log( "--------------------------------" );
    	app.log( "プログラム開始 : " + appName );
     
    }
     
    // *****************************************************
    // LOG
    // *****************************************************
    public void log( String Message ) {
     
    	application.log( "-- " + appName + " : " + Message );
     
    }
    


  • 使用例を以下に示します

  • <%@ page
    	language="java"
    	contentType="text/html;charset=shift_jis" %>
    <jsp:useBean id="my" scope="session" class="lightbox.webapp" />
    <%
    // *********************************************************
    // 内部データ用初期処理
    // *********************************************************
    	my.setApplication( application, "prog1" );
    	my.createShiftjisRequest( request );
     
    	if ( my.get( "send" ).equals( "キャンセル" ) ) {
    		my.clear();
    		response.sendRedirect( "sample1.jsp" );
    		return;
    	}
     
    %>
    


  • 以下は、ページを表示した時のログの内容です

  • 2003-12-21 23:33:40 StandardContext[/tomcat]--------------------------------
    2003-12-21 23:33:40 StandardContext[/tomcat]プログラム開始 : prog1
    

    解説
  • DB 接続関係の文字列を <jsp:setProperty 〜 /> で設定するようにします

  • ターゲット DBMS は、ここでは ODBC 経由のMySQL を想定しています


  • // *****************************************************
    // ドライバ文字列セット
    // *****************************************************
    public void setDriverName( String strName ) {
     
    	put( "DriverName", strName );
     
    }
     
    // *****************************************************
    // DB 接続 URL セット
    // *****************************************************
    public void setConnectionUrl( String strUrl ) {
     
    	put( "ConnectionUrl", strUrl );
     
    }
     
    // *****************************************************
    // DB 接続 Dbname セット
    // *****************************************************
    public void setConnectionDbname( String strUrl ) {
     
    	put( "ConnectionDbname", strUrl );
     
    }
     
    // *****************************************************
    // DB 接続 User セット
    // *****************************************************
    public void setConnectionUser( String strUser) {
     
    	put( "ConnectionUser", strUser );
     
    }
     
    // *****************************************************
    // DB 接続 Password セット
    // *****************************************************
    public void setConnectionPass( String strPass ) {
     
    	put( "ConnectionPass", strPass );
     
    }
    


  • 使用例を以下に示します

  • <%@ page
    	language="java"
    	contentType="text/html;charset=shift_jis" %>
    <jsp:useBean id="my" scope="session" class="lightbox.webapp" />
    <%
    // *********************************************************
    // 内部データ用初期処理
    // *********************************************************
    	my.setApplication( application, "prog1" );
    	my.createShiftjisRequest( request );
     
    	if ( my.get( "send" ).equals( "キャンセル" ) ) {
    		my.clear();
    		response.sendRedirect( "sample1.jsp" );
    		return;
    	}
     
    %>
    <jsp:setProperty name="my" property="driverName"       value="sun.jdbc.odbc.JdbcOdbcDriver" />
    <jsp:setProperty name="my" property="connectionUrl"    value="jdbc:odbc:SysMySQL" />
    <jsp:setProperty name="my" property="connectionDbname" value="lightbox" />
    <jsp:setProperty name="my" property="connectionUser"   value="root" />
    <jsp:setProperty name="my" property="connectionPass"   value="" />
    

    解説
  • DB 処理で、通常必要になるのは接続・読込み・更新・接続解除の4種類です



  • // *****************************************************
    // DB 接続
    // *****************************************************
    public boolean Connect( ) throws Exception {
     
    	Class.forName( get( "DriverName" ) );
     
    	try {
    		con = DriverManager.getConnection(
    			get( "ConnectionUrl" ),
    			get( "ConnectionUser" ),
    			get( "ConnectionPass" )
    		);
    		stm = con.createStatement();
    		if ( !get( "ConnectionDbname" ).equals( "" ) ) {
    			stm.executeUpdate( "use " + get( "ConnectionDbname" ) );
    		}
     
    		put( "ERROR_CONNECT", "" );
    		return true;
    	}
    	catch( SQLException e ) {
    		put( "ERROR_CONNECT", e.getMessage() );
    		return false;
    	}
     
    }
     
    // *****************************************************
    // DB 接続解除
    // *****************************************************
    public void DisConnect( ) throws Exception {
     
    	try {
    		stm.close();
    		con.close();
    	}
    	catch( SQLException e ) {
    		put( "ERROR_DISCONNECT", e.getMessage() );
    	}
     
    }
     
    // *****************************************************
    // DB レコードセット取得
    // *****************************************************
    public ResultSet Query( String Query ) throws Exception {
     
    	ResultSet rs;
     
    	try {
    		rs = stm.executeQuery( Query );
    		put( "ERROR_SQL", "" );
    		return rs;
    	}
    	catch( SQLException e ) {
    		put( "ERROR_SQL", e.getMessage() );
    		return null;
    	}
     
    }
     
    // *****************************************************
    // DB 更新処理
    // *****************************************************
    public boolean Execute( String Query ) throws Exception {
     
    	try {
    		stm.executeUpdate( Query );
    		put( "ERROR_SQL", "" );
    		return true;
    	}
    	catch( SQLException e ) {
    		put( "ERROR_SQL", e.getMessage() );
    		return false;
    	}
     
    }
    


  • 使用例を以下に示します

  • <%@ page
    	language="java"
    	import="java.sql.*"
    	contentType="text/html;charset=shift_jis" %>
    <jsp:useBean id="my" scope="session" class="lightbox.webapp" />
    <%
    // *********************************************************
    // 内部データ用初期処理
    // *********************************************************
    	my.setApplication( application, "prog1" );
    	my.createShiftjisRequest( request );
     
    	if ( my.get( "send" ).equals( "キャンセル" ) ) {
    		my.clear();
    		response.sendRedirect( "sample1.jsp" );
    		return;
    	}
     
    %>
    <jsp:setProperty name="my" property="driverName"       value="sun.jdbc.odbc.JdbcOdbcDriver" />
    <jsp:setProperty name="my" property="connectionUrl"    value="jdbc:odbc:SysMySQL" />
    <jsp:setProperty name="my" property="connectionDbname" value="lightbox" />
    <jsp:setProperty name="my" property="connectionUser"   value="root" />
    <jsp:setProperty name="my" property="connectionPass"   value="" />
     
    <%
    	my.put( "ERROR_MESSAGE", "" );
     
    	if ( !my.Connect() ) {
    		my.log( my.get( "ERROR_CONNECT" ) );
    		my.put( "ERROR_MESSAGE", "接続エラーです : " + my.get("ERROR_CONNECT") );
    	}
    	else {
    		String Query = "select * from 商品マスタ where コード = '0001'";
    		ResultSet rset = my.Query( Query );
     
    		if ( rset != null ) {
    			rset.next();
    			my.put( "Field1", rset.getString("コード") );
    			my.put( "Field2", rset.getString("商品名") );
    			my.put( "Field3", rset.getString("単価") );
    		}
    		else {
    			my.put( "Field1", "" );
    			my.put( "Field2", "" );
    			my.put( "Field3", "" );
     
    			String Message = "データベースのエラーです : " + my.get("ERROR_SQL");
    			my.put( "ERROR_MESSAGE", Message );
    		}
     
    		my.DisConnect();
    	}
     
    %>
     
     
    <HTML>
    <BODY>
     
    <FORM method=post>
    Field1 <INPUT type=text name=Field1 value="<%= my.get("Field1") %>"><br>
    <HR size=1 color=black>
    Field2 <INPUT type=text name=Field2 value="<%= my.get("Field2") %>"><br>
    Field3 <INPUT type=text name=Field3 value="<%= my.get("Field3") %>"><br><br>
    <INPUT type=submit name=send value="送信"><br>
    <INPUT type=submit name=send value="キャンセル"><br>
    </FORM>
     
    <TEXTAREA cols=80 rows=10>
    <%= my.get("ERROR_MESSAGE") %>
    </TEXTAREA>
     
    </BODY>
    </HTML>
     
    <%-- ************************************************** --%>
     
    <jsp:getProperty name="my" property="debug" />