要实现Controller返回数据给页面,Spring MVC 提供了以下几种途径:
ModelAndView:将视图和数据封装成ModelAndView对象,作为方法的返回值,数据最终会存到HttpServletRequest对象中!
Model对象:通过给方法添加引用Model对象入参,直接往Model对象添加属性值。那么哪些类型的入参才能够引用Model对象,有三种类型,分别是 org.springframework.ui.Model、org.springframework.ui.ModelMap 或 java.uti.Map。只要是这些类型的入参,都是指向Model对象的,而且不管定义多少个这些类型的入参都是指向同一个Model对象!
@SessionAttributes:通过给Controller类添加@SessionAttributes注解,该注解的name和value属性值都是Model的key值,意思是指Model中这些key对应的数据也会存到HttpSession,不仅仅存到HttpServletRequest对象中!这样页面可以共享HttpSession中存的数据了!
@ModelAttribute:使用@ModelAttribute注解的方法会在此Controller每个方法执行前被执行,指定@ModelAttribute的name或value都是一样的功能,都是作为key,将注解的方法返回的对象作为value存放到Model中,不指定name和value的话,则以注解的方法返回的类型名称首字母小写作为key。
当然,除了上述的途径,也可以使用传统的方式,那就是直接使用HttpServletRequest或HttpSession对象来存数据,页面上再去取。
注意:Model中存的数据,最终都会存放到HttpServletRequest对象中,页面上可以通过HttpServletRequest对象获取数据。
接下来,我们就看看demo,通过demo来理解如何通过这几种方式实现将数据返回给页面。
demo场景:通过ResetFul风格的URL路径传递用户ID给Controller,Controller查询出对应的用户信息返回给页面。
Spring MVC配置的视图解析器:
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/jsp/" />
<property name="suffix" value=".jsp" />
</bean>
ReturnModelDataController1.java:
package edu.mvcdemo.controller;
import java.util.Map;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.ui.ModelMap;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.servlet.ModelAndView;
import edu.mvcdemo.model.User;
import edu.mvcdemo.service.IUserService;
/**
* @编写人: yh.zeng
* @编写时间:2017-7-10 下午9:16:54
* @文件描述: Controller中如何将model数据返回给页面的demo1
*/
@Controller
@Scope(value="singleton") //只实例化一个bean对象(即每次请求都使用同一个bean对象),默认是singleton
@RequestMapping("users")
public class ReturnModelDataController1 {
@Autowired
@Qualifier("userService")
private IUserService userService;
/**
* 方式一,通过ModelAndView返回用户信息数据到页面
* @return
*/
@RequestMapping(value="/view/{userId}/use/ModelAndView", method=RequestMethod.GET)
private ModelAndView getUserInfo(@PathVariable("userId") Integer userId){
User user = userService.getUserById(userId);
return new ModelAndView("userinfo", "user", user);
}
/**
* 方式二,通过Model返回用户信息数据到页面
* @return
*/
@RequestMapping(value="/view/{userId}/use/Model", method=RequestMethod.GET)
private String getUserInfo(@PathVariable("userId") Integer userId, Model model){
User user = userService.getUserById(userId);
model.addAttribute("user", user);
return "userinfo";
}
/**
* 方式三,通过ModelMap返回用户信息数据到页面
* @return
*/
@RequestMapping(value="/view/{userId}/use/ModelMap", method=RequestMethod.GET)
private String getUserInfo(@PathVariable("userId") Integer userId, ModelMap model){
User user = userService.getUserById(userId);
model.addAttribute("user", user);
return "userinfo";
}
/**
* 方式四,通过Map返回用户信息数据到页面
* @return
*/
@RequestMapping(value="/view/{userId}/use/Map", method=RequestMethod.GET)
private String getUserInfo(@PathVariable("userId") Integer userId, Map<String,Object> model){
User user = userService.getUserById(userId);
model.put("user", user);
return "userinfo";
}
}
RetunnModelDataController2.java:
package edu.mvcdemo.controller;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.SessionAttributes;
import org.springframework.web.servlet.ModelAndView;
import edu.mvcdemo.model.User;
import edu.mvcdemo.service.IUserService;
/**
* @编写人: yh.zeng
* @编写时间:2017-7-11 下午9:09:03
* @文件描述: Controller中如何将model数据返回给页面的demo2
*/
@Controller
@Scope(value="singleton") //只实例化一个bean对象(即每次请求都使用同一个bean对象),默认是singleton
@RequestMapping("users")
@SessionAttributes({"user"}) //Model中key=user的数据也会存到HttpSession
public class RetunnModelDataController2 {
@Autowired
@Qualifier("userService")
private IUserService userService;
/**
* 方式五,通过@SessionAttributes将指定key的模型数据存到HttpSession,让页面可以获取
* @return
*/
@RequestMapping(value="/view/{userId}/use/SessionAttributes", method=RequestMethod.GET)
private ModelAndView getUserInfo(@PathVariable("userId") Integer userId){
User user = userService.getUserById(userId);
return new ModelAndView("userinfo", "user", user);
}
}
RetunnModelDataController3.java:
package edu.mvcdemo.controller;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import edu.mvcdemo.model.User;
import edu.mvcdemo.service.IUserService;
/**
* @编写人: yh.zeng
* @编写时间:2017-7-11 下午9:09:03
* @文件描述: Controller中如何将model数据返回给页面的demo3
*/
@Controller
@Scope(value="singleton") //只实例化一个bean对象(即每次请求都使用同一个bean对象),默认是singleton
@RequestMapping("users")
public class RetunnModelDataController3 {
@Autowired
@Qualifier("userService")
private IUserService userService;
/**
* 注解@ModelAttribute用法一:
* 使用@ModelAttribute注解的方法会在此Controller每个方法执行前被执行,
* 指定@ModelAttribute的name或value都是一样的功能,都是作为key,将注解的方法返回的对象作为value存放到Model中,
* 不指定name和value的话,则以注解的方法返回的类型名称首字母小写作为key。
* @param userId ResetFul路径的请求参数
* @return
*/
@ModelAttribute(name="user")
public User addAccount(@PathVariable("userId") Integer userId) {
return userService.getUserById(userId);
}
/**
* 注解@ModelAttribute用法二:
* 使用@ModelAttribute注解的方法会在此Controller每个方法执行前被执行
* @param userId ResetFul路径的请求参数
* @param model 模型对象,可以使用org.springframework.ui.Model、org.springframework.ui.ModelMap
* 或 java.uti.Map 作为入参类型,以引用模型对象
*/
/*@ModelAttribute
public void addAccount(@PathVariable("userId") Integer userId, Model model) {
User user = userService.getUserById(userId);
model.addAttribute("user", user);
}*/
/**
* 方式六,通过@SessionAttributes将指定key的模型数据存到HttpSession,让页面可以获取
* @return
*/
@RequestMapping(value="/view/{userId}/use/ModelAttribute", method=RequestMethod.GET)
private String getUserInfo(@PathVariable("userId") Integer userId){
return "userinfo";
}
}
RetunnModelDataController4.java:
package edu.mvcdemo.controller;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import edu.mvcdemo.model.User;
import edu.mvcdemo.service.IUserService;
/**
* @编写人: yh.zeng
* @编写时间:2017-7-11 下午9:09:03
* @文件描述: Controller中如何将model数据返回给页面的demo2
*/
@Controller
@Scope(value="singleton") //只实例化一个bean对象(即每次请求都使用同一个bean对象),默认是singleton
@RequestMapping("users")
public class RetunnModelDataController4 {
@Autowired
@Qualifier("userService")
private IUserService userService;
/**
* 方式七,直接将数据存到HttpSession,让页面可以获取
* @param userId
* @param session
* @return
*/
@RequestMapping(value="/view/{userId}/use/HttpSession", method=RequestMethod.GET)
private String getUserInfo(@PathVariable("userId") Integer userId, HttpSession session){
User user = userService.getUserById(userId);
session.setAttribute("user", user);
return "userinfo";
}
/**
* 方式八,直接将数据存到HttpServletRequest,让页面可以获取
* @param userId
* @param session
* @return
*/
@RequestMapping(value="/view/{userId}/use/HttpServletRequest", method=RequestMethod.GET)
private String getUserInfo(@PathVariable("userId") Integer userId, HttpServletRequest request){
User user = userService.getUserById(userId);
request.setAttribute("user", user);
return "userinfo";
}
}
用户信息页面userinfo.jsp:
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<!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>userinfo.jsp</title>
</head>
<body>
<c:if test="${sessionScope.user != null}">
<h3>HttpSession对象中也存了用户信息!用户信息如下:</h3>
用户编号:${sessionScope.user.no}
<br>
用户名:${sessionScope.user.userName}
<br>
年龄:${sessionScope.user.age}
</c:if>
<c:if test="${requestScope.user != null}">
<h3>HttpServletRequest对象中存的用户信息如下:</h3>
用户编号:${requestScope.user.no}
<br>
用户名:${requestScope.user.userName}
<br>
年龄:${requestScope.user.age}
</c:if>
</body>
</html>
效果:
方式一:通过org.springframework.web.servlet.ModelAndView实现
方式二:通过org.springframework.ui.Model实现
方式三:通过org.springframework.ui.ModelMap实现
方式四:通过java.util.Map实现
方式五:通过org.springframework.web.bind.annotation.SessionAttributes标注指定Model中的某些数据也存储到HttpSession中
方式六:通过org.springframework.web.bind.annotation.ModelAttribute实现
方式七:直接将数据存到HttpSession,让页面可以获取
方式八:直接将数据存到HttpServletRequest,让页面可以获取
---------------------
相关推荐
在Spring MVC框架中,AOP...通过这种方式,我们可以轻松地在Spring MVC Controller层实现日志管理,无需在每个方法中手动插入日志代码。这种解耦使得代码更易于维护,同时提供了全面的日志信息,有助于调试和性能分析。
- **DAO层**:Spring MVC中的Service层通常调用DAO层完成数据访问,DAO层使用Hibernate进行具体操作。 在`hibernate3.6.8.chm`文件中,可能包含了Hibernate 3.6.8的官方文档,对于深入理解Hibernate的工作原理和...
模型数据通过ModelMap或者模型对象(@ModelAttribute)传递,这允许我们在Controller中处理数据,然后将结果传递给视图。视图解析器(ViewResolver)根据指定的逻辑视图名查找物理视图,常见的视图技术有JSP、...
Spring MVC 支持模型数据自动绑定,可以将请求参数自动绑定到 Controller 方法的参数中,也可以将 Controller 返回的数据自动填充到 Model 中。 六、异常处理 通过 @ExceptionHandler 或自定义 ExceptionResolver,...
Spring MVC中的Model是业务对象,通常由Service层处理,然后传递给Controller。视图则通常是JSP、Thymeleaf、FreeMarker等模板引擎,用于渲染数据并返回给客户端。视图解析器(ViewResolver)在其中起到了关键作用,...
在2015年的版本中,Spring MVC 4已经相当成熟,提供了许多特性来简化开发流程并提高开发效率。在这个"Mastering Spring MVC 4(2015.09)源码"中,我们可以深入理解这个框架的核心概念和实际应用。 首先,Spring MVC ...
Controller将数据传递给Velocity模板,Velocity根据模板内容和传入的数据生成HTML,最后返回给客户端。 总结起来,Spring MVC提供了MVC模式的实现,MyBatis简化了数据库操作,Velocity则负责页面渲染。这三者结合,...
1. **Spring MVC 概述**:Spring MVC 是基于 Spring 框架构建的,它遵循 MVC 设计模式,将业务逻辑、数据和用户界面分离,提高代码的可重用性和可测试性。Spring MVC 通过 DispatcherServlet 进行请求分发,并使用 ...
此外,Spring MVC提供了ModelAndView类,它可以将处理结果(模型数据)和视图名组合在一起,方便返回给视图层进行渲染。`@ResponseBody`注解可以让方法的返回值直接写入HTTP响应体,常用于返回JSON或XML等格式的数据...
在Controller方法中,可以返回一个ModelAndView对象,指定返回的视图和传递给视图的数据。 5. **视图解析**: Spring MVC支持多种视图技术,如JSP、FreeMarker、Thymeleaf等。通过`viewResolver`配置,可以指定视图...
4. **Model**:模型对象,封装了业务数据,Controller处理完请求后,会将Model对象传给View,以便在页面上展示。 5. **ViewResolver**:视图解析器,负责根据Controller返回的视图名称查找实际的视图资源,如JSP、...
在 Spring MVC 框架中,controller 间跳转重定向传参是一个非常常见的需求。这里,我们将讨论三种常见的情况:不带参数跳转、带参数拼接 URL 形式跳转、带参数不拼接参数跳转。 一、不带参数跳转 在某些情况下,...
三、Spring MVC核心流程图:描述了Spring MVC处理请求的流程,包括前端控制器接收请求,经过分发器分发给具体的控制器,然后由控制器处理业务逻辑,最后将结果返回给用户。 四、Spring MVC DispatcherServlet说明:...
在处理请求时,控制器会将数据填充到模型中,然后传递给视图层。 4. **ViewResolver**: 视图解析器的作用是根据模型中的视图名找到对应的视图模板。Spring MVC支持多种视图技术,如JSP、Thymeleaf、FreeMarker等。 ...
在Spring MVC中,DispatcherServlet作为核心组件负责请求分发,Controller处理请求并返回ModelAndView对象,ViewResolver解析模型数据并渲染视图。 2. **配置与启动** 配置Spring MVC通常涉及web.xml文件中的...
在Controller中处理完业务逻辑后,会将数据封装到Model对象中,供视图层使用。 4. **View**:视图是用户界面,Spring MVC支持多种视图技术,如JSP、FreeMarker、Thymeleaf等。视图解析器会根据ModelAndView中的信息...
可以用于方法参数和返回值,用于从请求中获取数据或将数据注入到模型中。 9. `@ExceptionHandler`:用于处理全局异常。当Controller方法抛出异常时,标注了`@ExceptionHandler`的方法会被调用,可以统一处理错误并...
4. **Controller**:Controller组件负责处理用户请求,它会调用业务逻辑(Service层),处理完数据后,将结果返回给Model,最终由View进行展示。 5. **Model和View**:Model通常包含了业务对象和它们的状态,而View...