【 Webアプリケーション用のコア JavaBeans の作成 】
環境 |
アプリケーションとして登録した 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" />
|