
1、回顧MVC
**Model(模型):**數(shù)據(jù)模型,提供要展示的數(shù)據(jù),因此包含數(shù)據(jù)和行為,可以認為是領域模型或JavaBean組件(包含數(shù)據(jù)和行為),不過現(xiàn)在一般都分離開來:Value Object(數(shù)據(jù)Dao) 和 服務層(行為Service)。也就是模型提供了模型數(shù)據(jù)查詢和模型數(shù)據(jù)的狀態(tài)更新等功能,包括數(shù)據(jù)和業(yè)務。
(資料圖片)
**View(視圖):**負責進行模型的展示,一般就是我們見到的用戶界面,客戶想看到的東西。
**Controller(控制器):**接收用戶請求,委托給模型進行處理(狀態(tài)改變),處理完畢后把返回的模型數(shù)據(jù)返回給視圖,由視圖負責展示。也就是說控制器做了個調(diào)度員的工作。
最典型的MVC就是JSP + servlet + javabean的模式。
Model1優(yōu)點:架構簡單,比較適合小型項目開發(fā);
Model1缺點:JSP職責不單一,職責過重,不便于維護;
Model2把一個項目分成三部分,包括視圖、控制、模型。
用戶發(fā)請求Servlet接收請求數(shù)據(jù),并調(diào)用對應的業(yè)務邏輯方法業(yè)務處理完畢,返回更新后的數(shù)據(jù)給servletservlet轉(zhuǎn)向到JSP,由JSP來渲染頁面響應給前端更新后的頁面職責分析:
Controller:控制器
取得表單數(shù)據(jù)調(diào)用業(yè)務邏輯轉(zhuǎn)向指定的頁面Model:模型
業(yè)務邏輯保存數(shù)據(jù)的狀態(tài)View:視圖
顯示頁面Model2這樣不僅提高的代碼的復用率與項目的擴展性,且大大降低了項目的維護成本。Model 1模式的實現(xiàn)比較簡單,適用于快速開發(fā)小規(guī)模項目,Model1中JSP頁面身兼View和Controller兩種角色,將控制邏輯和表現(xiàn)邏輯混雜在一起,從而導致代碼的重用性非常低,增加了應用的擴展性和維護的難度。Model2消除了Model1的缺點。
建立一個Moudle:springmvc-01-servlet , 添加Web app的支持!導入servlet 和 jsp 的 jar 依賴junit junit 4.12 org.springframework spring-webmvc 5.1.9.RELEASE javax.servlet servlet-api 2.5 javax.servlet.jsp jsp-api 2.2 javax.servlet jstl 1.2
編寫一個Servlet類,用來處理用戶的請求javax.servlet servlet-api 2.5 javax.servlet.jsp jsp-api 2.2
package com.kuang.servlet;//實現(xiàn)Servlet接口public class HelloServlet extends HttpServlet { @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { //取得參數(shù) String method = req.getParameter("method"); if (method.equals("add")){ req.getSession().setAttribute("msg","執(zhí)行了add方法"); } if (method.equals("delete")){ req.getSession().setAttribute("msg","執(zhí)行了delete方法"); } //業(yè)務邏輯 //視圖跳轉(zhuǎn) req.getRequestDispatcher("/WEB-INF/jsp/hello.jsp").forward(req,resp); } @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { doGet(req,resp); }}編寫Hello.jsp,在WEB-INF目錄下新建一個jsp的文件夾,新建hello.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>在web.xml中注冊ServletKuangshen ${msg}
配置Tomcat,并啟動測試localhost:8080/user?method=addlocalhost:8080/user?method=deleteHelloServlet com.kuang.servlet.HelloServlet HelloServlet /user
MVC框架要做哪些事情
將url映射到java類或java類的方法 .封裝用戶提交的數(shù)據(jù) .處理請求--調(diào)用相關的業(yè)務處理--封裝響應數(shù)據(jù) .將響應的數(shù)據(jù)進行渲染 . jsp / html 等表示層數(shù)據(jù) .說明:
?常見的服務器端MVC框架有:Struts、Spring MVC、??ASP.NET?? MVC、Zend Framework、JSF;常見前端MVC框架:vue、angularjs、react、backbone;由MVC演化出了另外一些模式如:MVP、MVVM 等等....
Spring MVC是Spring Framework的一部分,是基于Java實現(xiàn)MVC的輕量級Web框架。
查看官方文檔:??https://docs.spring.io/spring/docs/5.2.0.RELEASE/spring-framework-reference/web.html#spring-web??
我們?yōu)槭裁匆獙W習SpringMVC呢?
Spring MVC的特點:
輕量級,簡單易學高效 , 基于請求響應的MVC框架與Spring兼容性好,無縫結合約定優(yōu)于配置功能強大:RESTful、數(shù)據(jù)驗證、格式化、本地化、主題等簡潔靈活Spring的web框架圍繞DispatcherServlet[ 調(diào)度Servlet ] 設計。
DispatcherServlet的作用是將請求分發(fā)到不同的處理器。從Spring 2.5開始,使用Java 5或者以上版本的用戶可以采用基于注解形式進行開發(fā),十分簡潔;
正因為SpringMVC好 , 簡單 , 便捷 , 易學 , 天生和Spring無縫集成(使用SpringIoC和Aop) , 使用約定優(yōu)于配置 . 能夠進行簡單的junit測試 . 支持Restful風格 .異常處理 , 本地化 , 國際化 , 數(shù)據(jù)驗證 , 類型轉(zhuǎn)換 , 攔截器 等等......所以我們要學習 .
最重要的一點還是用的人多 , 使用的公司多 .
Spring的web框架圍繞DispatcherServlet設計。DispatcherServlet的作用是將請求分發(fā)到不同的處理器。從Spring 2.5開始,使用Java 5或者以上版本的用戶可以采用基于注解的controller聲明方式。
Spring MVC框架像許多其他MVC框架一樣, 以請求為驅(qū)動, 圍繞一個中心Servlet分派請求及提供其他功能,DispatcherServlet是一個實際的Servlet (它繼承自HttpServlet 基類)。
SpringMVC的原理如下圖所示:
當發(fā)起請求時被前置的控制器攔截到請求,根據(jù)請求參數(shù)生成代理請求,找到請求對應的實際控制器,控制器處理請求,創(chuàng)建數(shù)據(jù)模型,訪問數(shù)據(jù)庫,將模型響應給中心控制器,控制器使用模型與視圖渲染視圖結果,將結果返回給中心控制器,再將結果返回給請求者。
圖為SpringMVC的一個較完整的流程圖,實線表示SpringMVC框架提供的技術,不需要開發(fā)者實現(xiàn),虛線表示需要開發(fā)者實現(xiàn)。
簡要分析執(zhí)行流程
DispatcherServlet表示前置控制器,是整個SpringMVC的控制中心。用戶發(fā)出請求,DispatcherServlet接收請求并攔截請求。我們假設請求的url為 : ???http://localhost:8080/SpringMVC/hello??如上url拆分成三部分:http://localhost:8080服務器域名SpringMVC部署在服務器上的web站點hello表示控制器通過分析,如上url表示為:請求位于服務器localhost:8080上的SpringMVC站點的hello控制器。HandlerMapping為處理器映射。DispatcherServlet調(diào)用HandlerMapping,HandlerMapping根據(jù)請求url查找Handler。HandlerExecution表示具體的Handler,其主要作用是根據(jù)url查找控制器,如上url被查找控制器為:hello。HandlerExecution將解析后的信息傳遞給DispatcherServlet,如解析控制器映射等。HandlerAdapter表示處理器適配器,其按照特定的規(guī)則去執(zhí)行Handler。Handler讓具體的Controller執(zhí)行。Controller將具體的執(zhí)行信息返回給HandlerAdapter,如ModelAndView。HandlerAdapter將視圖邏輯名或模型傳遞給DispatcherServlet。DispatcherServlet調(diào)用視圖解析器(ViewResolver)來解析HandlerAdapter傳遞的邏輯視圖名。視圖解析器將解析的邏輯視圖名傳給DispatcherServlet。DispatcherServlet根據(jù)視圖解析器解析的視圖結果,調(diào)用具體的視圖。最終視圖呈現(xiàn)給用戶。在這里先聽一遍原理,不理解沒有關系,我們馬上來寫一個對應的代碼實現(xiàn)大家就明白了,如果不明白,那就寫10遍,沒有笨人,只有懶人!
現(xiàn)在我們來看看如何快速使用SpringMVC編寫我們的程序吧!
1、新建一個Moudle , springmvc-02-hello , 添加web的支持!
2、確定導入了SpringMVC 的依賴!
3、配置web.xml , 注冊DispatcherServlet
springmvc org.springframework.web.servlet.DispatcherServlet contextConfigLocation classpath:springmvc-servlet.xml 1 springmvc /
4、編寫SpringMVC 的 配置文件!名稱:springmvc-servlet.xml : [servletname]-servlet.xml
說明,這里的名稱要求是按照官方來的
5、添加 處理映射器