2018java後端面試集合篇最值得收藏的(三)
Java面試最值得收藏的文章(共4部分):
談談你對spring框架的理解?
我認為spring 就是一個框架的整合器,通常使用spring 來管理action 層和DAO 層。Spring本身有很多的元件,比如:MVC、IOC、AOP、DaoSupport等等。IOC 本身也就是一個容器,它管理了所有的bean 和bean 之間的依賴關係。
IOC 也叫作控制反轉,核心是BeanFactory。也就意味著IOC 是基於工廠模式設計的,同時這個工廠生產的bean 預設是單例的。如果想修改單例變成多例項,則需要修改bean 的scope屬性,值是prototype。在沒有使用IOC 以前,程式設計師需要自己在對應的類中new 相關依賴的物件。
比如UserAction依賴於UserService完成業務操作,而UserService又依賴於UserDAO完成資料庫操作。所以需要在action 中new servcie,在service 中new DAO。這樣的方式,是由程式設計師來管理了物件的生命週期和他們之間的依賴關係,耦合度很高,不利於程式的拓展。所以通過IOC 來管理bean 和依賴關係,可以解耦合。
我們將所有的action、service 和dao等類定義成IOC 的一個bean 元件,此時類的例項化就交給了IOC 的beanFactory,由工廠來負責例項化bean 的物件。IOC 有三種注入方式,屬性注入、構造器注入和介面注入。介面注入只是spring 提出的設計,並沒有具體的實現,所以常用的注入方式是屬性注入。
屬性注入就是在bean 的標籤中,配置property 標籤設定注入其他的bean。要求注入的bean在被注入的bean 中要存在一個全域性的私有變數,並提供set 方法。這樣就可以實現了依賴關係的注入。如果需要很多的bean,則直接注入就可以。如此操作會導致bean 標籤的配置比較冗餘複雜,所以spring 提供了autowried的自動裝配方式,可以byName也可以byType。後續的版本中,spring 還提供了annotation 的方式,不需要再去定義多餘的bean 標籤,而是直接在對應的類上面宣告註解就可以了。
常用的註解有:@controller、@Service、@Repository、@Component、@AutoWried、@Resource 等。除了IOC 以外,專案中通常通過AOP 來實現事務控制。AOP 就是面向切面程式設計,一般事務我們會控制在service 層,因為一個service 有可能會呼叫到多個DAO 層的方法,所以只有
當一個service 方法執行成功後,再提交或者回滾事務。具體的配置方式是:在applicationContext.xml 中,配置aop:config標籤,指定事務控制在service 層。除此還需要配置事務的管理類transactionManager,將這個transactionManager指定給事務管理的bean,並且配置事務的傳播特性、隔離級別、回滾策略以及只讀事務read-only等等。
Spring 預設的傳播特性是如果當前上下文中存在事務則支援當前事務,如果沒有事務,則開啟一個新的事務。還有另外一個傳播特性是在專案中經常用的,REQUIRES_NEW 這個配置,這個屬性指的是總是開啟一個新的事務,如果當前上下文中存在一個事務,則將當前的事務掛起後開啟新的事務。
比如說:在一個本來是隻讀事務的操作中,想加入寫操作的時候,就使用
REQUIRES_NEW。關於事務的隔離級別,一般使用預設的配置提交讀。也就是說,事務提交以後,才能訪問這條資料。
除了事務控制以外,我們通常還可以使用AOP 去完成一些特殊操作,比如日誌控制、安全校驗等等。這麼做的目的就是將功能操作的程式碼從實際的業務邏輯操作出分離出來。實現的方式是通過代理模式,真正完成操作的不是實際的業務物件而是代理物件。
代理模式有靜態代理和動態代理,實現的方案也有兩種,一種是基於JDK 的Proxy 代理類,另外一種則通過CGLIB 來實現。實現AOP 的方式,主要是在applicationContext中定義一個AOP 處理類,這就是一個普通的bean,在類中定義要執行的方法。然後去配置一個aop:config標籤,在標籤中定義aop:aspect切面,在切面中關聯剛才定義好的處理類bean。然後在切面標籤中配置aop:pointcut切入點,切入點就指的是在哪個類的哪個方法上加入代理事務,然後配置通知模型。
AOP 的通知模型中包含:前置通知、後置通知、最終通知、異常通知、環繞通知。這幾個通知模型表示在方法執行以前、執行以後、最終執行、當遇到異常時執行以及前後都執行。在執行的AOP 切面方法中,可以通過JoinPoint連線點來獲得當前被代理的物件以及被代理物件要執行的方法和方法的引數。
除了IOC 和AOP,我們經常還會使用到spring 的DaoSupport。主要是spring 提供了對hibernate 和myBatis等持久型框架的介面。比如HibernateDaoSupport,和sqlSessionDaoSupport。如果DAO 繼承了HibernateDaoSupport,則需要在對應的bean 中注入sessionFactory。而sessionFactory是通過IOC 載入的。
什麼是事務?
在資料庫中,所謂事務是指一組邏輯操作單元即一組sql語句。當這個單元中的一部分操作失敗,整個事務回滾,只有全部正確才完成提交。
事物的四大特性?
事務的ACID屬性
1. 原子性(Atomicity)
原子性是指事務是一個不可分割的工作單位,事務中的操作要麼都發生,
要麼都不發生。
2. 一致性(Consistency)
事務必須使資料庫從一個一致性狀態變換到另外一個一致性狀態。(資料不被破壞)
3. 隔離性(Isolation)
事務的隔離性是指一個事務的執行不能被其他事務干擾.
4. 永續性(Durability)
永續性是指一個事務一旦被提交,
它對資料庫中資料的改變就是永久性的.
在JDBC中,
事務預設是自動提交的,
每次執行一個 SQL 語句時,如果執行成功,
就會向資料庫自動提交,而不能回滾
為了讓多個 SQL 語句作為一個事務執行:
(1)執行語句前呼叫 Connection 物件的setAutoCommit(false);
以取消自動提交事務
(2)在所有的 SQL 語句都成功執行後,呼叫 commit(); 方法提交事務
(3)在出現異常時,呼叫 rollback(); 方法回滾事務。
事務的隔離級別?
spring中事務的傳播特性好像有5個左右,
我做專案的時候使用最多的就是propagation_required,
它所代表的意思支援當前事務,如果當前沒有事務,就新建一個事務。
spring中事務的隔離級別有5個,預設使用的是isolation_default,
它代表使用資料庫預設的事務隔離級別,也是我們專案中最常使用的。
除此之外還有
讀未提交:
它充許另外一個事務可以看到這個事務未提交的資料,
這種隔離級別會產生髒讀,不可重複讀和幻像讀。
讀提交:
保證一個事務修改的資料提交後才能被另外一個事務讀取,
也是大多數資料庫的預設值。可以避免髒讀,但會產生不可重複讀和幻像讀。
重複讀:
在一個事務內兩次讀到的資料是不一樣的,因此稱為是不可重複讀。
序列化:
順序執行事務。除了防止髒讀,不可重複讀外,還避免了幻像讀。
併發性也最低,但最安全。
不可重複讀的重點是修改:同樣的條件,你讀取過的資料,再次讀取出來發現值不一樣了 。
幻讀的重點在於新增或者刪除:同樣的條件,第1次和第2次讀出來的記錄數不一樣。
參考:
我們首先說併發中可能發生的3中不討人喜歡的事情
1: Dirty reads--讀髒資料。也就是說,比如事務A的未提交(還依然快取)的資料被事務B讀走,如果事務A失敗回滾,會導致事務B所讀取的的資料是錯誤的。
2: non-repeatable reads--資料不可重複讀。比如事務A中兩處讀取資料-total-的值。在第一讀的時候,total是100,然後事務B就把total的資料改成 200,事務A再讀一次,結果就發現,total竟然就變成200了,造成事務A資料混亂。
3: phantom reads--幻象讀資料,這個和non-repeatable reads相似,也是同一個事務中多次讀不一致的問題。但是non-repeatable reads的不一致是因為他所要取的資料集被改變了(比如total的資料),但是phantom reads所要讀的資料的不一致卻不是他所要讀的資料集改變,而是他的條件資料集改變。比如Select account.id where account.name="ppgogo*",第一次讀去了6個符合條件的id,第二次讀取的時候,由於事務b把一個帳號的名字由"dd"改成"ppgogo1",結果取出來了7個數據。
介面和抽象類的區別?
1.一個類只能進行單繼承,但可以實現多個介面。
2.有抽象方法的類一定是抽象類,但是抽象類裡面不一定有抽象方法;
接口裡面所有的方法的預設修飾符為public abstract,接口裡的成員變 量預設的修飾符為 pulbic static final。
關係:
介面和介面 繼承
介面和抽象類 抽象類實現介面
類和抽象類 類繼承抽象類
類和類 繼承
SpringMVC有哪些註解?
我們通常使用Spring MVC 來充當我們專案中的控制層,我們控制層的作用就是接受前臺傳遞的引數,呼叫業務邏輯層進行業務處理以及將返回的結果集返回前臺進行展示,首先我們要在web.xml 中配置Spring MVC 的前端總控制器DispatcherServlet並載入Spring MVC 的配置檔案,我們在Controller 層上加上@Controller 註解,使其充當控制層,並且要在Spring mvc的配置檔案中通過component-scan 對Controller 層進行掃描從而使類中的@Controller 註解生效,Spring mvc用方法來接收引數,所以我們說Spring mvc是基於方法的設計,我們也可以通過@PathVariable衝路徑中獲取資訊,我們通常通過@Resource 這個註解來進行Bean 注入,他是java 中的註解,而不是Spring 中的,預設是按照屬性名進行注入,我們也可以通過設定name屬性的值,讓其只能按照屬性名進行注入,我們也可以用@Autowired註解來進行Bean 的注入,他預設是按照型別進行注入,如果要按屬性名進行注入我們需要結合@Qualifier 註解使其按照名字進行注入,我們可以將返回值的型別改為ModelAndView並在配置檔案中配置檢視解析器的字首和字尾,以此來給我們前臺頁面傳遞資料,也可以在方法中通過ModelMap進行返回資料。也可以通過@ResponseBody將返回的實體類或者實體類的集合轉換為指定的格式進行前臺頁面互動。並且要在配置檔案中進行相關的配置。@RequestMapping是將Url對映到具體的方法上。檔案上傳時我們通過@RequestParam來接收前臺上傳的檔案。以上就是我對SpringMVC的理解和運用。
重寫和過載的區別?
1.過載發生在同一個類中,重寫發生在父子類繼承關係中
2.重寫要求重寫父類非私有非靜態的方法,而過載沒有要求
3.過載與返回值無關,重寫要求返回值必須相同
4.過載要求引數型別順序個數至少有一個不同,重寫要求引數必須相同
5.重寫要求子類的訪問許可權不得小於父類,但過載沒有要求
6.重寫要求子類不得丟擲比父類更多的異常單可以是父類異常的子異常,過載也沒有要求
1、過載:
(1) 方法過載是讓類以統一的方式處理不同型別資料的一種手段。多個同名函式同時存在,具有不同的引數個數/型別。
過載Overloading是一個類中多型性的一種表現。
(2) Java的方法過載,就是在類中可以建立多個方法,它們具有相同的名字,但具有不同的引數和不同的定義。
呼叫方法時通過傳遞給它們的不同引數個數和引數型別來決定具體使用哪個方法, 這就是多型性。
(3) 過載的時候,方法名要一樣,但是引數型別和個數不一樣,返回值型別可以相同也可以不相同。無法以返回型別作為過載函式的區分標準。
2、重寫:
(1) 父類與子類之間的多型性,對父類的函式進行重新定義。如果在子類中定義某方法與其父類有相同的名稱和引數,我們說該方法被重寫 (Overriding)。在Java中,子類可繼承父類中的方法,而不需要重新編寫相同的方法。
但有時子類並不想原封不動地繼承父類的方法,而是想作一定的修改,這就需要採用方法的重寫。
方法重寫又稱方法覆蓋。
(2)若子類中的方法與父類中的某一方法具有相同的方法名、返回型別和引數表,則新方法將覆蓋原有的方法。
如需父類中原有的方法,可使用super關鍵字,該關鍵字引用了當前類的父類。
(3)子類函式的訪問修飾許可權不能少於父類的;
概念:即呼叫物件方法的機制。
Java中什麼是全域性變數?什麼是區域性變數?
全域性變數直接定義在類中。
區域性變數定義在方法中,引數上,語句中。
- 全域性變數存放在堆記憶體,區域性變數存放在棧記憶體。
- 全域性變數隨著物件的建立而存在,隨著物件的消失而消失。區域性變數隨著方法的建立而存在,隨著方法的結束而結束。
- 全域性變數有預設初始值,區域性變數沒有預設初始值,要想使用,必須賦初始值。
1、全域性變數:
1.1 非靜態全域性變數:
非靜態全域性變數的定義:非靜態全域性變數都是定在類中,是類的成員變數或者說是成員屬性屬於類的一部分(或者說是物件的一部分);
生存時間:非靜態全域性變數載入在堆記憶體中,隨著宣告初始化而建立,隨著物件消亡而消亡;
是否需要初始化:全域性變數都是不需要被強制初始化的,系統都會預設根據其資料型別進行預設賦值;但是建議、在宣告時都進行初始化操作;
建立位置:建立在堆記憶體中,因為非靜態的全域性變數數物件的成員變數是物件的一部分;
1.2靜態全域性變數:
靜態全域性變數的定義:靜態的類成員變數;
生存時間:靜態全域性變數隨著類的位元組碼檔案載入而載入產生,隨著位元組碼檔案的消失而消失,生存時間比類的物件還要長;
是否初始化:凡是全域性變數都是可以不要初始化的,靜態變數也是一樣,系統會自動根據其資料型別進行賦預設值,但是建議變數在宣告時都進行初始化;
建立位置:靜態變數時存在於對記憶體中的,所以靜態全域性變數也是存在於堆記憶體中的;
2、區域性變數:
區域性變數的定義:定義在方法中的變數都是區域性變數(main方法也是方法,所以定義在main方法中的變數也是區域性變數)。
生存時間:區域性變數的生存時間和方法的生存時間一致,呼叫該方法宣告該區域性變數並初始化的時,該區域性變數被建立並分配記憶體空間;直到該方法呼叫結束區域性變數也就結束了;
是否需要初始化:區域性變數在使用前必須進行初始化,系統預設不會對區域性變數進行初始化資料操作,如果區域性變數在使用前沒有進行初始化則會在編譯器報錯;如果區域性變數進行了宣告沒有進行初始化,但是也一直沒有被使用的話編譯也是不會報錯的;(區域性變數使用前必須初始化話)
建立位置:區域性變數是建立在棧記憶體中的;
為什麼要使用log4j?
記錄專案執行時產生的動作。比如異常資訊,或者關鍵動作的記錄。都可以配置記錄到一個檔案當中方便檢視。
基本上每個專案都可以使用。這個是個日誌系統。系統上線後可以配置一個log.html檔案路徑,將所有捕獲的異常都想log日誌中輸出一下。這樣系統在執行中出現異常情況就可以直接從這裡檢查原因,而不用特費勁到伺服器上呼叫控制檯輸出日誌了。
優先順序從高到低分別是 ERROR、WARN、INFO、DEBUG。
一:試驗環境
OS:win7
JDK:jdk7
Log4j:1.2.17(好尷尬,原本是想試驗下log4j2的,結果陰差陽錯用了這個版本,不過幸好,試驗也不白試驗,試驗的作用是一樣的)
二:先看兩個簡單的例子然後在談為什麼吧!
(1)當我們想列印一些資訊時,估計這是最容易想到的一種方式,將我們想列印的資訊,列印到控制檯中
(2)這個是使用log4j日誌框架,我覺得最簡單的一種實現方式,好像比(1)麻煩不少,我們好像沒有必要非使用log4j日誌框架的,那麼再看看下面的例子吧!
(3)這段日誌資訊,我們的需求稍微複雜了一點點,我們想區分開來列印的資訊的級別,比如:哪些可能是錯誤的情況?哪些可能是警告的情況?以及順便看一下不使用日誌框架時程式執行的效率如何?
(4)這段日誌資訊和(3)的需求一模一樣,使用日誌框架好像更能滿足一些我們的特殊需要啦,是的,這也是為什麼我們選擇使用日誌框架的原因的。
5)這段程式碼平淡無奇,是用來輔助我們測試的,不過實際的開發中使用這類程式碼的地方可以說是到處都是。
三:看完栗子後的感想
(1)很明顯我們在編寫程式碼的時候有各種需要列印日誌的需求,比如:我們除錯程式碼的時候;我們的應用出現了問題,我們分析、定位、解決問題的時候;我們想將某些日誌資訊作為離線的業務資料分析的時候等等
(2)最簡單的列印日誌的方式就是使用系統本身的輸出語句,不過對於大多數需求這種方式都是不能滿足的
(3)於是我們的目光可能會向編寫一個專門列印日誌資訊的工具類轉移,不過有人更近了一步,寫出了一個日誌框架供我們使用
(4)使用日誌框架的好處顯而易見,方便、自在、功能強大能夠滿足各種需求,不好的地方也是有的,比如:如果你也進行了試驗你會發現,程式變慢了,需要一定的時間和精力作為學習的成本
(5)日誌框架都是能控制什麼哪?那我們需要列印的日誌都能滿足什麼樣的需求哪?通常我們希望一個日誌框架能夠靈活的做到以下三點:
5-1:能夠控制日誌資訊想往哪裡打就往哪裡打,比如:控制檯、檔案、郵箱、資料庫等等
5-2:能夠控制日誌資訊想怎麼打就怎麼打,比如:我想要列印時間、程式的名稱、程式的方法名、程式的行號、執行緒的名稱等等
5-3:能夠控制日誌資訊想打什麼打什麼,不想打的就不打,日誌資訊是分級別的,有時候我只想看錯誤的資訊或者警告的資訊,有時候我想看到所有的資訊我想除錯程式等等
(6)如果有這麼個框架,不是太難使用我也是非常樂意玩玩的,尤其是當程式出現問題的時候,專案負責人讓你趕緊解決問題,這時候有一份日誌檔案可供分析就好了!
談談你對Java反射機制的看法?
JAVA反射機制是在執行狀態中,對於任意一個類,都能夠知道這個類的所有屬性和方法;對於任意一個物件,都能夠呼叫它的任意一個方法和屬性;這種動態獲取的資訊以及動態呼叫物件的方法的功能稱為java語言的反射機制。
Java反射機制主要提供了以下功能:在執行時判斷任意一個物件所屬的類;在執行時構造任意一個類的物件;在執行時判斷任意一個類所具有的成員變數和方法;在執行時呼叫任意一個物件的方法;生成動態代理。
有時候我們說某個語言具有很強的動態性,有時候我們會區分動態和靜態的不同技術與作法。我們朗朗上口動態繫結(dynamic binding)、動態連結(dynamic linking)、動態載入(dynamic loading)等。然而“動態”一詞其實沒有絕對而普遍適用的嚴格定義,有時候甚至像物件導向當初被匯入程式設計領域一樣,一人一把號,各吹各的調。
一般而言,開發者社群說到動態語言,大致認同的一個定義是:“程式執行時,允許改變程式結構或變數型別,這種語言稱為動態語言”。從這個觀點看,Perl,Python,Ruby是動態語言,C++,Java,C#不是動態語言。
儘管在這樣的定義與分類下Java不是動態語言,它卻有著一個非常突出的動態相關機制:Reflection。這個字的意思是“反射、映象、倒影”,用在Java身上指的是我們可以於執行時載入、探知、使用編譯期間完全未知的classes。換句話說,Java程式可以載入一個執行時才得知名稱的class,獲悉其完整構造(但不包括methods定義),並生成其物件實體、或對其fields設值、或喚起其methods。這種“看透class”的能力(the ability of the program to examine itself)被稱為introspection(內省、內觀、反省)。Reflection和introspection是常被並提的兩個術語。
Java如何能夠做出上述的動態特性呢?這是一個深遠話題,本文對此只簡單介紹一些概念。整個篇幅最主要還是介紹Reflection APIs,也就是讓讀者知道如何探索class的結構、如何對某個“執行時才獲知名稱的class”生成一份實體、為其fields設值、呼叫其methods。本文將談到java.lang.Class,以及java.lang.reflect中的Method、Field、Constructor等等classes。
你們的mongodb主要在什麼場景下使用,如何使用的?
1、mongo使用場合
mongodb的主要目標是在鍵/值儲存方式(提供了高效能和高度伸縮性)以及傳統的RDBMS系統(豐富的功能)架起一座橋樑,集兩者的優勢於一身。mongo適用於以下場景:
a.網站資料:mongo非常適合實時的插入,更新與查詢,並具備網站實時資料儲存所需的複製及高度伸縮性。
b.快取:由於效能很高,mongo也適合作為資訊基礎設施的快取層。在系統重啟之後,由mongo搭建的持久化快取可以避免下層的資料來源過載。
c.大尺寸、低價值的資料:使用傳統的關係資料庫儲存一些資料時可能會比較貴,在此之前,很多程式設計師往往會選擇傳統的檔案進行儲存。
d.高伸縮性的場景:mongo非常適合由數十或者數百臺伺服器組成的資料庫。
e.用於物件及JSON資料的儲存:mongo的BSON資料格式非常適合文件格式化的儲存及查詢。
2、不適合的場景:
a.高度事物性的系統:例如銀行或會計系統。傳統的關係型資料庫目前還是更適用於需要大量原子性複雜事務的應用程式。
b.傳統的商業智慧應用:針對特定問題的BI資料庫會對產生高度優化的查詢方式。對於此類應用,資料倉庫可能是更合適的選擇。
c.需要SQL的問題。
為什麼離職?
上家公司為什麼沒有給你上社保?
抽象類能夠例項化物件麼?
不能的。因為預設的都是“public static”的靜態方法,所以是沒法new物件的。
抽象類之所以存在就是要子類去實現他的所有的抽象方法,既然是抽象的,建立它的物件後呼叫它的方法,什麼都不會產生,所以毫無意義。
1.抽象類與抽象方法的關係是:抽象方法必須在抽象類中,如果抽象方法不在抽象類中,則會編譯報錯,這個是規定的。
2.抽象類中的方法不一定要必須是抽象方法,可以有抽象方法,和非抽象方法.其中非抽象方法,往往都是抽象類的所有子類所具有的,而抽象方法則由具體的不同子類實現不同的方法。
抽象類無法例項化,無法建立物件。現實生活中也有抽象類的類子,比如說人類是一個抽象類,無法建立一個叫人類的物件,人繼承人類來建立物件。況且抽象類中的抽象方法只有宣告,沒有主體,如果例項化了,又如何去實現呼叫呢?
Redis中的資料型別有哪些?
String(字串),hash(雜湊),list(集合),set(無序集合)及zset(sorted set有序集合)
1、String (Key-Value)String是最常用的一種資料型別,普通的key/value儲存都可以歸為此類。
2、Hash(Key-Value)hash是一個string 型別的field和value的對映表。
3、list是一個連結串列結構,主要功能是push, pop, 獲取一個範圍的所有的值等。操作中key理解為連結串列名字。
4、Set它是string型別的無序集合。set是通過hash table實現的,可以進行新增、刪除和查詢。對集合我們可以取並集,交集,差集.
5、zset,Redis sorted set的使用場景與set類似,區別是set不是自動有序的,而sorted set可以通過使用者額外提供一個優先順序(score)的引數來為成員排序,並且是插入有序的,即自動排序。
什麼是物件的序列化,什麼是物件的反序列化?
Serialization(序列化)是一種將物件以一連串的位元組描述的過程;反序列化deserialization是一種將這些位元組重建成一個物件的過程。
序列化是將物件狀態轉換為可保持或傳輸的格式的過程。與序列化相對的是反序列化,它將流轉換為物件。這兩個過程結合起來,就使得資料能夠被輕鬆地儲存和傳輸。(即Java序列化是指把Java物件轉換為位元組序列的過程;而Java反序列化是指把位元組序列恢復為Java物件的過程。)
1、序列化是幹什麼的?
簡單說就是為了儲存在記憶體中的各種物件的狀態,並且可以把儲存的物件狀態再讀出來。雖然你可以 用自己的各種方法來儲存Object states,
但是Java給你提供一種應該比你自己好的儲存物件狀態的機制、那就是序列化。
2、什麼情況下需要序列化?
a)當你想把的記憶體中的物件儲存到一個檔案或者資料庫中時候。
b)當你想用套接字在網路上傳送物件的時候
c)當你想通過RMI傳輸物件的時候(RMI->Remote Method Invocation 遠端方法呼叫)
3、當對一個物件實現序列化時,究竟發生了什麼?
在沒有序列化前,每個儲存在堆(Heap)中的物件都有相應的狀態(state),即實體變數(instance ariable)例如:Foo myFoo=new Foo(); myFoo.setWidth(20); myFoo.setHeight(40);
物件反序列化方法和裝置
其中,物件反序列化方法包括:獲取目標字串;建立與所述目標字串對應的Json物件,所述Json物件為具有Json屬性的設定操作的類;將所述目標字串轉化為所述Json物件;以及由所述Json物件生成所述目標字串的物件。通過本發明,避免了Json字串內容與目標物件不匹配,而導致的反序列化失敗的問題,達到了成功反序列化的效果。
面向物件程式設計的英文縮寫?OOP
oop(Object-Oriented Programming)
面向切面程式設計英文縮寫?AOP
aop(Aspect-Oriented Programming)
面向服務程式設計的英文縮寫?SOP
Sop(Service-Oriented Programming)
你們的許可權是怎麼做的,說一下實現的思路。(可以選擇提問:一張表能不能做許可權,兩張表能不能做?不用表能不能做)
許可權思路
我們做許可權的時候用了5張表,一張使用者表、角色表、使用者角色中間表,首先完成使用者賦角色,就是將使用者和角色id一起存入使用者角色中間表。一張許可權表和一張角色許可權中間表,將角色id和許可權id插入角色許可權中間表。當用戶登陸的時候,通過使用者id查詢當前使用者擁有的所有角色,通過角色id再查許可權,將許可權用ztree的形式完成展示,完成許可權
許可權涉及到 5 張表:
使用者表,角色表,許可權表(選單表),使用者角色關聯表,角色許可權關聯表
60
當用戶登入時,根據使用者名稱和密碼到使用者表驗證資訊是否合法,如果合法則獲取使用者資訊,
之後根據使用者id再到使用者角色關聯表中得到相關連的角色id集合,之後根據角色id再到角色權
限關聯表中獲取該角色所擁有的許可權 id 集合,然後再根據許可權 id 集合到許可權表(選單表)中
獲取具體的選單,展現給當前登入使用者,從而達到不同用使用者看到不同的選單許可權。
我們通過ZTree 來給角色賦權並且通過 ZTree 來展示選單,以及通過 ZTree 來管理選單即
增加和編輯選單。
我們做的許可權控制到url 級別,為了防止使用者不登入直接輸入 url 訪問的這個弊端,通過攔
截器進行攔截驗證。
resultMap與resultType、parameterMap與 parameterType的區別?
Map:對映;Type:Java型別。
- SpringMVC的執行原理
1、客戶端發出一個http請求給web伺服器,web伺服器對http請求進行解析,如果匹配DispatcherServlet的請求對映路徑(在web.xml中指定),web容器將請求轉交給DispatcherServlet.
2、DipatcherServlet接收到這個請求之後將根據請求的資訊(包括URL、Http方法、請求報文頭和請求引數Cookie等)以及HandlerMapping的配置找到處理請求的處理器(Handler)。
3-4、DispatcherServlet根據HandlerMapping找到對應的Handler,將處理權交給Handler(Handler將具體的處理進行封裝),再由具體的HandlerAdapter對Handler進行具體的呼叫。
5、Handler對資料處理完成以後將返回一個ModelAndView()物件給DispatcherServlet。
6、Handler返回的ModelAndView()只是一個邏輯檢視並不是一個正式的檢視,DispatcherSevlet通過ViewResolver將邏輯檢視轉化為真正的檢視View。
7、Dispatcher通過model解析出ModelAndView()中的引數進行解析最終展現出完整的view並返回給客戶端。
- Ssm框架的搭建過程
1、建立mvn專案、完善目錄結構
- 你們公司的maven私服怎麼搭建的
- 在官網上面下載maven的壓縮包。
- 配置驗證maven(mvn-version命令檢視是否安裝成功)。
- 把maven和eclipse整合到一起。
- 小雞吃大米,怎麼實現。
1、建立一個小雞物件,給它新增屬性,胃能容納多少粒米。
2、寫一個小雞吃米方法,有一個for寫吃米的過程,for(int i = 0; i < 變數+1; i++),也就是吃飽了就不吃了。如果是多隻小雞,就在外面加個for迴圈(預設是小雞排隊吃飽為止)。如果小雞不排隊的話,就用多執行緒的搶佔機制來吃米(多執行緒的搶佔排程機制)。
- 表和表的關係有幾種。
- 一對多
- 多對一
- 多對多。
- 一對一
- 如何研究一門新技術,說說思路。
- 新技術是什麼東西。
- 為什麼要使用這項技術。
- 如何使用這項技術。
- 在使用這個技術中遇到什麼問題,怎麼解決的。
- 這個技術的應用場景。
- 啥叫感恩?
- 解釋 常見的幾個java技術網站。
CSDN、部落格園、GitHub、stackoverflow、知乎、開源中國
- 什麼叫 b2b b2c 020 p2p B/S C/S
B2B:(Business To Business)商家對商家進行交易, 是指企業與企業之間通過專用網路或Internet,進行資料資訊的交換、傳遞,開展交易活動的商業模式。它將企業內部網,通過 B2B 網站與客戶緊密結合起來,通過網路的快速反應,為客戶提供更好的服務,從而促進企業的業務發展。
B2C:(Business To Consumer)商家對個人進行交易。而其中文簡稱為“商對客”。“商對客”是電子商務的一種模式,也就是通常說的直接面向消費者銷售產品和服務商業零售模式。
O2O即Online To Offline(線上離線/線上到線下),是指將線下的商務機會與網際網路結合,讓網際網路成為線下交易的前臺,這個概念最早來源於美國。O2O的概念非常廣泛,只要產業鏈中既可涉及到線上,又可涉及到線下,就可通稱為O2O。
P2P借貸是一種將非常小額度的資金聚集起來借貸給有資金需求人群的一種民間小額借貸模式。P2P是“Peer-to-Peer”的簡寫,個人對個人的意思,P2P借貸指個人通過第三方平臺(P2P公司)在收取一定服務費用的前提下向其他個人提供小額借貸的金融模式。
C/S結構,即Client/Server(客戶機/伺服器)結構,是大家熟知的軟體系統體系結構,通過將任務合理分配到Client端和Server端,降低了系統的通訊開銷,可以充分利用兩端硬體環境的優勢。早期的軟體系統多以此作為首選設計標準。
B/S結構,即Browser/Server(瀏覽器/伺服器)結構,是隨著Internet技術的興起,對C/S結構的一種變化或者改進的結構。在這種結構下,使用者介面完全通過WWW瀏覽器實現,一部分事務邏輯在前端實現,但是主要事務邏輯在伺服器端實現,形成所謂3-tier結構。B/S結構,主要是利用了不斷成熟的WWW瀏覽器技術,結合瀏覽器的多種Script語言(VBScript、JavaScript…)和ActiveX技術,用通用瀏覽器就實現了原來需要複雜專用軟體才能實現的強大功能,並節約了開發成本,是一種全新的軟體系統構造技術。隨著Windows 98/Windows 2000將瀏覽器技術植入作業系統內部,這種結構更成為當今應用軟體的首選體系結構。
- 常見sql 優化,程式碼優化。
http://blog.csdn.net/z719725611/article/details/52922695
- 不使用子查詢,即使用表自聯查。
- 避免函式索引,MySQL不像Oracle那樣支援函式索引,即使d欄位有索引,也會直接全表掃描。
- 用IN來替換OR,or的查詢低效查詢,in高效查詢。
- .LIKE雙百分號無法使用到索引
- 讀取適當的記錄LIMIT M,N
- 避免資料型別不一致
- 分組統計可以禁止排序
- 避免隨機取記錄
- 禁止不必要的ORDER BY排序
- 批量INSERT插入
resultMap&resultType
兩者都是表示查詢結果集與java物件之間的一種關係,處理查詢結果集,對映到java物件。
resultMap表示將查詢結果集中的列一一對映到bean物件的各個屬性。對映的查詢結果集中的列標籤可以根據需要靈活變化,並且,在對映關係中,還可以通過typeHandler設定實現查詢結果值的型別轉換,比如布林型與0/1的型別轉換。
例如:
<resultMaptype="hdu.terence.bean.Message"id="MessageResult">
<!--存放Dao值--><!--type是和資料庫對應的bean類名Message-->
<idcolumn="id"jdbcType="INTEGER"property="id"/><!--主鍵標籤-->
<resultcolumn="COMMAND"jdbcType="VARCHAR"property="command"/>
<resultcolumn="DESCRIPTION"jdbcType="VARCHAR"property="description"/>
<resultcolumn="CONTENT"jdbcType="VARCHAR"property="content"/>
</resultMap>
<selectid="queryMessageList"parameterType="hdu.terence.bean.Message"resultMap="MessageResult">
SELECTID,COMMAND,DESCRIPTION,CONTENT FROM message WHERE 1=1
<iftest="command!=null and!"".equals(command.trim())">
andCOMMAND=#{command}
</if>
<iftest="description!=null and!"".equals(description.trim())">
andDESCRIPTION like '%' #{description} '%'
</if>
</select>
resultType 表示的是bean中的物件類,此時可以省略掉resultMap標籤的對映,但是必須保證查詢結果集中的屬性和 bean物件類中的屬性是一一對應的,此時大小寫不敏感,但是有限制。
以下是resultType的寫法,將其值設定成對應的java類上即可。不需要上述resultMap的對映關係。
<selectid="queryMessageList"parameterType="hdu.terence.bean.Message" resultType=" hdu.terence.bean.Message ">
SELECTID,COMMAND,DESCRIPTION,CONTENT FROM message WHERE 1=1
<iftest="command!=null and!"".equals(command.trim())">
andCOMMAND=#{command}
</if>
<iftest="description!=null and!"".equals(description.trim())">
andDESCRIPTION like '%' #{description} '%'
</if>
</select>
ParameterMap(不推薦) ¶meterType
ParameterMap和resultMap類似,表示將查詢結果集中列值的型別一一對映到java物件屬性的型別上,在開發過程中不推薦這種方式。
一般使用parameterType直接將查詢結果列值型別自動對應到java物件屬性型別上,不再配置對映關係一一對應,例如上述程式碼中下劃線部分表示將查詢結果型別自動對應到hdu.terence.bean.Message的Bean物件屬性型別。
#{}和${}的使用
resultMap和ParameterMap書寫拼寫要使用#{},resultType和parameterType型別使用${},使用例子如下:
Select ID,COMMAND from Message where COMMAND=#{command}
Select ID,COMMAND from Message where COMMAND=‘${command}’
前者解析為:
Select ID,COMMAND from Message where COMMAND=?具有預編譯效果
後者解析為:
Select ID,COMMAND from Message where COMMAND=段子 不具有預編譯效果
但是,例如當頁面向後臺傳遞一個列名(屬性名)的時候,是不希望被預編譯出一個?的,此時要用到$格式;
如:加上 order by${param} ,此時param是一個列名。
#{}和 ognl表示式