/**
* 使用View接口完成请求转发|重定向
* 解释:
* SpringMVC的官方,提供了一个叫做View的接口,告诉开发人员
* DispatcherServlet底层会调用View接口的实例化对象中的逻辑方法
* 来完成对应的请求转发和重定向。
* 使用:
* 1. 单元方法的返回值为View接口类型
* 2.真实return的为View接口的实例化对象(视图解析器)。
* 官方提供的实现了View接口的视图解析器:
* InternalResourceView:请求转发
* RedirectView:重定向
* @return
*/
@RequestMapping("demoView")
public View demoView(HttpServletRequest request){
//处理请求
System.out.println("MyController.demoView:View接口实例化对象完成请求转发|重定向");
//响应结果
//请求转发
//return new InternalResourceView("/req.jsp");
//重定向
return new RedirectView(request.getContextPath()+"/redirect.jsp");
}
/** * SpringMVC视图解析器升级:ModelAndView * 问题: * 在原有的View接口的视图解析器中需要自己在单元方法中根据响应方式 * 来创建对应的视图解析器对象返回给DispatcherServlet使用,过于麻烦。 * 解决: * 从根据响应方式的不同创建不同的视图解析器对象,变为只创建一个 * 视图解析器对象,该对象内部自动根据参数来实现请求转发或者重定向。 * 实现: * ModelAndView * 注意: * 升级后也就意味着DispatcherServlet使用ModelAndView来接收 * 单元方法的返回值,为了兼容早期版本,让ModelAndView可以接收 * View接口的实例化对象。 * 特点: * ModelAndView对象是Model和View对象的结合体。既可以作为视图解析器使用 * 又可以作为数据流转的载体使用。 */
@RequestMapping("md")
public ModelAndView demoModelAndView(){
//处理请求
System.out.println("MyController.demoModelAndView:ModelAndView视图解析器");
//响应结果
//创建ModelAndView对象
ModelAndView modelAndView=new ModelAndView();
modelAndView.addObject("str","我是流转的数据");
//请求转发
//modelAndView.setViewName("forward:/mdReq.jsp");
//重定向
modelAndView.setViewName("redirect:/mdRedirect.jsp");
return modelAndView;
}
/** * SpringMVC视图解析器再次升级: * 问题: * 在使用了ModelAndView对象后,已经很爽了。但是在单元方法中 * 我们还需要创建ModelAndView对象并将请求转发或者重定向的 * 路径存储进入,返回给DispatcherServlet使用,而我们真正 * 想写的是资源路径以及响应方式 * 解决: * 我们在单元方法中直接返回字符串资源路径及其响应方式关键字。 * 由DispatcherServlet底层帮我们创建ModelAndView来接收 * 单元方法的返回值。 * 注意: * 虽然我们在单元方法中直接返回的字符串数据,但是DispatcherServlet * 并不是直接使用字符串数据而是仍然调用ModelAndView视图解析器完成请求转发或者重定向。 */
@RequestMapping("demoString")
public String demoString(){
//处理请求
System.out.println("目前的请求转发或者重定向的方式");
//响应结果
//请求转发
//return "forward:/req.jsp";
//重定向
return "redirect:/redirect.jsp";
}
准备步骤
先将lib中的web.xml删掉,重新创建一个,接着创建springmvc.xml文件在src中。
使用:
1.在springmvc.xml文件中进行配置
2.在单元房法中按照指定的格式返回资源路径
在springmvc.xml中
前提:只在请求转发中有效。
当我们return后面没有加forword:,则默认会用ModelandView,反之,会用自定义的视图解析器。
取决于请求转发的路径是否为WEB-INF下的,是的话则不需要加forword:。
用来解决controller中,只能请求转发一个资源路径的问题。
方法:根据请求,请求转发WEB-INF下的资源的单元方法是肯定要声明的。我们可以声明一个公共的单元方法,该单元方法不参与请求的逻辑处理,只负责根据请求转发WEB-INF下的资源。
代码
当我们在浏览器页面中,输入我们想要的jsp页面,然而我们的controller中没有return该页面中的值,就会自动去找我们的公共单元方法。
红框中是直接去项目的根路径中找,如果我们把js放到WEB-INF中,不放在根路径(Web目录)中,就会出现报错,此时我们需要通过资源放行配置。