JavaのDTOとは?複数のデータをまとめて受け渡すクラスの使い方|確認問題の回答例
JavaのDTOとは?複数のデータをまとめて受け渡すクラスの使い方の確認問題の回答例です。本文と同じ見積もりの仕様で確認します。
問題1:数量5の計算結果
| getter | 戻り値 | 理由 |
|---|---|---|
| getSubtotal() | 2500 | 500 × 5 |
| getShippingFee() | 300 | 小計2500は3000未満 |
| getTotal() | 2800 | 2500 + 300 |
QuoteModelが3つの金額を計算し、QuoteResultのコンストラクタへ渡します。getterはその値を返すだけなので、表示する側で送料をもう一度計算する必要はありません。
問題2:境界の数量6と、ルールを変更する場所
数量6なら小計3000、送料0、合計3000です。条件は subtotal >= 3000 なので、ちょうど3000円も送料無料になります。
送料無料の基準を5000円へ変えるなら、QuoteModel.javaの条件を次のように変更します。
if (subtotal >= 5000) {
shippingFee = 0;
}
QuoteResultの項目やgetter、結果を表示するquote-result.jspはそのままです。ただし、入力画面quote-form.htmlにある「小計3000円未満は送料300円」という案内も新しい条件に合わせて直します。変更後の数量6は小計3000、送料300、合計3300です。数量9と10でも、4500円では送料300円、5000円では送料0円になることを確認できます。
問題3:4つの役割を対応させる
| 処理 | 担当 |
|---|---|
| 送料を決める | QuoteModel.java |
| 計算結果の3つの値を持つ | QuoteResult.java(DTO) |
| 結果をrequest属性へ入れる | QuoteServlet.java |
| 結果の金額をHTMLへ出す | quote-result.jsp |
DTOに画面表示のHTMLを書いたり、JSPに送料の条件分岐を書いたりせず、計算・データ・受け渡し・表示の役割を分けます。MVCのModel側には、業務処理を行うクラスだけでなく、このようにデータを表すクラスも含まれます。
問題4:属性名を合わせて同じ結果を受け取る
このサンプルではresultという名前の属性は設定していないので、getAttribute(“result”)はnullを返します。掲載したJSPならnullの分岐に入り、入力画面から送信するよう案内されます。null確認なしでgetterを呼べばNullPointerExceptionになります。
QuoteResult result =
(QuoteResult) request.getAttribute("quote");
ServletのsetAttributeと同じquoteに直します。Javaの変数名resultと、リクエスト属性名quoteが同じである必要はありません。対応させるのは setAttributeとgetAttributeに指定する文字列です。
JSPでnew QuoteResult(…)を書いて結果を作り直す必要はありません。Modelが作った結果を、同じリクエストから取り出します。キャストは型を指定するもので、新しいオブジェクトを作る処理ではありません。