@Controller
@RequestMapping("/user")
public class UserController {
@GetMapping("/t1")
public String test1(String name, Model model){
System.out.println("从前端接受到的参数为:"+name);
model.addAttribute("msg",name);
return "test";
}
}
可是这样子写的话,如果前端没有携带参数,就会返回空值。如果前端传的不是一个name呢?我们该怎么处理?
@Controller
@RequestMapping("/user")
public class UserController {
@GetMapping("/t1")
public String test1(@RequestParam("username") String name, Model model){
System.out.println("从前端接受到的参数为:"+name);
model.addAttribute("msg",name);
return "test";
}
}
@RequestParam(“username”)会强制你请求携带的参数必须是username。如果你的参数还是name或者其他(包括不携带参数),必定会报400错误(错误的请求),它告诉你请求是畸形的。
@RequestParam注解保证了前端的参数,在后端能明显的区分出来,从而保证了前后端传参的一致性。(通俗的讲,其实就是@RequestParam的优点:前端参数无论怎么改变,不需要改变后端的参数,只要有@RequestParam,它携带的参数一定就是前端最新的参数。)
@Data
@AllArgsConstructor
@NoArgsConstructor
public class User {
String name;
int age;
String sex;
}
@Controller
@RequestMapping("/user")
public class UserController {
@GetMapping("/t2")
public String test2(User user, Model model) {
model.addAttribute("msg", user);
System.out.println(user);
return "test";
}
}
需要保证url请求的参数名和对象的属性名一致。确保这些请求的参数可以与对象中的属性一一匹配。如果两者不一致的,则后端获取的对象中的相应属性就会被赋值为null。
前面说了如何获取前端请求的参数,接收一个参数或者多个参数,或是接收一个对象参数。
下面讨论如何把这些参数回显到前端,除了我们常用的model.addAttribute方法。
modelAndView通常用于只是实现了Controller接口的controller类。
public class HelloController implements Controller {
@Override
public ModelAndView handleRequest(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse) throws Exception {
ModelAndView modelAndView = new ModelAndView();
modelAndView.addObject("msg","HelloSpringMVC!");
modelAndView.setViewName("hello");
return modelAndView;
}
}
处理器适配器给前端控制器DispatcherServlet返回一个modelAndView,视图解析器从DispatcherServlet获取到modelAndView,对其进行视图解析,返回相应的视图给DispatcherServlet。
缺点:因为每一个处理器只能有一个实现方法,因此一个处理器只能返回一个modelAndView对象。所以每来一个视图,就需要创建很多个controller类。
model是SpringMVC三大组件中的处理器映射器对应的注解下,所使用的简化版模型。比如使用了RequestMapping注解下的方法,它的返回值即视图名会自动去匹配视图解析器前后缀。因此,相对于原来那种实现了Controller接口的处理器,省去了设置视图名称的步骤。并且,一个处理器类下可以通过处理器映射器来映射多个视图,而不需要像之前那样每一个视图只能对应一个处理器。
@GetMapping("/t2")
public String test2(Model model) {
model.addAttribute("msg", user);
return "test";
}
modelMap只是在model的基础上,它还继承了LinkedHashMap,因此它还拥有LinkedHashMap的一些特定方法和特性。用法:和model一样,只是多了一些方法。