概要
この記事では、Oracle データベースを例に、JSP 技術を使用して WEB アプリケーションを開発する際の、開発負荷の軽減と本体プログラム コードの提供を目的とした、シンプルで汎用的な帳票データの保存と処理方法を紹介します。
はじめに
J2EE (Java 2 Enterprise Edition) テクノロジは、Web アプリケーション開発で広く使用されています。JavaBean およびサーブレット テクノロジは、ページの表示に使用され、サーブレット テクノロジは多数のページの表示に使用されます。ビジネス プロセス。Bean を使用してデータと一部のビジネス処理を保存します。 WEB アプリケーションでは、ビジネス データをデータベースに保存する処理作業が非常に困難になることがよくあります。その主な形式の 1 つは、アプリケーションの処理プロセス全体で、このようなデータ保存操作が多数発生することです。フォームを処理する必要があるため、開発者は対応するデータ ストレージ プログラムを個別に作成する必要があり、多大な時間と労力がかかります。フォームデータストレージの開発負荷を軽減するためにどのような方法を使用するかは、研究する価値のある問題です。
2 つの一般的なフォーム データの保存および処理方法:
1. JSP ページ、JavaBean、またはサーブレットの各フォームに対応するプログラム コードを記述します
。 request.getparameter() 関数を使用して、フォームによって送信されたデータを 1 つずつ抽出するか、 setProperty メソッドを使用してデータを JavaBean に自動的にフェッチし、SQL ステートメント (挿入、更新、削除) を生成し、最後にexecuteupdate() 関数を実行してデータ テーブルの格納を完了します。
2. データ テーブルごとに JavaBean プログラム コードを自動的に生成します。
データベース システムは、ユーザーがテーブル構造を読み取ってキー フィールドを識別できるようにする必要があります。 PowerBuilder、Delphi などのオブジェクト指向の高速開発ツールを使用して、Java コード自動生成プログラムを開発します。このプログラムでは、データベーステーブルの構造(フィールド名、データ型、データ長)を読み取り、JavaBeanコードを自動生成します。このコードでは、テーブル内のフィールドに対応する同じ名前の変数を定義し、すべての変数に対して setValue メソッドと getValue メソッドを確立し、挿入、更新、削除の SQL ステートメントの生成と実行を処理する挿入、更新、および削除関数を確立します。とそれぞれ削除します。
フォームによって送信されたデータ処理ページで、次のコードを記述してフォーム データを JavaBean に格納します:
<jsp: useBean id="table" class="table1_bean" />
<jsp:setProperty name="table" property="*" />
(注: table1_bean は、上記の特定のテーブルに対応する自動生成された JavaBean です)
次に、table1_bean の挿入、更新、および削除関数を呼び出して、データ テーブルの格納を完了し、実行結果を返します。のように:
<%boolean success =table.insert(); %>
最初の方法はシンプルで直感的ですが、フォームごとに対応するデータ処理プログラムを作成する必要があります。やや大規模なアプリケーションの場合、フォームの数が多くなり、開発負荷が大きくなり、開発効率が低下することがあります。フィールドの追加や削除などテーブル構造が変更されると、対応するデータ処理プログラムを変更する必要があります。
2 番目の方法は、1 番目の方法よりもはるかに単純で、各データ テーブルのデータ処理は対応する JavaBean によって実装され、テーブル構造が変更された場合に、新しいデータ テーブルを再生成するだけで済みます。 JavaBeanをJavaでコンパイルした後に上書きすることで、オリジナルのJavaクラスを利用することができます。ただし、この方法ではJavaBean自動生成プログラムの開発が必要であり、テーブル構造が変更された場合にはJavaBeanを再生成してコンパイルする必要があります。
WEB アプリケーション開発において、フォームデータを保存するためのシンプルで汎用的な方法を紹介します
。多くのフォームは、フロントエンドブラウザ上で簡単なデータ検証を行った後、バックエンドサーバーに送信され、サーバーはデータを直接保存します。データベーステーブル。この場合、これらのフォームを均一に処理し、対応するデータ テーブルにデータを保存するプログラムを作成するだけです。この方法では、データベース システムがテーブル構造の読み取りとキー フィールドの識別をサポートすることも必要です。このプログラムの作成には JSP テクノロジを使用しており、プログラム ファイルの名前は DbdataStore.jsp です。
1. 呼び出し形式
Web ページ内のフォームの Action 呼び出し方法は以下のとおりです:
<Form Name=Frm1 Method=Post Action="DBdataStore.jsp? tablename=table1&OperType=…">
table1 はデータベーステーブルのテーブル名です。データの保存場所と OperType 操作には、挿入、更新、削除の 3 つのタイプがあります。
フォーム内の <input type=text name=…>、<textarea name=…><select name=…> の名前の値は、データ テーブルによって送信された対応するフィールド名と同じである必要があります。 DBdataStore.jsp でフォームが 1 つずつ抽出されます。フォームに入力が定義されておらず、結果の値が null 値の場合、フィールドは処理されません。
2. Oracle を例にしたビュー定義
1) テーブルの列ごとにデータ型ビューを作成
CREATE OR REPLACE VIEW v_dbstru AS SELECT table_name、column_name、data_type、data_length、data_precision、data_scale、column_id
FROM all_tab_columns WHERE owner='user1'; //user1 はデータ テーブルの所有者です。
2) テーブルのキー列ビューを作成します。
CREATE OR REPLACE VIEW v_pkey_column AS
SELECT b.テーブル名、b.列名、b.位置
FROM all_constraints a、all_cons_columns b
WHERE a.owner=b.owner AND a.constraint_name=b.constraint_name AND a.owner='user1' AND a.constraint_type='P';
3. メインプログラムコード
1) プログラムの初期化
String tablename=request.getParameter(" tablename"); //テーブル名を抽出する
String OperType=request.getParameter("OperType"); //操作タイプを抽出します。
String sFieldValue="";//フォームによって送信されたフィールド データ値を保存します
String fieldname="", Datatype="" //ストレージフィールド名、フィールドのデータ型
int iFieldvalue=0;
文字列 updateSql="", whereSql=" where ", insSql1="", insSql2="", opSql="", strSql="";
結果セット rs1=null、rs2=null;
insSql1="「+テーブル名+」に挿入 (";
insSql2="values(";
2) SQL ステートメントのキー フィールド部分を生成し
、
次のように挿入ステートメントのキー フィールド部分を生成します。
update および delete ステートメントを生成します。 where id=100; のような部分は、
操作タイプが update の場合、Web フォームのキー フィールドのデータは変更されません。
rs1=Stmt.executeQuery("SELECT column_name FROM v_pkey_column WHERE table_name='"+tablename+"'") //キーフィールド名を取得します。
while(rs1.next()){
フィールド名=rs1.getString("列名");
rs2=Stmt.executeQuery("SELECT data_type FROM v_dbstru WHERE table_name='"+tablename+"' AND column_name='"+fieldname+"'") //キー フィールドのデータ型を取得 if(rs2.next()){
データ型=rs2.getString("データ型");
sFieldValue=request.getParameter(フィールド名.toLowerCase());
//挿入文のキーフィールド部分を生成 if(OperType.equals("insert")){
insSql1+=フィールド名+",";
if((sFieldValue==null) ){
//キーフィールドのデータ値がフォームに送信されていない場合、この記事では数値型としてのみ処理し、データ値はシリアル番号に従って計算されます。
rs2= Stmt.executeQuery("SELECT max("+フィールド名+")+1 FROM "+テーブル名); iFieldvalue=rs2.getInt(1);" ; }else if(Datatype.equals("DATE")){
insSql2+= "To_Date('" + sFieldValue + "','YYYY-MM-DD'),";
}else if(Datatype.equals("VARCHAR2") || Datatype.equals("CHAR")){
insSql2+="'" + sFieldValue+"',";}
else /*NUMBER, FLOAT */ insSql2+=sFieldValue+","}
//更新および削除ステートメントを生成します。 where 部分: where fieldname=... AND
if(OperType.equals("update") || OperType.equals("delete")){
if(Datatype.equals("DATE")){
whereSql+=フィールド名+"=To_Date('" + sFieldValue + "','YYYY-MM-DD') AND ";
}else if(Datatype.equals("VARCHAR2") || Datatype.equals("CHAR")){
whereSql+=フィールド名+"='" + sFieldValue+"' AND ";}
else /*NUMBER, FLOAT */ whereSql+=fieldname+"="+ sFieldValue+" AND ";}
}
}
whereSql=whereSql.substring(0, whereSql.length()-4);
3) 非キー フィールド部分の SQL ステートメントは
、次のような更新ステートメント
を生成します。100 の
挿入ステートメント。次のようなものです。 insert into table1(id, column1,…)values(100, value1,…)
updateSql="update "+tablename+" set ";
strSql="SELECT 列名、データ型、データ長、データ精度、データスケール FROM v_dbstru a "+"where table_name='"+tablename+"' AND a.column_name not in (SELECT b.column_name FROM v_pkey_column b where b.table_name=a.table_name )";
rs1=Stmt.executeQuery(strSql); //非キーフィールドのフィールド名とデータ型を取得します。
while(rs1.next()){
fieldname=rs1.getString("column_name"); Datatype=rs1.getString("data_type"); sFieldValue=request.getParameter(fieldname.toLowerCase()); // フォームがフィールドの値を送信しない場合は無視します。フィールドの処理 if((sFieldValue!=null)){
//挿入ステートメント =insSql1+insSql2 を生成します。つまり、tablename(… と value(…) に挿入します)
if(OperType.equals("insert")){ insSql1+=フィールド名+",";
if(Datatype.equals("DATE")){
insSql2+= "To_Date('" + sFieldValue + "','YYYY-MM-DD'),";
} else if(Datatype.equals("VARCHAR2") || Datatype.equals("CHAR")){
insSql2+="'" + sFieldValue+"',";}else /*NUMBER,FLOAT*/ insSql2+= sFieldValue+",";}
//更新ステートメント=updateSql+whereSqlを生成します。つまり、テーブル名セットを更新します... where fieldname=... if(OperType.equals("update")){
if(Datatype.equals("DATE")){
updateSql+=フィールド名+"=To_Date('" + sFieldValue + "','YYYY-MM-DD'),";
}else if(Datatype.equals("VARCHAR2") || Datatype.equals("CHAR")){
updateSql+=fieldname+"='" + sFieldValue,1}+"',";}else /*NUMBER,FLOAT*/ updateSql+=fieldname+"="+sFieldValue+",";}))
rs1.close();
4) 完全な SQL ステートメントを生成し、
if(OperType.equals("insert"))
を実行します。
opSql=insSql1.substring(0, insSql1.length()-1)+")"+insSql2.substring(0, insSql2.length()-1)+")";
if(OperType.equals("更新"))
opSql=updateSql.substring(0, updateSql.length()-1)+" "+whereSql; if(OperType.equals("delete"))
opSql="delete FROM "+テーブル名+" "+whereSql;
//完全な SQL ステートメント opSql が生成されました
try{sqlnrows=Stmt.executeUpdate(opSql);}
catch(SQLException e){out.println("SQLException:"+opSql);}
4. 特徴
このメソッドは、直接保存されたすべてのフォームに対してこのプログラムを一律に使用します。これは普遍的であり、すべてのフォームまたはすべてのフォームに使用する必要はありません。対応するプログラムはデータ テーブル用に独自に開発されており、開発負荷は非常に小さく、呼び出しは非常に簡単です。同時に、テーブル構造が変更された場合でも、DBdataStore.jsp プログラムを変更する必要はありません。このプログラムはサーブレットとして書き直すこともでき、呼び出し形式は <Form Name=Frm1 Method=Post Action="DBdataStoreServelet?tablename=table1&OperType=…"> となります。
結論
Web アプリケーションで、送信後にフォーム データのさらなるデータ検証またはサーバー バックグラウンドでの処理が必要な場合は、2 番目の方法を使用する必要があります。ただし、多くの場合、ユーザーはフォームにデータを入力または変更し、JavaScript を使用してフロントエンド ブラウザーでデータを確認または処理し、バックエンド サーバーでは処理が行われず、データが送信されます。フォームによってデータベースに直接保存されます。現時点では、3 番目の方法を使用するのは非常に簡単で、開発者の作業負荷を大幅に軽減できます。