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

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

HttpServletRequest

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

ModelAndView

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

Model与ModelMap、Map

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

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

package net.sonng.mvcdemo.controller;

import net.sonng.mvcdemo.entity.Book;

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

浏览器访问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修饰的方法会在该控制器里的其他方法执行前执行,并且每个处理方法执行时都会执行一次

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

package net.sonng.mvcdemo.controller;

import java.util.Map;

import javax.servlet.http.HttpServletRequest;

import net.sonng.mvcdemo.entity.Book;

import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.RequestMapping; @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>

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

看代码:

package net.sonng.mvcdemo.controller;

import java.util.Map;

import javax.servlet.http.HttpServletRequest;

import net.sonng.mvcdemo.entity.Book;

import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.RequestMapping; @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";
}
}

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

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

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

看controller代码:

package net.sonng.mvcdemo.controller;

import net.sonng.mvcdemo.entity.Book;

import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.RequestMapping; @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";
}
}

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

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

Controller代码:

package net.sonng.mvcdemo.controller;

import net.sonng.mvcdemo.entity.Book;

import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.RequestMapping; @Controller
public class ModelAttributeDemoController { @ModelAttribute("info")
@RequestMapping("/addbook")
public String addbook(Book book){
book.setBookname("书的名字被改了改了");
return "result"; //这里的result不再是视图名,而是作为字符串返回值成为key为info的对应的value的值,视图名是请求名,也就是addbook
}
}

把result.jsp改名为:addbook.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>
@ModelAttribute绑定的数据是:${info } <!-- 加了一行代码 -->
</body>
</html>

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

您输入的书籍信息为:
书籍的名称:书的名字被改了改了 //book的信息还是被传递到了视图中,并且跟@ModelAttribute("info")注解无关 书籍的作者:Craig Walls 沃尔斯 书籍的出版社:人民邮电出版社 书籍的ISBN:9787115417305 书籍的豆瓣评分:8.4 @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. How to set up OpenERP for various timezone kindly follow the following steps to select timezone in OpenERP

        How to set up OpenERP for different Time Zones Click on the "Edit Preferences" wheel a ...

  2. eclipse to avoid the message, disable the...

      标题 CreateTime--2018年5月9日10:38:15 Author:Marydon 1.问题描述 2.问题解析 这是因为eclipse的智能提示超时引起的,将超时间调大即可,如:200 ...

  3. 使用JDK自带的Stax操作XML

    操作的books.xml <?xml version="1.0" encoding="UTF-8"?> <bookstore> < ...

  4. PHP 大数自动转换为科学计数法

    前段时间碰到一个很头疼的问题,就是大于12位的数字在PHP中,会自动转成科学计数法表 示. 比如 1234567891234 显示为 1.23456789123E+12 , 最后只能在计算出大数之后, ...

  5. 解决ADSL拨号上网错误691:由于域上的用户名和密码无效而拒绝访问

    此错误是发生在我家用一个台式机拨号上网没问题,但笔记本拨号上网就有问题.   问题解决发现是电信初次拨号上网会绑定这个拨号用户的MAC网卡地址,将台式机的MAC地址配置到我的笔记本上就ok了!     ...

  6. ajax操作登录

    js文件中的内容(ajax.operate.js) ;(function ($, window) { var _ajaxOperate = window.ajaxOperate || {}; _aja ...

  7. Android HTTP通讯

    这里有一个非常棒的http通讯的总结,我看了以后茅塞顿开. 先贴代码: 01 public class Activity1 extends Activity { 02   03     private ...

  8. 史上最简单的ButterKnife配置教程

    网上的教程感觉都是抄来抄去,没一个靠谱的 还是自己丰衣足食搞一个ButterKnife配置教程吧.. 我的Android Studio版本是3.3. 1.dependencies中添加依赖 imple ...

  9. python标准库介绍——23 UserString 模块详解

    ==UserString 模块== (2.0 新增) ``UserString`` 模块包含两个类, //UserString// 和 //MutableString// . 前者是对标准字符串类型的 ...

  10. tomcat多域名配置(转)

    TOMCAT的域名配置 现在很多的公司的网站都是用tomcat作为应用服务区的,可是对于初学者,8080端口号是如何去掉的,这些网站是如何和域名绑定到一起的呢?一个 tomcat是如何绑定多域名?并且 ...