概要 この記事では、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.table_name, b.column_name, b.position FROM all_constraints a, all_cons_columns b WHERE a.owner=b.owner AND a.constraint_name=b.constraint_nameかつ .owner='user1' かつ a.constraint_type='P'; |
3. メインプログラムコード
1) プログラムの初期化
String tablename=request.getParameter("tablename"); //テーブル名を抽出
String OperType=request.getParameter("OperType"); //操作タイプを抽出
String sFieldValue="";/ /フォームで送信されたフィールド データ値を保存します。
String fieldname="", Datatype="" //フィールド名、フィールド データ型を保存します。
int iFieldvalue=0;
whereSql=" where ", insSql1=" ", insSql2 ="", opSql="", strSql ="";
ResultSet rs1=null, rs2=null;
insSql1="insert into "+tablename+" (";
insSql2="values(";
2) SQL 文の生成キー フィールド
挿入ステートメントのキー フィールド部分を部分的に生成します。例: insert into table1(id andvalues(100));
キー フィールドのみを使用して更新ステートメントと削除ステートメントを生成します。例: where id=100 ;
操作タイプが更新の場合、Web フォームのキー フィールドのデータは変更されません。
rs1=Stmt.executeQuery("SELECT 列名 FROM v_pkey_column WHERE テーブル名='"+テーブル名+"'"); //キーフィールド名を取得 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 "+テーブル名); rs2.next();iFieldvalue=rs2.getInt(1);insSql2+=Integer.toString(iFieldvalue)+","; }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 ステートメントの非キー フィールド部分は
、次のような更新ステートメントを生成します: update table1 set column1=value1,… where id=100
insert ステートメント、たとえば: insert into table1 (id, column1,…) names (100, 値1,…)
updateSql="更新 "+テーブル名+" セット "; strSql="SELECT 列名、データ型、データ長、データ精度、データスケール FROM v_dbstru a "+"where table_name='"+tablename+"' かつ、 a.column_name が (SELECT b.column_name FROM v_pkey_column b where b.table_name=a.table_name)"; rs1=Stmt.executeQuery(strSql); //非キーフィールドのフィールド名とデータ型を取得します while(rs1.next()){ フィールド名=rs1.getString("列名"); データ型=rs1.getString("データ型"); sFieldValue=request.getParameter(フィールド名.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 フィールド名=... if(OperType.equals("update")){ if(Datatype.equals("DATE")){ updateSql+=フィールド名+"=To_Date('" + sFieldValue + "','YYYY-MM-DD'),"; }else if(Datatype.equals("VARCHAR2") || Datatype.equals("CHAR")){ updateSql+=フィールド名+"='" + sFieldValue,1}+"',";}else /*NUMBER,FLOAT*/ updateSql+=フィールド名+"="+sFieldValue+",";})) rs1.close(); |
4) 完全な SQL ステートメントを生成し、実行します。
if(OperType.equals("挿入")) 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 番目の方法を使用するのは非常に簡単で、開発者の作業負荷を大幅に軽減できます。