SpringMVC的返回值类型(六)

你未看此花时,则此花与汝心同归于寂, 你来看此花时,此花颜色一时明白起来,便知此花不在你的心外。

上一章简单介绍了SpringMVC的请求乱码解决和接收前端常用类型(五),如果没有看过,请观看上一章

一.SpringMVC的方法返回值

SpringMVC 的方法返回值有多种, ModelAndView, Model,ModelMap,Map,View, String, void , 但是常用的,只有3个,ModelAndView,void 和String. 这里,详细的介绍一下。

下面讲解一下,跳转方法返回值类型

二 返回ModelAndView 对象。 (最常用的之一)

ModelAndView, 实际上就是 Model 模型和View 视图, 将数据模型和返回视图放置在一个类里面。

public class ModelAndView
{
  	private Object view;  //视图
	private ModelMap model; //数据
	private boolean cleared = false;
}

有图片。

二.一 后台处理:

@RequestMapping(value="/toLogin")
	public ModelAndView toLogin(){
		//放置对象还可以放其他的类型,下面会重点讲解。这里先只返回简单的字符串。
		ModelAndView model=new ModelAndView();
		//添加数据
		model.addObject("name","两个蝴蝶飞ModelAndView形式"); 
		//设置视图
		model.setViewName("user/login");
		return model;
	}

ModelAndView ,利用 addObject() 来放置数据, 利用setViewName() 来设置要跳转的视图的名称。 这是是最常用的。

二.二 前端视图展示。 (接下来的视图展示也是用这个代码)

<body>
	<h3>${name}欢迎你来到这个页面</h3>
</body>

运行之后,前端展示

有图片。

常看见,将ModelAndView 放置在方法的参数里面,这样也是可行的。 不用再次实例化了。

@RequestMapping(value="/toLogin")
	public ModelAndView toLogin(ModelAndView model){
		//放置对象还可以放其他的类型,下面会重点讲解。这里先只返回简单的字符串。
		//添加数据
		model.addObject("name","两个蝴蝶飞ModelAndView形式"); 
		//设置视图
		model.setViewName("user/login");
		return model;
	}

其实,SpringMVC的方法参数里面可以放置很多对象,如ModelAndView,Model ,HttpServletRequest 等。 会专门收集讲一下的。

##三. 返回Model 类型

返回的是Model,数据模型,可以填充数据了, 那么如何指定要跳转到哪儿呢,即指定视图名。 猜想,可以在方法名或者是访问路径url上做文章。是在url 上进行的。 可以验证一下。

三.一 Model接口

Model 是一个接口,故最好放置在方法参数里面,而不是进行手动的实例化。

package org.springframework.ui;

import java.util.Collection;
import java.util.Map;

public abstract interface Model
{
  public abstract Model addAttribute(String paramString, Object paramObject);
  
  public abstract Model addAttribute(Object paramObject);
  
  public abstract Model addAllAttributes(Collection<?> paramCollection);
  
  public abstract Model addAllAttributes(Map<String, ?> paramMap);
  
  public abstract Model mergeAttributes(Map<String, ?> paramMap);
  
  public abstract boolean containsAttribute(String paramString);
  
  public abstract Map<String, Object> asMap();
}

三.二 URL 形式的后台指定跳转视图名

@RequestMapping(value="/login")
public Model login(Model model){
	model.addAttribute("name","两个蝴蝶飞Model形式");
	return model;
}

前台传入的路径url 是login,那么就会跳转到login.jsp 页面。

有图片。

三.三 将URL 与方法名设置不一致,主要是将url 进行改变,看跳转到哪一个页面。

	@RequestMapping(value="/toLogin")
	public Model login(Model model){
		model.addAttribute("name","两个蝴蝶飞Model形式");
		return model;
	}

运行服务器, 进行访问之后,会报404错误,说要跳转到toLogin.jsp(url控制),而不是login.jsp(方法名控制).

在这里插入图片描述
这样,就需要将url 访问路径与页面的视图名称保持一致,不太友好。

四. 返回Map 形式

Map 与Model 一样,也是可以收集数据,但不知道如何控制视图名,所以用URL 来进行相应的控制。

@RequestMapping(value="/login")
	public Map<String,String> toLogin(){
		Map<String,String>map=new HashMap<String,String>();
		map.put("name","两个蝴蝶飞的Map形式");
		return map;
	}

有图片。

五. 返回ModelMap 形式

ModelMap, 是一个Map,但又具有Model 类的某些特性。 是Model和Map的结合体。

当然,ModelMap 也是通过 url来控制跳转的视图名的。

@RequestMapping(value="/login")
	public ModelMap toLogin(ModelMap modelMap){
		//可以用model的形式
		modelMap.addAttribute("name","两个蝴蝶飞ModelMap的model形式");
		//也可以用map的形式赋值
		//modelMap.put("name","两个蝴蝶飞ModelMap的map形式");
		return modelMap;
	}

用model的形式填充的话,

有图片。

用map的形式填充的话,将下面的那行代码去除注释,上面的添加注释

有图片。

六. 返回View 形式

返回的是 PDF,Excel 格式的内容。 暂不讲解。

##七. 返回String 类型 (最常用之一)

返回一个字符串。 其中这个字符串,可以单纯的指将要返回的视图名称,也可以是转发和重定向。 当然,设置的数据模型的形式也是多种多样。
常见的用 Model,ModelMap 和request 域,但是,不能用ModelAndView填充,会出错。

七.一 表示单纯的将要返回的视图名称

1 .request域或者是session 域 填充值。

@RequestMapping(value="/toLogin")
	public String toLogin(HttpServletRequest request){
		request.setAttribute("name","两个蝴蝶飞返回String的request设置值");
		return "user/login";
	}

有图片

2 . Model 填充值

@RequestMapping(value="/toLogin")
	public String toLogin(Model model){
		model.addAttribute("name","两个蝴蝶飞返回String的model设置值");
		return "user/login";
	}

有图片。

3 .ModelMap 填充值

@RequestMapping(value="/toLogin")
	public String toLogin(ModelMap map){
		map.put("name","两个蝴蝶飞返回String的modelMap设置值");  //也可以用addAttribute
		return "user/login";
	}

有图片。

4 .ModelAndView 填充值,会展示不出数据。

@RequestMapping(value="/toLogin")
	public String toLogin(){
		ModelAndView model=new ModelAndView();
		model.addObject("name","两个蝴蝶飞返回String的modelAndView设置值");
		return "user/login";
	}

在这里插入图片描述
前台展示,并不会展示出数据。

常常喜欢用Model 来进行填充值。

七.二 表示转发 (request域可以接收到) 用forward

	@RequestMapping(value="/toLogin")
	public String toLogin(HttpServletRequest request){
		request.setAttribute("name","两个蝴蝶飞返回String的转发设置值");
		return "forward:forwardLogin.action";  //forward 这个表示的是转发,注意路径。后面要加上.action
	}
	@RequestMapping(value="/forwardLogin")
	public String forwardLogin(HttpServletRequest request,Model model){
		System.out.println("获取值:"+request.getAttribute("name").toString());
		model.addAttribute("name",request.getAttribute("name").toString());
		return "user/login";  //这个就是单纯的返回视图名称。
	}

控制台打印输出:

有图片。

前台展示输出:

有图片。

注意观察地址栏,没有发现改变。 而且接收到了request域的内容。
转发时的路径, 如果是同一个Action 中的不同的方法,可以直接写路径,不用带/user 。

七.三 表示重定向 (request域接收不到) 用 redirect

@RequestMapping(value="/toLogin")
	public String toLogin(HttpServletRequest request){
		request.setAttribute("name","两个蝴蝶飞返回String的重定向设置值");
		return "redirect:forwardLogin.action";  //redirect 这个表示的是重定向,注意路径。后面要加上.action
	}
	@RequestMapping(value="/forwardLogin")
	public String forwardLogin(HttpServletRequest request,Model model){
		if(null==request.getAttribute("name")){
			model.addAttribute("name","两个蝴蝶飞返回String的重定向未获取request域值");
		}else{
			model.addAttribute("name",request.getAttribute("name").toString());
		}
		return "user/login";  //这个就是单纯的返回视图名称。
	}

前台展示输出

有图片

重定向时,地址栏发生了改变,不能接收到request域的内容。

##八. 返回 void 类型 (最常用之一)

返回void 类型时,可以用Model 来设置值,那如何来设置视图名称呢?

八.一 与返回Model 和返回ModelMap 一样,也是url 来控制的。

@RequestMapping(value="/login")
	public void toLogin(Model model){
		model.addAttribute("name","两个蝴蝶飞返回void设置值");
	}

前台展示:
有图片。

这个时候,如何在方法中强行用request 域设置转发或者是重定向呢?

八.二 强行转发或者是重定向

@RequestMapping(value="/toLogin")
	public void toLogin(Model model,HttpServletRequest request,HttpServletResponse response){
		model.addAttribute("name","两个蝴蝶飞返回void设置值");
		try {
			request.getRequestDispatcher("/login").forward(request, response);
		} catch (ServletException e) {
			// TODO 自动生成的 catch 块
			e.printStackTrace();
		} catch (IOException e) {
			// TODO 自动生成的 catch 块
			e.printStackTrace();
		}
	}

前台展示:

有图片。

发现,这样操作是不行的。

需要把全部的路径都带上。

@RequestMapping(value="/toLogin")
	public void toLogin(HttpServletRequest request,HttpServletResponse response){
		try {
			request.setAttribute("name","两个蝴蝶飞返回void设置request值");
			request.getRequestDispatcher("/WEB-INF/jsp/user/login.jsp").forward(request, response);
		} catch (ServletException e) {
			// TODO 自动生成的 catch 块
			e.printStackTrace();
		} catch (IOException e) {
			// TODO 自动生成的 catch 块
			e.printStackTrace();
		}
	}

而且,注意,这个时候就不能用 Model 来设置值了, 只能用request 来设置值。 完全变成了Servlet+JSP的阶段了。

前台展示:

有图片。

可以在里面继续写, 上面是转发, 也可以进行重定向, 当然也可以返回JSON 数据。

九. JSON 方法返回值

前面可以看到,可以返回多种形式,如Model,ModelAndView,String,void 等,但它们都是跳转的页面,有相应的视图名称, SpringMVC 中也可以进行 JSON的数据形式传输,那么这个时候,就可以采用其他的形式了。

需要用 @ResponseBody 注解或者是 ResponseEntity

返回的形式是: 自定义的实体对象 或者是ResponseEntity . 这个会在JSON 章节来详细讲解。

也可以返回 void.

十. SpringMVC 中参数的类型

可以简单分为几大类。 只说一下常用的。

十.一 与Web,Servlet 有关的

javax.servlet.ServletRequest  或者是  javax.servlet.http.HttpServletRequest

javax.servlet.ServletResponse 或者是 javax.servlet.http.HttpServletResponse  

javax.servlet.http.HttpSession


springmvc 又扩展了两个。

org.springframework.web.context.request.WebRequest 
或者是  org.springframework.web.context.request.NativeWebRequest 

十.二 读写与打印的

java.io.InputStream或java.io.Reader
java.io.OutputStream或java.io.Writer
java.security.Principal
HttpEntity<?>

十.三 国际化

java.util.Locale

十.四 SpringMVC 封装数据

java.util.Map
org.springframework.ui.Model
org.springframework.ui.ModelMap

十.五 SpringMVC 提供的其他工具

org.springframework.web.servlet.mvc.support.RedirectAttributes
org.springframework.validation.Errors
org.springframework.validation.BindingResult
org.springframework.web.bind.support.SessionStatus
org.springframework.web.util.UriComponentsBuilder

十.六 SpringMVC 参数所用注解

@PathVariable、@@MatrixVariable
@RequestParam、@RequestHeader、@RequestBody、@RequestPart

谢谢!!!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

两个蝴蝶飞

你的鼓励,是老蝴蝶更努力写作的

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值