BookServlet クラスを編集する

最後に、サーブレット・クラスで適切なメソッドを実装して、そのメソッドに渡された状態を正しく読み取り、BookWrapper 上で適切なメソッドを実行してから、返された値をユーザに渡す必要があります。

  1. BookServlet.cbl ファイルを開きます。
  2. 次の指令をファイルの先頭に追加します。
          $set ilusing"java.io"
    $set ilusing"java.util"
    $set ilusing"com.microfocus.cobol.program"
  3. 次の 78 項目を既存の項目の下に追加します。
           78 submitParameter      value "submit".
           78 readParameter        value "Read".
           78 addParameter         value "Add".
           78 deleteParameter      value "Delete".
           78 nextParameter        value "Next".
           78 errorVal             value "ERROR".
           78 defaultVal           value "DEFAULT".
  4. 次のユーティリティー関数を追加します。
           method-id outputBook private.
           procedure division using by value req as type HttpServletRequest
                                             res as type HttpServletResponse
                                             book as type Book.
               if book <> null
                   invoke req::setAttribute(stockNoAttribute   book::StockNumber::trim())
                   invoke req::setAttribute(titleAttribute     book::Title::trim())
                   invoke req::setAttribute(authorAttribute    book::Author::trim())
                   invoke req::setAttribute(typeAttribute      book::Type::trim())
                   invoke req::setAttribute(priceAttribute     "" & book::RetailPrice)
                   invoke req::setAttribute(onHandAttribute    "" & book::NumberOnHand)
                   invoke req::setAttribute(soldAttribute      "" & book::NumberSold)
                   invoke req::setAttribute(stockValAttribute  "" & book::StockValue)
               else
                   invoke req::setAttribute(stockNoAttribute   "****")
                   invoke req::setAttribute(titleAttribute     "*************************************")
                   invoke req::setAttribute(authorAttribute    "*************************************")
                   invoke req::setAttribute(typeAttribute      "****")
                   invoke req::setAttribute(priceAttribute     "****")
                   invoke req::setAttribute(onHandAttribute    "****")
                   invoke req::setAttribute(soldAttribute      "****")
                   invoke req::setAttribute(stockValAttribute  "****")
               end-if
               
               goback.
           end method.
           method-id outputBlankBook private.
           01 book     type Book value new Book.
           procedure division using by value req as type HttpServletRequest
                                             res as type HttpServletResponse.
               set book::StockNumber to ""
               set book::Title to ""
               set book::Author to ""
               set book::Type to ""
               set book::RetailPrice to 0
               set book::NumberOnHand to 0
               set book::NumberSold to 0
               
               invoke self::outputBook(req res book)
               
               goback.
           end method.
           method-id outputException private.
           01 msg              string.
           procedure division using by value req as type HttpServletRequest
                                             res as type HttpServletResponse
                                             e as type Exception.
               set msg to e::getClass()::getName() & " [" & e::getMessage() & "]"
               invoke self::outputError(req res msg)
           end method.
           method-id outputError private.
           01 book     type Book value new Book.
           procedure division using by value req as type HttpServletRequest
                                             res as type HttpServletResponse
                                             msg as string.
               invoke req::setAttribute(stockNoAttribute   "****")
               invoke req::setAttribute(titleAttribute     msg)
               invoke req::setAttribute(authorAttribute    "*************************************")
               invoke req::setAttribute(typeAttribute      "****")
               invoke req::setAttribute(priceAttribute     "****")
               invoke req::setAttribute(onHandAttribute    "****")
               invoke req::setAttribute(soldAttribute      "****")
               invoke req::setAttribute(stockValAttribute  "****")
               
               goback.
           end method.
           method-id getParamsAsBook private.
           01 stockNoStr   string.
           01 titleStr     string.
           01 authorStr    string.
           01 typeStr      string.
           01 priceStr     string.
           01 onHandStr    string.
           01 soldStr      string.
           procedure division using by value req as type HttpServletRequest
                                             res as type HttpServletResponse
                              returning book as type Book.
               set book to new Book
               
               set stockNoStr to req::getParameter(stockNoAttribute)
               if stockNoStr = null
                   set stockNoStr to errorVal
               end-if
               set book::StockNumber to stockNoStr
               
               set titleStr to req::getParameter(titleAttribute)
               if titleStr = null
                   set titleStr to errorVal
               end-if
               set book::Title to titleStr
               
               set authorStr to req::getParameter(authorAttribute)
               if authorStr = null
                   set authorStr to errorVal
               end-if
               set book::Author to authorStr
               
               set typeStr to req::getParameter(typeAttribute)
               if typeStr = null
                   set typeStr to errorVal
               end-if
               set book::Type to typeStr
               
               set priceStr to req::getParameter(priceAttribute)
               if priceStr = null
                   set priceStr to errorVal
               end-if
               set book::RetailPrice to type ScaledInteger::parseScaledInteger(priceStr)
               
               set onHandStr to req::getParameter(onHandAttribute)
               if onHandStr = null or onHandStr::length() = 0
                   set onHandStr to "0"
               end-if
               set book::NumberOnHand to type Integer::parseInt(onHandStr)
               
               set soldStr to req::getParameter(soldAttribute)
               if soldStr = null  or onHandStr::length() = 0
                   set soldStr to "0"
               end-if
               set book::NumberSold to type Integer::parseInt(soldStr)
               
           end method.
  5. 下記のメソッドを追加します。このメソッドは、ストック番号 ID を適切な HTTP パラメータから取得し、ラッパ・クラスで Read() メソッドを呼び出し、あらかじめ定義された出力メソッドを使用して最後にブックを出力します。例外がスローされた場合は、エラー処理出力メソッドが呼び出されます。
           method-id performRead private.
           01 bookId       string.
           01 book         type Book.
           01 e            type Exception.
           procedure division using by value req as type HttpServletRequest
                                             res as type HttpServletResponse.
               set bookId to req::getParameter(stockNoAttribute)
               if bookId = null
                   set bookId to errorVal
               end-if
               
               try
                   set book to type Book::Read(bookId)
                   invoke self::outputBook(req res book)
               catch e
                   invoke self::outputException(req res e)
               end-try
           
               goback.
           end method.
  6. doProcessing() メソッドを下記のコードに置き換えます。その結果、このメソッドは、どの関数を実行するのかを伝えるサブミット・パラメータの値を取得するようになります。
           method-id doProcessing protected.
           01 viewUrl      string value "/BookJsp.jsp".
           01 dispatcher   type RequestDispatcher.
           01 subValue     string.
           procedure division using by value req as type HttpServletRequest
                                             res as type HttpServletResponse
                                             isGet as condition-value.       
               set subValue to req::getParameter(submitParameter)
               
               if subValue = null
                   set subValue to defaultVal
               end-if
               
               evaluate true
               when subValue::equals(readParameter)
                   invoke self::performRead(req res)
               when subValue::equals(addParameter)
                   invoke self::performAdd(req res)
               when subValue::equals(deleteParameter)
                   invoke self::performDelete(req res)
               when subValue::equals(nextParameter)
                   invoke self::performNext(req res)
               when other
                   invoke self::outputBlankBook(req res)
               end-evaluate
    
               set dispatcher to self::getServletContext()::getRequestDispatcher(viewUrl)
               invoke dispatcher::forward(req res)
    
               goback.
           end method.
  7. 下記のメソッドを追加します。
           method-id performAdd private.
           01 book         type Book.
           01 e            type Exception.
           procedure division using by value req as type HttpServletRequest
                                             res as type HttpServletResponse.
               try
                   set book to self::getParamsAsBook(req res)
                   set book to type Book::Add(book)
                   invoke self::outputBook(req res book)
               catch e
                   invoke self::outputException(req res e)
               end-try
           
               goback.
           end method.
           method-id performDelete private.
           01 book         type Book.
           01 e            type Exception.
           procedure division using by value req as type HttpServletRequest
                                             res as type HttpServletResponse.
               try
                   set book to self::getParamsAsBook(req res)
                   set book to type Book::Delete(book::StockNumber)
                   invoke self::outputBook(req res null)
               catch e
                   invoke self::outputException(req res e)
               end-try
           
               goback.
           end method.   
           method-id performNext private.
           01 book         type Book.
           01 e            type Exception.
           procedure division using by value req as type HttpServletRequest
                                             res as type HttpServletResponse.
               try
                   set book to self::getParamsAsBook(req res)
                   set book to type Book::Next(book::StockNumber)
                   invoke self::outputBook(req res book)
               catch e
                   invoke self::outputException(req res e)
               end-try
           
               goback.
           end method.