返回ModelAndView:
若处理器方法处理完后,需要跳转到其它资源,且又要在跳转的资源间传递数据,此时处理器方法返回ModelAndView 比较好。当然,若要返回 ModelAndView,则处理器方法中 需要定义ModelAndView对象。
在使用时,若该处理器方法只是进行跳转而不传递数据,或只是传递数据而并不向任何资源跳转(如对页面的Ajax 异步响应),此时若返回ModelAndView,则将总是有一部分多 余:要么Model多余,要么View多余。即此时返回ModelAndView将不合适。
返回String:
如果你只是进行视图的跳转:从a页面跳转到b页面,用String是最方便的。这个返回值String既可以是逻辑名称,也可以是一个完整的视图路径;当String代表的是完整路径的时候,不能和视图解析器一同工作,因为视图解析器会进行字符串的拼接: 前缀+视图的逻辑名称+后缀
总之:如果你要用完整路径就不能有视图解析器,如果你要用逻辑名称,就必须要用视图解析器,否则冲突
案例1:
index.jsp:
<p>如果你只是进行视图的跳转:从a页面跳转到b页面,用String</p>
<form action = "returnString.do">姓名:<input type ="text" name = "name">年龄: <input type = "text" name = "age"><input type = "submit" value = "提交参数"/>
</form>
@Controller
public class MyController3 {@RequestMapping("/returnString.do")public String doReturnView(String name ,Integer age){//因为项目中配置了视图解析器,所以你只能写视图的逻辑名称return "show3";}
}
show3.jsp:
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head><h3>myName数据:${myName}</h3><h3>myAge数据:${myAge}</h3>
</head>
<body></body>
</html>
结果:
案例2:
如果处理器方法的返回值为String,可以自己手工的添加数据到Request作用域:
index.jsp:
<p>如果你只是进行视图的跳转:从a页面跳转到b页面,用String returnString2.do</p>
<form action = "returnString2.do">姓名:<input type ="text" name = "name">年龄: <input type = "text" name = "age"><input type = "submit" value = "提交参数"/>
</form><p>如果你只是进行视图的跳转:从a页面跳转到b页面,用String returnString3.do</p>
<form action = "returnString3.do">姓名:<input type ="text" name = "name">年龄: <input type = "text" name = "age"><input type = "submit" value = "提交参数"/>
</form>
以下两个处理器方法的逻辑是等价的:
@RequestMapping("/returnString2.do") //框架会自动创建request对象public String doReturnView2(HttpServletRequest request,String name , Integer age){//手工添加数据到request作用域:request.setAttribute("myName",name);request.setAttribute("myAge",age);//因为项目中配置了视图解析器,所以你只能写视图的逻辑名称return "show3";}@RequestMapping("/returnString3.do")public String doReturnView3(HttpServletRequest request){String myName = request.getParameter("name");String myAge = request.getParameter("age");//手工添加数据到request作用域:request.setAttribute("myName",myName);request.setAttribute("myAge",myAge);//因为项目中配置了视图解析器,所以你只能写视图的逻辑名称return "show3";}
show3.jsp:
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head><h3>myName数据:${myName}</h3><h3>myAge数据:${myAge}</h3>
</head>
<body>
</body>
</html>
案例3:
如果你返回完整路径,且没有删除视图解析器:
因为你的项目中的视图解析器没删,它会做一个字符串的拼接:前缀+视图名称+后缀: