欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

SpringMVC的返回值类型

程序员文章站 2022-03-24 15:32:54
...

Springmvc 支持如下的返回方式:


一种是返回页面的数据,另外一种是通过@ResponseBody注解返回的数据不是html标签的页面,而是其他某种格式的数据(如json、xml等)。本文主要讲返回的是页面数据类型。下一遍会讲@ResponseBody注解返回的数据


  1. ModelAndView
  2. Model
  3. ModelMap
  4. Map
  5. View
  6. String
  7. void 

不管返回什么类型,最终都会被转化成ModeAndView返回!!!

1.返回ModelAndView

@RequestMapping(method = RequestMethod.GET)
public ModelAndView index() {
    ModelAndView modelAndView = new ModelAndView("/user/index");
    modelAndView.addObject("xxx", "xxx");
    return modelAndView;
}

PS:对于ModelAndView构造函数可以指定返回页面的名称,也可以通过setViewName方法来设置所需要跳转的页面;

PPS:返回的是一个包含模型和视图的ModelAndView对象,建议返回ModeAndView

@RequestMapping(method = RequestMethod.GET)
public ModelAndView index() {
    ModelAndView modelAndView = new ModelAndView();
    modelAndView.addObject("xxx", "xxx");
    modelAndView.setViewName("/user/index");
    return modelAndView;
}

对于ModelAndView类的属性和方法

SpringMVC的返回值类型

2.返回void

当返回类型为Void的时候,则响应的视图页面为对应着的访问地址

  1.     /* 
  2.      * 返回值是void类型的,由于没有返回值 
  3.      * 它默认的展示逻辑视图名和url中的一段是一样的即returnVoid.jsp 
  4.      */  
  5.     @RequestMapping("/returnVoid")  
  6.     public void returnVoid(Model model){  
  7.         model.addAttribute("test""return void!!!");  
  8.     }  


返回的结果页面还是:/returnVoid.jsp,如果项目底下没有这个页面就会报404

PS:这个时候我们一般是将返回结果写在了HttpServletResponse 中了,如果没写的话,spring就会利用RequestToViewNameTranslator 来返回一个对应的视图名称。如果这个时候需要模型的话,和返回字符串的情况处理模型是相同的。例如:model.addAttribute("test""return void!!!")

在Controller类方法形参上可以定义request和response,使用request或response指定响应结果:

  1. 使用request转向页面,如下:

    request.getRequestDispatcher("页面路径").forward(request, response);

    之前我们实现商品列表的查询,返回的是ModelAndView,如果现在该方法的返回值是void,那么就应使用request跳转页面,如下:

    @RequestMapping("/itemList2")
    public void itmeList2(HttpServletRequest request, HttpServletResponse response) throws Exception {
        // 查询商品列表
        List<Items> itemList = itemService.getItemList();
        // 向页面传递参数
        request.setAttribute("itemList", itemList);
        // 如果使用原始的方式做页面跳转,必须给的是jsp的完整路径
        request.getRequestDispatcher("/WEB-INF/jsp/itemList.jsp").forward(request, response);
    }

    注意:如果使用原始的方式做页面跳转,那么必须给定jsp页面的完整路径。

  2. 也可以通过response实现页面重定向:

    response.sendRedirect("url")
  3. 也可以通过response指定响应结果,例如响应json数据如下:

    response.setCharacterEncoding("utf-8");
    response.setContentType("application/json;charset=utf-8");
    response.getWriter().write("json串");

    例如,将以上itmeList2方法修改为:

    @RequestMapping("/itemList2")
    public void itmeList2(HttpServletRequest request, HttpServletResponse response) throws Exception {
        PrintWriter writer = response.getWriter();
        response.setCharacterEncoding("utf-8");
        response.setContentType("application/json;charset=utf-8");
        writer.write("{\"id\":\"123\"}");
    }

    此时,在浏览器地址栏中输入url访问地址:http://localhost:8080/springmvc-web2/item/itemList2.action进行访问,我们可在浏览器看到如下效果: 
    SpringMVC的返回值类型

3.返回String

逻辑视图名

Controller类方法返回字符串可以指定逻辑视图名,通过视图解析器解析为物理视图地址。 
SpringMVC的返回值类型

Redirect重定向

Contrller类方法返回结果重定向到一个url地址,如下商品信息修改提交后重定向到商品查询方法,参数无法直接带到商品查询方法中。

@RequestMapping(value="/updateitem",method={RequestMethod.POST,RequestMethod.GET})
public String updateItems(Items items) {
    itemService.updateItem(items);
    // '/'是不包含工程名的根目录,即http://localhost:8080/springmvc-web2/item/itemList.action
    return "redirect:/item/itemList.action";
}

redirect方式相当于“response.sendRedirect()”,转发后浏览器的地址栏变为转发后的地址,因为转发即执行了一个新的request和response。由于新发起一个request,原来的参数在转发时就不能传递到下一个url,如果要传参数可以在/item/itemList.action后边加参数,如下:

return "redirect:/item/itemList.action?id=xxx&name=xxx";

SpringMVC的返回值类型 
但如果你使用的是Model接口,那么SpringMVC框架会自动将Model中的数据拼装到/item/itemList.action后面。

forward转发

Controller类方法执行后继续执行另一个Controller类方法,如下商品修改提交后转向到商品修改页面,修改商品的id参数可以直接带到商品修改方法中。

@RequestMapping(value="/updateitem",method={RequestMethod.POST,RequestMethod.GET})
public String updateItems(Items items) throws UnsupportedEncodingException {
    itemService.updateItem(items);
    return "forward:/item/itemList.action";
}

forward方式相当于“request.getRequestDispatcher().forward(request,response)”,转发后浏览器地址栏还是原来的地址。转发并没有执行新的request和response,而是和转发前的请求共用一个request和response。所以转发前请求的参数在转发后仍然可以读取到。 
SpringMVC的返回值类型

4.返回Model /ModeMap

  1.     /* 
  2.      * 返回值是Model或者ModeMap类型的,由于没有指定视图名 
  3.      * 它默认的展示视图名和url中的一段是一样的即returnModel.jsp 
  4.      */  
  5.     @RequestMapping("/returnModel")  
  6.     public Model returnModel(Model model){  
  7.         model.addAttribute("test""return Model!!!");  
  8.         return model;  
  9.     }  
 

PS: 返回的结果页面还是:/returnModel.jsp,如果项目底下没有这个页面就会报404,这时候的模型数据就是返回的model或者modeMap对象。

 5.返回Map

  1. /* 
  2.      * 返回值是void类型的,由于没有指定视图名 
  3.      * 它默认的展示视图名和url中的一段是一样的即returnVoid.jsp 
  4.      */  
  5.     @RequestMapping("/returnMap")  
  6.     public Map returnMap(Model model){  
  7.         Map map = new HashMap<String,String>();  
  8.         map.put("test""return map!!!");  
  9.       //map.put相当于request.setAttribute方法
  10.         return map;  
  11.     }  

PS: 返回的结果页面还是:/returnMap.jsp,如果项目底下没有这个页面就会报404,在jsp页面中可直通过${key1}获得到值, map.put()相当于request.setAttribute方法。 

 6.返回View

可以返回pdf,excel等,暂时没详细的了解 

小结:

1.使用 String 作为请求处理方法的返回值类型是比较通用的方法,这样返回的逻辑视图名不会和请求 URL 绑定,具有很大的灵活性,而模型数据又可以通过 ModelMap 控制。
2.使用void,map,Model 时,返回对应的逻辑视图名称真实url为:prefix前缀+方法请求url +suffix后缀组成。
3.使用String,ModelAndView返回视图名称可以不受请求的url绑定,ModelAndView可以设置返回的视图名称。


最后上个Demo
 
package com.wangbiao.springMVC;

import java.util.HashMap;
import java.util.Map;

import javax.servlet.ServletContext; 
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.springframework.context.ApplicationContext;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.View;
import org.springframework.web.servlet.mvc.multiaction.MultiActionController;
@Controller
@RequestMapping("/return")
public class HelloWorld extends  MultiActionController{

	/*
	 * 返回值为ModelAndView类型的
	 */
	public ModelAndView sayHelloWorld(HttpServletRequest request,      HttpServletResponse response) {
		String param = request.getParameter("param");
		System.out.println("springMVC测试:helloWorld;"+param);
		ModelAndView mv = new ModelAndView();
		User user = (User) this.getApplicationContext().getBean("user");
		mv.addObject("content", "springMVC HelloWorld:"+param);
		mv.setViewName("springMVC/helloWorld");
		ServletContext ctx = this.getServletContext();	
		return mv;
	}
	/*
	 * 返回值为String类型的,视图名就是返回值
	 */
	@RequestMapping(value="/returnString",method=RequestMethod.GET)
	public String returnString(Model model) {
		model.addAttribute("test", "return string!!!");
		System.out.println("springMVC测试:helloWorld;");
		return "return/returnString";
	}
	
	/*
	 * 返回值是void类型的,由于没有返回值
	 * 它默认的展示视图名和url中的一段是一样的即returnVoid.jsp
	 */
	@RequestMapping("/returnVoid")
	public void returnVoid(Model model){
		model.addAttribute("test", "return void!!!");
	}
	
	/*
	 * 返回值是Model类型的,由于没有指定视图名
	 * 它默认的展示视图名和url中的一段是一样的即returnVoid.jsp
	 */
	@RequestMapping("/returnModel")
	public Model returnModel(Model model){
		model.addAttribute("test", "return Model!!!");
		return model;
	}
	
	/*
	 * 返回值是Map类型的,由于没有指定视图名
	 * 它默认的展示视图名和url中的一段是一样的即returnVoid.jsp
	 */
	@RequestMapping("/returnMap")
	public Map returnMap(Model model){
		Map map = new HashMap<String,String>();
		map.put("test", "return map!!!");
		return map;
	}
	

}


相关标签: SpringMvc