MVC,模型、视图、控制器,请求来了,控制器负责找到Controller进行一通计算,计算的结果放到模型里,再找视图把结果呈现出来。

请求里一般都包含了一些参数,前面说了,Spring MVC有很多种方式可以拿到这些参数,一通计算之后把结果存到了模型里,但是这模型有哪些,怎样顺顺利利的交给视图呢?

HttpServletRequest

这个类简直神通广大,接受参数靠它,传递结果还靠他。当然了,估计后面的Model、ModelAndView都是把它封装在其中的

ModelAndView

一接触Spring MVC,肯定先接触的是这个类。该类将视图和模型放在一起,视图名称解析器和视图解析器就到这个类的对象里拿数据,一开始就用它,不说了。

Model与ModelMap、Map

还是用前面的上传书籍信息的例子,

index.html

  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4. <title>Spring MVC如何接受浏览器传递来的参数</title>
  5. <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
  6. </head>
  7. <body>
  8. <form action="addbook" method="POST">
  9. <fieldset>
  10. <legend>要上传的参数</legend>
  11. 书名:<input name="bookname" /><br>
  12. 作者:<input name="author" /><br>
  13. 出版社:<input name="press" /><br>
  14. ISBN:<input name="isbn" /><br>
  15. 豆瓣评分:<input name="douban" /><br>
  16. <input type="submit" value="提交" />
  17. </fieldset>
  18. </form>
  19. </body>
  20. </html>

result.jsp

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

实体类Book省略

写Controller

  1. package net.sonng.mvcdemo.controller;
  2. import net.sonng.mvcdemo.entity.Book;
  3. import org.springframework.stereotype.Controller;
  4. import org.springframework.ui.Model;
  5. import org.springframework.web.bind.annotation.RequestMapping;
  6. @Controller
  7. public class ModelDemoController {
  8. @RequestMapping("/addbook")
  9. public String modelTest(Book book,Model model){ //将Model放在形参当中
  10. model.addAttribute("book", book);
  11. return "result";
  12. }
  13. }

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

看起来modelTest()方法中压根就没有model的对象,下面调用addAttribute()方法,岂不是要抛NullPointerException异常了。其实Spring MVC在调用这个处理方法之前就已经创建了一个隐含的模型对象,如果处理方法的参数有Model或者ModelMap,那就将这个隐含对象直接传递过去,当然就想咋用就咋用了。

说了Model,还有ModelMap、Map呢,将上面处理方法的Model换成ModelMap或者Map,其余代码不变。

上面把Model或者ModelMap放在形参里面是可以的,那放在局部变量里呢?

Model:这是个接口,找到一个实现类ExtendedModelMap,也是可以的

ModelMap:也可以

Map:也是个接口,用HashMap也是可以的。

所以:这个隐含对象到底是哪个类的对象?

@ModelAttribute注解----用@ModelAttribute(value="")注释返回值为对象的方法

这个注解用法有点多,很灵活,从获取请求参数到处理这些数据再到向视图传递数据,一条线从头到尾。

特别注意:被@ModelAttribute修饰的方法会在该控制器里的其他方法执行前执行,并且每个处理方法执行时都会执行一次

还是以传递书籍信息作例子

  1. package net.sonng.mvcdemo.controller;
  2. import java.util.Map;
  3. import javax.servlet.http.HttpServletRequest;
  4. import net.sonng.mvcdemo.entity.Book;
  5. import org.springframework.stereotype.Controller;
  6. import org.springframework.ui.Model;
  7. import org.springframework.web.bind.annotation.ModelAttribute;
  8. import org.springframework.web.bind.annotation.RequestMapping;
  9. @Controller
  10. public class ModelAttributeDemoController {
  11. //加在方法上,该方法返回值是一个对象,相当于以“book”为key,以方法的返回值为value,添加到了model中
  12. //如果没有指定key,那么默认的key是返回值类型的首字母小写
  13. @ModelAttribute("book")
  14. public Book getBookInfo(Book book){ //注意这里的参数封装,跟处理方法的参数一样:形参同名;实体类;@RequestParam
  15. System.out.println("getBookInfo方法执行。。。。。"); //该方法会在调用addbook()方法前先调用
  16. return book;
  17. }
  18. @RequestMapping("/addbook")
  19. public String addbook(){
  20. System.out.println("addbook方法开始执行。。。。。");
  21. return "result";
  22. }
  23. }

视图result.jsp如下:

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

@ModelAttribute注解----用@ModelAttribute(value="")注释处理方法的形参--在处理方法中获取到绑定的对象

看代码:

  1. package net.sonng.mvcdemo.controller;
  2. import java.util.Map;
  3. import javax.servlet.http.HttpServletRequest;
  4. import net.sonng.mvcdemo.entity.Book;
  5. import org.springframework.stereotype.Controller;
  6. import org.springframework.ui.Model;
  7. import org.springframework.web.bind.annotation.ModelAttribute;
  8. import org.springframework.web.bind.annotation.RequestMapping;
  9. @Controller
  10. public class ModelAttributeDemoController {
  11. @ModelAttribute("book")
  12. public Book getBookInfo(Book book){
  13. System.out.println("getBookInfo方法执行。。。。。");
  14. return book;
  15. }
  16. @RequestMapping("/addbook")
  17. public String addbook(@ModelAttribute("book") Book b){ //该注解注释形参,将getBookInfo绑定的对象赋值给形参b
  18. b.setBookname("书的名字被改了"); //获取到绑定的对象后,就可以做些修改,然后传递给视图
  19. System.out.println("addbook方法开始执行。。。。。");
  20. return "result";
  21. }
  22. }

上面的处理方法换成这样,也是可以获得绑定对象的的:

  1. @RequestMapping("/addbook")
  2. public String addbook(Model model){
  3. Book b=(Book)model.asMap().get("book");
  4. b.setBookname("书的名字被改了");
  5. System.out.println("addbook方法开始执行。。。。。");
  6. return "result";
  7. }

@ModelAttribute注解----用@ModelAttribute注释返回值为void的方法

看controller代码:

  1. package net.sonng.mvcdemo.controller;
  2. import net.sonng.mvcdemo.entity.Book;
  3. import org.springframework.stereotype.Controller;
  4. import org.springframework.ui.Model;
  5. import org.springframework.web.bind.annotation.ModelAttribute;
  6. import org.springframework.web.bind.annotation.RequestMapping;
  7. @Controller
  8. public class ModelAttributeDemoController {
  9. @ModelAttribute //修饰返回值为void的方法,因为没有返回值,因而不能绑定返回值。在形参中加上Model,在视图中就可以拿到绑定的数据
  10. public void getBookInfo(Book book,Model model){
  11. System.out.println("getBookInfo方法执行。。。。。");
  12. model.addAttribute("book", book);
  13. }
  14. @RequestMapping("/addbook")
  15. public String addbook(Model model){
  16. Book b=(Book)model.asMap().get("book");
  17. b.setBookname("书的名字被改了");
  18. System.out.println("addbook方法开始执行。。。。。");
  19. return "result";
  20. }
  21. }

@ModelAttribute和@RequestMapping一起修饰处理方法

这种情况下,看起来有点奇怪

Controller代码:

  1. package net.sonng.mvcdemo.controller;
  2. import net.sonng.mvcdemo.entity.Book;
  3. import org.springframework.stereotype.Controller;
  4. import org.springframework.ui.Model;
  5. import org.springframework.web.bind.annotation.ModelAttribute;
  6. import org.springframework.web.bind.annotation.RequestMapping;
  7. @Controller
  8. public class ModelAttributeDemoController {
  9. @ModelAttribute("info")
  10. @RequestMapping("/addbook")
  11. public String addbook(Book book){
  12. book.setBookname("书的名字被改了改了");
  13. return "result"; //这里的result不再是视图名,而是作为字符串返回值成为key为info的对应的value的值,视图名是请求名,也就是addbook
  14. }
  15. }

把result.jsp改名为:addbook.jsp,并加一行代码:

  1. <%@page pageEncoding="utf-8"
  2. contentType="text/html;charset=utf-8" %>
  3. <html>
  4. <head>
  5. <title>返回结果</title>
  6. </head>
  7. <body style="color:blue;font-size:18px">
  8. 您输入的书籍信息为:<br>
  9. 书籍的名称:${book.bookname }<br><br>
  10. 书籍的作者:${book.author }<br><br>
  11. 书籍的出版社:${book.press }<br><br>
  12. 书籍的ISBN:${book.isbn }<br><br>
  13. 书籍的豆瓣评分:${book.douban }<br><br>
  14. @ModelAttribute绑定的数据是:${info } <!-- 加了一行代码 -->
  15. </body>
  16. </html>

访问index.jsp,输入数据提交后,返回如下页面:

  1. 您输入的书籍信息为:
  2. 书籍的名称:书的名字被改了改了 //book的信息还是被传递到了视图中,并且跟@ModelAttribute("info")注解无关
  3. 书籍的作者:Craig Walls 沃尔斯
  4. 书籍的出版社:人民邮电出版社
  5. 书籍的ISBN9787115417305
  6. 书籍的豆瓣评分:8.4
  7. @ModelAttribute绑定的数据是:result //result成为了绑定值,传递到视图,而不是视图名

总的来说,@ModelAttribute更像是为了将请求参数的封装跟处理方法分离,单独用一个方法负责参数的获取封装

Spring MVC的请求参数的获取、传递,模型传递,都十分灵活。

0058 Spring MVC如何向视图传值--Model--ModelMap--ModelAndView--@ModelAttribute的更多相关文章

  1. SpringMVC的Model ModeMap ModelAndView @ModelAttribute @SessionAttribute区分

    Spring MVC整理系列(05)————Spring MVC配置解析及整合SpriSpring MVC之@ModelAttribute.@SessionAttributes以及Model的使用介绍 ...

  2. Spring MVC 向页面传值-Map、Model和ModelMap

    原文链接:https://www.cnblogs.com/caoyc/p/5635878.html Spring MVC 向页面传值-Map.Model和ModelMap 除了使用ModelAndVi ...

  3. Spring MVC 向页面传值-Map、Model、ModelMap、ModelAndView

    Spring MVC 向页面传值,有4种方式: ModelAndView Map Model ModelMap 使用后面3种方式,都是在方法参数中,指定一个该类型的参数. Model Model 是一 ...

  4. Spring MVC 向页面传值-Map、Model和ModelMap https://www.cnblogs.com/caoyc/p/5635878.html

    Spring MVC 向页面传值-Map.Model和ModelMap 除了使用ModelAndView方式外.还可以使用Map.Model和ModelMap来向前台页面创造 使用后面3种方式,都是在 ...

  5. Model ModelMap ModelAndView

    前言 Spring MVC在调用方法前会创建一个隐含的模型对象作为模型数据的存储容器. 如果方法的入参为ModelMap,Model,Map类型,Spring MVC会将隐含模型的引用传递给这些入参. ...

  6. springMVC数据模型model,modelmap,map,@ModelAttribute的相互关系

    结论: a.注解方法中形参为model,modelmap,map一个或几个时,他们指向的引用对象相同即他们的值相同. b.当使用@ModelAttribute注解请求参数时,springmvc自动将该 ...

  7. Spring mvc前台后台传值

    前台向后台传值: ①同名参数传递:form表单中提交input,Controller方法入参中,直接以同名参数获取 ②不同名参数传递:from表单提交input,Controller方法入参中需要使用 ...

  8. ASP.NET MVC Action向视图传值之匿名类型

    在使用ASP.NET MVC过程中想必大家都有遇到过一个问题就是我们的Action如何向视图传递匿名类型的值呢,如果不做特殊处理则无法实现. 接下来我们来看一个示例: 在我们的控制中: using S ...

  9. spring Mvc Web 编码相关 [model 到 视图传递数据] (九)

    在某种编码环境,由bean注解的参数可能会发生乱码问题. 即可页面web.xml或其他地方都设备UTF-8, 但还是会有这样的问题. 首先不要使用model传到视图的数据. 第二,不要request. ...

随机推荐

  1. js 动画性能分析 transfrom

    1.动画实现代码 (1)使用定位实现: <!DOCTYPE html> <html> <head> <meta charset="utf-8&quo ...

  2. 寻找[nginx] 由Lua 粘合的Nginx生态环境-- agentzh

    来自:linuxtone org     Chnangelog:         120312 fixed as s/hhttp/http/g ,thanx muxueqz         12030 ...

  3. OpenERP7.0安装后提示“not supported" ,如何去掉此提示

    转自:http://blog.csdn.net/vnsoft/article/details/17581831 下载了新版本的OpenERP7.0安装测试,发现在登录后会提示如图的内容. 经过测试发现 ...

  4. SQL Server表描述 及 字段描述的增、删、改、查询

    SQL Server表描述 及 字段描述的增.删.改.查询 --测试: --创建表及描述信息 ),isname )) --为表添加描述信息 EXECUTE sp_addextendedproperty ...

  5. 〖Linux〗使用gsoap搭建web server(C)

    1. gsoap的好处就不用说了:百度百科 2. gsoap的下载地址:项目地址,目前我使用的是2.8.15版本 3. 开发环境:Ubuntu13.10 4. 具体操作步骤(以简单相加为例): 1) ...

  6. 自己写的一个读取execl的帮助类

    目标:读取execl的第一个sheet,并传入不需要读取的表头的行数,返回该execl里所有数据的list 解析共有2种:1.DOM      2.SAX import java.io.File; i ...

  7. Tomcat 配置加密的服务器连接器

    先查询API,找到Configuration里面的Connector的HTTP中的SSL(加密连接器) SSL abbr. Security Socket Layer 加密套接字协议层   利用已生成 ...

  8. Centos6.5生产环境最小化优化配置

    Centos6.5生产环境最小化优化配置,满足业务需求! 01.启动网卡 #centos6.x最小化安装后,网卡默认不是启动状态 ifup eth0  //  ifconfig eth0 up /et ...

  9. java开发_eclipse导出为war文件,热部署到tomcat运行总结[转]

    在Myeclipse中,我们很容易做到这一步:把一个web项目生成war文件 其实在eclipse中,实现这样的功能,也是很简单的. 下面就看一下是怎样操作的吧! 新建一个web项目: 取名为:ecl ...

  10. Fusion Tables 图层用于呈现 Google Fusion Tables 中包含的数据

    Google Maps API 允许您使用 FusionTablesLayer 对象将 Google Fusion Tables 中包含的数据呈现为地图上的图层.Google Fusion Table ...