springMVC接收参数的几种形式

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有嵌套,如下所示
1
{
    "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的时候,也可以用。
--------------------- 
作者:alwaysBrother 
来源:CSDN 
原文:https://blog.csdn.net/u013041642/article/details/72611065 
版权声明:本文为博主原创文章,转载请附上博文链接!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值