#Spring 視圖 ##1. 概念介紹java
###1.1 Servlet ####1.1.1 概念 Java Servlet 是運行在 Web 服務器或應用服務器上的程序,它是做爲來自 Web 瀏覽器或其餘 HTTP 客戶端的請求和 HTTP 服務器上的數據庫或應用程序之間的中間層。spring
####1.1.2 生命週期數據庫
Servlet 經過調用 init () 方法進行初始化。瀏覽器
Servlet 調用 service() 方法來處理客戶端的請求。服務器
Servlet 經過調用 destroy() 方法終止(結束)。session
最後,Servlet 是由 JVM 的垃圾回收器進行垃圾回收的。app
###1.2 Servlet 跳轉 ####1.2.1 redirect重定向 response對象的sendRedirect()方法jsp
跳轉路徑: response.sendRedirect("/projectName/XXXX")ui
傳值方式: 只能在url中帶parameter或者放在session中,沒法使用request.setAttribute來傳遞。this
瀏覽器地址欄: 會發生變化,這種方式是在客戶端做的重定向處理。該方法經過修改HTTP協議的HEADER部分,對瀏覽器下達重定向指令。
####1.2.2 forward轉發
RequestDispatcher對象的forward()方法
跳轉路徑: request.getRequestDispatcher("/a.jsp").forward(request, response);
傳值方式: url中帶parameter,session,request.setAttribute。
瀏覽器地址欄: 不會發生變化,這種方式是在服務器端做的重定向。
##2. Spring 視圖 ###2.1 Spring 視圖返回方式
//返回String,利用Model對象 @RequestMapping("/toBuilding") public String toBuilding(HttpServletRequest request,Model model){ String buildingId = request.getParameter("buildingId"); model.addAttribute("buildingId",buildingId); return "/basedata/index.jsp"; } //返回的是一個包含模型和視圖的ModelAndView對象; @RequestMapping(value = "/toEdit", method = RequestMethod.GET) public ModelAndView toEdit(HttpServletRequest request, ModelMap model, Integer restaurantId) { ModelAndView mav = new ModelAndView(); mav.setViewName("/basedata/edit"); return mav; } //返回一個模型對象 //主要包含spring封裝好的model和modelMap,以及java.util.Map, @RequestMapping(value="/toUpdate",method=RequestMethod.GET) public Map<String, String> toUpdate(){ Map<String, String> map = new HashMap<String, String>(); map.put("1", "1"); //map.put至關於request.setAttribute方法 return map; } //返回Json對象,返回字符串表示一個視圖名稱,若是須要在渲染視圖的過程當中須要模型的話, //就能夠給處理器添加一個模型參數,而後在方法體往模型添加值就能夠了。 @RequestMapping(value = "/delete", method = RequestMethod.POST) @ResponseBody public String delete(Integer Id) { return "success"; }
在Spring MVC 4控制器中,全部的處理方法必須返回一個邏輯視圖名稱,不管是顯式的(返回String,View或ModelAndView)仍是隱式的。Spring中的視圖由視圖解析器處理這個邏輯視圖名稱。
處理視圖最重要的兩個接口ViewResolver和View。ViewResolver接口在視圖名稱和真正的視圖之間提供映射; 而View接口則處理請求將真正的視圖呈現給用戶。
public static final String REDIRECT_URL_PREFIX = "redirect:"; public static final String FORWARD_URL_PREFIX = "forward:"; protected View createView(String viewName, Locale locale) throws Exception { if(!this.canHandle(viewName, locale)) { return null; } else { String forwardUrl; //決定是重定向仍是轉發。 if(viewName.startsWith("redirect:")) { forwardUrl = viewName.substring("redirect:".length()); RedirectView view = new RedirectView(forwardUrl, this.isRedirectContextRelative(), this.isRedirectHttp10Compatible()); return this.applyLifecycleMethods(viewName, view); } else if(viewName.startsWith("forward:")) { forwardUrl = viewName.substring("forward:".length()); return new InternalResourceView(forwardUrl); } else { return super.createView(viewName, locale); } } }
它是URLBasedViewResolver的子類,因此URLBasedViewResolver支持的特性它都支持. InternalResourceViewResolver會把返回的視圖名稱都解析爲 InternalResourceView對象, InternalResourceView會把Controller處理器方法返回的模型屬性都存放到對應的request屬性中,而後經過RequestDispatcher 在服務器端把請求forword轉發到目標URL 。