美文网首页
前后端的参数传递

前后端的参数传递

作者: Tommmmm | 来源:发表于2018-06-12 10:18 被阅读0次

    一、向视图传值

    Model 和ModelAndView的区别:Model只是用来传输数据的,并不会进行业务的寻址。ModelAndView 却是可以进行业务寻址的,即设置对应的要请求的静态文件,这里的静态文件指的是类似jsp的文件。

    1、HttpServletRequest
    Model、ModelAndView都应该是把它封装在其中的。

    2、ModelMap
    ModelMap对象主要用于传递页面所需要的数据到页面,我们只要把数据放到ModelMap对象中即可。
    它的作用类似于request对象的setAttribute方法的作用:用来在一个请求过程中传递处理的数据。
    ModelMap的实例是spirng mvc框架自动创建并作为控制器方法参数传入,用户无需自己创建。

    public ModelMap addAttribute(String attributeName, Object attributeValue){...}
    public ModelMap addAttribute(Object attributeValue){...}
    
    public String xxxxmethod(String someparam,ModelMap model)
    {
         //将数据放置到ModelMap对象model中,第二个参数可以是任何java类型
          model.addAttribute("key",someparam);
             ......
         //返回跳转地址
          return "path";
    }
    

    modelmap本身不能设置页面跳转的url地址别名或者物理跳转地址
    可以通过控制器方法的字符串返回值来设置跳转url地址别名或者物理跳转地址。

    3、Model类
    Model 是一个接口,继承了ModelMap类。

    4、ModelAndView
    ModelAndView对象有两个作用:
    (1). 设置转向地址,这也是ModelAndView和ModelMap的主要区别

    ModelAndView view = new ModelAndView("path:ok");
    
    //或者通过setViewName方式:
    public void setViewName(String viewName){...}
    

    (2). 将控制器方法中处理的结果数据传递到结果页面,其作用类似于request对象的setAttribute方法的作用,ModelAndView的实例是由用户手动创建的

    public ModelAndView addObject(String attributeName, Object attributeValue){...}
    public ModelAndView addObject(Object attributeValue){...}
    
    public ModelAndView method123(String someparam)
    {
          //构建ModelAndView实例,并设置跳转地址
          ModelAndView view = new ModelAndView("path:handleok");
          //将数据放置到ModelAndView对象view中,第二个参数可以是任何java类型
          view.addObject("key",someparam);
        ......
         //返回ModelAndView对象view
          return view;
    }
    

    5、使用Map传值,以及Model和ModelMap的整合

    @RequestMapping("/test")
    public String test(Map<String,Object> map,Model model,ModelMap modelMap){
    
        map.put("names", Arrays.asList("caoyc","zhh","cjx"));
    
        model.addAttribute("time", new Date());
        modelMap.addAttribute("city", "ChengDu");
        modelMap.put("gender", "male");
        return "hello";
    }
    

    一的补充:一个例子

    index.html:

    <!DOCTYPE html>
    <html>
    <head>
        <title>Spring MVC如何接受浏览器传递来的参数</title>
        <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    </head>
    <body>
        <form action="addbook" method="POST">
            <fieldset>
                <legend>要上传的参数</legend>
                 书名:<input name="bookname" /><br>
                作者:<input name="author" /><br>
                出版社:<input name="press" /><br>
                ISBN:<input name="isbn" /><br>
                豆瓣评分:<input name="douban" /><br>
            <input type="submit" value="提交" />
            </fieldset>
            
        </form>
    </body>
    </html>
    

    result.jsp

    <%@page pageEncoding="utf-8" 
            contentType="text/html;charset=utf-8" %>
    <html>
        <head>
            <title>返回结果</title>
        </head>
        <body style="color:blue;font-size:18px">
            您输入的书籍信息为:<br>
            书籍的名称:${book.bookname }<br><br>
            书籍的作者:${book.author }<br><br>
            书籍的出版社:${book.press }<br><br>
            书籍的ISBN:${book.isbn }<br><br>
            书籍的豆瓣评分:${book.douban }<br><br>
        </body>
    </html> 
    

    Book类省略了

    Controller

    @Controller
    public class ModelDemoController {
        @RequestMapping("/addbook")
        public String modelTest(Book book,Model model){  
        //将Model放在形参当中
            model.addAttribute("book", book);
            return "result";
        }
    }
    

    浏览器访问index.html,输入信息后,来到result.jsp页面。

    2、使用@ModelAttribute注解
    被@ModelAttribute修饰的方法会在该控制器里的其他方法执行前执行,并且每个处理方法执行时都会执行一次

    @Controller
    public class ModelAttributeDemoController {
        
        //加在方法上,该方法返回值是一个对象,相当于以“book”为key,以方法的返回值为value,添加到了model中
        //如果没有指定key,那么默认的key是返回值类型的首字母小写
        @ModelAttribute("book")  
        public Book getBookInfo(Book book){  //注意这里的参数封装,跟处理方法的参数一样:形参同名;实体类;@RequestParam
            System.out.println("getBookInfo方法执行。。。。。");  //该方法会在调用addbook()方法前先调用
            return book;
        }
        
        @RequestMapping("/addbook")
        public String addbook(){
            System.out.println("addbook方法开始执行。。。。。");
            return "result";
        }
    }
    

    result.jsp

    <%@page pageEncoding="utf-8" 
            contentType="text/html;charset=utf-8" %>
    <html>
        <head>
            <title>返回结果</title>
        </head>
        <body style="color:blue;font-size:18px">
            您输入的书籍信息为:<br>
            书籍的名称:${book.bookname }<br><br>  <!-- @ModelAttribute可以将一个对象传递过来 -->
            书籍的作者:${book.author }<br><br>
            书籍的出版社:${book.press }<br><br>
            书籍的ISBN:${book.isbn }<br><br>
            书籍的豆瓣评分:${book.douban }<br><br>
        </body>
    </html> 
    

    3、使用@ModelAttribute在处理方法中获取到绑定的对象

    @Controller
    public class ModelAttributeDemoController {
      @ModelAttribute("book")
        public Book getBookInfo(Book book){
            System.out.println("getBookInfo方法执行。。。。。");
            return book;
        }
        @RequestMapping("/addbook")
        public String addbook(@ModelAttribute("book") Book b){  //该注解注释形参,将getBookInfo绑定的对象赋值给形参b
            b.setBookname("书的名字被改了"); //获取到绑定的对象后,就可以做些修改,然后传递给视图
            System.out.println("addbook方法开始执行。。。。。");
            return "result";
        }
    }
    

    4、用@ModelAttribute注释返回值为void的方法

    @Controller
    public class ModelAttributeDemoController {
        
        @ModelAttribute  //修饰返回值为void的方法,因为没有返回值,因而不能绑定返回值。在形参中加上Model,在视图中就可以拿到绑定的数据
        public void getBookInfo(Book book,Model model){
            System.out.println("getBookInfo方法执行。。。。。");
            model.addAttribute("book", book);
        }
        
        @RequestMapping("/addbook")
        public String addbook(Model model){
            Book b=(Book)model.asMap().get("book");
            b.setBookname("书的名字被改了");
            System.out.println("addbook方法开始执行。。。。。");
            return "result";
        }
    }
    

    5、getAttribute和getParameter的区别
    getAttribute表示从request取得设置的属性,必须要先setAttribute设置属性,设置与取得的为Object对象类型。

    getParameter表示接收参数,参数为页面提交的参数,包括:表单提交的参数、URL重写(就是xxx?id=1中的id)等,因此这个并没有设置参数的方法(没有setParameter),而且接收参数返回的是String类型。

    HttpServletRequest类既有getAttribute()方法,也由getParameter()方法

    二、向控制器传递

    1、@RequestParam注解的使用
    request.getParameter(“参数名”)

    springmvc会自动根据参数名字来注入,所以要名字一致,不然不会注入

    @RequestMapping("/")
    public String Demo1(@RequestParam String lid){
        System.out.println("----"+lid);
        return null;
    }
    
    前台页面
    <input type="text" name="lid" />  <!-- 这时输出为10 -->
    
    输出结果
    ----10
    

    当参数名不一致时

    @RequestMapping("/")
    public String Demo1(@RequestParam(name="lid") String id){
        System.out.println("----"+id);
        return null;
    }
    

    可以通过required=false或者true来要求@RequestParam配置的前端参数是否一定要传

    @RequestMapping("/")
    public String Demo1(@RequestParam(name="lid",required=true) int id){
             ……
    }
    

    2、HttpServletRequest。

    @RequestMapping("/login")  
    public String login(HttpServletRequest request){  
        String name = request.getParameter("name")  
        String pass = request.getParameter("pass")  
    } 
    

    3、使用自动机制封装成实体参数

        <form action="login.do">  
        用户名:<input name="name"/>  
        密码:<input name="pass"/>  
        <input type="submit" value="登陆">  
        </form>  
          
        //封装的User类  
        public class User{  
          private String name;  
          private String pass;  
        }
    
      @RequestMapping("/login")  
        public String login(User user)  
        {  
           user.getName();  
           user.getPass();  
        }  
    

    三、其它

    1、@ResponseBody
    这个注解表示该方法的返回结果直接写入HTTP response body中。
    在使用@RequestMapping后,返回值通常解析为跳转路径。加上@responsebody后,返回结果直接写入HTTP response body中,不会被解析为跳转路径

    2、//@RestController
    @RestController相当于@Controller+@ResponseBody,每一个方法上默认返回的是json串。

    相关文章

      网友评论

          本文标题:前后端的参数传递

          本文链接:https://www.haomeiwen.com/subject/diwasftx.html