springMVC中Model和ModelMap和ModelndView和RedirectAttributes用法整理;参数接收及@RequestParam和@ModelAttribute

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);会默认将数据存到重定向的
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值