1. SpringMVC的攔截器和過濾器的區別與聯系
攔截器與過濾器的區別 :
攔截器是基於java的反射機制的,而過濾器是基於函數回調。
攔截器不依賴與servlet容器,過濾器依賴與servlet容器。
攔截器只能對action請求起作用,而過濾器則可以對幾乎所有的請求起作用。
攔截器可以訪問action上下文、值棧里的對象,而過濾器不能訪問。
在action的生命周期中,攔截器可以多次被調用,而過濾器只能在容器初始化時被調用一次。
攔截器,在AOP(Aspect-Oriented Programming)中用於在某個方法或欄位被訪問之前,進行攔截然後在之前或之後加入某些操作。
過濾器是一個程序,它先於與之相關的servlet或JSP頁面運行在伺服器上。過濾器可附加到一個或多個servlet或JSP頁面上,並且可以檢查進入這些資源的請求信息。
2. 面試官:談談過濾器和攔截器的區別
攔截器與過濾器的區別如下:
功能與作用范圍:
執行時機與位置:
配置方式:
應用場景:
總結:攔截器和過濾器在Java Web開發中各有其獨特的功能和應用場景。攔截器主要用於控制Action的執行流程,而過濾器則用於管理所有web資源請求。開發者應根據實際需求選擇合適的技術進行應用。
3. SpringMVC的攔截器和過濾器的區別與聯系
首先給介紹下過濾器和攔截器的區別:
(1)攔截器是基於Java的反射機制的,而過濾器是基於函數回調。
(2)攔截器不依賴與servlet容器,過濾器依賴與servlet容器。
(3)攔截器只能對action請求起作用,而過濾器則可以對幾乎所有的請求起作用。
(4)攔截器可以訪問action上下文、值棧里的對象,而過濾器不能訪問。
(5)在action的生命周期中,攔截器可以多次被調用,而過濾器只能在容器初始化時被調用一次。
(6)攔截器可以獲取IOC容器中的各個bean,而過濾器就不行,這點很重要,在攔截器里注入一個service,
可以調用業務邏輯。
然後進行分析下:
1.過濾器是JavaEE標准,採用函數回調的方式進行。是在請求進入容器之後,還未進入Servlet之前進行預處
理,並且在請求結束返回給前端這之間進行後期處理。
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
System.out.println("before...");
chain.doFilter(request, response);
System.out.println("after...");
}
chain.doFilter(request, response);這個方法的調用作為分水嶺。事實上調用Servlet的doService()方法是在
chain.doFilter(request, response);這個方法中進行的。
2.攔截器是被包裹在過濾器之中的。
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
System.out.println("preHandle");
return true;
}
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
System.out.println("postHandle");
}
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
System.out.println("afterCompletion");
}
a.preHandle()這個方法是在過濾器的chain.doFilter(request, response)方法的前一步執行,也就是在
[System.out.println("before...")][chain.doFilter(request, response)]之間執行。
b.preHandle()方法之後,在return ModelAndView之前進行,可以操控Controller的ModelAndView內容。
c.afterCompletion()方法是在過濾器返回給前端前一步執行,也就是在[chain.doFilter(request, response)]
[System.out.println("after...")]之間執行。
3.SpringMVC的機制是由同一個Servlet來分發請求給不同的Controller,其實這一步是在Servlet的service()方法
中執行的。所以過濾器、攔截器、service()方法,dispatc()方法的執行順序應該是這樣的如下圖:
4. Java-springmvc 和struct2介紹(詳解)
Java-SpringMVC 和 Struts2 介紹(詳解)SpringMVCSpringMVC 是一個基於Java的實現了Web MVC設計模式的請求驅動類型的輕量級Web框架。它按照Model-View-Controller的設計模式將Web層進行職責解耦,把Web層進行解耦分成模型(Model)、視圖(View)和控制器(Controller)三部分。SpringMVC通過一套MVC框架,將三者進行分離,使得開發者能夠使用更加簡潔明了的方式進行Web層的開發。
核心組件:
DispatcherServlet:前端控制器,負責接收請求並分發到相應的處理器。
HandlerMapping:處理器映射器,根據請求的URL找到對應的處理器。
HandlerAdapter:處理器適配器,將處理器包裝成適配器,以便執行處理器。
ViewResolver:視圖解析器,根據邏輯視圖名解析成真正的視圖對象。
執行流程:
客戶端請求:用戶發送請求到前端控制器DispatcherServlet。
HandlerMapping:DispatcherServlet通過HandlerMapping找到處理請求的處理器(Controller)。
HandlerAdapter:DispatcherServlet通過HandlerAdapter調用處理器進行業務處理。
處理器返回ModelAndView:處理器處理完業務後,返回一個ModelAndView對象,其中包含了視圖名或視圖對象和模型數據。
ViewResolver:DispatcherServlet通過ViewResolver解析視圖名,找到真正的視圖對象,進行視圖渲染。
響應客戶端:視圖對象將渲染結果返回給客戶端。
優勢:
輕量級:SpringMVC是Spring框架的一部分,它使用了Spring的IoC容器和AOP(面向切面編程)等特性,使得開發更加簡潔。
靈活性:SpringMVC提供了豐富的配置選項和擴展點,開發者可以根據需要進行自定義。
與Spring無縫集成:SpringMVC與Spring框架無縫集成,可以使用Spring的各種特性,如事務管理、依賴注入等。
支持多種視圖技術:SpringMVC支持JSP、Velocity、Freemarker等多種視圖技術,開發者可以根據需要選擇合適的視圖技術。
Struts2 是一個基於MVC設計模式的Web應用框架,它採用了攔截器的機制來處理用戶的請求。Struts2是Struts1和WebWork技術的合並,它吸收了Struts1和WebWork兩者的優勢,成為了一個功能強大且易於擴展的Web框架。
MVC對應關系:
V(視圖):JSP+OGNL。OGNL(Object-Graph Navigation Language)是一種強大的表達式語言,用於在JSP頁面中訪問和操作對象圖中的數據。
C(控制器):Action類。Action類負責接收用戶請求、處理業務邏輯並返回結果。
M(模型):JavaBean+ModelDriven。JavaBean用於封裝業務數據,ModelDriven介面用於將用戶表單提交的數據封裝到對應的JavaBean中。
核心組件:
struts.xml:Struts2的配置文件,用於配置Action、攔截器、結果類型等。
核心過濾器StrutsPrepareAndExecuteFilter:Struts2的核心過濾器,負責攔截用戶請求並進行預處理和分發。
攔截器:Struts2提供了豐富的攔截器,用於在Action執行前後進行各種處理,如輸入驗證、許可權檢查等。
執行流程:
客戶端請求:用戶發送請求到伺服器。
核心過濾器攔截:Struts2的核心過濾器StrutsPrepareAndExecuteFilter攔截用戶請求。
預處理:核心過濾器進行預處理,如創建ActionContext和ValueStack對象,解析請求參數等。
找到Action:根據struts.xml配置文件找到對應的Action類。
執行攔截器:執行Action類之前,先執行配置的攔截器。
執行Action:執行Action類的方法,處理業務邏輯。
返回結果:Action方法處理完業務後,返回一個結果字元串,根據結果字元串找到對應的視圖進行渲染。
響應客戶端:視圖對象將渲染結果返回給客戶端。
優勢:
強大的攔截器機制:Struts2提供了豐富的攔截器,開發者可以根據需要進行自定義攔截器,實現各種功能。
易於擴展:Struts2的插件機制使得開發者可以輕松地擴展框架的功能。
支持多種視圖技術:Struts2支持JSP、Velocity、Freemarker等多種視圖技術,開發者可以根據需要選擇合適的視圖技術。
與Spring等框架集成:Struts2可以與Spring等框架進行集成,實現更加靈活和強大的功能。
綜上所述,SpringMVC和Struts2都是優秀的Java Web框架,它們各自具有獨特的特點和優勢。開發者在選擇框架時,應根據項目的具體需求和團隊的技術儲備進行選擇。