WEB框架之Spring MVC基礎應用

目錄

一、EasyMVC

1.三層架構

2.MVC原理

3.前端控制器

二、走進SpringMVC

1.Spring Web框架

2.入門程序(使用XML開發)

3.執行流程

4.使用註解開發

5.靜態資源訪問

三、請求和響應

1.返回類型

2.請求跳轉

3.參數處理

4.其他請求信息

5.處理多對象屬性名相同的問題

6.JSON數據處理

7.日期類型處理

四、攔截器

1.攔截器執行流程:

五、異常處理

1.使用Spring MVC提供的

2.實現Spring的異常處理接口

3.使用註解實現異常處理;

六、數據校驗

1.實體類的屬性校驗:

七、SpringMVC標籤

1.表單標籤

八、文件上傳和下載

1.文件上傳

2.文件下載


一、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註解:處理地址請求映射,可以用在類上(父路徑),可以用在方法上(子路徑),六大屬性如下:

  1. value:和path一樣,指定請求的URL,比如 /hello。
  2. method:指定請求方式的類型,比如GET,HEAD,PATCH,POST,PUT,DELETE,OPTIONS,TRACE。
  3. consumes(消費):指定請求內容格式:Content-Type=application/json; 
  4. produces(生產):指定響應內容格式:Accept=application/json; charset=UTF-8;
  5. params :指定request 中必須包含某些參數值,包含該方法才處理,
  6. 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.參數處理

  1. 方法可傳入參數HttpServletRequest request, HttpServletResponse response , HttpSession session
  2. 可以給對象(單例的)屬性進行自動注入註解,比如@Autowired
  3. 獲取請求參數,可以直接獲取(保證URL的參數和方法的參數相同):String username, int age相同,
  4. 使用註解獲取:@RequestParam ("name") String usexname, @Requescparam(value = "age", requixed = ralse) int age可以自定義順序,進行設定名稱並且選擇該參數是否必須
  5. RESTful風格傳參,將URL中佔位符綁定到方法的形參中,RequestMapping ("/delete/{id} "),void test3 (@PathVariable ("id")Long id)
  6. 使用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(轉爲字節流);
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章