1. 程式人生 > >Springmvc——Controller接受各類請求引數

Springmvc——Controller接受各類請求引數

url傳送過來的請求攜帶的引數多種多樣,SpringMVC提供了諸多註解來解析引數。期目的就是 把控制器從複雜的Servlet API中剝離開來,解耦合,這樣就可以在非web容器環境中重用控制器,也方便測試。
請求引數大致可分為5種:

  1. 普通請求引數
  2. 需要@RequestParam註解指定獲取引數
  3. 使用URL路徑傳遞引數
  4. 傳遞JSON資料引數
  5. 列表資料引數及表單序列化

假設有Controller如下:

@Controller
@RequestMapping("/params")
public class ParamsController {
    //...
}

分述如下:

接受普通請求引數

SpringMVC比較智慧化,若傳遞過來的引數名和HTTP保持一致,那麼無需任何註解也可以獲取引數
表單提交如下:

    <form id="form" action="./params/commonParams.do" method="get">
        角色名稱:<input id="roleName" type="text" name="roleName" value="">
        備註資訊:<input id="note" type="text" name="note" value=""
> </form>

controller層程式碼如下:

    @RequestMapping("/commonParams")
    public ModelAndView commonParams(String roleName, String note){
        System.out.println("roleName->" + roleName);
        System.out.println("note->" + note);
        ModelAndView mv = new ModelAndView();
        mv.setViewName("index"
); return mv; }

這裡,C層就可以直接獲取到提交的引數,前提是引數名稱必須和HTTP請求的引數名稱保持一致,不一致無法獲取;
這種方式允許引數為空
——————————————————————
若是引數很多,可以將引數包裝成一個POJO(必有setter和getter方法),只要屬性名與引數一一對應,SpringMVC就能夠識別
form表單不需要改動,新增POJO接受引數:

public class RoleParams{
    private String roleName;
    private String note;

    //---------getter & setter------------
}

則相應的C中程式碼改為:

    @RequestMapping("/commonParams")
    public ModelAndView commonParams(RoleParams roleParams){
        System.out.println("roleName->" + roleParams.getRoleParams());
        System.out.println("note->" + roleParams.getNote());
        ModelAndView mv = new ModelAndView();
        mv.setViewName("index");
        return mv;
    }

可以看出,提交的表單資料被自動包裝成了RoleParams 物件

使用@RequestParams獲取引數

第一種情況適用於請求引數和C中的方法形參一一對應,若有不對應時,springMVC無法識別,這時需要人為指定,使用@RequestParams註解
如HTTP引數名稱從roleName改為了role_name,則C中可作如下處理:

    @RequestMapping("/commonParams")
    public ModelAndView commonParams(@RequestParams("role_name") String roleName, String note){
        System.out.println("roleName->" + roleName);
        System.out.println("note->" + note);
        ModelAndView mv = new ModelAndView();
        mv.setViewName("index");
        return mv;
    }

若引數被@RequestParams註解,則預設不能為空,可以使用如下控制:

@RequestParams(value="role_name",required=false) String roleName

使用URL傳遞引數

使用URL傳遞引數,符合RESTful風格,比如想獲取id=1的角色,url可寫成“/params/getRole/1”,其中 1 就代表id,
Controller中的可以如下處理:

@Controller
@RequestMapping("/params")
public class ParamsController {

    @Autowired
    RoleServiceImpl roleService;

    @RequestMapping("/getRole/{id}")
    public ModelAndView pathVariable(@PathVariable("id") Long id){
        Role role = roleService.getRole(id);
        ModelAndView mv = new ModelAndView();
        //繫結資料模型
        mv.addObject(role);
        //設為Json檢視,返回Json型別的資料給前臺
        mv.setViewName(new MappingJackson2JsonView());
        return mv;
    }
}

{id}代表了處理器需要接受一個由URL組成的引數,引數名為id,方法中的@PathVariable(“id”)就代表取出url中的id引數;
@PathVariable允許對應引數為空

傳遞JSON型別引數

若客戶端傳遞過來是JSON物件引數,則使用@RequestBody註解獲取,引數依然要一一對應
假設客戶端使用JQuery向服務端傳遞JSON:

$(document).ready(function() {
    //JSON資料和RoleParams一一對應
    var data = {
        roleName: 'role',
        note: 'note_message'
    }

    //向後臺傳送請求
    $.post({
        url: ".params/findRoles.do",
        //這裡必須告知傳遞型別為JSON
        contentType: "application/json",
        //HTTP只能傳遞字串,必須將JSON轉為字串形式
        data: JSON.stringify(data),
        success: function(result){}
    });

});

則處理器中使用@RequestBody獲取JSON引數,包裝為一個POJO處理:

    @RequestMapping("/findRoles")
    public ModelAndView findRoles(@RequestBody RoleParams roleParams){
        System.out.println("roleName->" + roleParams.getRoleParams());
        System.out.println("note->" + roleParams.getNote());
        ModelAndView mv = new ModelAndView();
        mv.addObject(role);
        mv.setViewName(new MappingJackson2JsonView());
        return mv;
    }

接受列表資料引數及表單序列化

用Java的集合或者陣列來接受JSON傳來的陣列型別
前臺程式碼:

$(document).ready(function() {
    //JSON資料和RoleParams一一對應
        var roleList = [
            {roleName: 'abc', note: 'abc_note'},
            {roleName: 'ABC', note: 'ABC_note'},
            {roleName: 'xyz', note: 'xyz_note'},
        ]

    //向後臺傳送請求
    $.post({
        url: ".params/findRoles.do",
        //這裡必須告知傳遞型別為JSON
        contentType: "application/json",
        //HTTP只能傳遞字串,必須將JSON轉為字串形式
        data: JSON.stringify(roleList ),
        success: function(result){}
    });

});

後臺處理:

    @RequestMapping("/addRoles")
    public ModelAndView addRoles(@RequestBody List<Role> roleList){
        ModelAndView mv = new ModelAndView();
        int totle = roleService.addRoles(roleList)
        mv.addObject("totle", totle);
        mv.setViewName(new MappingJackson2JsonView());
        return mv;
    }

提交序列化表單

    $(document).ready(function() {
        $("#commit").click(function(){
            var str = $("form").serialize();
            $.post({
                url: "./params/comonParamPojo2.do",
                //序列化後,資料將以 roleName=xxx&&note=yy 的形式傳遞
                data: $("form").serialize(),
                success: function(result){}
            });
        });
    });