Spring MVC中Controller如何将数据返回给页面

24 篇文章 0 订阅
23 篇文章 0 订阅

要实现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,让页面可以获取

 

 



 

 

 

  • 19
    点赞
  • 102
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
Spring MVC是一种基于MVC(Model-View-Controller)设计模式的Web框架,它可以帮助我们快速地开发Web应用程序。在Spring MVCController是控制器的核心组件,它负责接收用户请求并决定如何处理这些请求。 在Spring MVC,我们可以通过编写Controller类来实现请求的处理。在Controller,我们可以定义多个方法,每个方法对应处理一个具体的请求。这些方法通常使用注解来标识它们应该处理哪些请求。 例如,我们可以使用@Controller注解来标识一个类为Controller,并使用@RequestMapping注解来标识一个方法应该处理哪些请求。下面是一个简单的Controller类的示例: ``` @Controller @RequestMapping("/hello") public class HelloController { @RequestMapping("/world") public ModelAndView helloWorld() { String message = "Hello World, Spring MVC!"; return new ModelAndView("hello", "message", message); } } ``` 在上面的示例,我们使用@Controller注解将HelloController类标识为Controller,并使用@RequestMapping注解将该类处理的请求路径设置为“/hello”。我们还使用@RequestMapping注解将helloWorld方法标识为处理“/hello/world”请求的方法。该方法返回一个包含“Hello World, Spring MVC!”消息的ModelAndView对象。 需要注意的是,Controller类的方法可以返回不同类型的结果。除了ModelAndView之外,还可以返回String、void、HttpEntity、ResponseEntity等类型的结果。这些结果将由Spring MVC框架进行处理,并将相应的内容返回给客户端。 总的来说,Spring MVCController是Web应用程序的核心组件之一,它可以帮助我们快速地开发功能强大、易于维护的Web应用程序。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值