Java面試考點解析(2)-- Web開發、Spring、SprinMVC

-------------------------------   1、Web開發:Servlet 3開發技術  -------------------------------  html

一、什麼是SERVLET?前端

  Servlet就是一個運行在Web容器中的Java程序,Servlet用來接收和響應從客戶端發送過來的請求,一般使用HTTP協議。java

  Servlet是一個特殊的Java程序,一個基於Java的Web應用一般包含一個或多個Servlet類。Servlet不可以自行建立並執行,它是在Servlet容器中運行的,容器將用戶的請求傳遞給Servlet程序,並將Servlet的響應回傳給用戶。程序員

  Servlet處於服務器進程中,它經過多線程方式運行其service()方法,一個實例能夠服務於多個請求,而且其實例通常不會銷燬。web

二、SERVLET的生命週期spring

  Web容器加載Servlet並將其實例化後,Servlet生命週期開始,容器運行其init()方法進行Servlet的初始化;請求到達時調用Servlet的service()方法,service()方法會根據須要調用與請求對應的doGet或doPost等方法;當服務器關閉或項目被卸載時服務器會將Servlet實例銷燬,此時會調用Servlet的destroy()方法。編程

  • (1)用戶第一次訪問Servlet的時候,服務器會建立一個Servlet的實例,此時Servlet中init方法就會被執行。
  • (2)以後,用戶的每一次請求,服務器都會在新的線程中,來調用Servlet實例的service()方法。在service()方法內部根據請求的方式的不一樣,來調用對應的doXXX的方法.(get請求調用doGet,post請求調用doPost).
  • (3)當Servlet被服務器移除掉,或服務器被關閉時,Servlet的實例就會被銷燬,在銷燬前destroy方法就會被執行.

三、SERVLET中FORWARD和REDIRECT的區別json

  重定向(redirect):實際上是兩次request,第一次,客戶端request,A服務器響應,並response回來,告訴瀏覽器,你應該去B,而後客戶端再次向B發出請求。此時能夠看到瀏覽器地址欄中的url變了,並且歷史的回退按鈕也亮了。重定向能夠訪問本身web應用之外的資源。在重定向的過程當中,傳輸的信息會被丟失。 
  請求轉發(forward):是服務器內部把對一個request/response的處理權,移交給另一個.對於客戶端而言,它只知道本身最先請求的那個A,而不知道中間的B,甚至C、D。請求轉發過程當中,傳輸的信息不會丟失。設計模式

  請求轉發(forward)是容器中控制權的轉向,是服務器請求資源,服務器直接訪問目標地址的URL,把那個URL 的響應內容讀取過來,而後把這些內容再發給瀏覽器,瀏覽器根本不知道服務器發送的內容是從哪兒來的,因此它的地址欄中仍是原來的地址。
  重定向(redirect)就是服務器端根據邏輯,發送一個狀態碼,告訴瀏覽器從新去請求那個地址,所以從瀏覽器的地址欄中能夠看到跳轉後的連接地址,很明顯redirect沒法訪問到服務器保護起來資源,可是能夠從一個網站redirect到其餘網站。forward更加高效,因此在知足須要時儘可能使用forward(經過調用RequestDispatcher對象的forward()方法,該對象能夠經過ServletRequest對象的getRequestDispatcher()方法得到),而且這樣也有助於隱藏實際的連接;在有些狀況下,好比須要訪問一個其它服務器上的資源,則必須使用重定向(經過HttpServletResponse對象調用其sendRedirect()方法實現)。

 

四、Servlet 3中的異步處理指的是什麼? 瀏覽器

  在Servlet 3中引入了一項新的技術可讓Servlet異步處理請求。該方式很是適合那些執行時間很長,但用戶並不須要當即獲得結果的請求。

  有了異步處理的支持,Servlet 線程再也不須要一直阻塞,直到業務處理完畢才能再輸出響應,最後才結束該 Servlet 線程。在接收到請求以後,Servlet 線程能夠將耗時的操做委派給另外一個線程來完成,本身在不生成響應的狀況下返回至容器。針對業務處理較耗時的狀況,這將大大減小服務器資源的佔用,而且提升併發處理速度。

  Servlet異步處理的工做流程:

  第一步,須要把你的servlet聲明爲syncSupport,servlet3 提供了註解的方式,也可使用web.xml配置的方式。

  第二步,實現你的Servlet 的service方法。(1)調用request.startAsync()開啓異步模式,該方法將返回AsyncContext對象用於後臺線程異步處理該請求。後臺線程可以使用AsyncContext的getRequest()和getResponse()方法來讀取請求和寫Response,處理完成後調用AsyncContext.complete()結束請求處理。(2)service方法能夠退出了。(servlet 3還支持你將請求異步的dispatch到另外一個請求地址)。

    像Tomcat這樣的Servlet容器,每一個請求須要佔用它一個線程,直到該請求被處理完才釋放。對於那些處理時間長,並且大部分是IO類操做的請求,這樣作會很浪費,由於處理它們的容器線程會花很長時間進行等待,卻不能爲其餘請求服務。若是有大量這樣的請求,容器的線程就會很快被佔滿,致使其餘請求被迫等待甚至超時。
    因而Servlet3 添加了異步請求處理(asynchronous request processing)的新特性,有了它咱們就能夠把那些處理時間長的IO類請求丟給後臺線程去執行,從而能夠快速釋放容器線程用以服務更多的新請求。這樣作能夠大大提高咱們服務的性能(吞吐、時延和併發上都有改進)。下面將詳細介紹怎麼使用這個新特性。
    有人可能會質疑,既然都有多線程了,還須要異步處理請求嗎?答案是確定的,由於若是一個任務處理時間至關長,那麼Servlet或Filter會一直佔用着請求處理線程直到任務結束,隨着併發用戶的增長,容器將會遭遇線程超出的風險,這這種狀況下不少的請求將會被堆積起來然後續的請求可能會遭遇拒絕服務,直到有資源能夠處理請求爲止
  異步特性能夠幫助應用節省容器中的線程,特別適合執行時間長並且用戶不須要獲得結果的任務,若是用戶不須要獲得結果則直接將一個Runnable對象交給Executor並當即返回便可。

          推薦閱讀: Servlet3.0 新特性:新的註解支持、異步處理支持、可插拔組件支持

          推薦閱讀:異步請求:原生Servlet實現、SpringMVC實現、SpringBoot實現

 

五、Servlet中如何獲取用戶提交的查詢參數或表單數據? 

  答:能夠調用請求對象HttpServletRequest的getParameter()方法,經過參數名得到參數值。若是有包含多個值的參數(例如複選框),能夠經過請求對象的getParameterValues()方法得到。固然也能夠經過請求對象的getParameterMap()得到一個參數名和參數值的映射(Map)。

六、Servlet中如何獲取用戶配置的初始化參數以及服務器上下文參數? 
  答:能夠經過重寫Servlet接口的init(ServletConfig)方法,並經過ServletConfig對象的getInitParameter()方法來獲取Servlet的初始化參數。

    能夠經過ServletConfig對象的getServletContext()方法獲取ServletContext對象,並經過該對象的getInitParameter()方法來獲取服務器上下文參數。

    固然,ServletContext對象也可經過請求對象的getServletContext()方法來得到。

七、如何設置請求的編碼以及響應內容的類型? 
  答:(1)經過請求對象ServletRequest的 setCharacterEncoding(String)方法能夠設置請求的編碼,其實要完全解決亂碼問題就應該讓頁面、服務器、請求和響應、Java程序都使用統一的編碼,最好的選擇固然是UTF-8;

    (2)經過響應對象ServletResponse的 setContentType(String)方法能夠設置響應內容的類型,固然也能夠經過HttpServletResponsed對象的setHeader(String, String)方法來設置。

八、過濾器有哪些做用和用法? 

答:(1)做用:對Web應用來講,過濾器是一個駐留在服務器端的Web組件,它能夠截取客戶端和服務器之間的請求與響應信息,並對這些信息進行過濾。

  (2)過濾流程:當Web容器接受到一個對資源的請求時,它將判斷是否有過濾器與這個資源相關聯。若是有,那麼容器將把請求交給過濾器進行處理。在過濾器中,你能夠改變請求的內容,或者從新設置請求的報頭信息,而後再將請求發送給目標資源。當目標資源對請求做出響應時候,容器一樣會將響應先轉發給過濾器,在過濾器中你能夠對響應的內容進行轉換,而後再將響應發送到客戶端。

  (3)常見用途:對請求進行統一認證、對請求進行記錄和審覈、對請求的參數數據進行過濾或替換、轉換圖象格式、對響應內容進行壓縮以減小傳輸量、對請求或響應進行加解密處理、觸發資源訪問事件、對XML的輸出應用XSLT等。

和過濾器相關的接口主要有:Filter、FilterConfig和FilterChain。
Java Web開發中的過濾器(filter)是從Servlet 2.3規範開始增長的功能,並在Servlet 2.4規範中獲得加強

 

九、監聽器有哪些做用和用法? 
答:(1)監聽器的做用:在建立和銷燬 application、session、request對象時,或向 application、session、request對象中添加、修改、刪除屬性時,監聽器listener負責監聽以上的狀態變化,而後自動執行預約義代碼的。

  (2)監聽器分類: 

  • ServletContextListener:對Servlet上下文的建立和銷燬進行監聽。 
  • ServletContextAttributeListener:監聽Servlet上下文屬性的添加、刪除和替換。 
  • HttpSessionListener:對Session的建立和銷燬進行監聽。
  • HttpSessionAttributeListener:對Session對象中屬性的添加、刪除和替換進行監聽。 
  • ServletRequestListener:對請求對象的初始化和銷燬進行監聽。 
  • ServletRequestAttributeListener:對請求對象屬性的添加、刪除和替換進行監聽。
session的銷燬有兩種狀況:
(1)session超時;
(2)經過調用session對象的 invalidate()方法,使session失效。

 

十、web.xml文件中,能夠配置哪些內容? 
  web.xml文件,用於配置Web應用的相關信息,如:監聽器(listener)、過濾器(filter)、 Servlet、相關參數、會話超時時間、安全驗證方式、錯誤頁面等。下面是一些開發中常見的配置:

(1)配置Spring上下文加載監聽器:加載Spring配置文件並建立IoC容器

<context-param>
  <param-name>contextConfigLocation</param-name>
  <param-value>classpath:applicationContext.xml</param-value>
</context-param>
<listener>   <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> </listener>

(2)配置Spring編碼過濾器,防止中文亂碼

  <filter>
    <filter-name>characterEncodingFilter</filter-name>
    <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
  </filter>
  <filter-mapping>
    <filter-name>characterEncodingFilter</filter-name>
    <url-pattern>/*</url-pattern>
  </filter-mapping>

(3)配置SpringMVC前端控制器DispatcherServlet,匹配全部的請求

  <!-- 配置前端控制器DispatcherServlet,並匹配全部的請求 -->
  <servlet>
    <servlet-name>springMVC</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <init-param>
      <param-name>contextConfigLocation</param-name>
      <param-value>classpath:spring-mvc.xml</param-value>
    </init-param>
    <load-on-startup>1</load-on-startup>
  </servlet>
  <servlet-mapping>
    <servlet-name>springMVC</servlet-name>
    <url-pattern>/</url-pattern>
  </servlet-mapping>

(4)配置會話超時時間爲10分鐘:

<session-config>
    <session-timeout>10</session-timeout>
</session-config>

(5)配置404和Exception的錯誤頁面:

<error-page>
    <error-code>404</error-code>
    <location>/error.jsp</location>
</error-page>

<error-page>
    <exception-type>java.lang.Exception</exception-type>
    <location>/error.jsp</location>
</error-page>

 (6)配置安全認證方式:

<security-constraint>
  <web-resource-collection>
  <web-resource-name>ProtectedArea</web-resource-name>
  <url-pattern>/admin/*</url-pattern>
  <http-method>GET</http-method>
  <http-method>POST</http-method>
  </web-resource-collection>
  <auth-constraint>
  <role-name>admin</role-name>
  </auth-constraint>
</security-constraint>

<login-config>
  <auth-method>BASIC</auth-method>
</login-config>

<security-role>
  <role-name>admin</role-name>
</security-role>
補充:若是Web提供了有價值的商業信息或者是敏感數據,那麼站點的安全性就是必須考慮的問題。安全認證是實現安全性的重要手段,認證就是要解決 「Are you who you say you are?」的問題。認證的方式很是多,簡單說來能夠分爲三類: 
A. What you know? — 口令 
B. What you have? — 數字證書(U盾、密保卡) 
C. Who you are? — 指紋識別、虹膜識別 
在Tomcat中能夠經過創建安全套接字層(Secure Socket Layer, SSL)以及經過基本驗證或表單驗證來實現對安全性的支持。
說明:Servlet3 提供了基於註解的配置方式,能夠分別使用@WebServlet、@WebListener、@WebFilter註解,進行Servlet、Listener、Filter組件的配置

 

-------------------------------   2、Spring 框架 -------------------------------

一、什麼是框架?

  框架(Framework):IT語境中的框架,特指爲解決一個開放性問題而設計的具備必定約束性的支撐架構,在此結構上能夠根據具體問題擴展.安插更多的組成部分.從而更迅速和更方便的構建完整的解決問題的方案.

  框架的特色:

  • 框架自己通常不完整到能夠解決特定問題,可是能夠幫助咱們快速解決特定問題
  • 框架天生就是爲了擴展而設計的
  • 框架裏面能夠爲後續擴展的組件提供不少輔助性、支撐性的、方便易用的使用工具。框架時常配套提供一些幫助解決某類問題的庫或工具.

二、選擇使用Spring框架的緣由(Spring框架爲企業級開發帶來的好處有哪些)? 

答:

  • 非侵入式:支持基於POJO的編程模式的輕量級框架,不強制要求實現Spring框架中的接口或繼承Spring框架中的類。 
  • IoC容器(控制反轉、依賴注入)IoC容器幫助應用程序管理對象以及對象之間的依賴關係;對象之間的依賴關係若是發生了改變,只須要修改配置文件而不是修改代碼,由於代碼的修改可能意味着項目的從新構建和完整的迴歸測試。
  • AOP(面向切面編程)將全部的橫切關注功能封裝到切面(aspect)中,經過配置的方式將橫切關注功能動態添加到目標代碼上,進一步實現了業務邏輯和系統服務之間的分離。另外一方面,有了AOP程序員能夠省去不少本身寫代理類的工做。 
  • MVC支持:Spring的MVC框架是很是優秀的,爲Web表示層提供了更好的解決方案。 
  • 事務管理:Spring以寬廣的胸懷接納多種持久層技術,併爲其提供了聲明式的事務管理,在不須要一行代碼的狀況下就能完成事務管理。 
  • 其餘:選擇Spring框架的緣由還遠不止於此,Spring爲Java企業級開發提供了一站式選擇,你能夠在須要的時候使用它的部分和所有,更重要的是,你甚至能夠在感受不到Spring存在的狀況下,在你的項目中使用Spring提供的各類優秀的功能。
Spring 是輕量級的J2EE框架,Spring提供了IOC和AOP的支持,主要針對javabean的生命週期進行管理;Spring能夠單獨使用,也能夠跟其它框架組合使用。

 

三、在Web項目中如何得到Spring的IoC容器? 

WebApplicationContext ctx = WebApplicationContextUtils.getWebApplicationContext(servletContext);

 

四、介紹一下Spring的兩大核心功能

答:(1)控制反轉和依賴注入:對象建立的控制權交給Spring容器進行管理。核心原理:工廠模式+反射+配置文件

  (2)面向切面編程: 使用動態代理的方式,在方法執行先後或出現異常後作相關邏輯。咱們主要使用AOP來作: 事務處理、權限判斷、日誌記錄。

 

五、什麼是IoC和DI?DI是如何實現的? 
答:IOC也叫作控制反轉,是Inversion of Control的縮寫,DI(Dependency Injection)叫依賴注入,是對IoC更簡單的詮釋。

  控制反轉是把傳統上由程序直接操控的對象的調用權交給Spring容器,經過Spring容器來實現對象組件的裝配和管理。所謂的"控制反轉"就是對組件對象控制權的轉移,從程序代碼自己轉移到了外部容器,由容器來建立對象並管理對象之間的依賴關係。IoC體現了好萊塢原則 - "Don’t call me, we will call you"。

  依賴注入的基本原則:應用組件不該該負責查找資源或者其餘依賴的協做對象。配置對象的工做應該由容器負責,查找資源的邏輯應該從應用組件的代碼中抽取出來,交給容器來完成。DI是對IoC更準確的描述,即組件之間的依賴關係由容器在運行期決定,形象的來講,即由容器動態的將某種依賴關係注入到組件之中。

六、Spring中自動裝配的方式有哪些? 

  • no:不進行自動裝配,手動設置Bean的依賴關係。 
  • byName:根據Bean的名字進行自動裝配。 
  • byType:根據Bean的類型進行自動裝配。 
  • constructor:相似於byType,不過是應用於構造器的參數,若是有一個Bean與構造器的參數類型相同則能夠自動裝配,不然會致使錯誤。 
  • autodetect:若是有默認的構造器,則經過constructor的方式進行自動裝配,不然使用byType的方式進行自動裝配。
說明:自動裝配沒有自定義裝配方式那麼精確,並且不能自動裝配簡單屬性(基本類型、字符串等),在使用時應注意。

 七、Spring中的自動裝配有哪些限制? 

  • 若是使用了構造器注入或者setter注入,那麼將覆蓋自動裝配的依賴關係。 
  • 基本數據類型的值、字符串字面量、類字面量沒法使用自動裝配來注入。 
  • 優先考慮使用顯式的裝配來進行更精確的依賴注入,而不是使用自動裝配。

八、依賴注入時如何注入集合屬性? 
  能夠在定義Bean屬性時,經過<list> 、<set> 、 <map> 、 <props> 分別爲其注入列表、集合、映射和鍵值對(都是字符串的映射屬性)。

九、Spring IoC容器配置Bean的方式?

  • 基於XML文件進行配置。
  • 基於註解進行配置
  • 基於Java程序進行配置(Spring 3+)

十、闡述Spring框架中Bean的生命週期? 

  答:Spring框架中,一旦把一個Bean歸入Spring IOC容器之中,這個Bean的生命週期就會交由容器進行管理,通常擔當管理角色的是BeanFactory或者ApplicationContext,認識一下Bean的生命週期活動,對更好的利用它有很大的幫助。

  下面以BeanFactory爲例,說明一個Bean的生命週期活動

  1. Bean的創建, 由BeanFactory讀取Bean定義文件,並生成各個實例
  2. Setter注入,執行Bean的屬性 的 DI依賴注入
  3. BeanNameAware的setBeanName(), 若是實現該接口,則執行其setBeanName方法
  4. BeanFactoryAware的setBeanFactory(),若是實現該接口,則執行其setBeanFactory方法
  5. BeanPostProcessor的processBeforeInitialization(),若是有關聯的processor,則在Bean初始化以前都會執行這個實例的processBeforeInitialization()方法
  6. InitializingBean的afterPropertiesSet(),若是實現了該接口,則執行其afterPropertiesSet()方法
  7. Bean定義文件中定義init-method
  8. BeanPostProcessors的processAfterInitialization(),若是有關聯的processor,則在Bean初始化以前都會執行這個實例的processAfterInitialization()方法
  9. DisposableBean的destroy(),在容器關閉時,若是Bean類實現了該接口,則執行它的destroy()方法
  10. Bean定義文件中定義destroy-method,在容器關閉時,能夠在Bean定義文件中使用「destory-method」定義的方法

          推薦閱讀:Spring Bean生命週期詳解

十一、BeanFactory 和 ApplicationContext 對bean的管理上,有什麼區別?

  • BeanFactory:BeanFactory採用了工廠設計模式,負責讀取bean配置文檔,管理bean的加載,實例化,維護bean之間的依賴關係,負責bean的生命週期。 
  • ApplicationContext:提供上述BeanFactory所能提供的功能,除此以外,還提供了更完整的功能支持,如:國際化支持、aop支持、事務支持等。 
  • BeanFactory在解析配置文件時,並不會初始化對象,只有在使用getBean()時,纔會給實例化該對象。而ApplicationContext在解析配置文件時,會將全部對象都進行實例化,調用getBean()方法只是獲取對象的過程。

 十二、Spring中Bean的做用域有哪些? 

  在Spring的早期版本中,僅有兩個做用域:singleton 和 prototype。singleton單例模式下,Bean以單例存在;prototype原型模式下,每次從容器中調用Bean,都會返回一個新的實例。

  Spring 2.x中針對WebApplicationContext新增了3個做用域,分別是:

  • request(每次HTTP請求都會建立一個新的Bean)
  • session(同一個HttpSession共享同一個Bean,不一樣的HttpSession使用不一樣的Bean)
  • globalSession(同一個全局Session共享一個Bean)。
說明:單例模式和原型模式都是重要的設計模式。通常狀況下,無狀態或狀態不可變的類適合使用單例模式。
在傳統開發中,因爲DAO持有Connection這個非線程安全對象於是沒有使用單例模式;但在Spring環境下,全部DAO類對能夠採用單例模式,由於Spring利用AOP和Java API中的ThreadLocal對非線程安全的對象進行了特殊處理。

 1三、Spring中如何使用註解來配置Bean?有哪些相關的註解? 

  首先須要在Spring配置文件中增長註解自動掃描配置;而後用@Component、@Controller、@Service、@Repository註解來標註類,由Spring IoC容器來控制類對象的建立。

  以上四個註解沒有本質區別,只不過@Controller一般用於控制器、@Service一般用於業務邏輯類、@Repository一般用於持久層類(如:DAO)、@Component一般用於普通的類。

 

1四、解釋一下什麼叫AOP(面向切面編程)? 
  AOP(Aspect-Oriented Programming)指一種程序設計範型,該範型以一種稱爲切面(aspect)的語言構造爲基礎,切面是一種新的模塊化機制,用來描述分散在對象、類或方法中的橫切關注點(crosscutting concern)。

1五、你是如何理解"橫切關注"這個概念的? 
  "橫切關注"是會影響到整個應用程序的關注功能,它跟正常的業務邏輯是正交的,沒有必然的聯繫,可是幾乎全部的業務邏輯都會涉及到這些關注功能。一般,事務、日誌、安全性等關注就是應用中的橫切關注功能。

1六、你如何理解AOP中的鏈接點(Joinpoint)、切點(Pointcut)、加強(Advice)、引介(Introduction)、織入(Weaving)、切面(Aspect)這些概念? 

  • a. 鏈接點(Joinpoint):程序執行的某個特定位置(如:某個方法調用前、調用後,方法拋出異常後)。一個類或一段程序代碼擁有一些具備邊界性質的特定點,這些代碼中的特定點就是鏈接點。Spring僅支持方法的鏈接點。 
  • b. 切點(Pointcut):若是鏈接點至關於數據中的記錄,那麼切點至關於查詢條件,一個切點能夠匹配多個鏈接點。Spring AOP的規則解析引擎負責解析切點所設定的查詢條件,找到對應的鏈接點。 
  • c. 加強(Advice):加強是織入到目標類鏈接點上的一段程序代碼。Spring提供的加強接口都是帶方位名的,如:BeforeAdvice、AfterReturningAdvice、ThrowsAdvice等。不少資料上將加強譯爲「通知」,這明顯是個詞不達意的翻譯,讓不少程序員困惑了許久。
  • d. 引介(Introduction):引介是一種特殊的加強,它爲類添加一些屬性和方法。這樣,即便一個業務類本來沒有實現某個接口,經過引介功能,能夠動態的未該業務類添加接口的實現邏輯,讓業務類成爲這個接口的實現類。 
  • e. 織入(Weaving):織入是將加強添加到目標類具體鏈接點上的過程,AOP有三種織入方式:①編譯期織入:須要特殊的Java編譯期(例如AspectJ的ajc);②裝載期織入:要求使用特殊的類加載器,在裝載類的時候對類進行加強;③運行時織入:在運行時爲目標類生成代理實現加強。Spring採用了動態代理的方式實現了運行時織入,而AspectJ採用了編譯期織入和裝載期織入的方式。 
  • f. 切面(Aspect):切面是由切點和加強(引介)組成的,它包括了對橫切關注功能的定義,也包括了對鏈接點的定義。
  說明: Advice在國內的不少書面資料中都被翻譯成"通知",可是很顯然這個翻譯沒法表達其本質,有少許的讀物上將這個詞翻譯爲"加強",這個翻譯是對Advice較爲準確的詮釋,咱們經過AOP將橫切關注功能加到原有的業務邏輯上,這就是對原有業務邏輯的一種加強,這種加強能夠是前置加強、後置加強、返回後加強、拋異常時加強和包圍型加強。

 

-------------------------------   3、SpringMVC 框架 -------------------------------

一、什麼是MVC模式?

  MVC全名是model view Controller,是模型(model)—視圖(view)—控制器(Controller)的縮寫,是一種軟件設計典範. 
  最簡單的實現,就是:jsp(view) + servlet(Controller) + javabean(model) 

二、說一下對MVC框架的理解

  經常使用的MVC框架有Struts二、SpringMVC,是爲了解決傳統的MVC模式(jsp+servlet+javabean)問題而出現的框架.
  傳統MVC模式存在如下四種問題:

  • 1.全部的servlet和servlet映射,都要配置在web.xml中,若是項目太大,web.xml就太龐大,而且不能實現模塊化管理. 
  • 2.Servlet的主要功能就是接受參數,調用邏輯,跳轉頁面,好比像其餘字符編碼,文件上傳等功能也要寫在servlet中,不能讓servlet功能單一. 
  • 3.接受參數比較麻煩,不能經過model接收,只能單個接收,接收完成後轉換封裝進model. 
  • 4.跳轉頁面方式比較單一(forward,redirect),而且當頁面名稱發生變化時,須要修改servlet源代碼. 

三、SpringMVC的執行流程

  • 1.用戶發送請求,被前端控制器(DispatcherServlet)捕獲(捕獲請求) 
  • 2.前端控制器進行解析,獲得URI,經過URI調用HandlerMapping並得到該Handler配置的全部相關對象(查找Handler) 
  • 3.前端控制器根據獲得的Handler,選擇合適的HandlerAdapter,提取Request中的模型數據,填入Handler入參,開始執行Handler,最後返回一個ModelAndView對象.(執行Handler) 
  • 4.前端控制器根據返回的ModelAndViewm,選擇合適的ViewResolver(選擇ViewResolver) 
  • 5.經過ViewResolver結合Model和View來渲染視圖,前端控制器將渲染結果返回給客戶端(渲染並返回)

四、SpringMVC和Struts2有什麼不一樣?

  SpringMVC 和 Struts2有如下六點不一樣,以下:

  • 核心控制器:springmvc是servlet,struts2是filter
  • 控制器實例模式:springmvc是單例,strust2是多例。springmvc是基於方法設計,springmvc只有一個實例,每次請求執行對應的方法便可;而struts是基於對象,每發一次請求都會實例一個action對象。因此,理論上,springmvc會比struts2要快。
  • 參數傳遞方式:springmvc經過方法參數,來接收請求參數;而struts2中自身提供多種參數接收,經過valuestack進行傳遞和賦值。
  • interceptor實現機制:springmvc採用獨立的aop方式實現;struts2有本身的interceptor機制。
  • 異步請求實現方式:Springmvc在方法中使用註解@ResponseBody,自動將數據轉成json數據;而struts2是經過插件的方式實現。
  • 框架集成方式:springmvc是spring的一個模塊,因此spring對於springmvc的控制管理更加簡單方便;而struts須要使用xml配置來管理。
相關文章
相關標籤/搜索