1,传递参数整理:Model和ModelMap和ModelndView和RedirectAttributes
@RequestMapping("")
public Object index(RedirectAttributes redirectAttributes) {
//ModelAndView用法1//它是
HashMap<String, Object> map = new HashMap<>();
map.put("serverConfig","server");
return new ModelAndView("forward:index.do",map);//转发
//ModelAndView用法2
ModelAndView modelAndView = new ModelAndView();
modelAndView.setViewName("forward:index.do");
modelAndView.addObject("server");
return modelAndView;
//model用法
model.addAttribute(serverConfig);
model.addAttribute("hello");
return "forward:index.do";
//ModelMap的用法
ModelMap modelMap = new ModelMap();
modelMap.addAttribute("serverConfig","server");
return "redirect:index.do";//重定向,不共享请求数据的数据
//RedirectAttributes 的用法
redirectAttributes.addAttribute("serverConfig","server");
return "redirect:index.do";//重定向,共享请求数据的数据
}
2,参数接受整理:@RequestParam和@ModelAttribute@RequestBody
1.接受get请求如:http://localhost:8080/getData?username="liming"&password='123456'
下面三种方式都可以:
1.@RequestParam(value="username") String userName, @RequestParam(value="password") String userNick //value中的参数名称要跟name中参数名称一致
2.String username, String password// 此时要参数名称一致
3.HttpServletRequest request //request.getParameter("password")
2.post请求
1.@RequestParam
用来处理Content-Type: 为 application/x-www-form-urlencoded编码的内容。提交方式为get或post。(Http协议中,如果不指定Content-Type,则默认传递的参数就是application/x-www-form-urlencoded类型)
2.@RequestBody
用来接受json格式数据 一般可以直接用对象接受或者map形式如:
@RequestBody Map<String, String> map
@RequestBody User user
3.@ModelAttribute(结合springboot+thymeleaf模板使用 [thymeleaf模板总结中1.2选择变量表达式*{}更容易理解](https://blog.csdn.net/qq_44742816/article/details/103432538))
3.1用在方法上:在所有controller之前执行
@ModelAttribute("servve")
public ServerConfig getSerconfig(){
return serverConfig;
}
作用相当于model.addAttribute("servve",serverConfig),并且可以取出
public String getView(Model model,@ModelAttribute("servve") ServerConfig serverConfig){}
3.2用在方法参数上:
public String getView(Model model,@ModelAttribute("servve") ServerConfig serverConfig){}
1.表示从model中获取key为"servve"的对象并赋值给serverConfig
2.如果model中没有key为"server"的对象,则创建该对象并存入model中
1,2.总结
当前台界面使用GET或POST方式提交数据时,数据编码格式由请求头的ContentType指定。分为以下几种情况:
1. application/x-www-form-urlencoded,这种情况的数据@RequestParam、@ModelAttribute可以处理,@RequestBody也可以处理。
2. multipart/form-data,@RequestBody不能处理这种格式的数据。(form表单里面有文件上传时,必须要指定enctype属性值为multipart/form-data,意思是以二进制流的形式传输文件。)
3. application/json、application/xml等格式的数据,必须使用@RequestBody来处理。
3.转发forward和重定向redirect在controller间传参和接受
3.1:redirect传参和接受
方式1:通过RedirectAttributes传递参数(不能直接传递对象,只能时String,int等)@requestParam接收
这种传递自动拼接url默认转化为url传参:localhost:5050/index.do?port=12
//传参
@RequestMapping("")
public Object index(RedirectAttributes redirectAttributes) {
redirectAttributes.addAttribute("port",12);
return "redirect:index.do";
}
//接收
@RequestMapping("index.do")
public String viewHotCommody(@RequestParam("port") int port){
return "index";
}
方式2:通过RedirectAttributes+@ModelAttribute;和方式1一样,不用手动拼接对象
//引入对象serverConfig
@Autowired
private ServerConfig serverConfig;
//载入对象serverConfig
@ModelAttribute("ServerConfig")
public ServerConfig get(){
return serverConfig;
}
@RequestMapping("")
public Object index(@ModelAttribute("ServerConfig")ServerConfig serverConfig,RedirectAttributes redirectAttributes) {
redirectAttributes.addAttribute("port",serverConfig.getPort());
redirectAttributes.addAttribute("address",serverConfig.getAddress());
return "redirect:index.do";
}
方式3:通过RedirectAttributes的addFlashAttribut()传递 用Model接收
//传参
@RequestMapping("")
public Object index(RedirectAttributes redirectAttributes) {
redirectAttributes.addFlashAttribute("flush","flush");
return "redirect:index.do";
}
//接收
@RequestMapping("index.do")
public String viewHotCommody(Model model){
return "index";
}
方式4:通过session传参
//传参
@RequestMapping("")
public Object index(HttpServletRequest request) {
HttpSession session = request.getSession();
session.setAttribute("session1","session1的value");
return "redirect:index.do";
}
//接收
@RequestMapping("index.do")
public String viewHotCommody(HttpServletRequest request){
HttpSession session = request.getSession();
Object session1 = session.getAttribute("session1");
return "index";
}
3.2转发forward传参和接收
方式一:通过session传参
//传参
@RequestMapping("")
public Object index(HttpServletRequest request) {
HttpSession session = request.getSession();
session.setAttribute("session1","session1的value");
return "redirect:index.do";
}
//接收
@RequestMapping("index.do")
public String viewHotCommody(HttpServletRequest request){
HttpSession session = request.getSession();
Object session1 = session.getAttribute("session1");
return "index";
}
方式二:直接通过request传递参数和接收
//传参
@RequestMapping("")
public Object index(HttpServletRequest request) {
request.setAttribute("prot",123131);
return "redirect:index.do";
}
//接收
@RequestMapping("index.do")
public String viewHotCommody(HttpServletRequest request){
Integer address = (int) request.getAttribute("prot");
return "index";
}
3总结:在两个controller中传递和接收参数
1.如果想直接传递一个java对象,可以用session传递和接受(redirect和forward都支持)
2.在forward中支持request和session传递参数
3.在redirect中支持session和RedirectAttribute传递参数(不支持request)
redirectAttribute.addAttribute("key",value);会默认拼接url形式传递localhsot:80/?key=value;所以用@requestParame("key")接受。
如何不想以url拼接传输,可以redirectAttribute.addFlushAttribute("key",value);会默认将数据存到重定向的