SpringMVC-09-传递参数的几种方式

2.9 Controller 接收请求参数

  • 方式有多种,适合get和post,也有两者都适合的
  • 通过实体 Bean 接收请求参数
  • 通过 @ModelAttribute 接收请求参数
  • 通过处理方法的形参接收请求参数
  • 通过 @RequestParam 接收请求参数
  • 通过 HttpServletRequest 接收请求参数,默认的servlet方式
  • 通过 @PathVariable 接收 URL 中的请求参数,REST风格
2.9.1 通过实体 Bean 接收请求参数
  • 将多个请求参数封装到一个实体对象,实体 Bean 接收请求参数适用于 get 和 post 提交请求方式。需要注意,Bean 的属性名称必须与请求参数名称相同,某个字段不一致时,接收的值为null
@RequestMapping("/login")
public String login(User user, Model model){
    if ("zs".equals(user.getUsername())&&"123456".equals(user.getPwd())){
        model.addAttribute("msg","1登录ok");
    }else {
        model.addAttribute("msg","1登录false");
    }
    return "result";
}
2.9.2 @ModelAttribute接收请求参数
  • @ModelAttribute 注解用于将多个请求参数封装到一个实体对象中,从而简化数据绑定流程,而且自动暴露为模型model数据,在视图页面展示时使用。

“通过实体 Bean 接收请求参数”中只是将多个请求参数封装到一个实体对象,并不能暴露为模型数据(需要使用 model.addAttribute 语句才能暴露为模型数据,数据绑定与模型数据展示后面教程中会讲解)。

  • 通过 @ModelAttribute 注解接收请求参数适用于 get 和 post 提交请求方式
@RequestMapping("/login2")
public String login2(@ModelAttribute User user, Model model){
    if ("zs".equals(user.getUsername())&&"123456".equals(user.getPwd())){
        model.addAttribute("msg","2登录ok");
    }else {
        model.addAttribute("msg","2登录false");
    }
    return "result";
}
2.9.3 通过处理方法的形参接收请求参数
  • 直接把表单参数写在控制器类相应方法的形参中,即形参名称与请求参数名称完全相同。该接收参数方式适用于 get 和 post 提交请求方式。不相同不报错,只是请求参数无法映射到形参
@RequestMapping("/login3")
public String login3(String username,String pwds, Model model){
    if ("zs".equals(username)&&"123456".equals(pwds)){
        model.addAttribute("msg","3登录ok");
    }else {
        model.addAttribute("msg","3登录false");
    }
    return "result";
}

接收前端参数,先判断参数名字,若名字在方法参数中存在,可以直接使用

若前端传递的是一个对象,匹配对象中每个字段,匹配到的接收到值,没有匹配的为null值

2.9.4 通过 @RequestParam 接收请求参数(常用)
  • 方法入参处使用 @RequestParam 注解指定其对应的请求参数,可以和方法形参不一样,而页面传过来的参数可以和方法形参不一致,但是和注解的值必须一样否则会404。
  • 规范:前端传过来的参数,无论用不用都把@RequestParam注解加上,代表时前端传递的参数,还能约定和前端参数值配对

@RequestParam和@RequestBody接收参数的区别:原文链接ZWZhangYu

  • @RequestParm绑定HTTP请求参数,可以是多个参数,也可以是一个数组,Map集合,**不支持绑定bean,**GET,POST均可@RequestParm中name属性是指定参数名,required属性默认为true,表示必传。若为false则为非必传。属性有defaultValue默认值选项,若该参数为null时,会将默认值填充到参数上。

  • @RequestParm支持POST,GET请求 只支持Content-Type: 为application/x-www-form-urlencoded编码的内容。而对于Http协议不指定Content-Type,则默认传递的参数就是application/x-www-form-urlencoded类型

  • 利用@RequestBody注解绑定一个bean,不支持get请求,因为get请求没有HttpEntity。必须要在请求头中申明content-Type(如application/json).springMvc通过HandlerAdapter配置的HttpMessageConverters解析httpEntity的数据,并绑定到相应的bean上.只能一个@RequestBody。可以与@RequestParam一起使用,但建议最好不要与@RequestParam一起使用,是因为@RequestBody会将InputStream吃掉,造成后面的@RequsetParam无法匹配到参数而报400

  • 在这俩个注解的使用前了解一下Form Data 和 Request Payload的区别;

    • 前端开发中经常会用到AJAX发送异步请求,对于POST类型的请求会附带请求数据。而常用的两种传参方式为:Form Data 和 Request Payload
    • GET请求 使用get请求时,参数会以key=value的形式拼接在请求的url后面。但是受限于请求URL的长度限制,一般参数较少时会使用get请求。
    • POST请求 当参数数量较多,且对数据有一定安全性要求时,会考虑用post请求传递参数数据。POST请求的参数数据是在请求体中。
  • 而post请求提交方式也有两种格式

    • 方式一: Form Data形式 当POST请求的请求头里设置Content-Type: application/x-www-form-urlencoded(默认), 参数在请求体以标准的FormData的形式提交,以&符号拼接,参数格式为key=value&key=value&key=value… 前端代码设置:
      在servlet中,后端可以通过request.getParameter(name)的形式来获取表单参数。
    • 方式二:Request Payload形式 如果使用AJAX原生POST请求,请求头里设置Content-Type:application/json,请求的参数会显示在RequestPayload中,参数格式为JSON格式:{“key”:“value”,“key”:“value”…},这种方式可读性会更好。后端可以使用getRequestPayload方法来获取。
  • 在SpringMVC里面@RequestParam和@RequestBody的区别就是根据这个来的,当我们通过Ajax进行数据传输的时候,如果前端HTTP请求的Body体传输的Form Data那么后端就可以通过@RequestParam来进行接收,这种对应的Content-Type’: ‘application/x-www-form-urlencoded’。
    如果是Request Payload,那么对应Content-Type:application/json,这个时候如果使用@RequestParam来接收的后端会无法识别到参数,会报400的错误,这个时候需要使用@RequestBody来接收。

  • 前端传递的参数有多个的情况下,并且是基本数据类型或string的,把@Param注解添加上
  • 如果前端向后端传递的是非实体类对象,后台也可以使用@RequestBody注解,那就用List>来接收
  • @RequestParam 注解有3个参数
  • value:参数名

  • required:是否必须,默认为 true,表示请求中必须包含对应的参数名,若不存在将抛出异常

  • defaultValue:参数默认值。如果设置了该值,required=true将失效,自动为false,如果没有传该参数,就使用默认值。

    value 为接收url的参数名(相当于key值)。

//有一种特殊情况是参数为int类型时,设置required=false后参数不传值得话会给int类型参数赋值为null,而int是基本数据类型不能赋值为null,所以会报错,此时要将int类型改为Integer类型
@RequestParam(value="inputInt", required=false) int inputInt  

@RequestParm相当于整合下面俩个方法的功能:

  • request.getParamter(String s)
    该方法和上面的注解功能相同,也是用来获取get或post方式传递的参数值,输出结果为String类型
  • request.getParamterMap()
    该方法是获取get或post提交的所有参数,并转为一个map,key是String类型,value是String数组,用来保存相同key的所有value。

注意:当请求参数与接收参数名不一致时,此方式会报400错误

@Nullable加在 String username参数前,表示这个参数可以为null

@RequestMapping("/login4")
public String login4(@RequestParam("username") String username,@RequestParam("pwd") String pwd, Model model){
    if ("zs".equals(username)&&"123456".equals(pwd)){
        model.addAttribute("msg","3登录ok");
    }else {
        model.addAttribute("msg","3登录false");
    }
    return "result";
}
  • 若接受不到参数并且包required string parameter 'XXX’is not present 错。那么有几种情况
  • 原因是由于头文件类型不对,可以在MediaType中选择合适的类型,例如GET和POST
  • jquery提交delete时,不支持@RequestParam,只支持@PathVariable形式。需要换一种请求方式,比如现在用的是POST提交方式,改为GET/PUT等其他方式。
  • 若api在调用的时候,如果存在重类型,但不重名;例如:/id与/name,两者在类型上是一样的
  • 页面传递的参数和后台接受参数名自不匹配。
  • 传递的参数里面包含特殊符号,比如前台传递字符串不能包含逗号等。(待证明)
  • 传的参数是undefined;
2.9.5 通过 HttpServletRequest 接收请求参数
  • 通过 HttpServletRequest 接收请求参数适用于 get 和 post 提交请求方式,
HttpServletRequest req, HttpServletResponse resp参数来源于,所有的请求都会走Spring MVC 的DispatcherServlet的doService(HttpServletRequest request, HttpServletResponse response)方法,之后才映射到控制器的处理方法,所以控制器的处理方法也可以拿到req,resp
@RequestMapping("/login5")
public String login5(HttpServletRequest req, HttpServletResponse resp, Model model){
    String username = req.getParameter("username");
    String pwd = req.getParameter("pwd");
    if ("zs".equals(username)&&"123456".equals(pwd)){
        model.addAttribute("msg","5登录ok");
    }else {
        model.addAttribute("msg","5登录false");
    }
    return "result";
}
2.9.6通过 @PathVariable 接收 URL 中的请求参数
@RequestMapping("/login6/{username}/{pwd}")
public String login6(@PathVariable("username") String username, @PathVariable("pwd") String pwd,Model model){
    if ("zs".equals(username)&&"123456".equals(pwd)){
        model.addAttribute("msg","6登录ok");
    }else {
        model.addAttribute("msg","6登录false");
    }
    return "result";
}
  • http://localhost:8080/user/login6/zs/123456:访问时自动将 URL 中的模板变量 {username} 和 {pwd} 绑定到通过 @PathVariable 注解的同名参数上。

2.10 给前端返回数据

  • 有几种方式:

返回一个ModelAndView 不仅可以返回数据,也可以设置返回的逻辑视图,进行控制展示层跳转

返回一个Model (Model 继承了 ModelMap )

返回一个ModelMap (ModelMap 继承了LinkedHashMap,除了有自己的方法,也有LinkedHashMap的方法)

Model是一个精简版的ModelMap ,方法比较少,适合于大部分情况

返回json数据

下一篇:SpringMVC-10-Spring REST 风格

你可能感兴趣的:(框架,java,前端,servlet)