前后端的参数传递
一、向视图传值
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串。