1. 程式人生 > >SpringMVC基礎[email protected]註解&P

SpringMVC基礎[email protected]註解&P

在總結@ModelAttribute註解功能配合PUT請求方式使用之前,先來總結一下POJO類作為入參接收form表單POST提交方式提交資料。

POJO類接收引數


總的來說POJO類還是與普通的Java Bean類還是特別的相似的,私有的屬性,需要配置的空的構造方法,以及生成getter and setter,而且SpringMVC的form提交方式的確是比struts2簡單。

  • User類(getter and setter toString省略)
package com.example.springmvc.entity;

/**
 * Created by Administrator on 2016-01-25.
 */
public class User { private String id; private String username; private String password; private String email; private int age; private Address address; public User() { } public User(String username, String password, String email, int age) { this.username = username; this
.password = password; this.email = email; this.age = age; } public User(String id, String username, String password, String email, int age) { this.id = id; this.username = username; this.password = password; this.email = email; this.age = age; } }
  • 編寫好form提交表單程式碼,將action屬性填寫為requestMapping對應的url
  • <form action="springmvc/testPojo" method="post">
        username:<input type="text" name="username"/><br>
        password:<input type="password" name="password"/><br>
        email:<input type="text" name="email"/><br>
        age:<input type="text" name="age"/><br>
        city:<input type="text" name="address.city"/><br>
        province:<input type="text" name="address.province"><br>
        <input type="submit" value="submit"/><br>
    </form>
    form中每個input標籤的name對應了POJO類的每個屬性,在這裡我要強調一下 input隱藏域name屬性值為id的知識點,眾所周知,當涉及到資料庫連線時,POJO類必須加上id這個屬性,但是不論是編寫form表單還是form表單回顯資料,我們都不會將id資料顯示出來,但是,id資料對資料庫中資料的增刪改查是十分重要的,所以我們將id設定為隱藏域,form提交表單時將id值一起提交過去。
  • 將form提交表單對應方法入參設定為對應的POJO類
  •     //pojo類接受引數,springmvc會按請求引數名和pojo引數名自動匹配,並支援級聯屬性
        @RequestMapping("/testPojo")
        public String testPojo(User user) {
            System.out.println("testPojo" + user);
            return SUCCESS;
        }
    POJO引數自動匹配,並支援級聯屬性。
  • 點選提交就可以將資料賦值到處理方法入參POJO類


  • @ModelAttribute註解


    我們以User類物件為例子來學習ModelAttributes註解,ModelAttribute執行方法:

    • 首先執行被@ModelAttributes註解標註的方法,將從”資料庫中取出的物件放入到map物件中,也就是放入到request域中,鍵值為“user”
      @ModelAttribute
        public void getUser(@RequestParam(value = "id",required = false) Integer id,
                            Map<String,Object> map){
    
            System.out.println("test modelAttributes");
           if (id!=null){
           //模擬從資料庫取出一條訊息
               User user=new User("1","Tom","123456","[email protected]",12);
               System.out.println("從資料庫中得到一條資料"+user);
               //map.put("user",user);
             map.put("abc",user);//這裡map物件user對應testModelAttributes方法引數的引數類小寫
           }
        }
    在這裡模擬了從資料庫取出一條資料,被modelAttribute註解標註的方法在任何處理方法執行前都將被呼叫,所以這個地方我們將RequestParam值得required屬性設定為fasle; 這裡得到是id對應的資料庫原始資料,將值放入到map中,SpringMVC將會來處理。 這裡還有一點就是map put資料時key的命名規則
    1. 預設是POJO類名首字母小寫,例如User類,則map的key為”user”
    2. 可以用@ModelAttribute來修飾入參,例如@ModelAttribute(“abc”) User user,當然就要將key設定為”abc”
    3. 而且這個命名還跟@SessionAttribute註解相關,若Handler 也就是處理方法的類被@SessionAttribute註解修飾,而且他的屬性值其中有”user”(拿User類來做例子),如果@SessionAttribute註解沒有存入”user”鍵值的value,執行時會丟擲異常
  • 將表單傳入的值賦給從資料庫中取出的物件。
  • 這一條是交給SpringMVC核心來處理的,SpringMVC核心會將form提交的資料修改從”資料庫” 得到的 原資料,最後將新的物件資料注入到post方法(put方法 普通方法基於post方法之上的)的入參中。
  • 將值注入到post方法對應執行方法的入參
  •  @RequestMapping(value = "/testModelAttributes",method = RequestMethod.PUT)
        public String testModelAttributes(@ModelAttribute("abc") User user){
            System.out.println("修改"+user);
            return SUCCESS;
        }

    ModelAttribute執行流程

    ModelAttribute功能強大,比如說你要修改資料庫裡面的資訊,但是我們不修改其中某些資訊;比如說上面的POJO類物件user,我們form表單提交修改資訊,但是不修改其中的password,我們就可以使用這種方法,但是如果我們不寫ModelAttribute標註的方法,直接form表單提交的話,哪隻是簡單的POJO類接收表單資訊。