オブジェクト指向でやる場合の最初から最後までの流れを、実際の例を挙げて書いていくシリーズ「オブジェクト指向で開発の最初から最後までの手順例」
現在、「いままでのまとめ」にある、「(4)フレームワークにもとづき、クラスなどの開発手順、雛形の確定」をやっています。
で、作らなきゃいけない雛形などのうち、現在、「コントローラー」についてやっていて、そのコントローラーのサンプルの、編集型と検索型を作り、前回は仕様書もつくったので、今回は、その仕様書をもとに、雛形ソースをつくります。
■雛形ソースの概要
雛形ソースも、サンプル同様、編集型と検索型の2種類あります。
で、これらどちらも、サンプルでは、引数に関しては、ビューから受け取ったもの全部をモデルに渡し、モデルから受け取ったもの全部を、ビューに返して(XMLに書き出して)います。なので、仕様書の引数のところは関係ないものとします。
そうすると、編集型と検索型のどちらも、変更箇所は、以下のとおり
・public class $#$CELL D3$#$ extends HttpServletと、クラス名を変更
・「主処理:処理を実行する」ところ
$#$CELL D5$#$ obj = new $#$CELL D5$#$(); int kekka = obj.$#$CELL H5$#$(map);
と変更(検索型の場合、intではなく、返り値はVector)
■雛形ソース(編集型)
そーすると雛形ソースの編集型(返り値は、エラーコードまたは正常終了のときの0のみでいいもの)は、以下のようになります。
import java.io.*; import java.util.*; import javax.servlet.*; import javax.servlet.http.*; public class $#$CELL D3$#$ extends HttpServlet { /* * サーブレットが入ってくるところ<BR> */ public void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //============================================// //前処理:データをハッシュマップに全部入れる // //============================================// HashMap map = new HashMap(); //セッション開始 HttpSession session = request.getSession(true); // セッションのデータを全部ハッシュマップに移す Enumeration namelist = session.getAttributeNames(); if ( namelist != null ) { while(namelist.hasMoreElements() == true ) { String key = (String)namelist.nextElement(); key = new String(key); map.put(key,session.getAttribute(key)); } } // 画面からのrequestデータを全部ハッシュマップに入れる request.setCharacterEncoding("utf-8"); Enumeration namelist2 = request.getParameterNames(); if ( namelist2 != null ) { while(namelist2.hasMoreElements() == true ) { String key = (String)namelist2.nextElement(); key = new String(key); map.put(key,request.getParameter(key)); } } //==============================// // 主処理:処理を実行する // //==============================// $#$CELL D5$#$ obj = new $#$CELL D5$#$(); int kekka = obj.$#$CELL H5$#$(map); //==============================// // 後処理:結果をセットする // //==============================// // (1)セッションセット if ( kekka == 0 ) { String[] mapKeyList = (String [])map.keySet().toArray(); for(int i = 0 ; i < mapKeyList.length ; i ++ ) { if ( mapKeyList[i].indexOf("*session")>= 0 ) { session.setAttribute (mapKeyList[i],map.get(mapKeyList[i])); } } } // (2)結果をXMLで返す // (2)-1 ContentTypeを設定 response.setContentType("text/xml; charset=utf-8"); response.addHeader("Cache-Control", "no-cache"); response.addHeader("Pragma", "no-cache"); // (2)-2 出力用PrintWriterを取得 PrintWriter out = response.getWriter(); // (2)-3 出力 out.println("<?xml version='1.0' encoding='UTF-8' ?>"); out.println("<kekka xml:lang='ja'>"); out.println("<retcode>"+kekka + "</retcode)"); out.println("</kekka>"); } } |
(上記< > =は、本当は半角)
■雛形ソース(検索型)
一方、雛形ソースの検索型(返り値は、検索結果複数アイテム)は、以下のようになります。
import java.io.*; import java.util.*; import javax.servlet.*; import javax.servlet.http.*; public class $#$CELL D3$#$ extends HttpServlet { /* * サーブレットが入ってくるところ<BR> */ public void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //==============================================// // 前処理:データをハッシュマップに全部入れる // //==============================================// HashMap map = new HashMap(); //セッション開始 HttpSession session = request.getSession(true); // セッションのデータを全部ハッシュマップに移す Enumeration namelist = session.getAttributeNames(); if ( namelist != null ) { while(namelist.hasMoreElements() == true ) { String key = (String)namelist.nextElement(); key = new String(key); map.put(key,session.getAttribute(key)); } } // 画面からのrequestデータを全部ハッシュマップに入れる request.setCharacterEncoding("utf-8"); Enumeration namelist2 = request.getParameterNames(); if ( namelist2 != null ) { while(namelist2.hasMoreElements() == true ) { String key = (String)namelist2.nextElement(); key = new String(key); map.put(key,request.getParameter(key)); } } //==============================// // 主処理:処理を実行する // //==============================// $#$CELL D5$#$ obj = new $#$CELL D5$#$(); Vector kekka = obj.$#$CELL H5$#$(map); //==============================// // 後処理:結果をセットする // //==============================// // (1)セッションセット String[] mapKeyList = (String [])map.keySet().toArray(); for(int i = 0 ; i < mapKeyList.length ; i ++ ) { if ( mapKeyList[i].indexOf("*session") >= 0 ) { session.setAttribute (mapKeyList[i],map.get(mapKeyList[i])); } } // (2)結果をXMLで返す // (2)-1 ContentTypeを設定 response.setContentType("text/xml; charset=utf-8"); response.addHeader("Cache-Control", "no-cache"); response.addHeader("Pragma", "no-cache"); // (2)-2 出力用PrintWriterを取得 PrintWriter out = response.getWriter(); // (2)-3 出力 out.println("<?xml version='1.0' encoding='UTF-8' ?>"); out.println("<kekka xml:lang='ja'>"); if ( kekka == null ) { out.println("<retcode>-1</retcode)"); } else { out.println("<retcode>0</retcode)"); for(int i = 0 ; i < kekka.size() ; i ++ ) { HashMap rec = (HashMap)kekka.elementAt(i); out.println("<item>"); String[] key = (String[])rec.keySet().toArray(new String[0]); for(int j = 0 ; j < key.length ; j ++ ) { out.println("<"+ key[i] + ">"); out.println(rec.get(key[i]).toString()); out.println("</"+ key[i] + ">"); } out.println("</item>"); } } out.println("</kekka>"); } } |
(上記< > =は、本当は半角)
今回、テストしてないので、何か間違ったところがあったらごめんなさい。
あと、ここで示したような自動変換のExcelファイルを使えば、仕様書から上記雛形をもとに、サーブレットをじゃんじゃん?作成してくれる「はず」です。
ということで、コントローラー(サーブレット)の部分の雛形は終わりです。
次回からは、画面(View)の話です。