/**
* 使用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中的jsp頁面需要通過,在單元方法中跳轉,即
用自定義視圖解析器的前提:
取決于請求轉發的路徑是否為WEB-INF下的,是的話則不需要加forword:。
使用restful聲明公共單元方法請求轉發WEB-INF下的資源
用來解決controller中,只能請求轉發一個資源路徑的問題。
方法:根據請求,請求轉發WEB-INF下的資源的單元方法是肯定要聲明的。我們可以聲明一個公共的單元方法,該單元方法不參與請求的邏輯處理,只負責根據請求轉發WEB-INF下的資源。
代碼
當我們在瀏覽器頁面中,輸入我們想要的jsp頁面,然而我們的controller中沒有return該頁面中的值,就會自動去找我們的公共單元方法。
WEB-INF下的靜態資源放行配置
紅框中是直接去項目的根路徑中找,如果我們把js放到WEB-INF中,不放在根路徑(Web目錄)中,就會出現報錯,此時我們需要通過資源放行配置。