職業訓練覚え書き

47日目(Spring Framework5)

SpringMVCの利用方法おさらい

 

Controllerのさらに深い内容

 

@RequestMapping()

   ↑
※methodとparamsは現在あんまり使わないらしい
現在は@GetMapping、@PostMappingとかが使われるのが主流みたい

@RequestMappingはGET,POST両方に対応
分ける場合、

  • @GetMapping
  • @PostMapping

を使う

 


Controller用メソッドの引数
  • Modelオブジェクト
  • リクエストパラメータ
  • URIテンプレート変数
  • クッキーの値
  • ServletAPIの各種オブジェクト…

など

 

@GetMapping、@PostMappingを使ってみた例 

@GetMapping("/addMember")
public String addMemberGet() {
    return "addMember";
}

 

// method="post"
@PostMapping("/addMember")
public String addMemberPost(
        @RequestParam("name") String name,
        @RequestParam("age") Integer age,
        Model model) {
    if(name.isEmpty()) {
    model.addAttribute("error","氏名は必須");
    return "addMember";
    } else {
    return "addMemberDone";
}

※@RequestParamの引数("name")・String name(受取る変数名)が一致してたら、
@RequestParam String name
に省略可能(ageも同様)

 このname,ageはEL式のparam(暗黙オブジェクト)で使用可能


URIテンプレート変数

※GETメソッドにちょっと似てる?URL末尾の値で表示ページを分ける

@PathVariableアノテーションで値を取得できる

 

@RequestMapping("/show/{id}")
public String show(
        @PathVariable("id") Integer id,
        Model model) {
    if(id == 1) {
       model.addAttribute("name", "りんご");
       model.addAttribute("price", 150);
    } else if(id == 2) {
       model.addAttribute("name", "みかん");
       model.addAttribute("price", 300);
    } else if(id == 3) {
       model.addAttribute("name", "バナナ");
       model.addAttribute("price", 100);
    } else {
       return "redirect:/item/home";
    }

    return "item/show";
}

 

↑をJSPで記述して表示

<h1>選択した商品</h1>
<p>商品名:<c:out value="${name}" /></p>
<p>値段:<c:out value="${price}" /></p>


クッキー
  1. 色を設定するフォームのあるJSP(setColor)
  2. 設定した色を背景色として表示するJSP(getColor)
  3. フォームから受け取った色を受け取るController(ColorController)

setColor.jsp
<h1>色を設定する</h1>
<form action="" method="post">
    <input type="color" name="color"/>
    <input type="submit" value="設定" />
</form>
<p><a href="getColor">戻る</a></p>

 

getColor.jsp
<body style="background: <c:out value="${color}" />;">
<h1>Get Color</h1>
    <p>設定した色:<c:out value="${color}" /></p>
<p><a href="setColor">色を設定する</a></p>

 

ColorController.java

@PostMapping("/setColor")
public String settingColorPost(
        @RequestParam String color,
        HttpServletResponse response) {
        Cookie c = new Cookie("color", color);
        c.setMaxAge(86400 * 3);
        response.addCookie(c);
        return "redirect:/getColor";
}

 

@RequestMapping("/getColor")
public String home(
        @CookieValue(
        value = "color",
        defaultValue = "#ffffff") String color,
        Model model) {
    model.addAttribute("color", color);
    return "getColor";
}

↑@CookieValue()の引数内で、色受け取ってればその色、そうじゃなければデフォルト色として白が入る

 

セッション

簡単なログイン機能を持ったアプリ
(IDのみ認証・taroなら会員ページ、それ以外弾く)


①loginPost()メソッドでsessionに値を格納し、
============================
@PostMapping("/login")
public String loginPost(
        @RequestParam String loginId,
        HttpSession session) {

    if(loginId.equals("taro")) {
    // ログインOK
    session.setAttribute("loginOK", true);
    return "redirect:/memberOnly";
    } else {
// ログイン失敗
    return "login";
    }
}

②memberOnly()メソッドでその値で表示するか否かを判断する
============================
@RequestMapping("/memberOnly")
public String memberOnly(HttpSession session) {
  if(session.getAttribute("loginOK") != null) {

    //↓キャスト式がなんか注釈になるので[]を()で

    if([boolean]session.getAttribute("loginOK")){    

  return "memberOnly";
  }
}
return "redirect:/login";
}

③logout()メソッドでセッション内の値を削除する処理
============================
@RequestMapping("/logout")
public String logout(HttpSession session) {
// 実際にはログアウト処理を記述
        session.removeAttribute("loginOK");
        return "logout";
}


入力値をドメインオブジェクトで受け取る

①contact.jsp お問い合わせフォーム
②contactDone.jsp 入力内容の表示
③ContactController.java contactPostメソッドの引数にContact型オブジェクト、Model型オブジェクト
④domainパッケージ内にContact.java

①contact.jsp
<c:if test="${not empty error}">
    <p style="color: red;"><c:out value="${error}" /></p>
</c:if>
<form action="" method="post">
<p>名前:
<input type="text" name="name" />
</p>
<p>メール:
<input type="text" name="mail" />
</p>
<p>年齢:
<input type="text" name="age" />
</p>
<p>メッセージ:
<textarea name="message" cols="30" rows="10"></textarea>
</p>
<input type="submit" />
</form>

②contactDone.jsp
<p>以下の内容で承りました。</p>
<p>氏名:<c:out value="${contact.name}" /></p>
<p>メール:<c:out value="${contact.mail}" /></p>
<p>年齢:<c:out value="${contact.age}" /></p>
<p>内容:</p>
<pre>
<c:out value="${contact.message}" />
</pre>

③ContactController.java
@PostMapping("/contact")
public String contactPost(
        Contact contact,※ドメインオブジェクト
        Model model) {
        if(contact.getMessage().isEmpty()) {
        model.addAttribute("error", "入力に不備があります");
    return "contact";
         } else {
        return "contactDone";
}
}

④Contact.java
    contact.jspのフォームのname属性と合わせたフィールド、
    それぞれのアクセッサを持ったクラス


今日はここまで。

結構盛りだくさんだった