SpringMVC之数据传递二

时间:2023-01-20 20:15:38

上一篇学习了从url或view中传数据到Controller中,今天学习下数据从Controller传到view中,主要有4种。

一、ModelAndView

处理方法返回值类型为 ModelAndView时, 方法体即可通过该对象添加模型数据。

    @RequestMapping(value = "/testModelAndView",method = RequestMethod.GET)
public ModelAndView testModelAndView(HttpServletRequest request, HttpServletResponse response){ String viewName = "Hello";//视图名
ModelAndView modelAndView = new ModelAndView(viewName);
User user=new User();
user.setName("cuiyw");
user.setPwd("testModelAndView");
user.setBirthday(new Date());
modelAndView.addObject("name","cyw");
modelAndView.addObject("user",user);
return modelAndView;
}

二、Model/Map/ModelMap

入参为org.springframework.ui.Model、org.springframework.ui.ModelMap 或 Java.uti.Map 时,处理方法返回时,Map中的数据会自动添加到模型中

    @RequestMapping(value = "/testModel.do",method = RequestMethod.GET)
public String testModel(Model model){
User user=new User();
user.setName("cuiyw");
user.setPwd("testModel");
user.setBirthday(new Date());
model.addAttribute("name","cyw");
model.addAttribute("user",user);
return "Hello";
} @RequestMapping(value = "/testMap.do",method = RequestMethod.GET)
public String testMap(Map<String,Object> map){
User user=new User();
user.setName("cuiyw");
user.setPwd("testMap");
user.setBirthday(new Date());
map.put("name","cyw");
map.put("user",user);
return "Hello";
}

上面两个我们都可以使用下面的html访问变量。

<%@ page language="java" contentType="text/html; charset=utf-8"
pageEncoding="utf-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>Insert title here</title>
</head>
<body>
姓名:${user.name}<br>
密码:${user.pwd}<br>
出生日期:${user.birthday}<br>
名字:${name}<br>
名字:${requestScope.name}<br>
姓名:${requestScope.user.name}<br>
</body>
</html>

三、@SessionAttributes

将模型中的某个属性暂存到HttpSession 中,以便多个请求之间可以共享这个属性,比如我们登录之后可能会存登录信息,就可以使用它。@SessionAttributes这个注解只能放到类的上面。

@SessionAttributes({"user"})
@Controller
@RequestMapping("/hello")
public class HelloController {

这里我们将上面的user存到HttpSession中,我们可以在jsp中验证一下。

这里我们在html中加入SessionAttributes:${sessionScope.user.name}。

<%@ page language="java" contentType="text/html; charset=utf-8"
pageEncoding="utf-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>Insert title here</title>
</head>
<body>
姓名:${user.name}<br>
密码:${user.pwd}<br>
出生日期:${user.birthday}<br>
名字:${name}<br>
名字:${requestScope.name}<br>
姓名:${requestScope.user.name}<br>
SessionAttributes:${sessionScope.user.name}
</body>
</html>

当我们访问http://localhost:8080/WebMVC/hello/testModelAndView时,jsp输出结果如下.

SpringMVC之数据传递二

下面定义了一个testSessionAttributes,它里面什么都没有,只有返回Hello。当我们再访问它时http://localhost:8080/WebMVC/hello/testSessionAttributes.do,会有下图的结果。可以看到jsp中名字部分是没有值得,因为@SessionAttributes({"user"}),这只设置了user,对name没设置。

    @RequestMapping(value = "/testSessionAttributes.do",method = RequestMethod.GET)
public String testSessionAttributes(HttpServletRequest request, HttpServletResponse response){
return "Hello";
}

SpringMVC之数据传递二

四、@ModelAttribute

SpringMVC在每次调用请求处理方法时,都会创建Model类型的一个实例。如果准备使用此实例,则可以在方法中添加一个Model类型的参数,在上面的testModel方法就是这样使用的。它可以用@ModelAttribute来注释方法参数:带有@ModelAttribute注解的方法会将其输入或创建的参数对象添加到Model对象中(若方法中没有显式添加)。也可以用@ModelAttribute标注一个非请求的处理方法(有返回值,无返回值):被@ModelAttribute注释的方法会在此controller每个方法执行前被执行。

1.@ModelAttribute注释方法参数

    @RequestMapping(value = "/testModelAttribute.do",method = RequestMethod.GET)
public String testModelAttribute(HttpServletRequest request, HttpServletResponse response,@ModelAttribute("user")User user,@ModelAttribute("name")String name,Model model){
user.setName("cuiyw");
user.setPwd("testModelAttribute");
user.setBirthday(new Date());
name="testModelAttribute";
model.addAttribute("name", name);
return "Hello";
}

这里有个奇怪的地方,假如不传name的话,model也可以不用写在参数中,在函数中设置user的值在页面就能获取到,但是如果传入String类型的参数,那它就需要加入model这个参数,并要显示的设置才能在jsp中获取,这个暂时还不知道为什么。

2.@ModelAttribute标注一个非请求的处理方法

由于被@ModelAttribute注释的方法会在此controller每个方法执行前被执行。我们可以做个测试。

1)、有返回值

这里定义了一个map方法,并被标注为 @ModelAttribute(value = "mymap"),返回值是Map<String,Object>,在函数里面我们设置了user和name.

    @RequestMapping(value = "/testSessionAttributes.do",method = RequestMethod.GET)
public String testSessionAttributes(HttpServletRequest request, HttpServletResponse response){
return "Hello";
} @ModelAttribute(value = "mymap")
public Map<String,Object> map() {
User user=new User();
user.setName("cuiyw");
user.setPwd("ModelAttribute");
user.setBirthday(new Date());
HashMap<String, Object> map=new HashMap<String, Object>();
map.put("name","cyw");
map.put("user",user);
return map;
} @RequestMapping(value = "/testMethodModelAttribute.do",method = RequestMethod.GET)
public String testModelAttribute(HttpServletRequest request, HttpServletResponse response){
return "Hello";
}

我们在页面获取值,这里要注意,其实在 map()方法中是省略了一句,model.addAttribute("mymap", map);它对应的是mymap,所以在jsp中不能直接访问user和name。需要通过mymap来访问,我们之前设置的@SessionAttributes({"user"})这里也就不会有值了。

<%@ page language="java" contentType="text/html; charset=utf-8"
pageEncoding="utf-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>Insert title here</title>
</head>
<body>
姓名:${mymap.user.name}<br>
密码:${mymap.user.pwd}<br>
出生日期:${mymap.user.birthday}<br>
名字:${mymap.name}<br>
名字:${requestScope.mymap.name}<br>
姓名:${requestScope.mymap.user.name}<br>
SessionAttributes:${sessionScope.user.name}
</body>
</html>

SpringMVC之数据传递二

SpringMVC之数据传递二

如果我们想将里面的user设置为sessionAttribute,我们可以@SessionAttributes({"user","mymap"}),SessionAttributes:${sessionScope.mymap.user.name}来获取。

2)、无返回值

若方法返回一个void类型,则还必须自行将实例添加到Model中。

    @ModelAttribute
public void voidmap(Model model) {
User user=new User();
user.setName("cuiyw3");
user.setPwd("ModelAttribute3");
user.setBirthday(new Date());
HashMap<String, Object> map=new HashMap<String, Object>();
map.put("name","cyw3");
map.put("user",user);
model.addAttribute("mymap",map);
}

SpringMVC之数据传递二

SpringMVC之数据传递二的更多相关文章

  1. SpringMVC之数据传递一

    之前的博客中也说了,mvc中数据传递是最主要的一部分,从url到Controller.从view到Controller.Controller到view以及Controller之间的数据传递.今天主要学 ...

  2. OpenGL笔记&lt&semi;4&gt&semi; 数据传递二

    Sending data to a shader using uniform Preface 上一节我们介绍了通过顶点属性量进行数据传递,今天我们介绍一下通过uniform变量来进行数据传递的方法. ...

  3. SpringMVC前后台数据传递中Json格式的相互转换&lpar;前台显示格式、Json-lib日期处理&rpar;及Spring中的WebDataBinder浅析

    两个方向: 一.前台至后台: Spring可以自动封装Bean,也就是说可以前台通过SpringMVC传递过来的属性值会自动对应到对象中的属性并封装成javaBean,但是只能是基本数据类型(int, ...

  4. springMVC之数据传递

    在前面介绍过从controller中向页面中传数据,可以通过HttpServletRequest进行setAttribute可以将数据放入request中.并且可以在jsp页面使用el表达式获取数据. ...

  5. SpringMvc date数据传递处理

    1.form表单提交date数据 form表单提交的date数据要在接收的字段上加入@DateTimeFormat注解 @DateTimeFormat(pattern = "yyyy-MM- ...

  6. MVC进阶学习--View和Controller之间的数据传递&lpar;二&rpar;

    1. 使用Request.Form MVC 将页面简单化,与WebForm中的事件机制完全不同,就和普通的html标签表单提交没有任何区别(当然WebForm中的事件机制其实也是表单提交).在表单提交 ...

  7. 《Java从入门到放弃》入门篇:springMVC数据传递

    springMVC中的数据传递方式与JSP和Struts2相比,更加的简单.具体有什么样的区别呢?我们通过下面这张图来对比就知道了. 随手画的,有些错别字,不用太在意..... 接下来,进入正题,sp ...

  8. 七天学会ASP&period;NET MVC &lpar;二&rpar;——ASP&period;NET MVC 数据传递

    通过第一天的学习之后,我们相信您已经对MVC有一些基本了解. 本节所讲的内容是在上节的基础之上,因此需要确保您是否掌握了上一节的内容.本章的目标是在今天学习结束时利用最佳实践解决方案创建一个小型的MV ...

  9. Vue 爬坑之路(二)—— 组件之间的数据传递

    Vue 的组件作用域都是孤立的,不允许在子组件的模板内直接引用父组件的数据.必须使用特定的方法才能实现组件之间的数据传递. 首先用 vue-cli 创建一个项目,其中 App.vue 是父组件,com ...

随机推荐

  1. 玩转Jquery,告别前端知道思路忘记知识点的痛苦

    本节内容: 本章主要讲解一下jquery,主要是工作中用的前端框架是datetables框架,然后datetables框架又是基于jqeury研发的,所以要想学一个东西,就必须要了解其底层,不然走路都 ...

  2. ZigZag Conversion leetcode java

    题目: The string "PAYPALISHIRING" is written in a zigzag pattern on a given number of rows l ...

  3. 网络工程 POST与GET请求方法的本质区别

    POST与GET请求方法的本质区别: 第一:GET用于信息获取,它是安全的(这里安全的含义是指非修改信息),而POST是用于修改服务器上资源的请求 第二:GET请求的数据会附在URL之后,而POST把 ...

  4. Spring 上下文

    Spring 上下文WebApplicationContext.是服务器启动的时候加载ContextLoaderListener 的时候存在 ServletContext 中 servletConte ...

  5. nginx 重定向到index&period;php

    location /keywords {                index index.php;                try_files $uri $uri/ /keywords/i ...

  6. C&num;设计模式:责任链模式

    设计模式是面向对象编程的基础,是用于指导程序设计.在实际项目开发过程中,并不是一味将设计模式进行套用,也不是功能设计时大量引入设计模式.应该根据具体需求和要求应用适合的设计模式.设计模式是一个老话题了 ...

  7. 接口自动化集成到jenkins(Java&plus;testng&plus;maven&plus;git)

    一jenkins启动命令:jenkins 查看端口号: 1.lsof -i:端口号 2.netstat -tunlp|grep 端口号 二: 登录:http://localhost:8080 输入:u ...

  8. 每天学点SpringCloud(十二):Zipkin全链路监控

    Zipkin是SpringCloud官方推荐的一款分布式链路监控的组件,使用它我们可以得知每一个请求所经过的节点以及耗时等信息,并且它对代码无任何侵入,我们先来看一下Zipkin给我们提供的UI界面都 ...

  9. Error configuring application listener of class org&period;springframework&period;web&period;util

    解决方案: 1.打开工程属性对话框,到Deployment Assembly页面,点击Add 2. 选择Jave Build Path Entries 3. 把程序用于的Library加入进来 4.重 ...

  10. Python学习笔记:lambda表达式

    lambda表达式:通常是在需要一个函数,但又不想去命名一个函数的时候使用,即匿名函数. 示例如下: add = lambda x,y : x+ y add(1,2) # 结果为3 1.应用在函数式编 ...