SpringMVC = 基礎面試題

(1) 什麼是SpringMVC 作用是什麼?

一,首先是一個MVC框架。

在web模型中,MVC是一種很流行的框架,通過把Model,View,Controller分離,把較爲複雜的web應用分成邏輯清晰的幾部分,是爲了簡化開發,減少出錯。還是爲了組內開發人員之間的配合。總之就是一種分層工作的辦法。

二,springMVC,是spring的一個子框架,當然擁有spring的特性,如依賴注入。

Spring下的子項目:Spring Web MVC是一種基於Java的實現了Web MVC設計模式的請求驅動類型的輕量級Web框架,即使用了MVC架構模式的思想,將web層進行職責解耦,基於請求驅動指的就是使用請求-響應模型,框架的目的就是幫助我們簡化開發,Spring Web MVC也是要簡化我們日常Web開發的。

它用在基於MVC的表現層開發,類似於struts2框架

SpringMVC是一種Web層mvc框架,用於替代servlet,主要用於處理和響應請求,獲取表單參數,表單校驗等。

(2)爲什麼要用SpringMVC“”

SpringMVC框架的作用就是用來簡化編程的,相對於servlet來說,獲取表單參數,響應請求等變得更簡單了

(3)說一說SpringMVC底層執行流程(工作原理)?

(4)說說SpringMVC中常用註解有哪些?分別什麼作用?

@Controller
標識這個類是一個控制器

@RequestMapping
給控制器方法綁定一個uri

@ResponseBody
將Java對象轉成Json,並且發送給客戶端

@RequestBody
將客戶端請求過來的Json轉成Java對象

@RequestParam
當表單參數和方法形參名字不一致時,做一個名字映射

@PathVarible
用於獲取uri中的參數,比如user/1中1的值

RESTful 風格的新API:

@RestController
@Controller+ @ResponseBody
@GetMapping
@DeleteMapping
@PostMapping
@PutMapping

其他註解

@SessionAttribute
聲明將什麼模型數據存入session

@CookieValue
獲取cookie值

@ModelAttribute
將方法返回值存入model中

@HeaderValue
獲取請求頭中的值

(5)SpringMVC和Strus2的區別?

(1)入口不同
SpringMVC入口是servlet,Struts2入口是filter。

(2)生命週期不同
SpringMVC Controller是單例的,所以效率更高,但是不能使用成員變量獲取參數。
Struts2 Action是多例的,可以使用成員變量獲取參數,導致效率比較低。

(6)如何在SpringMVC實現RESTful 服務?

(1)導入jackson2包
(2)開啓註解驅動<mvc:annotation-driven/>
(3)Json交互=@RequestBody @ResponseBody

(7)什麼是攔截器?有什麼用?SpringMVC如何定義攔截器?

攔截器類似於filter的一個對象,用於預處理以及後處理處理器(控制器)。

新建一個class,實現HandlerInterceptor接口,重寫三個方法preHandler、postHandler、afterCompletion,最後在springmvc.xml中配置攔截器。

 

(8)SpringMVC中如何做表單數據校驗?

(1)springmvc.xml中配置一個validator
(2)<mvc:annotation-driven validator="validator"/>;
(3)給Entity添加校驗規則
@NotEmpty
@Length
...
(4)用BindingResult 緊接着entity之後來接收錯誤信息

(9)說說自己對於 Spring MVC 瞭解?

談到這個問題,我們不得不提提之前 Model1 和 Model2 這兩個沒有 Spring MVC 的時代。

Model1 時代 : 很多學 Java 後端比較晚的朋友可能並沒有接觸過 Model1 模式下的 JavaWeb 應用開發。在 Model1 模式下,整個 Web 應用幾乎全部用 JSP 頁面組成,只用少量的 JavaBean 來處理數據庫連接、訪問等操作。這個模式下 JSP 即是控制層又是表現層。顯而易見,這種模式存在很多問題。比如:
(1)將控制邏輯和表現邏輯混雜在一起,導致代碼重用率極低;
(2)前端和後端相互依賴,難以進行測試並且開發效率極低;

Model2 時代 :學過 Servlet 並做過相關 Demo 的朋友應該瞭解“Java Bean(Model)+ JSP(View)+Servlet(Controller) ”這種開發模式,這就是早期的 JavaWeb MVC 開發模式。Model是系統涉及的數據,也就是 dao 和 bean。View展示模型中的數據,只是用來展示。Controller用來處理用戶請求都發送給 ,返回數據給 JSP 並展示給用戶。

Model2 模式下還存在很多問題,Model2的抽象和封裝程度還遠遠不夠,使用Model2進行開發時不可避免地會重複造輪子,這就大大降低了程序的可維護性和複用性。於是很多JavaWeb開發相關的 MVC 框架營運而生,比如Struts2,但是 Struts2 比較笨重。隨着 Spring 輕量級開發框架的流行,Spring 生態圈出現了 Spring MVC 框架, Spring MVC 是當前最優秀的 MVC 框架。相比於 Struts2 , Spring MVC 使用更加簡單和方便,開發效率更高,並且 Spring MVC 運行速度更快。

MVC 是一種設計模式,Spring MVC 是一款很優秀的 MVC 框架。Spring MVC 可以幫助我們進行更簡潔的Web層的開發,並且它天生與 Spring 框架集成。Spring MVC 下我們一般把後端項目分爲 Service層(處理業務)、Dao層(數據庫操作)、Entity層(實體類)、Controller層(控制層,返回數據給前臺頁面)。

Spring MVC 的簡單原理圖如下:

 

(10)SpringMVC 工作原理了解嗎?

原理如下圖所示:

SpringMVC運行原理

Spring MVC 的入口函數也就是前端控制器 DispatcherServlet 的作用是接收請求,響應結果。

流程說明(重要):

(1)客戶端(瀏覽器)發送請求,直接請求到 DispatcherServlet。

(2)DispatcherServlet 根據請求信息調用 HandlerMapping,解析請求對應的 Handler。

(3)解析到對應的 Handler(也就是我們平常說的 Controller 控制器)後,開始由 HandlerAdapter 適配器處理。

(4)HandlerAdapter 會根據 Handler來調用真正的處理器開處理請求,並處理相應的業務邏輯。

(5)處理器處理完業務後,會返回一個 ModelAndView 對象,Model 是返回的數據對象,View 是個邏輯上的 View。

(6)ViewResolver 會根據邏輯 View 查找實際的 View。

(7)DispaterServlet 把返回的 Model 傳給 View(視圖渲染)。

(8)把 View 返回給請求者(瀏覽器)

 

 

(11)什麼是Servlet

servlet是一個Java編寫的程序,此程序是基於http協議的,在服務器端(如Tomcat)運行的,是按照servlet規範編寫的一個Java類。
客戶端發送請求至服務器端,服務器端將請求發送至servlet,servlet生成響應內容並將其傳給服務器
即,我們在瀏覽器點擊鏈接和按鈕產生的消息不是發送給servlet的,而是發送給web容器(如Tomcat、jetty)的,web容器接受消息後不知道怎麼處理,轉交給我們編寫的servlet處理,那麼web容器怎麼和servlet交流呢,於是就有了servlet接口(因爲接口是定義一種規範的良好表達形式)。我們只需要編寫Java類符合servlet規範,那麼就能被web容器識別,並被容器管理。
Servlet = Server + Applet

 

(12)servlet的作用:

處理客戶端的請求並將其結果發送到客戶端

 

(13)servlet的生命週期

servlet的生命週期由servlet容器來控制,分爲三個階段:

初始化階段:

1、servlet容器加載servlet類,把servlet類的.class文件中的數據讀到內存中。
2、servlet容器創建一個servletConfig對象。servletConfig對象包含了servlet的初始化配置信息。
3、servlet容器創建一個servlet對象。
4、servlet容器調用servlet對象的init方法進行初始化。

運行階段:

1、servlet容器接收到一個請求時,servlet容器會針對這個請求創建servletRequest和servletResponse對象。
2、然後調用service方法。並將這兩個參數傳遞給service方法。service方法通過servletRequest對象獲得請求的信息。並處理該請求。
3、再通過servletResponse對象生成這個請求的響應結果。然後銷燬servletRequest和servletResponse對象。不管這個請求時post提交的還是get提交的,這一種這個請求都會由service方法來處理。
銷燬階段:
當web應用被終止時,servlet容器會先調用servlet對象的destroy方法,然後在銷燬servlet對象,同時也會銷燬與servlet對象相關聯的servletConfig對象。我們可以在destroy方法的實現中,釋放servlet所佔用的資源,如關閉數據庫連接,關閉文件輸入輸出流等。

 

(14)servlet怎麼處理一個請求?

當用戶從瀏覽器向服務器發起一個請求,通常會包含如下信息:http://hostname: port /contextpath/servletpath,hostname 和 port 是用來與服務器建立 TCP 連接,而後面的 URL 纔是用來選擇服務器中那個子容器服務用戶的請求。那服務器是如何根據這個 URL 來達到正確的 Servlet 容器中的呢?
Tomcat中這件事很容易解決,因爲這種映射工作有專門的一個類來完成,這個類保存了Tomcat的container容器中所有子容器的信息。當 Request 進入 Container 容器之前,它要訪問那個子容器這時就已經確定了。
當用戶發送一個請求到某個servlet的時候,servlet容器會創建一個servletRequest和servletResponse對象。在servletRequest對象中封裝了用戶的請求信息,然後servlet容器把servletRequest和servletResponse對象傳遞給用戶所請求的servlet,servlet把處理好的結果卸載servletResponse中,然後servlet容器把響應結果傳給用戶。

 

(15)servlet和jsp的區別

1、jsp經編譯後就是servlet。
2、jsp更擅長頁面表現,servlet更擅長邏輯編輯
3、jsp位於MVC設計模式的視圖層,而servlet位於控制層

(16)servlet裏的過濾器

過濾器的作用

1、任何系統或網站都要判斷用戶是否登錄。
2、網絡聊天系統或論壇,功能是過濾非法文字
3、統一解決編碼

怎麼創建一個過濾器:

1、生成一個普通的class類,實現Filter藉口(javax.servlet.Filter)
2、重寫接口裏面的三個方法:init,doFilter和destroy
3、然後在web.xml配置過濾器

servlet中的監聽器

對Request的監聽,對session的監聽,對application的監聽

 

(17)SpringMVC如何有效的防止XSS注入?

SpringMVC如何有效的防止XSS注入?

答案如下:

首先明確xss的解決方式是輸入過濾,輸出編碼。SpringMVC Web程序通過控制器獲取參數,在view層輸出。在view層解決的話,基本的方法是html實體編碼,編碼特殊字符如()<>/,例如> 編成> <編成< 這樣顯示起來沒有問題,也不會導致用戶輸入的js語句被插入到輸出頁面而被執行,即所謂的xss。

向頁面輸出request接收的內容時,轉義"<"和">","("和")"即可。js腳本沒有小括號,則無法在html中調用,沒有尖括號,則無法在頁面中插入<script>標籤。

需要注意一點:springmvc註解@RequestParam不是通過HttpServletRequest.java的getParameter(String name)方法得到的參數值,而是通過getParameterValues得到的,所以,新增一個XSSHttpServletRequestWrapper來重寫request對象的getParameter方法,過濾參數中的容易引起xss漏洞的字符,但實際並不起作用呢

 

(18)是否需要在類路徑中使用spring-mvc.jar,或者是spring-core的一部分?

spring-mvc.jar不是spring-core的一部分,如果要在Java項目中使用Spring MVC框架,則必須在應用程序的類路徑中包含spring-mvc.jar。在Java Web應用程序中,spring-mvc.jar通常放在/ WEB-INF / lib文件夾中。

 

(19)什麼是DispatcherServlet以及它用於什麼?

DispatcherServlet是Front Controller設計模式的一個實現,它處理對Spring MVC應用程序的所有傳入Web請求。前端控制器模式是Web應用程序中的常見模式,其作用是接收所有請求並將其路由到應用程序的不同組件以進行實際處理。

在Spring MVC的情況下,DispatcherServlet將Web請求路由到Spring MVC控制器。

在Spring MVC中,DispatcherServlet用於查找正確的Controler以處理請求,它在處理程序映射的幫助下執行,例如@RequestMapping註解。

它還負責將邏輯視圖名稱委派給ViewResolver,然後將呈現的響應發送到客戶端。

 

(20)DispatcherServlet如何通過應用程序上下文實例化?

DispatcherServlet由Tomcat或Jetty等Servlet容器實例化。必須將DispatcherServlet定義到web.xml文件中,如下所示。

可以看到load-on-startup標記爲1,當Spring MVC應用程序部署到Tomcat或任何其他Servlet容器時,將實例化DispatcherServlet。在實例化期間,它會查找文件servlet-name-context.xml,然後初始化此文件中定義的bean。

 

(21)Spring MVC中的root應用程序上下文是什麼?怎麼裝載的?

在Spring MVC中,使用ContextLoaderListener加載的上下文稱爲“root”應用程序上下文,它屬於整個應用程序,而使用DispatcherServlet初始化的應用程序上下文實際上是特定於該servlet。

從技術上講,Spring MVC允許在Spring MVC Web應用程序中使用多個DispatcherServlet ,因此可能存在多個這樣的上下文,每個上下文都針對相應的servlet,但是具有相同的根上下文。

(22)@Controller註釋的用途?如何在沒有註釋的情況下創建控制器?

@Controller是用來定義Controller的Spring MVC註釋,但實際上它只是一個原型註釋。甚至可以在沒有@Controller的情況下通過使用@Component註釋Spring MVC控制器類來創建控制器。請求映射到處理程序方法的實際工作是使用@RequestMapping註釋來完成的

(23)什麼是ContextLoaderListener,它的作用是什麼?

ContextLoaderListener是一個監聽器,這有助於引導Spring MVC的。顧名思義它加載並創建ApplicationContext,因此不必編寫顯式代碼來創建它。應用程序上下文是Spring bean離開的地方。對於Web應用程序,有一個名爲WebAppliationContext的子類。

ContextLoaderListener還將ApplicationContext的生命週期與ServletContext的生命週期聯繫起來。可以使用getServletContext()方法從WebApplicationContext獲取ServletContext。

ContextLoaderListener是在web.xml中配置爲監聽器的,可以將它放在一個標記中,如下所示:

 

(24)傳入請求如何映射到控制器和方法?

有時也會問這個問題DispatcherServlet如何知道哪個Controller應該處理請求?

Spring使用處理程序映射將控制器與請求相關聯,兩個常用的處理程序映射是BeanNameUrlHandlerMapping和SimpleUrlHandlerMapping。

在BeanNameUrlHandlerMapping中,當請求url與bean的名稱匹配時,bean定義中的類是將處理請求的控制器。

另一方面,在SimpleUrlHandlerMapping中,映射更明確。可以指定URL的數量,並且每個URL可以與控制器顯式關聯。

順便說一句,如果你使用註釋來配置Spring MVC,那麼應該使用@RequestMapping註釋將傳入請求映射到控制器和處理程序方法。

還可以通過URI路徑,查詢參數,請求的HTTP方法以及請求中存在的HTTP標頭配置@RequestMapping批註。

 

(25)@RequestParam用於什麼?

@RequestParam是一個Spring MVC註釋,其被用於提取從URL中控制器的處理程序方法請求參數或查詢參數,如下所示:

@RequestParam註釋也支持數據類型轉換,例如這裏可以看到一個String被自動轉換爲long,但它也可能導致一個異常,如果查詢參數不存在或類型不匹配的情況下 還可以使用requried = false使參數成爲可選參數,例如@RequestParam(value ="id",required = false)

 

(26)控制器方法的一些有效返回類型是什麼?


Spring MVC中的控制器方法有許多可用的返回類型,這些方法由控制器內部的@RequestMapping註釋。其中一些流行的是:

(1)String
(2)void
(3)View
(4)ModelAndView (Class)
(5)Model (Interface)
(6)Map
(7)HttpEntity<?> or ResponseEntity<?>
(8)HttpHeaders

每種返回類型都有其特定用途。例如,如果使用的是String,則表示Controller只返回View Name,此視圖名稱將由ViewResolver解析。

如果不想返回任何視圖名稱,請提回返回類型void。如果要設置視圖名稱以及想要發送一些對象,請使用ModelAndView作爲返回類型。

 

(27)什麼是模型?

Model再次是封裝數據或輸出以進行渲染的引用。始終創建模型並將其傳遞給Spring MVC中的視圖。如果映射的控制器方法將Model作爲方法參數,則Spring框架會自動將模型實例注入該方法。

注入模型上設置的任何屬性都將保留並傳遞給View。以下是在Spring MVC中使用Model的示例:

(28)InternalResourceViewResolver有什麼作用?

在Spring MVC中,ViewResolveer返回View以處理基於邏輯視圖名稱(由控制器提供)和語言環境輸出呈現。這種方式控制器沒有耦合到特定的視圖技術,例如JSP或FreeMarker,它只返回邏輯視圖名稱。

InternalResourceViewResolver是在Spring MVC和DispatcherServlet中配置的默認View解析器用它來找到正確的視圖。InternalResourceViewResolver用於呈現JSP(JstlView)。

它將前綴和後綴配置爲邏輯視圖名稱,然後生成特定JSP的路徑,如下所示:

    <bean class = "org.springframework.web.servlet.view.InternalResourceViewResolver"> 
    <property name = "prefix" value = "/WEB-INF/" /> 
    <property name = "suffix" value = ".jsp" /> 
    </bean >

因此,如果Controller返回"hello"作爲邏輯視圖名稱,則InternalViewResolver將返回/WEB-INF/hello。

 

學習資源:

https://javadoop.com/

http://www.springmvc.cn/archives/54.html

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章