获取请求参数
前言
在 Servlet 中我们通过 request.getParameter(name)方法获取请求参数。该方式存在两个问题:
- 请求参数较多时会出现代码冗余的显现
- 与容器紧耦合
SpringMvc的改进
在 SpringMVC 中可以使用 HttpServletRequest 对象获取请求数据,同时还提供了参数注入的方式用于获取请求数据。
SpringMVC 参数注入的优点:
- 简化参数接收形式(不需要调用任何方法。需要什么参数, 就在控制器方法中提供 什么参数)。
- 参数类型不需要自己转换了。如果类型不符会抛出400异常
- 可将参数自动封装为对象
- 如果没有该参数对应的数据,可为该参数指定默认值
通过 HttpServletRequest 对象获取请求数据
@RequestMapping("/getData")
public ModelAndView getRequestParameter(HttpServletRequest request){
String username = request.getParameter("name");
ModelAndView modelAndView = new ModelAndView();
modelAndView.setViewName("/index.jsp");
modelAndView.addObject("username",username);
return modelAndView;
}
通过参数注入获取请求参数
@RequestMapping("/addUsers")
public ModelAndView addUsers(String username,int userage){
ModelAndView modelAndView = new ModelAndView();
modelAndView.setViewName("/index.jsp");
modelAndView.addObject("name",username);
modelAndView.addObject("age",userage);
return modelAndView;
}
通过@RequestParam注解参数注入获取请求参数
@RequestParam:将请求参数绑定到控制器的方法参数上
- value:参数名
- required:是否包含该参数,默认为 true,表示该请求路径中必须包含该参数,如果不包含就报错
- defaultValue:默认参数值,如果设置了该值,required=true 将失效,自动为 false,如果没有传该参数,就使用默认值
@RequestMapping("/addUsers")
public ModelAndView addUsers(@RequestParam(value = "name",required = true,defaultValue = "lanh") String username,@RequestParam("age") int userage){
ModelAndView modelAndView = new ModelAndView();
modelAndView.setViewName("/index.jsp");
modelAndView.addObject("name",username);
modelAndView.addObject("age",userage);
return modelAndView;
}
注入集合参数
在 SpringMVC请求参数注入中,如果有多请求参数的 name 相同,那么可以使用 String[] 或 List 集合来接收请求参数。如果使用的 List 类型需要在该参数前添加@RequestParam注解,String[]则不需要
@RequestMapping("/addUsers")
public ModelAndView addUsers(String username,@RequestParam List<String> userlike){
ModelAndView modelAndView = new ModelAndView();
modelAndView.setViewName("/index.jsp");
modelAndView.addObject("name",username);
String temp = "";
for(String str:userlike){
temp+= str+" ";
}
modelAndView.addObject("userlike",temp);
return modelAndView;
}
注入对象参数
在 SpringMVC 的请求参数注入中,可以使用注入POJO方式来接收请求参数。要求:请 求参数的name必须与POJO的属性名相同
@RequestMapping("/addUsers")
public ModelAndView addUsers(Users user){
ModelAndView modelAndView = new ModelAndView();
modelAndView.setViewName("/index.jsp");
modelAndView.addObject("name",user.getUsername());
String temp = "";
for(String str:user.getUserlike()){
temp+= str+" ";
}
modelAndView.addObject("userlike",temp);
return modelAndView;
}
注入关联对象
SpringMVC 可以根据对象的关联关系实现请求参数的注入
@RequestMapping("/addUsers")
public ModelAndView addUsers(Users user){
ModelAndView modelAndView = new ModelAndView();
modelAndView.setViewName("/index.jsp");
modelAndView.addObject("user",user.toString());
modelAndView.addObject("address",user.getAddress().toString());
return modelAndView;
}
向集合中注入对象
在 SpringMVC 中可以向一个集合属性中注入对象
@RequestMapping("/addUsers")
public ModelAndView addUsers(Users user){
ModelAndView modelAndView = new ModelAndView();
modelAndView.setViewName("/index.jsp");
modelAndView.addObject("user",user.toString());
modelAndView.addObject("address",user.getAddressList());
return modelAndView;
}
向Map集合注入对象
@RequestMapping("/addUsers")
public ModelAndView addUsers(Users user){
ModelAndView modelAndView = new ModelAndView();
modelAndView.setViewName("/index.jsp");
modelAndView.addObject("user",user.toString());
Set<Map.Entry<String,Address>> set = user.getAddressMap().entrySet();
modelAndView.addObject("address",set);
return modelAndView;
}