目錄
一、EasyMVC
1.三層架構
- 控制層(MVC)、業務層(Spring)、持久層(MyBatis)
2.MVC原理
- 使控制邏輯、業務邏輯調用、展示邏輯相互分離(責任分離)
- Model (模型) :數據模型,包含要展示的數據和業務功能。
- View (視圖) :用戶界面,在界面上顯示模型數據。
- Controller ( 控制器) :起調度作用,接收用戶請求、調用業務處理請求、共享模型數據並跳轉界面。
3.前端控制器
- 前端控制器模式:在所有控制器之前有一個統一的控制器;用來集中的對請求進行統一處理,然後前端控制器再把每一個請求分發給各自的處理器(減少重複代碼,抽離出公有的部分)
- 後端控制器:專門用來處理特定的,具體的請求;分發器會分發到不同的後端控制器;Apache體系(struts2)稱之爲XxxAction;Spring體系(Spring MVC)稱之爲XxxController
二、走進SpringMVC
1.Spring Web框架
-
SpringMVC是同步阻塞的IO模型,Spring的異步豐阻塞Web框架Spring WebFlux可以做到異步非阻塞,也可以使用其它方式來達到異步。
1.1SpringMVC和Struts2對比
- ①. Spring MVC的前端控制器是Servlet,而Struts2是Filter.
- ②. Spring MVC會稍微比Struts2快些. Spring MVC是基於方法設計.默認是單例的,而Sturts2 是基於類.每發一次請求都會創建一個新的對象,是多例的。
- ③、Spring MVC更加簡潔。開發效率Spring MVC比Struts2高.如支持JSR303校驗,且處理AJAX請求更方便。
- ④. Struts2 的OGNL表達式(模型和視圖之間傳遞數據),Spring MVC(通過Model對象傳遞)
2.入門程序(使用XML開發)
2.1開發步驟
- ①:配置前端控制器: DispatcherServlet(在web.xml配置)
- ②:配置處理器映射器: BeanNameUrlHandlerMapping(在springMVC.xml配置)
- ③:配置處理器適配器: SimpleControllerHandlerAdapter(在springMVC.xml配置)
- ④:配置視圖解析器: InternalResourceViewResolver(在springMVC.xml配置)
- ⑤:開發和配置處理器: HelloController(在XxxContrller裏進行開發,在springMVC.xml配置)
- ⑥:開發視圖:View(在頁面裏進行開發)
ps:根據請求的URL尋找對應的Bean,根據Bean的id/name(都可)尋找到對應的處理器;
ps:springMVC.xml這個配置文件,默認是/WEB-INF目錄去找(servlet-name)-servlet.xml;配置classpath路徑是在resources包裏面去找;
ps:DispatcherServiet.properties部分配置(默認配置了映射器,適配器,解析器);
3.執行流程
- 客戶端發送請求,到前端控制器DispatcherServlet先進行請求的統一封裝處理,
- 根據處理器映射器獲取到處理器,
- 根據處理器獲取到對應的適配器,
- 適配器去進行具體的執行並且返回ModelAndView數據給分派器,
- 傳送給視圖解析器進行處理(數據替換等)並返回填充好的view對象(JSTLView,FreeMarker,PdfView等模板引擎)給分派器,
- 分配器將view(HTML/JSP等)對象最終通過瀏覽器進行模板渲染,然後在進行呈現。
4.使用註解開發
4.1基本註解
- 控制層(mvc):@Controller,用在類上
- 業務邏輯層(Service):@Service,用在類上
- 數據持久層(DAO):@Resposotory,用在類上
- 其他組件使用通用註解:@Component
- 在springMVC.xml配置Ioc註解掃描器和MVC註解解析器(註冊處理器、適配器、解析器);
4.2@RequestMapping註解:處理地址請求映射,可以用在類上(父路徑),可以用在方法上(子路徑),六大屬性如下:
- value:和path一樣,指定請求的URL,比如 /hello。
- method:指定請求方式的類型,比如GET,HEAD,PATCH,POST,PUT,DELETE,OPTIONS,TRACE。
- consumes(消費):指定請求內容格式:Content-Type=application/json;
- produces(生產):指定響應內容格式:Accept=application/json; charset=UTF-8;
- params :指定request 中必須包含某些參數值,包含該方法才處理,
- headers :指定request中必須包含指定的header,包含才能處理。”
5.靜態資源訪問
問題:Tomcat默認的web.xml裏的servlet配置爲‘/’,項目的web.xml配置爲‘/’,會出現項目覆蓋了Tomcat的路徑,未進行動態映射的請求尋找不到默認的路徑就會失敗。
解決:使用<mvc:default-servlet-handler>在開發中使用比較多.SpringMVC如果發現沒有經過映射請求,就交給Tomcat的默認servlet來處理.
三、請求和響應
1.返回類型
- ModelAndView:指定數據模型+指定視圖名;
mv.addObject("bs", books);//指定數據模型
mv.setViewName("book");//指定視圖名
- String:配合入參Model使用,不加ResponseBody返回視圖名稱否則返回json字符串,也可重定向和請求轉發;
- Java數據結構:加ResponseBody常見的 List 集合、Map,實體類等都可以返回,這些數據由 HttpMessageConverter 自動轉爲 JSON ;
ps:一般需要在springMVC.xml配置視圖解析器的請求路徑的前綴和後綴;
2.請求跳轉
2.1請求轉發:返回String類型比如:forward:/hello.html;(共享數據,只有一個請求)
- 原理:request.getRequestDispatcher ("") . forward (request, response) ;
2.2重定向:返回String類型比如:redirect:/hello.html;(不共享數據,有兩個請求)
- 原理:response. sendRedirect ("") ;
2.3重定向的共享數據(只能顯式傳參/隱式傳參)
- 可以通過Flash屬性進行共享數據:原方法傳入參數RedirectAttributes,調用ra.addFlashAttribute ("msg2", "msg2") ;接收方法ModelAttribute ("msg2") String msg2來進行獲取;
- 原理:a向b傳輸數據,a先將數據傳入HttpSession裏然後讓b去取,然後刪除;
2.4重定向和請求轉發的絕對路徑和相對路徑
- 訪問資源的時候前面帶上/, 表示絕對路徑,從根路徑開始去尋找資源.比如:/response/test6 ------/hello.html
- 訪問資源的時候簽名不加/,表示相對路徑,從上一級上下文路徑中去尋找資源.比如:/response/test6 ------/response/hello.html
3.參數處理
- 方法可傳入參數HttpServletRequest request, HttpServletResponse response , HttpSession session
- 可以給對象(單例的)屬性進行自動注入註解,比如@Autowired
- 獲取請求參數,可以直接獲取(保證URL的參數和方法的參數相同):String username, int age相同,
- 使用註解獲取:@RequestParam ("name") String usexname, @Requescparam(value = "age", requixed = ralse) int age可以自定義順序,進行設定名稱並且選擇該參數是否必須
- RESTful風格傳參,將URL中佔位符綁定到方法的形參中,RequestMapping ("/delete/{id} "),void test3 (@PathVariable ("id")Long id)
- 使用Bean對象來進行接收,方法形參傳入對象,針對Bean這種複合類型(非簡單類型)參數,缺省情況下就會放到model中(共享) ,缺省的key就是類型首字母小寫。
4.其他請求信息
- @RequestHeader ("User- Agent") string userAgent;
- @CookieValue ("JSESSIONID") String cName;
- @SessionAttribute可以將request中的數據放入session中共享;
5.處理多對象屬性名相同的問題
- 使用自定義數據綁定註冊,view屬性名設置前綴,controller的方法設置前綴即可
6.JSON數據處理
- 利用Jackson開源庫可以將JavaBean對象和JSON/XML的格式對象互相轉;SpringMVC默認支持jackson處理JSON數據。
6.1請求響應格式:
- application/x-www-form-urlencoded:傳統的key-value表單格式;
- application/multipart:文件上傳的請求,也能處理普通表單數據;
- application/json:參數是JSON格式,等價application/xml
6.2註解處理:
- @ResponseBody註解:處理響應,將對象轉化爲JSON字符串;可以放到方法,也可以放到類上;(一般處理js發出的ajax請求)
- @RestController註解:等價@Controller+ResponseBody;
- @RequestBody註解:處理請求,將JSON格式的請求數據轉化成對象
7.日期類型處理
- 將字符串參數轉化爲日期類型:@DaceTime Format (pattern="yyyy -MM -dd") Date d;還可以使用@ControllerAdvice註解(對控制器進行增強)單獨抽離出一個類,在利用@InitBinder註解進行註冊;
- JSP顯示Date類型,引入taglib標籤庫;
- 後臺往前臺傳,轉化爲JSON格式:使用註解@JsonFormat (pattern= "yyyy-MM-dd HH:mm:ss") ;
四、攔截器
1.攔截器執行流程:
- 在通過映射器獲取到處理器的時候,會獲取到處理器執行鏈,可以獲取到每一個節點的攔截器,以及(唯一)處理器;
1.1三大方法:
- preHandle方法(處理器處理之前):在請求達到Handler之前,先執行這個前置處理方法。當該方法返回false時,請求直接返回,不會傳遞到鏈中的下一個攔截器,更不會傳遞到處理鏈末端的Handler中。只有返回true時,請求才向鏈中的下一個處理節點傳遞。
- postHandle方法(處理器處理之後,模板渲染之前) :控制器方法執行後.視圖渲染之前執行可以加入統一的響應信息。
- afterCompleti方法(模板渲染之後):視圖渲染之後執行處理Controller異常信息記錄操作日誌,清理資源等。
1.2在mvc.xml裏進行配置實現好的攔截器(實現HandlerInterceptor接口),<mvc:mapping path="/**"/>,<mvc: exclude-mapping path="/login"/>
五、異常處理
1.使用Spring MVC提供的
- 簡單異常處理器SimpleMappingExceptionResolver;
- 需要配置mvc.xml;
2.實現Spring的異常處理接口
-
實現HandlerExceptionResolver接口自定義自己的異常處理器;
3.使用註解實現異常處理;
- @ExceptionHandler(可對具體異常進行處理而不是Exception)
- 藉助@ControllerAdvice註解對@Controller註解進行增強,不需要配置mvc.xml;
六、數據校驗
1.實體類的屬性校驗:
1.1使用Spring自帶的驗證框架:spring-validator
1.2使用JSR 303的實現:jsr303-validator;(常用)
- 在控制器的方法傳參@Valid Employee e,BindingResult bindingResult;
- 通過bindingResult獲取錯誤信息,在通過model傳給頁面顯示;
七、SpringMVC標籤
1.表單標籤
通過SpringMVC的表單標籤可以實現將模型數據中的屬性和HTML表單元素相綁定,以實現表單數據編輯和表單值的回顯.
- 引入標籤<%@ taglib url= "http://wwv. springtramevork . org/tags/foxm" prefix= "form"'>
八、文件上傳和下載
1.文件上傳
1.1view視圖層:基於表單的提交具體實現
1.2controller控制層
- 可以基於Apache的.上傳組件,需要jar包,需要配置mvc.xml文件,在實現控制器的方法即可;
- 可以基於Servlet3.0:spring Boot默認支持,配置項目的web.xml文件,實現控制器的思路是相同的;
2.文件下載
- 原來的操作request方式,實現控制器方法;
- SpringMVC也做了封裝,返回值變爲ResponseEntity(轉爲字節流);