Spring 視圖

#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";
}

2.2 Spring 視圖解析器

在Spring MVC 4控制器中,全部的處理方法必須返回一個邏輯視圖名稱,不管是顯式的(返回String,View或ModelAndView)仍是隱式的。Spring中的視圖由視圖解析器處理這個邏輯視圖名稱。

處理視圖最重要的兩個接口ViewResolver和View。ViewResolver接口在視圖名稱和真正的視圖之間提供映射; 而View接口則處理請求將真正的視圖呈現給用戶。

2.2.1 UrlBasedViewResolver

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);
        }
    }
}

2.2.2 InternalResourceViewResolver

它是URLBasedViewResolver的子類,因此URLBasedViewResolver支持的特性它都支持. InternalResourceViewResolver會把返回的視圖名稱都解析爲 InternalResourceView對象, InternalResourceView會把Controller處理器方法返回的模型屬性都存放到對應的request屬性中,而後經過RequestDispatcher 在服務器端把請求forword轉發到目標URL 。

相關文章
相關標籤/搜索