1.要求转发和重定向52
当处理器完成请求并跳转到其他资源时,有两种跳转方式:请求转发和重量
方向。根据要跳转的资源类型,可分为两类:跳转到页面和跳转到其他处理器。
请注意,要求转发的页面可以是WEB-INF中的页面;重定向页面不能是WEB-INF
中页。因为重定向相当于用户再次发出请求,用户无法直接访问WEB-INF中资
源的。
SpringMVC框架包装了原Servlet中的请求转发和重定向操作。现在可以简单使用了
实现转发和重定向的单一方式。
forward:表示转发,实现request.getRequestDispatcher("xx.jsp").forward()
redirect:表示重定向,实现responsee.sendRedirect("xxx.jsp")
forward:表示转发
redirect:表示重定向
forward和redirect都是关键字,有一个共同的特点,不与视图解析器一起工作
2.请求转发52当处理器方法返回ModelAndView时,需要在setviewname()指定的视图前添加forward:,且
此时,视图不再与视图解析器一起工作,因此在配置解析器时可以指定不同位置的视图。
视图页面 相对于项目根的路径必须写出来。forward操作不需要视图分析器。
将处理器方法返回到String,并在视图路径前添加forward:完整的视图路径。
2.1需求52处理器方法返回ModelAndView,实现转发forward
语法:setViewName("forward:视图文件完整路径”)
forward特点:当项目中没有视图解析器时,不与视图解析器一起使用
因为我们的视图分析器已经配置了死亡(),我们只能跳转view目录下的页面,但我们现在有了hello.jsp不在WEB-INF在/view目录下,如果跳转,可以使用转发操作。因为转发操作忽略了视图解析器,所以不会报错
index.jsp
<%--index.编写jsp页面 52--%><%@ page contentType="text/html;charset=UTF-8" language="java" %><% String basePath = request.getScheme() + "://" + request.getServerName() + ":" + request.getServerPort() + request.getContextPath() + "/";%><html><head> <title>Title</title> <base href="<%=basePath%>" /></head><body> <p>当出方法返回ModelAndview实现forward</p> <form action="doForward.do" method="post"> 姓名:<input type="text" name="name"> <br/> 年龄:<input type="text" name="age"> <br/> <input type="submit" value=“提交请求”> </form></body></html>
MyController
/** * 处理器方法返回ModelAndView,实现转发forward 52 * 语法: setViewName("forward:视图文件完整路径”) * forward特点: 不与视图解析器一起使用,当项目中没有视图解析器时,就没有视图解析器 */ @RequestMapping(value = "/doForward.do") public ModelAndView doSome(){ ///处理some.do请求了。 相当于service调用处理的完成。 相当于service调用处理的完成。 ModelAndView mv = new ModelAndView(); //添加数据, 在请求结束时,框架将数据放入request作用域。 mv.addObject("msg“欢迎使用springmvc坐web开发”; mv.addObject("fun",“执行dosome方法”); //转发 mv.setViewName("forward:/WEB-INF/view/show.jsp"); //返回mv return mv; }
hello.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %><html><head> <title>Title</title></head><body> <h3>/WEB-INF/view/hello.jsp从request作用域获取数据</h3><br/> <h3>msg数据:${msg}</h3><br> <%--这里使用El表达式-%> <h3>fun数据:fun数据:${fun}</h3></body></html>
转发操作路径不会改变,服务器端可以访问WEB-INF目录下的文件
3.要求重定向53在处理器方法返回的视图字符串前添加redirect:,可实现重定向跳转。
redirect的特点:当项目中没有视图解析器时,不与视图解析器一起使用
3.1框架对重定向操作:531.框架将Model中简单类型的数据转换为string作为hellolo.使用jspget请求参数。
目的是doredirect.do和hello.Jsp两个请求之间的数据传递
2.目标hello.jsp页面可以使用参数集合对象${param}获取请求参数值${param.myname}
3.重定向不能访问/WEB-INF资源
3.2案例53index.jsp
<br/> <br/> <p>当出方法返回ModelAndview实现redirectt</p> <form action="doRedirect.do" method="post"> 姓名:<input type="text" name="name"> <br/> 年龄:<input type="text" name="age"> <br/> <input type="submit" value=“提交请求”> </form>
MyController
@RequestMapping(value = "/doRedirect.do") public ModelAndView doWithRedirect(String name,Integer age){ ///处理some.do请求了。 相当于service调用处理的完成。 ModelAndView mv = new ModelAndView(); ///数据放入 request作用域域 mv.addObject("myname",name); mv.addObject("myage",age); //重定向 mv.setViewName("redirect:/hello.jsp"); //http://localhost:8080/ch08_forard_redirect/hello.jsp?myname=lisi&myage=22 ///不能访问重定向//WEB-INF资源 //mv.setViewName("redirect:/WEB-INF/view/show.jsp"); return mv; }
hello.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %><html><head> <title>Title</title></head><body> <h3>/WEB-INF/view/hello.jsp从request作用域获取数据</h3><br/> <%--<h3>msg数据:${msg}</h3><br> <%–El表达式用于这里–%> <h3>fun数据:fun数据:${fun}</h3>--%> <h3>myname数据:${param.myname}</h3><br/> <h3>myage数据:${param.myage}</h3> <h3>参数数据:<%=request.getParameter("myname")%></h3></body></html>
3.3重定向不能访问/WEB-INF资源54
重定向将改变访问地址,相当于用户的两个请求,无权访问/WEB-INF资源
@RequestMapping(value = "/doRedirect.do") public ModelAndView doWithRedirect(String name,Integer age){ ///处理some.do请求了。 相当于service调用处理的完成。 ModelAndView mv = new ModelAndView(); ///数据放入 request作用域域 mv.addObject("myname",name); mv.addObject("myage",age); //重定向 //mv.setViewName("redirect:/hello.jsp"); //http://localhost:8080/ch08_forard_redirect/hello.jsp?myname=lisi&myage=22 ///不能访问重定向//WEB-INF资源 mv.setViewName("redirect:/WEB-INF/view/show.jsp"); return mv; }