オブジェクト指向でやる場合の最初から最後までの流れを、実際の例を挙げて書いていくシリーズ「オブジェクト指向で開発の最初から最後までの手順例」
現在、「いままでのまとめ」にある、「(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)の話です。