使用 @Controller 注解的处理器的处理器方法,其返回值常用的有四 种类型:
第一种ModelAndView
第二种String
无返回值void
第四种返回自定义类型对象(JSON数据的交互)
注:前三种的返回值的请求转发和重定向后面讲解
第一种ModelAndView(之前案例中就是)
若处理器方法处理完后需要跳转 到其它资源,且又要在跳转的资源间传递数据, 此时处理器方法返回 ModelAndView比较.当然,若要返回 ModelAndView则处理器方法中需要定义ModelAndView 对象。
在使用时,若该 处理器方法只是进行跳转而不传递数据,或只是传递数据而并不向任何资源 跳转(如对页面的 Ajax 异步响应),此时若返回 ModelAndView ,则 将总是有一部分多余 要么 Model 多余,要么 View 多余。即此时返回 ModelAndView 将不合适。
在之前的使用时,如果跳转到一个页面,使用视图解析器,就可以完成,这种模式相当于之前原生的请求转
request.getRequestDispather("/WEB-INF/jsp/show.jsp").forward(request,response)
model.setViewName("WEB-INF/jsp/show.jsp");
但是SpringMVC 框架把原来 Ser vlet 中的请求转发和重定向操作进行了封装。现在可以使用简单的方式实现转发和重定向。
forward: 表示转发,实现 request.getRequestDispatcher("xx.jsp").forward()
redirect: 表示重定向,实现 r esponse.sendRedirect("xxx.jsp")
forward
在返回ModelAndView时,需要在在 setViewName() 指定的视图前添加forward,此时不再与视图解析器一起工作(即使声明了),需要写对应的项目路径
index.jsp
<form action="test01/forward_test01.do" method="post">姓名:<input type="text" name = "name"/><br>年龄:<input type="text" name = "age"/><br><input type="submit" value="注册"/></form>
controller
@RequestMapping(value = "forward_test01")public ModelAndView forward_test01(String name, Integer age) {ModelAndView model = new ModelAndView();//如果需要传递参数,需要直接使用HttpServletRequest//因为使用String框架不帮助我们封装System.out.println("forward_test01 : " + name);model.addObject("name",name);//转发,不与视图解析器一起工作model.setViewName("forward:/WEB-INF/jsp/show.jsp");return model;}
show.jsp
<body>测试: modelAndView:forward${name }<br/></body>
测试:

redirect
注意:转发不能进入web_inf下的资源,所以show.jsp的结果页面拿到了外面
model.setViewName("redirect:/show.jsp");
测试

注意:向之后页面没有取到值,是因为之前的请求中的数据是在request中,转发还是同一个请求,一旦重定向之后,request域也就没了,值也就取不到了
当重定向到目标资源时,若需要向下传递参数值,除了可以直接通过请求 URL 携带参数,通过 HttpSession 携带参数
页面通过:param获取参数
show.jsp结果页面
测试: modelAndView:redirect${param.name }<br/>
测试结果

直接get请求测试

第二种String
逻辑视图名:方法返回字符串可以指定逻辑视图名,通过视图解析器解析为物理视图地址。
index.jsp页面
<form action="test01/string_test01.do" method="post">姓名:<input type="text" name = "name"/><br>年龄:<input type="text" name = "age"/><br><input type="submit" value="注册"/></form>
controller方法
@RequestMapping(value = "string_test01")public String string_test01(String name, Integer age, HttpServletRequest request) {//如果需要传递参数,需要直接使用HttpServletRequest//因为使用String框架不帮助我们封装System.out.println("String_name : " + name);System.out.println("String_age : " + age);request.setAttribute("name",name);return "show";}
show.jsp显示页面
<body>测试返回值String: ${name }</body>
测试结果

注意:可以直接返回资源的物理视图名。不过,此时就不需要再在视图解析器中再配置前辍与后辍了。
如果使用物理视图和视图解析器的话
return "WEB-INF/jsp/show.jsp";
测试:

Redirect重定向
return "redirect:/show.jsp";
forward转发
return "forward:/WEB-INF/jsp/show.jsp";
喜欢转发
明天见





