springMVC接收参数的几种形式

来源:互联网 发布:阿里云机房在哪里 编辑:程序博客网 时间:2024/05/20 00:39

springMVC接收参数的几种形式

1.参数写在Controller的方法的形参中,适用于get, post方式提交,post方式的时候编码方式需设置为:x-www-form-urlencoded转换为键值对形式,参数名必须完全相同才能映射到, 为此,使用下面5中的方法,可以实现别名转换。

注意:以x-www-form-urlencoded格式的post请求 与 get请求的异同:
同: 都把参数编为键值对形式name=susq&pswd=1233
异: get的时候,这个键值对拼在url后面,post的时候单独保存

 /**     * 1.直接把表单的参数写在Controller相应的方法的形参中      * @param username     * @param password     * @return     */    @RequestMapping("/addUser1")    public String addUser1(String username,String password) {        System.out.println("username is:"+username);        System.out.println("password is:"+password);        return "demo/index";    }

2. 通过HttpServletRequest接收,post方式和get方式都可以, 但不能接收json, post方式的时候编码方式需设置为:x-www-form-urlencoded转换为键值对

/**     * 2、通过HttpServletRequest接收      * @param request     * @return     */    @RequestMapping("/addUser2")    public String addUser2(HttpServletRequest request) {        String username=request.getParameter("username");        String password=request.getParameter("password");        System.out.println("username is:"+username);        System.out.println("password is:"+password);        return "demo/index";    }

如果username 或者 password 为空,不能直接拿来做参数,可能会抛空指针异常。

3.通过一个bean来接收,post方式和get方式都可以。参数?key1=val1&key2=val2的方式加在url后面即可。post方式不想让参数拼接在url后面的话,可以将参数放在body中,编码方式需设置为:x-www-form-urlencoded

    @RequestMapping("/doLogin")    public User doLogin(User u) {        logger.info("name: " + u.getName());        logger.info("pswd: " + u.getPswd());        User user = new User();        user.setName(u.getName());        user.setPswd(u.getPswd());        return user;    }

4. 通过一个bean来接收json

@RequestMapping("/doLogin")    public @ResponseBody User doLogin(@RequestBody User u) {        logger.info("name: " + u.getName());        logger.info("pswd: " + u.getPswd());        User user = new User();        user.setName(request.getParameter("name"));        user.setPswd(request.getParameter("pswd"));        return user;    }

4.2使用Map接收json

@RequestMapping("/doLogin")    public @ResponseBody User doLogin(@RequestBody Map<String, String> u) {        logger.info("name: " + u.get("name"));        logger.info("pswd: " + u.get("pswd"));        User user = new User();        user.setName(u.get("name"));        user.setPswd(u.get("pswd"));        return user;    }

注意Controller上标注了@RestController,这样相当于Controller的所有方法都标注了@ResponseBody, 但是接收参数的@RequestBody还是需要手动协商

5.通过@PathVariable获取路径中的参数

 /**     * @param username     * @param password     * @return     */    @RequestMapping(value="/addUser4/{username}/{password}",method=RequestMethod.GET)public String addUser4(@PathVariable String username,@PathVariable String password) {        System.out.println("username is:"+username);        System.out.println("password is:"+password);        return "demo/index";    }

6.用注解@RequestParam绑定请求参数到方法入参, post方式的时候编码方式需设置为:x-www-form-urlencoded, 不能接受json

@RequestMapping("/doLogin")    public User doLogin(@RequestParam(value="name") String username, @RequestParam(value="pswd") String password) {        logger.info("name: " + username);        logger.info("psed: " + password);        User user = new User();        user.setPswd(password);        user.setName(username);        return user;    }

7. 接收复杂类型参数json转换

如果接收的json有嵌套,如下所示
{    "s": {"clas": "s1", "age": "11"},    "name" : "susq",    "pswd" : 1233}

则可以定义相对应的实体类,来接收参数,spring回自动进行映射转换,很方便。

public class User {    Student s;    String name;    String pswd;    // getter  setter }Student是另一单独的对象public class Student {    String clas;    int age;    // getter setter}

注意把每一层对应的字段要写一样,才能对应上。同样不只是接收参数,返回json的时候,也可以用。

原创粉丝点击