|
在Web世界里,都是Web客戶端發(fā)起請求,Web服務(wù)器接收、處理并產(chǎn)生響應(yīng)。一般Web服務(wù)器是不能主動通知Web客戶端更新內(nèi)容。雖然現(xiàn)在有些技術(shù)如服務(wù)器推,如Comet,還有現(xiàn)在的HTML5 websocket可以實現(xiàn)Web服務(wù)器主動通知Web客戶端。到此我們了解了在web開發(fā)時的請求/響應(yīng),接下來我們看一下標(biāo)準(zhǔn)的MVC模型是什么。 Spring web,MVC 框架提供了模型-視圖-控制的體系結(jié)構(gòu)和可以用來開發(fā)靈活、松散耦合的 web 應(yīng)用程序 模型封裝了應(yīng)用程序數(shù)據(jù),并且通常它們由 POJO 組成。 視圖主要用于呈現(xiàn)模型數(shù)據(jù),并且通常它生成客戶端的瀏覽器可以解釋的 HTML 輸出。 控制器主要用于處理用戶請求,并且構(gòu)建合適的模型并將其傳遞到視圖呈現(xiàn)。 DispatcherServlet Spring Web 模型-視圖-控制(MVC)框架是圍繞 DispatcherServlet 設(shè)計的,DispatcherServlet 用來處理所有的 HTTP 請求和響應(yīng)。Spring Web MVC DispatcherServlet 的請求處理的工作流程如下圖所示: 下面是對應(yīng)于 DispatcherServlet 傳入 HTTP 請求的事件序列: 收到一個 HTTP 請求后,DispatcherServlet 根據(jù) HandlerMapping 來選擇并且調(diào)用適當(dāng)?shù)目刂破鳌?/p> 控制器接受請求,并基于使用的 GET 或 POST 方法來調(diào)用適當(dāng)?shù)?service 方法。Service 方法將設(shè)置基于定義的業(yè)務(wù)邏輯的模型數(shù)據(jù),并返回視圖名稱到 DispatcherServlet 中。 DispatcherServlet 會從 ViewResolver 獲取幫助,為請求檢取定義視圖。 一旦確定視圖,DispatcherServlet 將把模型數(shù)據(jù)傳遞給視圖,最后呈現(xiàn)在瀏覽器中。 上面所提到的所有組件,即 HandlerMapping、Controller 和 ViewResolver 是 WebApplicationContext 的一部分,而 WebApplicationContext 是帶有一些對 web 應(yīng)用程序必要的額外特性的 ApplicationContext 的擴展。 需求的配置 你需要映射你想讓 DispatcherServlet 處理的請求,通過使用 web.xml 文件將被保留在你的應(yīng)用程序的 WebContent/WEB-INF 目錄下。好的,在初始化 HelloWeb DispatcherServlet 時,該框架將嘗試加載位于該應(yīng)用程序的 WebContent/WEB-INF 目錄中文件名為 [servlet-name]-servlet.xml 的應(yīng)用程序內(nèi)容。在這種情況下,我們的文件將是 HelloWeb-servlet.xml。 接下來, 標(biāo)簽表明哪些 URLs 將被 DispatcherServlet 處理。這里所有以 .jsp 結(jié)束的 HTTP 請求將由 HelloWeb DispatcherServle t處理。 如果你不想使用默認(rèn)文件名 [servlet-name]-servlet.xml 和默認(rèn)位置 WebContent/WEB-INF,你可以通過在 web.xml 文件中添加 servlet 監(jiān)聽器 ContextLoaderListener 自定義該文件的名稱和位置,如下所示: <web-app...> ....<context-param> <param-name>contextConfigLocation</param-name> <param-value>/WEB-INF/HelloWeb-servlet.xml</param-value></context-param><listener> <listener-class> org.springframework.web.context.ContextLoaderListener </listener-class></listener></web-app> 現(xiàn)在,檢查 HelloWeb-servlet.xml 文件的請求配置,該文件位于 web 應(yīng)用程序的 WebContent/WEB-INF 目錄下: 以下是關(guān)于 HelloWeb-servlet.xml 文件的一些要點: [servlet-name]-servlet.xml 文件將用于創(chuàng)建 bean 定義,重新定義在全局范圍內(nèi)具有相同名稱的任何已定義的 bean。 標(biāo)簽將用于激活 Spring MVC 注釋掃描功能,該功能允許使用注釋,如 @Controller 和 @RequestMapping 等等。 InternalResourceViewResolver 將使用定義的規(guī)則來解決視圖名稱。按照上述定義的規(guī)則,一個名稱為 hello 的邏輯視圖將發(fā)送給位于 /WEB-INF/jsp/hello.jsp 中實現(xiàn)的視圖。 下一節(jié)將向你展示如何創(chuàng)建實際的組件,例如控制器,模式和視圖。 定義控制器 DispatcherServlet 發(fā)送請求到控制器中執(zhí)行特定的功能。@Controller 注釋表明一個特定類是一個控制器的作用。@RequestMapping 注釋用于映射 URL 到整個類或一個特定的處理方法。 @Controller@RequestMapping("/hello")public class HelloController{ @RequestMapping(method = RequestMethod.GET) public String printHello(ModelMap model) { model.addAttribute("message", "Hello Spring MVC Framework!"); return "hello"; } @Controller 注釋定義該類作為一個 Spring MVC 控制器。在這里,第一次使用的 @RequestMapping 表明在該控制器中處理的所有方法都是相對于 /hello 路徑的。下一個注釋 @RequestMapping(method = RequestMethod.GET) 用于聲明 printHello() 方法作為控制器的默認(rèn) service 方法來處理 HTTP GET 請求。你可以在相同的 URL 中定義其他方法來處理任何 POST 請求。 你可以用另一種形式來編寫上面的控制器,你可以在 @RequestMapping 中添加額外的屬性,如下所示: @Controllerpublic class HelloController{ @RequestMapping(value = "/hello", method = RequestMethod.GET) public String printHello(ModelMap model) { model.addAttribute("message", "Hello Spring MVC Framework!"); return "hello"; } } 值屬性表明 URL 映射到哪個處理方法,方法屬性定義了 service 方法來處理 HTTP GET 請求。關(guān)于上面定義的控制器,這里有以下幾個要注意的要點: 你將在一個 service 方法中定義需要的業(yè)務(wù)邏輯。你可以根據(jù)每次需求在這個方法中調(diào)用其他方法。 基于定義的業(yè)務(wù)邏輯,你將在這個方法中創(chuàng)建一個模型。你可以設(shè)置不同的模型屬性,這些屬性將被視圖訪問并顯示最終的結(jié)果。這個示例創(chuàng)建了一個帶有屬性 “message” 的模型。 一個定義的 service 方法可以返回一個包含視圖名稱的字符串用于呈現(xiàn)該模型。這個示例返回 “hello” 作為邏輯視圖的名稱。 創(chuàng)建 JSP 視圖 對于不同的表示技術(shù),Spring MVC 支持許多類型的視圖。這些包括 JSP、HTML、PDF、Excel 工作表、XML、Velocity 模板、XSLT、JSON、Atom 和 RSS 提要、JasperReports 等等。但我們最常使用利用 JSTL 編寫的 JSP 模板。所以讓我們在 /WEB-INF/hello/hello.jsp 中編寫一個簡單的 hello 視圖: <html> <head> <title>Hello Spring MVC</title> </head> <body> <h2>${message}</h2> </body></html> 其中,${message} 是我們在控制器內(nèi)部設(shè)置的屬性。你可以在你的視圖中有多個屬性顯示。 |
|
|