JavaのDTOとは?複数のデータをまとめて受け渡すクラスの使い方|確認問題の回答例

JavaのDTOとは?複数のデータをまとめて受け渡すクラスの使い方の確認問題の回答例です。本文と同じ見積もりの仕様で確認します。

問題1:数量5の計算結果

getter戻り値理由
getSubtotal()2500500 × 5
getShippingFee()300小計2500は3000未満
getTotal()28002500 + 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が作った結果を、同じリクエストから取り出します。キャストは型を指定するもので、新しいオブジェクトを作る処理ではありません。

元の記事に戻る

JavaのDTOとは?複数のデータをまとめて受け渡すクラスの使い方