SpringMVC的返回值类型【视图解析】

本文深入探讨SpringMVC中不同返回值类型的使用方法,包括ModelAndView、String和void的特性及应用场景,以及转发和重定向的区别。

切记:不论是哪种返回值类型,最终都要经过SpringMVC的适配器内置策略返回ModelAndView类型!

第一种:ModelAndView

  • 伪代码:

	
        /*第一种方法:当方法返回值为类型为ModelAndView
	 *需要方法结束时,定义ModelAndView
	 *将model和view分别进行设置
	 */
	@RequestMapping(value = "/login",method = {RequestMethod.GET})
	public ModelAndView getLogin(){
		ModelAndView modelAndView = new ModelAndView();
		//设置视图,如果在视图解析器中配置了jsp路径的前缀和后缀,修改为如下:
		//model.setViewName("/WEB-INF/pages/login.jsp");
		modelAndView.setViewName("login");
		//ModelAndView的addObject()方法相当于在Servlet中request的setAttribute()
		//设置模型数据
		modelAndView.addObject("username","user1");
		//相当于转发,但是需要视图解析器进行解析
		return modelAndView;
	}

 *第二种:String

  • 伪代码:
        /*第二种方法:当方法返回值类型为String
	 *标识返回逻辑视图名!
	 *真正视图(jsp路径)=前缀+逻辑视图名+后缀
	 */
	@RequestMapping(value = "/login2",method = {RequestMethod.GET})
	public String getLogin2(Model model){
		
		/*设置模型数据
		 *通过形参model将模型数据传到页面
		 *Model等价于ModelAndView 
		 *model.addAttribute()方法等价于modelAndView.addObject()
		 */
		model.addAttribute("username","user2");
		//标识返回逻辑视图名!
		return "login";
		//重定向
		//return "redirect:/login.jsp";
		//转发
		//return "forward:login.mvc";
	}
  • *转发和重定向的区别和使用

注意:WEB-INF目录底下的jsp界面是不能通过请求直接访问的,需要重定向到SpringMVC中,经过SpringMVC的视图解析器转发才可以间接访问!

(1)springMVC默认转发。因为转发是服务器端行为,所以它只能访问本web服务器上的所有组件资源

  • ·jsp:return "forward:/login.jsp":从项目的根路径进行寻找jsp界面
  • ·url:return "forward:/login/toUpdate.mvc"
  • ·切记:不可以缺少'/'

(2)当使用重定向:重定向不仅可以访问本web服务器上的所有资源,还可以跨站访问!!

  • ·jsp:return "redirect:/login.jsp":从项目的根路径进行寻找jsp界面
  • ·url:return "redirect:/login/toUpdate.mvc"
  • ·切记:不可以缺少'/'

注意:转发和重定向url时有斜线/和没有斜线的区别,有斜线是项目级别,无斜线是类级别下的

(3)SpringMVC默认采用转发形式,但是必须要经过中间组件视图解析器进行url路径拼接查找,字符串指定的仅是逻辑视图名例如:

  • ·jsp:return "login";

(4)转发可以访问WEB-INF目录下的资源;而重定向却不可以,要想通过重定向访问WEB-INF目录下的资源,首先必须通过url访问SpringMVC,然后再通过SpringMVC的请求转发间接访问WEB-INF目录下的资源!

  • 例如转发:return "forward:/WEB-INF/pages/404.jsp"

第三种:void 

  • 伪代码:
        /*第三种方法:当方法返回值类型为void
	 *在形参上定义request和response
	 *等价于HttpRequestHandlerAdapter这一种适配器的Handler执行
	 *等价于Servlet
	 */
	@RequestMapping(value = "/login3",method = {RequestMethod.GET})
	public void getLogin3(HttpServletRequest request, HttpServletResponse response) throws Exception{
		
		//设置模型数据
		request.setAttribute("username", "user3");
		//设置转发的视图,转发不需要视图解析器进行解析
		request.getRequestDispatcher("/login.jsp").forward(request, response);
		//response.sendRedirect("login.mvc");	
	
		//使用此种方法可以通过response,设置响应的数据格式,比如json数据
		/*response.setCharacterEncoding("utf-8");
		response.setContentType("application/json;charset=utf-8");
		response.getWriter().write("json串");*/
		
	}

                                       附录:SpringMVC几种返回结果的判断

  1. 当返回String/ModelAndView类型:默认经过视图解析器进行拼接后视图查找,但是当判断返回的字符串包含forward/redirect字样时候,不经过视图解析器而采用servlet默认的判断机制即当是jsp就进行界面查询,不是则默认为一个新的url,在根据相对或者绝对路径进行查询
  2. void:等价于servlet,不经过视图解析器
  3. pojo:返回一般是json串,因为在核心配置文件中的注解驱动默认支持json返回,所以也不会经过视图解析器!

 附项目地址: 

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值