天天看點

花了20天的時間給粉絲整理的一套“最全“的Java求職筆記(四)1為什麼寫這套Java求職筆記2一套Spring.Spring mvc知識大綱技術圖3spring spring mvc面試必知必會4結束語5個人說明

前言:前幾天有粉絲問我,網上java面試題總是參差不齊,希望我為他整理一套全面的java面試題,并且這套java面試題有個要求,必須能夠讓他20天就能看完這些面試題,他說現在很多面試題我看都得看3個月才能看完,然後我才能去找工作,但是自己得時間有限是以想讓我幫他總結一套萬能面試java求職筆記。接下來我将會至少分為12個章節進行闡述這套Java求職筆記,感興趣的可以堅持看完!覺得不錯的可以點個贊。

1為什麼寫這套Java求職筆記

很早的時候我就想寫一些Java求職方向的一些文章,由于很長時間耽擱了加上,有粉絲背景問我,可不可以幫他總結一些java求職筆記,他看了很多Java技術有很多技術,很迷茫不知道學哪些,我笑着說,不要着急,無論你到什麼時候你都會迷茫,因為技術一直在更新,謝謝你信任我,解救你的迷茫唯一辦法就是多看LRyab部落格,就是這樣我帶着粉絲的問題,開始編寫了這套Java求職筆記,看完這套求職筆記,我相信很多人都會找到屬于自己的心儀工作。

2一套Spring.Spring mvc知識大綱技術圖

思來想去,本來不想放這套思維大綱技術圖,但是很多大佬都喜歡放思維導圖,那麼我也放一張思維大腦圖,友善大家以後學習,在java求職的時候可以帶上這張腦圖。

花了20天的時間給粉絲整理的一套“最全“的Java求職筆記(四)1為什麼寫這套Java求職筆記2一套Spring.Spring mvc知識大綱技術圖3spring spring mvc面試必知必會4結束語5個人說明

3spring spring mvc面試必知必會

3.1Spring 闆塊

  • ✅ 聊聊傳統的MVC架構和基于RESTful架構前後端分離的開發架構

傳統的java開發,我們使用常用的一處架構是SSM(spring+springmvc+mybatis),簡化了我們的開發過程,讓程式員更加專注于業務邏輯而非其他細節。

RESTful架構前後端分離:從浏覽器發送AJAX請求,然後服務端接受該請求并傳回JSON資料傳回給浏覽器,最後在浏覽器中進行界面渲染。而這個模型正是REST(表述性狀态轉移),這種輕量級的Web服務我們把它稱之為RESTful Web Services服務(REST服務)。 REST服務能夠使得前後端分離,而spring mvc恰恰可以提供REST服務接口.

  • ✅SSM架構說明?

spring:提供IOC/AOP核心功能。實作了低耦合和高内聚的特點,讓java開發者更加關注與業務邏輯的實作。 spring最強大的地方在于它能夠與其他主流架構整合以減輕程式員的開發負擔。 ORM:目前使用最多的O/R mapping架構,一個是Mybatis(IBATIS), 另一個是Hibernate

Controller:對服務端的MVC架構,使用最多的是Structs2以及SpringMVC.

  • ✅ 談一下對spring 架構的了解

spring是一款輕量型架構,将代碼解耦合開發,spring對Java分層管理,提升了代碼的可閱讀性,spring還對多種架構進行內建,完成對應的一站式服務。

spring提供控制反轉功能:即springIOC就是将對象的建立權交給spring管理,我們無需對建立對象,這樣可以提升對應效率,節約了建立對象的時間。

springAOP:是指面向切面程式設計,面向切面,是spring提供的對事物的服務,而spring提供了兩種事務,一種是響應式事務,另外一種是程式設計式事務,springAOP将響應式事務直接內建到對應的應用程式中。

springtransactional是spring提供的事務:它有兩種,一種是響應式事務,另外一種是程式設計式事務,使用AOP與事務結合,完成對應的事務的管理。

  • ✅ spring架構的優缺點是什麼?

優點: 1友善解耦,簡化開發

2AOP程式設計的支援

3聲明式事務的支援

4友善程式的測試

5友善內建各種優秀架構

缺點:

1Spring明明一個很輕量級的架構,卻給人感覺大而全,内容太龐大。

2Spring依賴反射,反射影響性能

3使用門檻升高,入門Spring需要較長時間

  • ✅Spring架構的核心?

IOC和AOP子產品。

通過IOC容器管理POJO或JavaBean對象,以及它們之間的耦合關系;

通過AOP以動态非入侵的方式增強服務。

  • ✅Spring 架構到底有哪些好處?

答:spring是現在的主流架構,他對其他持久層架構有很好的支援,比如說ORM架構,日志架構都有很好的支援。支援對應的DI注入,完成對應的參數傳遞。Spring是一種輕量型架構,使用起來比較友善。spring有很好的對事務進行支援。提供了比較好的異常處理機制。提供了對web的支援springmvc。使用面向切面思想,将代碼分離。

  • ✅什麼是Spring IOC?

控制反轉主要是把傳統上的程式直接向記憶體中申請空間建立對象的這個控制權轉移到了外部工廠,通過工廠來對這些建立好的對象進行裝配和管理。外部工廠即我們常說的IOC容器,spring IOC負責建立對象,管理對象(依賴注入,裝配對象Autowride)并管理這些對象的整個生命周期。

  • ✅IOC 有什麼作用?

管理對象的建立和依賴關系的維護。解耦降低了依賴,由容器去維護具體的對象的建立。

bean對象生命周期管理。

  • ✅spring IOC支援哪些功能 依賴注入

依賴檢查

自動裝配

支援集合

  • ✅什麼是Spring的依賴注入?

答:依賴關系的維護又稱為依賴注入,這種關系交給spring來管理,當我們在類中要用到其它的類對象,都由spring來提供,我們隻需要在配置檔案中說明即可,依賴注入也是IOC控制反轉的一種實作。

  • ✅依賴注入有哪幾種實作方式?

答:依賴注入是時下最流行的IOC控制反轉的一種實作,實作方式有接口注入,構造器注入,setter方法注入。其中由于接口注入的靈活性太差,于是與spring4被廢棄。構造器依賴注入:構造器依賴注入通過容器觸發一個類的構造器來實作的,該類有一系列參數,每個參數代表一個對其他類的依賴。

Setter方法注入:Setter方法注入是容器通過調用無參構造器或無參static工廠 方法執行個體化bean之後,調用該bean的setter方法,即實作了基于setter的依賴注入

  • ✅Spring中支援的幾種bean的作用域?

spring的bean的作用範圍有5個:

singleton:預設單例,每個容器中隻能有一個bean的執行個體,單例模式由BeanFactory自身來維護。

prototype:多例,為每一個bean建立一個執行個體,容器中可以存在多個執行個體。

request:為每一個網絡請求建立一個執行個體,當請求完成後,bean随之被GC回收。

session:于request類似,每一個session會話有一個bean執行個體,當會話結束,bean随之失效。

global-session:全局的session,通常用于叢集伺服器使用,用于建立叢集伺服器的會話,多台伺服器可以共享session域,當隻有一台時,建立的就是session會話。

注意: 預設的Spring bean 的作用域是Singleton。使用 prototype 作用域需要慎重的思考,因為頻繁建立和銷毀 bean 會帶來很大的性能開銷。

  • ✅Spring 類的bean定義如何設定?

基于XML配置可以在bean标簽内配置scope如果spring需要bean的時候每次建立一個新的bean執行個體,這個時候應該使用多例,即scope = “prototype”。

使用一個bean對象,每次傳回的是同一個bean對象,則scope = “singleton”。基于注解開發同樣有scope屬性支援配置。

  • ✅聊聊spring bean

spring Bean是收到spring管理的bean對象,具體來說是被spring容器初始化,配置和管理的對象。spring Bean是再spring配置檔案中定義的,現在也可以通過注解來定義,在spring容器初始化,

注入到spring應用程式中。

spring bean在spring中以單例存在,而struts2中的Action屬于多例的

一個spring Bean的定義包含容器所必知道的配置中繼資料,包括如何建立一個bean,它的生命周期和它的依賴。

  • ✅springBean的生命周期

執行個體化bean對象,完成對應的對象的初始化。

使用構造方法指派到對應的bean的對象中。

進一步初始化對象,完成對應的方法調用

伺服器關閉銷毀對應的bean對象。

  • ✅Spring架構中的單例bean是線程安全的嗎?

spring架構并沒有對單例bean進行任何的多線程封裝處理。關于單例模式下的線程安全和并發問題需要程式員自己來解決,但是對于service和dao層,通常并不需要多個執行個體,即沒有可變狀态,是以預設情況下時我們說單例時線程安全的。如果你的bean有可變狀态,如Model View對象,就需要自行保證線程的安全,最直接的方法就是修改bean的作用域scope從singleton改為prototype。

  • ✅Spring是如何處理多線程并發問題?

有狀态bean就是有資料存儲功能,無狀态的bean就是不會儲存資料

多線程并發問題的根本在于相同的變量通路沖突問題。那麼spring中既有無狀态的bean又有有狀态的bean,spring中可以将絕大部分的bean對象聲明為singleton。是以絕大多數spring bean在多線程中是可以共享,因為它們不會導緻通路的沖突情況。但是還有一些有狀态的bean 為什麼可以在多線程中共享,spring 又是如何處理的呢? 如(RequestContextHolder、TransactionSynchronizationManager、LocaleContextHolder等),在spring 源碼中他們使用了多線程并發中的ThreadLocal模式進行處理,讓它們也成為線程安全的狀态,是以有狀态的bean就可以在多線程中共享了。

ThreadLocal是一種什麼模式呢?

ThreadLocal 和 線程同步機制都是為了解決相同的變量通路沖突問題。

線程同步機制中的處理是通過加入對象鎖處理,而ThreadLocal會為每個線程提供一個獨立的變量副本,進而隔離了多線程資料的沖突通路,

因為每個變量都有了自己的副本了,也就沒必要對該變量進行資料同步了。ThreadLocal提供線程安全的共享對象,編寫代碼時,

可以把哪些不安全的變量封裝進ThreadLocal。

概括來說:

同步機制提供的是一種時間換空間的機制,多個線程隻提供一個變量,讓不同線程進行排隊,避免了沖突的發生。

ThreadLocal采用的是一種空間換時間的方式,為每個線程都提供一個變量,是以可以同時通路而互不影響。

  • ✅spring的常用注解

答:spring注解配置可以替換XML的配置,可以大大減少XML配置的代碼量。

@Configuration:表示這是一個配置類,可以用來為IOC容器注入bean

@Bean:一般使用在配置類中,用于方法上面,将方法的傳回值注入到IOC容器中

@Component, @Controller, @Repository, @Service 有何差別?

@Component:在類上加載此注解,可以将Java類标記bean,由spring來管理它。spring的元件掃描機制可以可以将其拾取并注入到應用程式環境中(IOC容器)。

@Controller,@Repository,@Service服務于web三層架構,分别是springMVC層,持久層,業務層,功能和@Component一樣,為什麼有這三個注解,因為它們更好的指明了使用意圖。

  • ✅@Autowired 注解有什麼作用

@Autowired是預設按照類型注入的,預設情況下它要求依賴必須存在,當然可以設定屬性required為false,它的用法和required類似,可以作用域,屬性,方法構造器或具有任意名稱或任意參數的方法。

  • ✅@RequestMapping 注解有什麼用?

@RequestMapping用于接收HTTP請求,并将請求發送到相應的控制器類/方法上。作用位置有:

類:映射請求的URL父級目錄

方法:映射URL和HTTP請求方法

  • ✅@Autowired和@Resource之間的差別

@Autowired:是預設按照類型注入的,預設情況下它要求依賴必須存在,當然可以設定屬性required為false。

@Resource:預設是按照名稱注入的,如果找不到名稱比對的bean,才會按照類型注入。

  • ✅使用@Autowired注解自動裝配的過程是怎樣的?

當啟動spring的IOC容器後,容器自動裝載了一個AutowiredAnnotationBeanPostProcessor後置處理器,當容器掃描到@Autowired,@Resources,@Inject時,就會在IOC容器中查詢需要的bean,并裝配給該對象的屬性。在使用@Autowired會在容器中尋找對應類型的bean:由于容器類似一個一個Map結構,存儲着key-value,查詢機制是先從value上面找如果找到一個,則就将bean裝配給@Autowired指定的資料,如果找到兩個,那麼就從key值上面再找,找到則裝配,如果查詢結果為空,則會抛出異常。解決方法,可以設定@Autowired的required的屬性為false。

  • ✅怎樣開啟注解裝配?

注解裝配預設情況下是不開啟的,如若開啟,spring的XML檔案中配置:

<context:annnotation-config/>

  • ✅聊聊spring 資料通路?

JdbcTemplate是一個封裝了JDBC規範的工具類,并且提供了很多周遊的方法,如執行寫好或者可調用的SQL語句,提供把資料庫的資料封裝成基本資料類型或對象,提供自定義的資料錯誤處理。

  • ✅Spring架構的事務管理有哪些優點?

為不同的事務API,如JTA,JDBC,HIbernate,JPA等提供一種不變的程式設計模式 為程式設計式事務管理提供一套簡單的API而不是複雜的事務API

支援聲明式事務管理

和spring各種資料通路抽象層很好的內建。

  • ✅Spring的事務傳播行為?

事務傳播行為指的是當存在多個事務時,spring是如何管理這些事務的事務的傳播行為指如果在開始目前事務之前,一個事務上下文已經存在,此時有若幹選項可以指定一個事務性方法的執行行為。

預設傳播行為:TransactionDefinition.PROPAGATION_REQUIRED:如果目前存在事務,則加入該事務;如果目前沒有事務,則建立一個新的事務。

  • ✅spring 的事務隔離?

spring有5大事務隔離級别,預設值為isolation = “default”(使用資料庫設定),

其它四個隔離級别和資料庫隔離級别一緻:髒讀:表示一個事務讀取到另外一個事務未送出的資料。例如:事務甲嘗試插入資料A,當時還沒有送出資料,事務乙就已經查詢到了事務甲的資料A。

不可重複讀:表示的是在同一個事務兩次通路同一個資料可能出現不一樣。例如:事務1通路了資料A,此時還沒有送出,事務2也通路了資料A,并修改為資料接着送出了。此時事務1再次通路資料就可能出現A或B了。

幻讀:所謂幻讀時某一個事務讀取到某個範圍的記錄時,另外一個事務也通路了該範圍的資料,并且增加了新的資料接着送出了,之前的事務再次讀取到該範圍的資料時,會出現幻行。

  • ✅Spring支援的事務管理類型,事務實作方式有哪些?

程式設計式事務管理,在代碼中顯式調用開啟事務、送出事務、復原事務的相關方法

聲明式事務管理,底層是建立在 AOP 的基礎之上。其本質是對方法前後進行攔截,然後在目标方法開始之前建立或者加入一個事務,在執行完目标方法之後根據執行情況送出或者復原事務。

優缺點:

程式設計式事務管理:通過程式設計的方式管理事務,給你帶來極大的靈活性,但是難以維護

聲明式事務管理:可以将業務和事務管理分開,你隻需要用注解或XML配置來管理事務

實際應用:

基于 <tx> 和 <aop> 命名空間的聲明式事務管理是目前推薦的方式,其最大特點是與 Spring AOP 結合緊密,可以充分利用切點表達式的強大支援,使得管理事務更加靈活。基于 @Transactional 的方式将聲明式事務管理簡化到了極緻。開發人員隻需在配置檔案中加上一行啟用相關後處理 Bean 的配置,然後在需要實施事務管理的方法或者類上使用 @Transactional 指定事務規則即可實作事務管理,而且功能也不必其他方式遜色。

  • ✅聊聊spring 中的面向切面程式設計

AOP:面向切面程式設計,作為面向對象的補充,用于哪些與業務無關,但卻對多個對象産生公共行為和邏輯,抽取并封裝成一個可重用子產品。 這個子產品被稱為切面,減少系統中的重複代碼,降低子產品間的耦合度,同時提高了系統間的可維護性,可用于權限認證,日志,事務處理等。

  • ✅簡單說一下對AOP的了解

spring協助對應的事務,完成對應的和功能實作,AOP是指面向切面程式設計,aspect是由切點和通知組成,減少業務代碼中,混入對應的系統代碼,比如說,事務 ,日志資訊,權限管理。aop的實作原理是基于jdk的動态代理,反射共同實作完成。将對應的系統代碼抽離出來,使用的動态代理。在切點中,織入對應的代理功能,比如說對應的事務,權限管理,日志管理。一個方法的執行或者一個異常的處理。advice和pointcut,在類中我們可以認為所有的節點是一個jointcut,但是我們不是所有的事務都添加對應的織入advice而pointcut就是提供對應的,給滿足條件的pointcut添加對應的advice。

  • ✅Spring AOP裡面的幾個名詞解釋

切面(Aspect):切面是通知和切點的結合,通知和切點共同定義了切面的全部内容,在spring AOP中在類上加上@AspectJ來實作。Joinpoint(連接配接點):連接配接點代表這一個個的方法,切面代碼可以通過這些點插入到應用程式的正常流程中,并添加新的行為。

Pointcut(切入點):也是代表方法,但是這些方法并沒有被增強。

Advice(通知/增強):spring AOP攔截到Joinpoint(連接配接點)所要做增強過程就是通知。

引入(Introduction):不修改代碼的前提下,運作期我們新的類中添加新的屬性或方法

織入(Weaving):是指把增強應用到目标對象來建立新的代理對象的過程。spring 采用動态代理織入,而 AspectJ 采用編譯期織入和類裝載期織入。簡單的說加入事務控制的過程叫做織入。

Proxy(代理):一個類被AOP織入增強後,就産生結果代理類,其實就是代理對象。

Target(目标對象):代理目标對象,就是被代理對象。

  • ✅JDK動态代理和CGLIB動态代理的差別

Java動态代理是利用反射機制生成一個實作代理接口的匿名類,在具體方法前調用InvokeHandler來處理。而CGLIB動态代理是利用asm開源包,對代理對象類的class檔案加載進來,通過修改其位元組碼生成子類來處理。

如果目标對象實作了接口,則預設使用JDK的動态代理實作AOP

如果目标對象使用了,可以強制使用CGLIB實作AOP

如果目标對象沒有實作接口,則必須使用CGLIB,spring會自動在CGLIB和JDK動态代理之間切換

如何強制使用CGLIB實作AOP?

添加CGLIB庫,SPRING_HOME/cglib/*.jar

在spring配置檔案中加入 < aop:aspectj-autoproxy proxy-target-class=“true” />

JDK動态代理和CGLIB動态代理生成位元組碼的差別

JDK動态代理隻能對實作接口的類生成代理,不能針對類

CGLIB是針對類實作代理,主要是指定的類生成一個子類,覆寫其中方法,因為是繼承,是以該類或方法最好不要聲明為final

  • ✅spring aop實作方式

Spring AOP的底層實作有兩種方式:一種是JDK動态代理,另一種是CGLib的方式。

如果要被代理的對象是個實作類,那麼Spring會使用JDK動态代理來完成操作(Spirng預設采用JDK動态代理實作機制);如果要被代理的對象不是個實作類那麼,Spring會強制使用CGLib來實作動态代理。

  • ✅Spring AOP and AspectJ AOP 有什麼差別?AOP 有哪些實作方式?

AOP的實作關鍵技術在于代理模式,代理模式又分為靜态代理和動态代理。AspectJ AOP 使用的是靜态代理,Spring AOP使用的是動态代理。

AspectJ是靜态代理的增強,所謂靜态代理就是AOP架構會在編譯階段生成AOP代理類,是以也成為編譯期增強,它會在編譯期将Aspect(切面)織入到Java位元組碼中,運作時候就是增強後的AOP對象

Spring AOP使用的就是動态代理,所謂動态代理就是AOP架構不會去修改位元組碼檔案,而是每次運作時在記憶體中臨時為方法生成一個AOP對象,這個AOP對象包含目标對象的全部方法,并且在特定切點處做了增強處理,并回調原對象的方法。

  • ✅聊聊Spring通知有哪些類型?

在AOP屬于中,切面的工作被稱為通知,實際上是程式執行時要通過spring AOP架構觸發的代碼段。spring可以又5中通知類型:

前置通知(Before):在目标方法被調用之前調用此方法。

後置通知(After):在目标方法調用完成後執行。

最終通知(After-returning):目标方法成功執行之後執行。

異常通知(After-throwing):在目标方法抛出異常後調用通知。

環繞通知(Around):通知包裹被通知的方法,在被通知調用之前和調用之後執行自定義的行為。

3.2Spring mvc闆塊

  • ✅什麼是MVC?

MVC 是一種使用 MVC(Model View Controller 模型-視圖-控制器)設計建立 Web 應用程式的模式。

Model(模型):處理應用程式資料邏輯的部分

View(視圖):處理資料顯示的部分

Controller(控制器):處理與使用者互動的部分

  • ✅Spring Mvc設計模式

SpringMVC 将傳統的 Model 層再次進行細化,拆分為 Service 層和 Dao層

Service(業務層):處理業務邏輯代碼

Dao(資料通路層):處理資料庫操作

  • ✅簡單介紹下你對springMVC的了解

Spring MVC是Spring的一個子產品,式一個web架構。通過Dispatcher Servlet, ModelAndView 和 View Resolver,開發web應用變得很容易。

Spring MVC是一個基于Java的實作了MVC設計模式的請求驅動類型的輕量級Web架構,通過把Model,View,Controller分離,将web層進行職責解耦,把複雜的web應用分成邏輯清晰的幾部分,簡化開發,減少出錯,友善組内開發人員之間的配合。

Spring整體架構的核心思想是容器,用來管理bean的生命周期,而一個項目中會包含很多容器,并且它們分上下層關系,目前最常用的一個場景是在一個項目中導入Spring和SpringMVC架構,而Spring和SpringMVC其實就是兩個容器,Spring是父容器,SpringMVC是子容器,Spring父容器中注冊的Bean對SpringMVC子容器是可見的,反之則不行。

  • ✅Springmvc有哪些優點?

springmvc 是spring 是一個公司釋出的,那麼他們間的相容性較好。

springmvc 配置簡單容易上手

springmvc 支援restful架構

springmvc 視圖配置與控制器映射非常靈活

  • ✅springMVC和struts2的差別有哪些?

(1)springmvc的入口是一個servlet即前端控制器(DispatchServlet),而struts2入口是一個filter過慮器(StrutsPrepareAndExecuteFilter)。

(2)springmvc是基于方法開發(一個url對應一個方法),請求參數傳遞到方法的形參,可以設計為單例或多例(建議單例),struts2是基于類開發,傳遞參數是通過類的屬性,隻能設計為多例。

(3)Struts采用值棧存儲請求和響應的資料,通過OGNL存取資料,springmvc通過參數解析器是将request請求内容解析,并給方法形參指派,将資料和視圖封裝成ModelAndView對象,

最後又将ModelAndView中的模型資料通過reques域傳輸到頁面。Jsp視圖解析器預設使用jstl。

  • ✅SpringMVC的執行流程

1、使用者發送請求至前端控制器DispatcherServlet;

2、DispatcherServlet收到請求後,調用HandlerMapping處理器映射器,請求擷取Handler;

3、處理器映射器根據請求url找到具體的處理器Handler,生成處理器對象及處理器攔截器(如果有則生成),一并傳回給DispatcherServlet;

4、DispatcherServlet 調用 HandlerAdapter處理器擴充卡,請求執行Handler;

5、HandlerAdapter 經過适配調用 具體處理器進行處理業務邏輯;

6、Handler執行完成傳回ModelAndView;

7、HandlerAdapter将Handler執行結果ModelAndView傳回給DispatcherServlet;

8、DispatcherServlet将ModelAndView傳給ViewResolver視圖解析器進行解析;

9、ViewResolver解析後傳回具體View;

10、DispatcherServlet對View進行渲染視圖(即将模型資料填充至視圖中)

11、DispatcherServlet響應使用者。

前端控制器 DispatcherServlet:接收請求、響應結果,相當于轉發器,有了DispatcherServlet 就減少了其它元件之間的耦合度。

處理器映射器 HandlerMapping:根據請求的URL來查找Handler

處理器擴充卡 HandlerAdapter:負責執行Handler

處理器 Handler:處理器,需要程式員開發

視圖解析器 ViewResolver:進行視圖的解析,根據視圖邏輯名将ModelAndView解析成真正的視圖(view)

視圖View:View是一個接口, 它的實作類支援不同的視圖類型,如jsp,freemarker,pdf等等

花了20天的時間給粉絲整理的一套“最全“的Java求職筆記(四)1為什麼寫這套Java求職筆記2一套Spring.Spring mvc知識大綱技術圖3spring spring mvc面試必知必會4結束語5個人說明
  • ✅SPring mvc請求轉發與重定向

SpringMVC請求轉發差別于重定向,請求轉發位址欄不會發生改變、隻發送一次請求、能攜帶原有的參數,但隻可以在同一個伺服器中進行轉發。

傳統的重定向請求位址會改變(兩次請求)、不能傳遞參數,但是利用SpringMVC的重定向可以攜帶和傳遞參數。重定向相比于請求轉發可以跨服,但是不能直接重定向通路WEB-INF下的資源(可重定向後再進行一次請求轉發)。

轉發配置:在傳回值前面加"forward:",比如"forward:user.do?name=method4"

重定向配置:在傳回值前面加"redirect:",比如"redirect:http://www.liph.fun"

  • ✅SpringMVC常用的注解有哪些?

@RequestMapping:用于處理請求 url 映射的注解,可用于類或方法上。用于類上,則表示類中的所有響應請求的方法都是以該位址作為父路徑。

@RequestBody:注解實作接收http請求的json資料,将json轉換為java對象。

@RequestParam

包位置:org.springframework.web.bind.annotation

作用:從請求體中讀出對應的資料

@PathVariable

包位置:org.springframework.web.bind.annotation

作用:獲得請求url中的動态參數

@ResponseBody

包位置:org.springframework.web.bind.annotation

作用:将 Controller 對象傳回的方法,通過适當的轉換器轉換為指定格式後,寫入到 response 的 body 區中,長用來傳回 JSON 資料或是 XML 資料。使用此注解後不會再走視圖解析器,傳回對象轉化為json對象響應給客戶。

  • ✅SpingMvc中的控制器的注解一般用哪個?有沒有别的注解可以替代?

一般用@Controller注解,也可以使用@RestController,@RestController注解相當于@ResponseBody加@Controller,表示是表現層,除此之外,一般不用别的注解代替。

  • ✅Spring mvc如何解決POST請求中文亂碼問題,GET請求的又如何處理呢?

解決post請求亂碼問題:在web.xml中配置一個CharacterEncodingFilter過濾器,設定成utf-8;

get請求中文參數出現亂碼解決方法有兩個:

修改tomcat配置檔案添加編碼與工程編碼一緻,如下:<ConnectorURIEncoding="utf-8" connectionTimeout="20000" port="8080" protocol="HTTP/1.1" redirectPort="8443"/>

另外一種方法對參數進行重新編碼:

String userName = new String(request.getParamter("userName").getBytes("ISO8859-1"),"utf-8")

ISO8859-1是tomcat預設編碼,需要将tomcat編碼後的内容按utf-8編碼。

  • ✅Spring MVC的異常攔截器處理

可以将異常抛給Spring架構,由Spring架構來處理;我們隻需要配置簡單的異常處理器,在異常處理器中添視圖頁面即可。springmvc提供全局異常處理器(一個系統隻有一個異常處理器)進行統一異常處理。

系統遇到異常,在程式中手動抛出,dao抛給service、service給controller、controller抛給前端控制器,前端控制器調用全局異常處理器。

  • ✅ Filter 與 Interceptor 的差別

過濾器和攔截器的作用看起來非常相似,都是對用戶端發來的請求進行處理,差別如下:

作用域不同

過濾器依賴于 servlet 容器,隻能在 servlet 容器, web 環境下使用

攔截器依賴于 spring 容器,可以在 spring 容器中使用,無論此時 Spring 是什麼環境

細粒度不同

過濾器的控制比較粗,隻能在請求進來時進行處理,對請求和響應進行包裝

攔截器支援更精細的控制,可以在 controller 對請求處理之前或之後被調用,也可以在渲染視圖呈現給使用者後被調用

中斷鍊執行的難易程度不同

過濾器較為複雜,需要處理請求和響應對象來引發中斷,如将使用者重定向到錯誤界面

攔截器隻需要在 preHandle 方法内傳回 false 進行中斷

總結

攔截器相比過濾器有更細粒度的控制,依賴于Spring容器,可以在請求之前或之後啟動,過濾器主要依賴于servlet,過濾器能做的,攔截器基本上都能做

  • ✅SpringMvc用什麼對象從背景向前台傳遞資料的?

答:通過ModelMap對象,可以在這個對象裡面調用put方法,把對象加到裡面,前端就可以通過el表達式拿到。

  • ✅怎麼樣把ModelMap裡面的資料放入Session裡面?

答:可以在類上面加上@SessionAttributes注解,裡面包含的字元串就是要放入session裡面的key。

  • ✅SpringMvc的控制器是不是單例模式?如果是,有什麼問題?怎麼解決?

答:是單例模式,在多線程通路的時候有線程安全問題,解決方案是在控制器裡面不能寫可變狀态量,如果需要使用這些可變狀态,可以使用ThreadLocal機制解決,

為每個線程單獨生成一份變量副本,獨立操作,互不影響。

  • ✅常見的處理并發問題的機制

常見的解決多線程中相同變量的通路沖突,有兩種方式:線程同步機制(鎖) 或 ThreadLocal

線程同步機制:同步機制采用了"時間換空間"的方式,僅提供一份變量,不同的線程在通路前需要擷取鎖,沒獲得鎖的線程則需要排隊等待

ThreadLocal: 采用了"空間換時間"的方式,為每一個線程提供一個獨立的變量副本,進而隔離了多個線程對資料的通路沖突。由于每一個線程都擁有了自己的變量副本,

就無需鎖了。在編寫代碼時,應該将不安全的變量封裝進 ThreadLocal

4結束語

翻看了自己的技術部落格,我的第一篇CSDN部落格居然是2015年10月25日記得那是我第一次注冊CSDN,并且設定了頭像,就開始寫部落格,後來2019年6月開始寫部落格,時間過的真快,希望在java道路上,一邊自己學習,一邊也能幫助到更多人。

5個人說明

我是LRyab部落格,專注電商項目實戰開發,擅長網站搭建與技術問題指導,經驗是由一點一點積累的,思維也是由一天一天訓練出來的。謝謝大家的閱讀,原創不易,如果你認為文章對你有所幫助,就點個贊感謝大家支援,你的點贊是我持續寫作的動力!