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){}
            });
        });
    });

猜你喜欢

转载自blog.csdn.net/u014256815/article/details/81978799