中國建設銀行北海招聘信息網(wǎng)站百度旗下產(chǎn)品
Spring MVC
目錄
- Spring MVC
- 1.spring mvc簡介
- 2.spring mvc實現(xiàn)原理
- 2.1核心組件
- 2.2工作流程
- 3.RESTful 風格
- 4.Cookie,Session
- 4.1 會話
- 4.2 保存會話的兩種技術
- 5.攔截器
- 5.1過濾器、監(jiān)聽器、攔截器的對比
- 5.2 過濾器的實現(xiàn)
- 5.3 攔截器基本概念
- 5.4 攔截器的實現(xiàn)
1.spring mvc簡介
Spring MVC是一款由Spring Framework 提供的 web組件,實現(xiàn)mvc設計模式的一款框架,Java web開發(fā)者必會框架,前后端不分離。
MVC是一種軟件架構(gòu)思想,把軟件按照模型,視圖,控制器來劃分
- Model:模型層,指工程中的JavaBean,用來處理數(shù)據(jù),JavaBean分成兩類:
一類稱為實體類Bean:專門用來存儲業(yè)務數(shù)據(jù)(返回和接收數(shù)據(jù)),比如Student,User
一類稱為業(yè)務處理Bean:指Servlet或Dao對象,專門用來處理業(yè)務邏輯和數(shù)據(jù)訪問 - View:視圖層,指工程中的html,jsp等頁面,作用是和用戶進行交互,展示數(shù)據(jù)
- Controler:控制層,指工程中的Servlet,作用是接收請求和響應瀏覽器
2.spring mvc實現(xiàn)原理
2.1核心組件
- DispatcherServlet:前端控制器,負責調(diào)度其它組件,是所有組件的中心站同時也對其它組件進行了解耦。
- HandlerMapping:dispatcherServlet收到請求,在這里找到對應的處理器進行處理。
- HandlerInterceptor:處理器攔截器,是一個接口,用于實現(xiàn)一些攔截任務完成接口的調(diào)用
- HandlerExecutionChain:這是一個執(zhí)行鏈,包括Handler和HandlerInterceptor
- HandlerAdapter:處理適配器,在執(zhí)行業(yè)務之前,需要進行一系列的操作包括表單的數(shù)據(jù)驗證、數(shù)據(jù)類型轉(zhuǎn)換、把表單數(shù)據(jù)封裝到POJO等,這些一系列的操作都是由HandlerAdapter完成,DispatcherServlet通過HandlerAdapter執(zhí)行不同的處理器。
- Handler:處理器完成具體的業(yè)務邏輯。
- ModelAndView:裝載了模型數(shù)據(jù)和視圖信息,作為 Handler 的處理結(jié)果,返回給 DispatcherServlet。
- ViewResolver:視圖解析器,DispatcheServlet 通過它將邏輯視圖解析為物理視圖,最終將渲染結(jié)果響應給客戶端。
2.2工作流程
a.客戶端請求先被DispatcherServlet接收。
b.DispatcherServlet將請求傳給HandlerMapping,映射到對應的handler返回一個執(zhí)行鏈。
c.前端控制器調(diào)用處理適配器來調(diào)用處理器。
d.執(zhí)行處理器,處理器返回一個ModleAndView給前端控制器。
e.前端控制器將ModleAndView結(jié)果返回給視圖解析器。
f.視圖解析器解析后返回個view,經(jīng)過視圖渲染,將模型數(shù)據(jù)渲染頁面形成最后視圖返回客戶端。
3.RESTful 風格
- RESTful是當前比較流行的一種互聯(lián)網(wǎng)軟件架構(gòu)模型,通過統(tǒng)一的規(guī)范來完成不同終端的數(shù)據(jù)訪問和交換,REST全稱是Representaional State Transfer(資源表現(xiàn)層狀態(tài)轉(zhuǎn)換)
- RESTful的優(yōu)點:結(jié)構(gòu)清晰,有統(tǒng)一的標準、擴展性好
- RESTful的特點:
1.URL傳參更加簡潔
傳統(tǒng)形式URL: http://localhost:8080/findById?id=1
RESTful風格URL: http://localhost:8080/findById/1
2.完成不同終端之間的資源共享,RESTful提供了一套規(guī)范,不同終端之間只要遵守這個規(guī)范,就可以實現(xiàn)數(shù)據(jù)交互。
RESTful具體來說是四種表現(xiàn)形式,HTTP請求中四種請求類型(GET、POST、PUT、DELETE)分別表示四種常規(guī)操作,CRUD:GET用來獲取資源,POST用來創(chuàng)建資源,PUT用來修改資源,DELETE用來刪除資源。
4.Cookie,Session
4.1 會話
會話:用戶打開一個瀏覽器,點擊了很多超鏈接,訪問多個web資源,關閉瀏覽器,這個過程可以稱之為會話;
有狀態(tài)會話:一個同學來過教室,下次再來教室,我們會知道這個同學,曾經(jīng)來過,稱之為有狀態(tài)會話;
客戶端, 服務端:
服務端給客戶端一個信件,客戶端下次訪問服務端帶上信件就可以了; cookie
服務器登記你來過了,下次你來的時候我來匹配你; seesion
4.2 保存會話的兩種技術
cookie:客戶端技術 (響應,請求)。請求時客戶端會攜帶一個cookie,響應時服務端返回一個cookie。
session:服務器技術,利用這個技術,可以保存用戶的會話信息?服務端會給每一個用戶創(chuàng)建一個session對象,會話沒有關閉session就一直存在,一般也會設置失效時間。
Session和cookie的區(qū)別:
- Cookie是把用戶的數(shù)據(jù)寫給用戶的瀏覽器,瀏覽器保存 (可以保存多個)
- Session把用戶的數(shù)據(jù)寫到用戶獨占Session中,服務器端保存 (保存重要的信息,減少服務器資源的浪費,Session對象由服務創(chuàng)建;
使用場景:
保存一個登錄用戶的信息;購物車信息;在整個網(wǎng)站中經(jīng)常會使用的數(shù)據(jù),我們將它保存在Session中;
5.攔截器
5.1過濾器、監(jiān)聽器、攔截器的對比
- Servlet:處理Reequest請求和Response響應。繼承HttpServlet類,在對請求和響應加入更多邏輯處理。在spring boot項目不用我們顯示處理servlet了,底層已經(jīng)嵌入了servlet容器處理http請求。
- 過濾器(Filter):對Request請求起到過濾作用,作用在Servlet之前,如果配置為/*可以為所有的資源(servlet、js/css靜態(tài)資源等)進行過濾處理
- 監(jiān)聽器(Listener):實現(xiàn)了javax.servlet.ServletContextListener接口的服務器端組件,它隨Web應用的啟動而啟動,只初始化一次,然后一直監(jiān)視,隨Web應用的停止而銷毀
作用一:做初始化工作,web應用中spring容器啟動ContextLoaderListener
作用二:監(jiān)聽web中的特定事件,比如HttpSession,ServletRequest的創(chuàng)建和銷毀;變量的創(chuàng)建、銷毀和修改等可以在某些動作 前后增加處理,實現(xiàn)監(jiān)控,比如說統(tǒng)計在線人數(shù),利用HttpSessionListener等 - 攔截器(Interceptor):是Spring MVC、Struts等表現(xiàn)層框架自己的,不會攔截jsp/html/css/image等的訪問,只會攔截訪問的控制器方法(Handler)
servlet、filter、listener是配置在web.xml中,interceptor是配置在表現(xiàn)層框架自己的配置文件中,在Handler業(yè)務邏輯執(zhí)行之前攔截一次,在Handler邏輯執(zhí)行完但是還沒有跳轉(zhuǎn)頁面之前攔截一次,在跳轉(zhuǎn)頁面后攔截一次。
5.2 過濾器的實現(xiàn)
過濾器是作用在servlet之前,對訪問的所有資源進行過濾處理。
比如 Shiro安全框架技術就是用Filter來實現(xiàn)的
Filter:過濾器,用來過濾網(wǎng)站的數(shù)據(jù);處理中文亂碼, 登錄驗證,網(wǎng)關過濾(有些請求需要過濾),過濾臟話等….
工作中還會學到很多類型的過濾器。
public class CharacterEncodingFilter implements Filter {//初始化:web服務器啟動,就以及初始化了,隨時等待過濾對象出現(xiàn)!public void init(FilterConfig filterConfig) throws ServletException {System.out.println("CharacterEncodingFilter初始化");}//Chain : 鏈/*1. 過濾中的所有代碼,在過濾特定請求的時候都會執(zhí)行2. 必須要讓過濾器繼續(xù)同行chain.doFilter(request,response);*/public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {request.setCharacterEncoding("utf-8");response.setCharacterEncoding("utf-8");response.setContentType("text/html;charset=UTF-8");System.out.println("CharacterEncodingFilter執(zhí)行前....");chain.doFilter(request,response); //讓我們的請求繼續(xù)走,如果不寫,程序到這里就被攔截停止!System.out.println("CharacterEncodingFilter執(zhí)行后....");}//銷毀:web服務器關閉的時候,過濾器會銷毀public void destroy() {System.out.println("CharacterEncodingFilter銷毀");}}
5.3 攔截器基本概念
Spring MVC中的攔截器(Interceptor)類似于Servlet中的過濾器(Filter),它主要用于攔截用戶請求并作相應的處理。例如通過攔截器可以進行權限驗證、記錄請求信息的日志、判斷用戶是否登錄等。
要使用Spring MVC中的攔截器,就需要對攔截器類進行定義和配置。通常攔截器類可以通過兩種方式來定義。
- 通過實現(xiàn)HandlerInterceptor接口
- 繼承HandlerInterceptor接口的實現(xiàn)類(如:HandlerInterceptorAdapter)來定義。
5.4 攔截器的實現(xiàn)
public class MyInterceptor implements HandlerInterceptor {/*** 在目標Handler(方法)執(zhí)行前執(zhí)行* 返回true:執(zhí)行Handler方法* 返回false:阻止目標Handler方法執(zhí)行* @param request* @param response* @param handler* @return* @throws Exception*/@Overridepublic boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {System.out.println("目標Handler執(zhí)行前執(zhí)行MyInterceptor---->preHandle方法...");return true;}/*** 在目標Handler(方法)執(zhí)行后,視圖生成前執(zhí)行* @param request* @param response* @param handler* @param modelAndView* @throws Exception*/@Overridepublic void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {System.out.println("目標Handler執(zhí)行后,視圖執(zhí)行前執(zhí)行MyInterceptor---->postHandle方法...");}/*** 在目標方法執(zhí)行后,視圖生成后執(zhí)行* @param request* @param response* @param handler* @param ex* @throws Exception*/@Overridepublic void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {System.out.println("目標Handler執(zhí)行后,視圖執(zhí)行后執(zhí)行MyInterceptor---->afterCompletion方法...");}
}