Restaurantアプリケーションのプログラム・リスト
 
| 
      | 
 
| 
   
  | 
 
 
Restaurantアプリケーションのプログラム・リスト
 
以下にプログラムを示すが、ここではこのアプリケーションのクラスの全てにRestaurantというプレフィックスをつけている。これはテスト環境でひとつのグループとしてまとめ易いためである。このアプリケーションのクラスはRestaurantMaster, RestaurantChef, RestaurantWaitress, RestaurantMenu, RestaurantMenuItem, RestaurantMenuBusyFlagの6クラスで、最初の3つがサーブレットである。より実際的なサンプルなので、少々長いが我慢して頂きたい。
 
| 
   import java.io.*; import java.util.*; import javax.servlet.*; import javax.servlet.http.*; /**  * Masterは本日のメニューに価格を設定するとともに  * わがままな顧客に対応する  * 作成日 : (01/08/13 14:52:25)  * @author: Terry  */ public class RestaurantMaster extends
  javax.servlet.http.HttpServlet { /**  * HTTP GET要求入口  */ public void
  doGet(javax.servlet.http.HttpServletRequest request,
  javax.servlet.http.HttpServletResponse response) throws javax.servlet.ServletException,
  java.io.IOException {  
  performTask(request, response); } /**  * HTTP POST要求入口  */ public void
  doPost(javax.servlet.http.HttpServletRequest request,
  javax.servlet.http.HttpServletResponse response) throws
  javax.servlet.ServletException, java.io.IOException {  
  performTask(request, response); } /**  * サーブレット情報の返し  */ public String getServletInfo() {  
  return "RestaurantChef, Version 1.0 by Terry"; } /**  * マスターが仕事についたらメニューのビジーフラグをセットする  */ public void init() {  
  ServletContext context = getServletContext();  
  if (context.getAttribute("menu") == null){     RestaurantMenu menu = new RestaurantMenu();     context.setAttribute("menu", menu);     RestaurantMenuBusyFlag menuBusyFlag = new
  RestaurantMenuBusyFlag();     context.setAttribute("menuBusyFlag",
  menuBusyFlag);  
  } } /**  * マスターの要求処理本体  */ public void
  performTask(HttpServletRequest request, HttpServletResponse response) {  
  try  
  {     if (request.getAttribute("Sender")
  == null)         //要求元がウェイトレスかどうかチェック     doEditMenu(request, response);     else doCustomerService(request, response);  
  }  
  catch(Throwable theException)  
  {  
  } } /**  * メニューに価格の設定  */ public void doEditMenu(HttpServletRequest
  request, HttpServletResponse response) {  
  try{     //応答ページ作成の準備     response.setContentType("text/html;
  charset=Shift_JIS");     response.setHeader("Cache-Control",
  "no-cache");   
  //ブラウザやProxyにキャッシングさせない     PrintWriter out = response.getWriter();    
  out.println("<HTML><HEAD><TITLE>Restaurant
  Master</TITLE>");     out.println("<META
  HTTP-EQUIV=\"pragma\" CONTENT=\"no-cache\">"); //本ページはキャッシングをさせない    
  out.println("</HEAD><BODY><H1>本日のメニューの価格設定</H1><PRE>");     //到来要求が最初のものかどうか調べる     HttpSession session = request.getSession();     session.setMaxInactiveInterval(360);               
  //このセッションのタイムアウトを秒で設定     //メニューのオブジェクトをコンテキストから取得  
    ServletContext
  context = getServletContext();     RestaurantMenu menu =
  (RestaurantMenu)context.getAttribute("menu");     RestaurantMenuBusyFlag menuBusyFlag =
  (RestaurantMenuBusyFlag)context.getAttribute("menuBusyFlag");     String url = "http://" + request.getRemoteAddr()
  + ":"  +
  request.getServerPort() + request.getRequestURI();     if (session.isNew())     { //初めて、このメニューを強引にロックする       while (menuBusyFlag.isBusyFlagOn()
  == true){        
  menuBusyFlag.freeBusyFlag();         try{          
  Thread.sleep(250);         }catch
  (InterruptedException e){}       }              menuBusyFlag.getBusyFlag();               
         //それからメニューをビジーに       //初期画面をクライアントにかえす       out.println("単価を記入");      
  out.println("</PRE>");       String url1 =
  response.encodeURL(url);           
  //このメソッドはWTEでは機能しないので現在使っていない       if
  (request.isRequestedSessionIdFromCookie()==false){         url1 = url + ";jsessionid=" +
  session.getId();       }       out.println("<FORM
  ACTION=\""+url1+"\" METHOD=\"POST\">");      
  out.println("<TABLE><TR><TH>アイテム</TH><TH>仕込(残り)数</TH><TH>単価</TH></TR>");       String[] repertory =
  menu.repertory;       for (int i=0;
  i<repertory.length; i++){         Enumeration selections
  = menu.keys();         while
  (selections.hasMoreElements()){           String
  selection = (String)selections.nextElement();          
  RestaurantMenuItem menuItem = (RestaurantMenuItem)menu.getItem(selection);           if
  (repertory[i] == menuItem.selection){            
  out.println("<INPUT TYPE=\"hidden\"
  NAME=\"Selections\"
  VALUE=\""+menuItem.selection+"\">");            
  out.println("<TR><TD>"+menuItem.selection+"</TD><TH>"
  + menuItem.stock + "</TH>");            
  out.println("<TD><INPUT TYPE=\"text\"
  MAXLENGTH=\"5\" NAME=\"Price\"
  VALUE=\""+menuItem.price+"\"</TD></TR>");           }         }       }      
  out.println("</TABLE></BODY></HTML>");      
  out.println("</TABLE>");       out.println("<INPUT TYPE=\"reset\"
  VALUE=\"リセット\">");       out.println("<INPUT
  TYPE=\"submit\" VALUE=\"送信\">");      
  out.println("</FORM></BODY></HTML>");     }     else     { //解答画面からの応答、メッセージの情報を保存       session.invalidate(); //セッションは1回のみ       String[] priceString = request.getParameterValues("Price");       String[] selections =
  request.getParameterValues("Selections");       RestaurantMenuItem menuItem;       for (int i=0;
  i<priceString.length; i++){         menuItem =
  menu.getItem(selections[i]);         //各menuItemオブジェクトを取得         int itemPrice;         try{ itemPrice =
  Integer.valueOf(priceString[i]).intValue();        
  }catch(NumberFormatException numberFormatError){itemPrice = 0;}         menuItem.price =
  itemPrice;        
  menu.addMenuItem(menuItem);            
  //menuItemオブジェクトをmenuオブジェクトに追加       }      
  context.setAttribute("menu", menu);      
  //Contextにmenuオブジェクトをセット         // HTMLボディの出力       out.println("<BODY>本日の設定価格です. 変更は再度入力してください<BR>");      
  out.println("<TABLE><TR><TH>アイテム</TH><TH>仕込数</TH><TH>単価</TH></TR>");       menu =
  (RestaurantMenu)context.getAttribute("menu");       String[] repertory =
  menu.repertory;       for (int i=0;
  i<repertory.length; i++){         Enumeration
  newSelections = menu.keys();         while
  (newSelections.hasMoreElements()){  
          String selection
  = (String)newSelections.nextElement();           menuItem =
  (RestaurantMenuItem)menu.getItem(selection);           if
  (repertory[i] == menuItem.selection){            
  out.println("<TR><TD>"+menuItem.selection+"</TD><TD
  ALIGN=\"right\">" + menuItem.stock +
  "</TD><TD ALIGN=\"right\">" + menuItem.price
  + "</TD></TR>");           }         }       }      
  out.println("</TABLE><FORM
  ACTION=\""+url+"\" METHOD=\"GET\">");       out.println("<INPUT
  TYPE=\"submit\" VALUE=\"設定価格変更\"></FORM></BODY></HTML>");
         //このメニューを開放する       menuBusyFlag.freeBusyFlag();     }     //バッファの明示的吐き出し     out.flush();     out.close();    
  }  
  catch(Throwable theException)  
  {  
  } } /**  * わがままな顧客への対応  */ public void
  doCustomerService(HttpServletRequest request, HttpServletResponse response) { try{  
  PrintWriter out = response.getWriter();  
  ServletContext context = getServletContext();  
  RestaurantMenu menu =
  (RestaurantMenu)context.getAttribute("menu");  
  String[] selections = (String[])request.getAttribute("Selections");  
  int[] numberOfTheSelection =
  (int[])request.getAttribute("Numbers");  
  RestaurantMenuItem menuItem;  
  for (int i=0; i<selections.length; i++){     if (numberOfTheSelection[i] != 0){       menuItem =
  menu.getItem(selections[i]);       if (menuItem.stock <
  numberOfTheSelection[i]){        
  out.println(selections[i] + " は "+ menuItem.stock + "しかおつくりできません<BR>");       }     }  
  }  
  out.println("ご注文をやり直してください(マスター)<BR>");  
  context.setAttribute("menu", menu);  } catch(Throwable theException){} }   }  | 
 
| 
   import java.io.*; import java.util.*; import javax.servlet.*; import javax.servlet.http.*; /**  * Chefはウェイトレスから顧客からの注文を受けるとともに  * 本日のメニューを作成する  * 作成日 : (01/08/13 14:52:25)  * @author: Terry  */ public class RestaurantChef extends
  HttpServlet {  
  public String[] repertory =  
  {  
  "Sweet Potato and Coconut Milk",//$8.00  
  "Tomato Basil Bisque With Grilled Lobster Tail",//$10.00  
  "Pan Seared Crab Cakes",//$12.00  
  "Pesto Shrimp",//$15.00  
  "Baked Goat Cheese",//$12.00  
  "Entree: Lamb",//$42.00  
  "Entree: Duck",//$34.00  
  "Braised Chilean Sea Bass",//$32.00  
  "Grilled Chicken and Italian Sausage",//$27.00  
  "Chipotle Marinated Shrimp With Rice and Salad",//$35.00  
  "Seared Beef Tenderloin",//$29.00  
  "Key Lime Pie"//$3.25  
  } ; /**  * 顧客が注文した料理を調理  */ public void doCook(HttpServletRequest
  request, HttpServletResponse response) { try{  
  PrintWriter out = response.getWriter();  
  ServletContext context = getServletContext();  
  RestaurantMenu menu = (RestaurantMenu)context.getAttribute("menu");  
  String[] selections =
  (String[])request.getAttribute("Selections");  
  int[] numberOfTheSelection =
  (int[])request.getAttribute("Numbers");  
  RestaurantMenuItem menuItem;  
  for (int i=0; i<selections.length; i++){     if (numberOfTheSelection[i] != 0){       out.println(selections[i] + "
  を "+ numberOfTheSelection[i] + "<BR>");       menuItem =
  menu.getItem(selections[i]);       menuItem.stock = menuItem.stock -
  numberOfTheSelection[i];       menu.addMenuItem(menuItem);     }  
  }  
  out.println("お造りしました(シェフ)<BR>");  
  context.setAttribute("menu", menu); } catch(Throwable theException){} } /**  * HTTP GET要求入口  */ public void doGet(HttpServletRequest
  request, HttpServletResponse response) throws ServletException,
  java.io.IOException {  
  performTask(request, response); } /**  * メニューの作成  */ public void doMakeMenu(HttpServletRequest
  request, HttpServletResponse response) {  
  try{     //応答ページ作成の準備     response.setContentType("text/html;
  charset=Shift_JIS");     response.setHeader("Cache-Control",
  "no-cache");          //ブラウザやProxyにキャッシングさせない     PrintWriter out = response.getWriter();    
  out.println("<HTML><HEAD><TITLE>RestaurantChef</TITLE>");     out.println("<META
  HTTP-EQUIV=\"pragma\" CONTENT=\"no-cache\">"); //本ページはキャッシングをさせない    
  out.println("</HEAD><BODY><H1>本日のメニュー作成</H1><PRE>");     ServletContext context = getServletContext();     RestaurantMenu menu =
  (RestaurantMenu)context.getAttribute("menu");     RestaurantMenuBusyFlag menuBusyFlag =
  (RestaurantMenuBusyFlag)context.getAttribute("menuBusyFlag");     String url = "http://" +
  request.getRemoteAddr() + ":" 
  + request.getServerPort() + request.getRequestURI();     //到来要求が最初のものかどうか調べる     HttpSession session = request.getSession();     session.setMaxInactiveInterval(300);               
  //このセッションのタイムアウトを秒で設定(5分間)     if (session.isNew())     {        //初めて、このメニューをロックする       menuBusyFlag.getBusyFlag();       //初期画面をクライアントにかえす       out.println("本日のセレクションを指定");      
  out.println("</PRE>");       String url1 =
  response.encodeURL(url);           
  //このメソッドはWTEでは機能しない       if
  (request.isRequestedSessionIdFromCookie()==false){         url1 = url +
  ";jsessionid=" + session.getId();       }       out.println("<FORM
  ACTION=\""+url1+"\" METHOD=\"POST\">");      
  out.println("<TABLE><TR><TH>選択</TH><TH>仕込数</TH></TR>");      
  for (int i=0; i<repertory.length; i++){         RestaurantMenuItem
  menuItem = new RestaurantMenuItem();         if
  (menu.getItem(repertory[i])==null){          
  menuItem.selection = repertory[i];          
  menuItem.stock = 0;         } else menuItem =
  menu.getItem(repertory[i]);         String checkedString
  ="";         if (menuItem.stock !=
  0) checkedString = "CHECKED";        
  out.println("<TR><TD><INPUT
  TYPE=\"checkbox\" NAME=\"Item\"
  VALUE=\""+i+"\" "+checkedString+">"+repertory[i]+"</TD>");         out.println("<TD><INPUT
  TYPE=\"text\" MAXLENGTH=\"6\" NAME=\"Stock\"
  VALUE=\""+menuItem.stock+"\"</TD></TR>");       }      
  out.println("</TABLE>");       out.println("<INPUT
  TYPE=\"reset\" VALUE=\"リセット\">");       out.println("<INPUT
  TYPE=\"submit\" VALUE=\"送信\">");      
  out.println("</FORM></BODY></HTML>");     }      else     { //解答画面からの応答、メッセージの情報を保存       session.invalidate(); //セッションは1回のみ       RestaurantMenu newMenu = new
  RestaurantMenu();       String[] itemsString =
  request.getParameterValues("Item");       String[] stockString =
  request.getParameterValues("Stock");       RestaurantMenuItem menuItem;       for (int i=0;
  i<itemsString.length; i++){         int itemNumber;         try{ itemNumber =
  Integer.valueOf(itemsString[i]).intValue();         }catch(NumberFormatException
  numberFormatError){itemNumber = 0;}         menuItem =
  menu.getItem(repertory[itemNumber]);         if (menuItem == null){           menuItem =
  new RestaurantMenuItem();          //各menuItemオブジェクトの生成         }         menuItem.selection =
  repertory[itemNumber];         try{ menuItem.stock =
  Integer.valueOf(stockString[itemNumber]).intValue();        
  }catch(NumberFormatException numberFormatError){menuItem.stock = 0;}        
  newMenu.put(menuItem.selection, menuItem);      //menuItemオブジェクトをmenuオブジェクトに追加       }       newMenu.repertory =
  repertory;                   
  //シェフが最初に立ち上がっていないときはこれがセットされていない       context.setAttribute("menu",
  newMenu);           
  //Contextにmenuオブジェクトをセット         // HTMLボディの出力        
  out.println("<BODY>本日のメニューです. 変更は再度入力してください<BR>");      
  out.println("<TABLE><TR><TH>アイテム</TH><TH>仕込数</TH></TR>");       menu =
  (RestaurantMenu)context.getAttribute("menu");       String[] repertory =
  menu.repertory;       for (int i=0;
  i<repertory.length; i++){         Enumeration selections
  = menu.keys();         while
  (selections.hasMoreElements()){           String
  selection = (String)selections.nextElement();           menuItem =
  (RestaurantMenuItem)menu.getItem(selection);           if
  (repertory[i] == menuItem.selection){            
  out.println("<TR><TD>"+menuItem.selection+"</TD><TH>"
  + menuItem.stock + "</TH></TR>");           }         }       }       out.println("</TABLE><FORM
  ACTION=\""+url+"\" METHOD=\"GET\">");       out.println("<INPUT
  TYPE=\"submit\" VALUE=\"メニュー変更\"></FORM></BODY></HTML>");       //このメニューを開放する       menuBusyFlag.freeBusyFlag();     }     //バッファの明示的吐き出し     out.flush();     out.close();    
  }   catch(Throwable theException)  
  {  
  } } /**  * HTTP POST要求入口  */ public void doPost(HttpServletRequest
  request, HttpServletResponse response) throws ServletException,
  java.io.IOException {  
  performTask(request, response); } /**  * サーブレット情報の返し  */ public String getServletInfo() {  
  return "RestaurantChef, Version 1.0 by Terry"; } /**  * シェフが仕事についたらメニューのビジーフラグをセットする  */ public void init() {  
  ServletContext context = getServletContext();  
  if (context.getAttribute("menu") == null){     RestaurantMenu menu = new RestaurantMenu();     menu.repertory =repertory;                         
  //シェフのレパートリーをセットする     context.setAttribute("menu", menu);     RestaurantMenuBusyFlag menuBusyFlag = new
  RestaurantMenuBusyFlag();     context.setAttribute("menuBusyFlag",
  menuBusyFlag);  
  } } /**  * シェフの要求処理本体  */ public void
  performTask(HttpServletRequest request, HttpServletResponse response) {  
  try  
  {     if (request.getAttribute("Sender")
  == null)         //要求元がウェイトレスかどうかチェック       doMakeMenu(request, response);     else doCook(request, response);  
  }  
  catch(Throwable theException)  
  {  
  } } }  | 
 
| 
   import java.io.*; import java.util.*; import javax.servlet.*; import javax.servlet.http.*; /**  * Waitressは顧客に対する窓口となり、注文を受ける。  * 作成日 : (01/08/16 10:08:29)  * @author: Terry  */ public class RestaurantWaitress extends
  HttpServlet { /**  * HTTP GET要求入口  */ public void
  doGet(javax.servlet.http.HttpServletRequest request,
  javax.servlet.http.HttpServletResponse response) throws
  javax.servlet.ServletException, java.io.IOException {  
  performTask(request, response); } /**  * HTTP POST要求入口  */ public void
  doPost(javax.servlet.http.HttpServletRequest request,
  javax.servlet.http.HttpServletResponse response) throws
  javax.servlet.ServletException, java.io.IOException {  
  performTask(request, response); } /**  * 顧客にメニューを提示し、注文の記入を依頼する  */ public void getOrder(PrintWriter out,
  HttpServletRequest request, HttpServletResponse response, RestaurantMenu
  menu, HttpSession session) {  
  out.println("<BR>メニューをどうぞ<BR>");  
  String url = "http://" + request.getRemoteAddr() +
  ":"  +
  request.getServerPort() + request.getRequestURI();  
  String url1 = response.encodeURL(url);  
  if (request.isRequestedSessionIdFromCookie()==false){     url1 = url + ";jsessionid=" +
  session.getId();  
  }  
  out.println("<FORM ACTION=\""+url1+"\"
  METHOD=\"POST\">");  
  out.println("<TABLE><TR><TH>本日のセレクション</TH><TH>値段</TH><TH>ご注文数</TH></TR>");  
  String[] repertory = menu.repertory;  
  for (int i=0; i<repertory.length; i++){     Enumeration newSelections = menu.keys();     while (newSelections.hasMoreElements()){       String selection =
  (String)newSelections.nextElement();       RestaurantMenuItem menuItem =
  (RestaurantMenuItem)menu.getItem(selection);       if (repertory[i] ==
  menuItem.selection){        
  out.println("<INPUT TYPE=\"hidden\"
  NAME=\"Selections\" VALUE=\""+menuItem.selection+"\">");        
  out.println("<TR><TD>"+menuItem.selection+"</TD><TD>"
  + menuItem.price + "</TD>");        
  out.println("<TD><INPUT TYPE=\"text\"
  MAXLENGTH=\"2\" NAME=\"Number\"
  VALUE=\"\"</TD></TR>");       }     }  
  }  
  out.println("</TABLE>");  
  out.println("<INPUT TYPE=\"reset\" VALUE=\"リセット\">");  
  out.println("<INPUT TYPE=\"submit\" VALUE=\"送信\"></FORM>"); } /**  * サーブレット情報の返し  */ public String getServletInfo() {  
  return "RestaurantWaitress, Version 1.0 by Terry"; } /**  * ウェイトレスが仕事についたらメニューのビジーフラグをセットする  */ public void init() {  
  ServletContext context = getServletContext();  
  if (context.getAttribute("menu") == null){     RestaurantMenu menu = new RestaurantMenu();     context.setAttribute("menu", menu);     RestaurantMenuBusyFlag menuBusyFlag = new
  RestaurantMenuBusyFlag();     context.setAttribute("menuBusyFlag",
  menuBusyFlag);  
  } } /**  * ウェイトレスの顧客からの要求処理本体  */ public void
  performTask(HttpServletRequest request, HttpServletResponse response) {  
  try  
  {     response.setContentType("text/html;
  charset=Shift_JIS");     response.setHeader("Cache-Control",
  "no-cache");   
  //ブラウザやProxyにキャッシングさせない     PrintWriter out = response.getWriter();     ServletContext context = getServletContext();     HttpSession session = request.getSession();     session.setMaxInactiveInterval(300);               
  //このセッションのタイムアウトを秒で設定    
  out.println("<HTML><HEAD><TITLE>Restaurant
  Waitress</TITLE>");     out.println("<META
  HTTP-EQUIV=\"pragma\"
  CONTENT=\"no-cache\">");  //本ページはキャッシングをさせない     out.println("<META
  HTTP-EQUIV=\"Expires\" CONTENT=\"-1\">");    
  out.println("</HEAD><BODY><H1>レストラン・クレス</H1><BR>");     RestaurantMenu menu =
  (RestaurantMenu)context.getAttribute("menu");     RestaurantMenuBusyFlag menuBusyFlag =
  (RestaurantMenuBusyFlag)context.getAttribute("menuBusyFlag");     if ((menu.isEmpty())||(menu.repertory ==
  null)){       out.println("申し訳ありません、開店の用意が出来ておりません。またお越しください。");      
  out.println("<BR>");     }     else {       //到来要求が最初のものかどうか調べる       if (session.isNew()){         //初めて、初期画面をクライアントにかえす        
  menuBusyFlag.getBusyFlag();                    
  //メニューをロックする         getOrder(out, request,
  response, menu, session);       } else{         while (true) {         //二回目のセッション、注文を受理する        
  request.setAttribute("Sender", "Waitress");     //要求元がウェイトレスであることの情報を付加         String[] numberString
  = request.getParameterValues("Number");   //要求内の注文数         if ((numberString ==
  null)||(numberString.length == 0)){        //正しくない注文への対策          
  out.println("申し訳ありません、もう一度注文をお願いします<BR>");           getOrder(out,
  request, response, menu, session);           break;         }         int[]
  numberOfTheSelection = new int[numberString.length];      //数量に変換した配列         String[] selections =
  request.getParameterValues("Selections"); //セレクションの配列         for (int i=0;
  i<numberString.length; i++){                     
  //数量に変換(非数は0扱い)           try{
  numberOfTheSelection[i] = Integer.valueOf(numberString[i]).intValue();          
  }catch(NumberFormatException
  numberFormatError){numberOfTheSelection[i] = 0;}         }  
        request.setAttribute("Selections",
  selections); //マスターやシェフのサーブレットに渡すために        
  request.setAttribute("Numbers", numberOfTheSelection);          //これらを要求の属性にする         RestaurantMenuItem
  menuItem;         int totalAmount = 0;         for (int i=0; i<selections.length;
  i++){        //顧客にこれを返すとともに注文数確認           if
  (numberOfTheSelection[i] != 0){            
  out.println(selections[i] + " を "+ numberOfTheSelection[i] +
  "<BR>");            
  menuItem = menu.getItem(selections[i]);     //各menuItemオブジェクトを取得            
  totalAmount = totalAmount + numberOfTheSelection[i] * menuItem.price;
  //会計の集計            
  if(menuItem.stock < numberOfTheSelection[i]){              
  request.setAttribute("Cause", "toMuchOrder");   //注文がストックを超えているときはフラグをたてる            
  }           }         }         out.println("ご注文頂きました(ウェイトレス)<BR>");         //マスターかシェフに要求を転送して応答作成の継続を依頼        
  if(request.getAttribute("Cause") ==
  "toMuchOrder"){            
  //マスターに顧客対応を依頼          
  context.getRequestDispatcher("/servlet/RestaurantMaster").include(request,
  response);          
  out.println("もう一度メニューをどうぞ(ウェイトレス)<BR>");          
  getOrder(out, request, response, menu, session);             
  //この場合はセッションは継続させる          
  menuBusyFlag.freeBusyFlag();                 
  //メニューのロックを開放         } else {                                        //シェフに調理を依頼          
  //out.println("getContextPath: " +
  request.getContextPath()); //このパスの後に続くパスをパラメタとする          
  context.getRequestDispatcher("/servlet/RestaurantChef").include(request,
  response);           session.invalidate();                        
  //この場合はセッションはこれで終了          
  menuBusyFlag.freeBusyFlag();                 
  //メニューのロックを開放          
  out.println("お食事をごゆっくりどうぞ(ウェイトレス)<BR>");          
  out.println("ご会計は" + totalAmount + "円になります、またお越しください(ウェイトレス)");           String url = "http://" +
  request.getRemoteAddr() + ":" 
  + request.getServerPort() + request.getRequestURI();          
  out.println("<FORM ACTION=\""+url+"\"
  METHOD=\"GET\">");          
  out.println("<INPUT TYPE=\"submit\" VALUE=\"新規顧客ご来店\"></FORM>");                  }         break;         }       }     }     // HTMLフッタの出力とバッファの明示的吐き出し    
  out.println("</BODY></HTML>");     out.flush();     out.close();  
  }  
  catch(Throwable theException)  
  {  
  } } }  | 
 
| 
   /**  * RestaurantMenuBusyFlagのクラス  * 同期ロックを使わないで競合を回避するためのフラグ  * Busyフラグを獲得するスレッドと開放するスレッドが異なる状況用  */ public class RestaurantMenuBusyFlag { private String busyflag = null;       
  //フラグとしてスレッドのストリングを使用   /* ビジーフラグを開放するメソッド */ public synchronized void freeBusyFlag() {  
  busyflag = null;          //フラグをクリアして  
  notify();            
  //待機中のスレッドに通知する } /* ビジーフラグを取得するメソッド */ public synchronized void getBusyFlag() {  
  while (tryGetBusyFlag() == false){   //すでにビジーであれば     try{       wait();           //解除を待つ     }catch (Exception e){}  
  } } /* busyフラグがまだオンかチェックする */ public synchronized boolean
  isBusyFlagOn() {  
  if (busyflag != null){     return true;  
  }  
  else return false; } /* ビジーフラグの取得を試みるメソッド */ public synchronized boolean
  tryGetBusyFlag() {  
  if (busyflag == null){    //まだセットされていなければ     busyflag = (Thread.currentThread()).toString();   //自分のスレッドの文字列をフラグにセット     return true;           
  //ビジーになったことを返す  
  }  
  if (busyflag == (Thread.currentThread()).toString()){ //自分セットしたフラグを再度セットしようとしている     return true;           
  //ビジー状態であることを返す  
  }  
  return false;            
  //他のスレッドがビジーフラグを取得していることを返す } }  | 
 
| 
   import java.util.*; /**  * MenuはMenuItemのハシュテーブルで構成する  * 作成日 : (01/08/13 13:50:40)  * @author: Terry  */ public class RestaurantMenu extends
  Hashtable {     public java.lang.String[] repertory; /**  * RestaurantMenu コンストラクター・コメント。  */ public RestaurantMenu() {     super(); } /**  * Menuにアイテムを追加する  */ public void
  addMenuItem(RestaurantMenuItem menuItem) {     put(menuItem.selection, menuItem);     } /**  * 料理名(selection)をキーにしてMenuItemを取得  */ public RestaurantMenuItem getItem(String
  selection) {     if (containsKey(selection) == true){         return
  (RestaurantMenuItem)get(selection);     } else     return null; } /**  * 本日の料理の列挙型を返す  */ public Enumeration getTodaysSelection() {     return keys(); } }  | 
 
| 
   /**  * MenuItemは料理名、仕込数、値段からなる  * 作成日 : (01/08/13 13:38:33)  * @author: Terry  */ public class RestaurantMenuItem { String selection; //料理名 int stock;        //仕込数 int price;        //値段 }  |