トップ画面 処理選択のメニュー画面です。

「ABC」は、入力されたID名を表示させています。
中段に選択メニューを、
下段には現在登録されているデータ一覧が表示されております。

マウスクリックにより次の各画面に遷移します。

Javaで必要なファイル
ファイル名概説機能説明
top.jsp表示する画面フォームと項目が一致している必要があります
TopAction.java処理ロジックトップ画面を起動するクラス
TopDispatchAction.java ボタンが押された時に実行されるクラス

全体で共通使用するファイル
ファイル名(共通使用する)概説機能説明
NametableForm.javaフォーム定義データベース表示情報
UserId.java ユーザーID
NameTable.javaデータベース定義データベースデータを格納する為のクラス
FrmaplDefine.java定数の定義frmapl固有の定数
SetCharacterEncodingFilter.javaエンコード文字エンコード
   
struts-config.xml動作の関連付けjsp・action・formを連携させる
web.xml基本的な設定
MessageResources.propertiesメッセージ定義
ログインでは、あえて省略しましたが共通で使っているものが存在しています。
単独の部品サンプルでなく、アプリサンプルですので各クラス間の連携なども考慮する必要がでてきます。


Java遷移
Javaでは、『 画面(jsp)の起動 』と『 クラス(java)の起動 』ができますが、これが利点と同時に難解にしている原因でもあるようです。
例えば、PHP(CGI)ではサーバーが全ての処理をおこなってHTMLを出力します。
しかし、JavaではJSPを出力できます。 するとJSPは必要なデータを自分で集める必要があります。
データはrequest内のformに準備しておく必要がありますが、それを作成するのはクラスです。


top.jsp


入力されたユーザID値をセッションから取り出して表示させております。



表示メッセージを取り出して表示する。
「表示」と「追加」は、リンクにより遷移させています。
「削除」と「変更」は、ボタンにより遷移させています。




設定されているデータ数を取り出して表示する。
データ本体を表示する。


NametableForm.java

package frmapl; public final class NametableForm extends ActionForm { private String f_id = ""; private String f_yomigana = ""; private String f_name = ""; private String f_telphone = ""; private String f_fax = ""; private String f_zip = ""; private String f_address = ""; private String f_remarks = ""; private String id_number = ""; public void setId( String value) { this.f_id = value; } public String getId() { return this.f_id; } public void setYomigana( String value) { this.f_yomigana = value; } public String getYomigana() { return this.f_yomigana; } public void setName( String value) { this.f_name = value; } public String getName() { return this.f_name; } public void setTelphone( String value) { this.f_telphone = value; } public String getTelphone() { return this.f_telphone; } public void setFax( String value) { this.f_fax = value; } public String getFax() { return this.f_fax; } public void setZip( String value) { this.f_zip = value; } public String getZip() { return this.f_zip; } public void setAddress( String value) { this.f_address = value; } public String getAddress() { return this.f_address; } public void setRemarks( String value) { this.f_remarks = value; } public String getRemarks() { return this.f_remarks; } /* 選択したデータ番号 */ public void setId_number(String number) { this.id_number = number; } public String getId_number() { return this.id_number; } }

アクセッサだけです。
「id_number」は、削除と変更のときに、選択されたID番号として使います。

TopAction.java

package frmapl; import frmapl.UserId; import mypackage.NameTable; import java.sql.*; import java.util.*; import javax.sql.*; import javax.servlet.*; import javax.servlet.http.*; import org.apache.struts.*; import org.apache.struts.action.*; import org.apache.struts.validator.*; import java.io.*; import javax.naming.*; public final class TopAction extends Action { boolean success_flag = false; //正常(true) or 異常(false)の終了状態フラグ public ActionForward execute( ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response ) throws SQLException, Exception { Connection conn = null; PreparedStatement stmt = null; ResultSet rs = null; try { // データベース情報を取り出す NametableForm dform = (NametableForm)form; InitialContext ic = new InitialContext(); DataSource ds = (DataSource)ic.lookup("java:comp/env/MySQL_DBCP"); conn = ds.getConnection(); // データベースからデータを抽出 { ArrayList refList = new ArrayList(); if (conn != null) { String strSQL = "select * from nametable order by id asc"; stmt = conn.prepareStatement( strSQL ); rs = stmt.executeQuery(); while (rs.next()) { NameTable refNameTable = new NameTable(); { refNameTable.setId( rs.getString("id") ); refNameTable.setYomigana( rs.getString("yomigana") ); refNameTable.setName( rs.getString("name") ); refNameTable.setTelphone( rs.getString("telphone") ); refNameTable.setFax( rs.getString("fax") ); refNameTable.setZip( rs.getString("zip") ); refNameTable.setAddress( rs.getString("address") ); refNameTable.setRemarks( rs.getString("remarks") ); } refList.add( refNameTable ); } } request.setAttribute( "NameList", refList); } success_flag=true; //正常(true)終了 } catch (SQLException e) { throw e; } catch (Exception e) { throw e; } finally{ if (conn != null) { conn.close(); } if (stmt != null) { stmt.close(); } if (rs != null) { rs.close(); } } //ファイナル判定 if (success_flag == true) { return (mapping.findForward("success")); } else { return (mapping.findForward("error")); } } }

●Connection などは、エラー後処理ができるように外で定義します。
●DBCPに接続してデータベースを読み出します。
●読み出したデータは、配列展開してrequestに保存します。
●try catch でエラーキャッチしています。
●終了状態を判断して(正常か異常)フォワード先を替えています。。
(注意)ログインで組込まなかったエラー処理をおこなっていますが、メッセージは未作成です。

TopDispatchAction.java

package frmapl; import frmapl.UserId; import frmapl.FrmaplDefine; import mypackage.NameTable; import java.sql.*; import java.util.*; import javax.sql.*; import javax.servlet.*; import javax.servlet.http.*; import org.apache.struts.actions.DispatchAction; import org.apache.struts.*; import org.apache.struts.action.*; import org.apache.struts.validator.*; import java.io.*; import javax.naming.*; public class TopDispatchAction extends DispatchAction { /* * */ public ActionForward dbDelete( ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response ) throws Exception, ServletException, IOException { boolean fg = isCancelled(request); if (fg){ return (mapping.findForward("cancel")); } else { int end_fg = this.dbSelect(mapping, form, request, response); if (end_fg == FrmaplDefine.OK) { return (mapping.findForward("dbDelete")); } else { //データ無しはエラーにしている if (end_fg == FrmaplDefine.DB_NOTFOUND) { ActionErrors errors = new ActionErrors(); errors.add("", new ActionMessage("errors.invalid","データなし、ID番号")); saveErrors(request, errors); } else { } return (mapping.findForward("error")); } } } /* * */ public ActionForward dbChange( ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response ) throws Exception, ServletException, IOException { boolean fg = isCancelled(request); if (fg){ return (mapping.findForward("cancel")); } else { int end_fg = this.dbSelect(mapping, form, request, response); if (end_fg == FrmaplDefine.OK) { return (mapping.findForward("dbChange")); } else { return (mapping.findForward("error")); } } } /* * 指定されたID番号の情報をデータベースから取り出す。 */ public int dbSelect( ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response ) throws Exception, ServletException, IOException { int success_flag = FrmaplDefine.NG; //正常や異常の終了状態フラグ Connection conn = null; PreparedStatement stmt = null; ResultSet rs = null; try { // ID番号情報を取り出すための準備 NametableForm dform = (NametableForm)form; InitialContext ic = new InitialContext(); DataSource ds = (DataSource)ic.lookup("java:comp/env/MySQL_DBCP"); conn = ds.getConnection(); // データベースからデータを抽出 { ArrayList refList = new ArrayList(); if (conn != null) { String strSQL = "select * from nametable where id=? "; stmt = conn.prepareStatement( strSQL ); stmt.setString(1, dform.getId_number()); //入力ID番号値を取得する rs = stmt.executeQuery(); if (rs.first() != false) { //データ在りか NameTable refNameTable = new NameTable(); { refNameTable.setId( rs.getString("id") ); refNameTable.setYomigana( rs.getString("yomigana") ); refNameTable.setName( rs.getString("name") ); refNameTable.setTelphone( rs.getString("telphone") ); refNameTable.setFax( rs.getString("fax") ); refNameTable.setZip( rs.getString("zip") ); refNameTable.setAddress( rs.getString("address") ); refNameTable.setRemarks( rs.getString("remarks") ); } refList.add( refNameTable ); request.setAttribute( "NameList", refList); success_flag = FrmaplDefine.OK; //正常終了 } else { success_flag = FrmaplDefine.DB_NOTFOUND; //データなし } } } } catch (SQLException e) { throw e; } catch (Exception e) { throw e; } finally{ if (conn != null) { conn.close(); } if (stmt != null) { stmt.close(); } if (rs != null) { rs.close(); } } return (success_flag); } }

●削除と変更ボタンが押された時に呼び出されるメソッドです。
●データベース一覧は共通で必要なのでメソッドを分けて作成してあります。
●終了状態を判断して(正常か異常)フォワード先を替えています。
(注意)エラー処理をおこないメッセージまで作成させています。

●finallyはエラーをcatchした場合に最後に実行される部分です。
エラーでは後処理をおこなっていますが、正常の場合には未後処理というおかしなロジックですが、処理部分の見安さを考えて入れておりません。


FrmaplDefine.java

/* * * frmaplの定数を定義するクラス * * 使用方法: * import frmapl.FrmaplDefine; * return(FrmaplDefine.OK); * */ package frmapl; public class FrmaplDefine { public final static int OK = 0; public final static int NG = 1; public final static int CANCEL = 2; public final static int NOTFOUND = 3; public final static int DB_NOTFOUND = 4; private FrmaplDefine() {} // インスタンス化させない }

Frmaplの共通定数を作成しました。


struts-config.xml


●トップメニュー画面部分のみの抜粋です。
●ボタンフォームで指定したアクションクラスの動作を定義しています。