切记:不论是哪种返回值类型,最终都要经过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几种返回结果的判断
- 当返回String/ModelAndView类型:默认经过视图解析器进行拼接后视图查找,但是当判断返回的字符串包含forward/redirect字样时候,不经过视图解析器而采用servlet默认的判断机制即当是jsp就进行界面查询,不是则默认为一个新的url,在根据相对或者绝对路径进行查询
- void:等价于servlet,不经过视图解析器
- pojo:返回一般是json串,因为在核心配置文件中的注解驱动默认支持json返回,所以也不会经过视图解析器!
附项目地址:

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

被折叠的 条评论
为什么被折叠?



