前后端的参数传递

2018-06-12  本文已影响0人  Tommmmm

一、向视图传值

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串。

上一篇下一篇

猜你喜欢

热点阅读