java web項目一般採用的技術概述

序:

  網站的架構通常來講,分爲前端和後端。前端負責頁面的展現,後端則是業務邏輯的實現。因爲HTML5的興起,前端領域發展極快,在經典的java web的開發模式中,咱們使用JSP技術做爲展示層的實現,其實就是前端。除了JSP,還要懂得HTML,CSS,JS,AJAX等前端的基礎知識。JSP在其中扮演外層包裝的角色。後端是由一些實現了業務邏輯的java代碼和數據庫組成,說到這,就能夠推出web開發中經典的MVC模式:model-view-controller。view就是表現層,model是用來承載數據的抽象結構,而controller則是view和model的橋樑。view存在於前端代碼中,controller和model存在於後端代碼中,css

  在後端代碼中,爲了保證代碼的整潔,易讀性,通常會採用分層。自頂向下分別爲controller層,service層,dao層,數據層或者叫持久層(直接與數據庫打交道)。有時候爲了達到解耦的目的,會在上述基層中間加入響應的接口層,。在更加大型的網站,會在dao層和數據層之間出現緩存層。或者訪問壓力增大後,需使用集羣,負載均衡等高級技術。html

  綜上,一個web項目前端須要表現層,後端有controller層,service層,dao層,持久層。在表現層,除了提到的HTML,css,js,jsp,ajax等基礎知識,還會用到許多框架,好比tiles,velocity,freemaker等模板。在持久層,除了jdbc,還有mybatis,hibernate等框架。在java web中最耀眼的當屬spring,spring做爲一個貫穿始終的框架,爲項目開發帶來依賴注入,面向切面編程等功能,除了這些還要掌握一種關係型數據庫,如MySQL Oracle等,能掌握非關係型數據庫更好 如Redis mongodb等。前端

  掌握了上述知識點,恭喜你,你已經能夠開始寫java web項目了。可是隻會寫而不會部署,咱們的項目仍然不能拿出來用。須要一個容器來運行咱們的代碼。這裏所說的容器不是java裏的數據類型,而是指應用服務器,此處要區分應用服務器和web服務器。目前比較流行的應用服務器有Tomcat等,經常使用的web服務器有Nginx,Apache等。java

java web技能樹:git

大後臺:

web後臺屬於後臺,但後臺的範圍很是普遍。二者是包含關係,從網絡協議的角度來看,web後臺更多關注的是http,而C++後臺關注的是tcp協議。github

web後臺能夠看做是一個大後臺最靠前的東西,它解析了HTTP請求,而後可能層層轉發給了後面整個分佈式系統的許多組件,而後調用他們的服務。公司內部服務器主機之間絕大部分是經過TCP來通訊額。具體來講C++後臺關注的是socket,也就是網絡編程,還有併發的知識(固然了C++也能夠作web後臺的:CGI 逃)。由於大公司的server通常都是Linux,因此應聘C++後臺,必定要會Linux,這裏的會Linux操做大體分爲兩類:一類是Linux基本操做,包括經常使用Linux命令和工具的使用、shell腳本的編寫,能經過腳本完成一些平常任務。另外一類纔是重點——Linux環境編程,你須要對Linux/Unix環境下各類環境編程的API要熟悉(POSIX那些函數,固然ANSI標準庫的函數也要熟)。常常考察的就是IO、各種IPC的操做方式、socket通訊的流程、select/poll/epoll 等IO多路複用模型。socket和IO多路複用是網絡編程的重點。    題主還問操做系統通常問什麼,這些東西就是通常和操做系統雜糅到一塊兒的,學習Linux環境編程絕對不只僅是記憶幾個函數接口那麼簡單,由於大多數是系統調用,參與內核操做的,因此須要瞭解其中的原理,而其中的原理就是操做系統的概念了,好比上面我說的IPC,就能夠扯出fork函數,進而面試官就能夠問題進程的其餘東西,而後和線程作過比較之類的,線程又能夠牽扯出同步、互斥鎖等概念,怎麼樣是否是想起操做系統課本了。還沒完。其實面試制勝的關鍵並非面試官會問你什麼,而是你能主動給輸出什麼。面試不是作選擇題,判斷題。換句話說:要學會觸類旁通。好比他不問你Linux環境編程,他問了你一個malloc、new區別之類的東西,這個問題很好答,說完以後呢,你能夠主動輸出一些更深刻的東西,經過它們的區別來深刻談論操做系統的內存管理,好比邊界對齊,還有這塊內存的首部或尾部包含其餘信息等等。具體能夠閱讀CSAPP內存管理的章節,此外瞭解一下C++的placement new能夠幫助你對malloc和new的區別有更深的瞭解,從而更好的回答這類問題。C/C++語言的一大特色就是,語言不只僅是語言,你總能和操做系統扯上一腿。   另外不管是哪一種後臺,數據庫是必然逃不開的。你確定要對數據庫有了解。不只僅是SQL,還要懂一些優化,瞭解主鍵的原理(B樹/B+樹啊)。MySQL的話,瞭解一下引擎的知識吧。數據結構、算法等內容也是必考,不過那不僅針對C++後臺開發,這裏就不過多介紹了。     若是你想知道C++怎麼寫web後臺的話,那麼瞭解一下CGI。HTTP協議的內容也是知道比不知道要好。起碼知道個get/post,cookie/session之類的。。

參考書籍:《C++ primer》,《effective C++》,《STL源碼解析》,《深度搜索C++對象模型》web

  1. C++多態的實現?
  2. 虛函數的做用?
  3. 虛函數用於實現多態,這點你們都能答上來可是虛函數在設計上還具備封裝和抽象的做用。好比抽象工廠模式。
  4. 動態綁定是如何實現的?
  5. 靜態多態和動態多態。靜態多態是指經過模板技術或者函數重載技術實現的多態,其在編譯器肯定行爲。動態多態是指經過虛函數技術實如今運行期動態綁定的技術。
  6. 虛函數表
  7. 虛函數表是針對類的仍是針對對象的?同一個類的兩個對象的虛函數表是怎麼維護的?
  8. 編譯器爲每個類維護一個虛函數表,每一個對象的首地址保存着該虛函數表的指針,同一個類的不一樣對象實際上指向同一張虛函數表。
  • 純虛函數如何定義,爲何對於存在虛函數的類中析構函數要定義成虛函數
  • 析構函數能拋出異常嗎
  • 構造函數和析構函數中調用虛函數嗎?
  • 指針和引用的區別
  • 指針與數組千絲萬縷的聯繫
  • 智能指針是怎麼實現的?何時改變引用計數?
  1. 構造函數中計數初始化爲1;
  2. 拷貝構造函數中計數值加1;
  3. 賦值運算符中,左邊的對象引用計數減一,右邊的對象引用計數加一;
  4. 析構函數中引用計數減一;
  5. 在賦值運算符和析構函數中,若是減一後爲0,則調用delete釋放對象。
  6. share_prt與weak_ptr的區別?
  • C++四種類型轉換static_cast, dynamic_cast, const_cast, reinterpret_cast
  • 內存對齊的原則
  • 內聯函數有什麼優勢?內聯函數與宏定義的區別?
  • C++內存管理
  • STL裏的內存池實現
  • STL裏set和map是基於什麼實現的。紅黑樹的特色?
  • STL裏的其餘數據結構和算法實現也要清楚
    這個問題,把STL源碼剖析好好看看,不只面試不慌,本身對STL的使用也會上升一個層次。
  • 必須在構造函數初始化式裏進行初始化的數據成員有哪些
  • 模板特化
  • 定位內存泄露
    (1)在windows平臺下經過CRT中的庫函數進行檢測;
    (2)在可能泄漏的調用先後生成塊的快照,比較先後的狀態,定位泄漏的位置
    (3)Linux下經過工具valgrind檢測
  • 手寫strcpy,memcpy,strcat,strcmp等函數

 

數據結構與算法

這一塊考察範圍太廣,主要靠多刷題吧,牛客網,劍指OFFER,LeetCode等。面試

Hash表

  • Hash表實現(拉鍊和分散地址)
  • Hash策略常見的有哪些?
  • STL中hash_map擴容發生什麼?
    (1) 建立一個新桶,該桶是原來桶兩倍大最接近的質數(判斷n是否是質數的方法:用n除2到sqrt(n)範圍內的數) ;
    (2) 將原來桶裏的數經過指針的轉換,插入到新桶中(注意STL這裏作的很精細,沒有直接將數據從舊桶遍歷拷貝數據插入到新桶,而是經過指針轉換)
    (3) 經過swap函數將新桶和舊桶交換,銷燬新桶。

鏈表

  • 鏈表和插入和刪除,單向和雙向鏈表都要會
  • 鏈表的問題考慮多個指針和遞歸
    (1) 反向打印鏈表(遞歸)
    (2) 打印倒數第K個節點(先後指針)
    (3) 鏈表是否有環(快慢指針)等等。

棧和隊列

  • 隊列和棧的區別?(從實現,應用,自身特色多個方面來闡述,不要只說一個先入先出,先入後出,這個你會別人也會,要展示出你比別人掌握的更深)
  • 典型的應用場景

海量數據問題

  • 十億整數(隨機生成,可重複)中前K最大的數
  • 十億整數(隨機生成,可重複)中出現頻率最高的一千個

排序算法

  • 排序算法固然是基礎內容了,必須至少能快速寫出,快排,建堆,和歸併
  • 每種算法的時間空間複雜度,最好最差平均狀況

位運算

布隆過濾器

幾十億個數常常要查找某一個數在不在裏面,使用布隆過濾器,布隆過濾器的原理。布隆過濾器可能出現誤判,怎麼保證無偏差?ajax

網絡與TCP/IP

參考書籍:《圖解TCP/IP》,《TCP/IP詳解 卷一》,《圖解HTTP》,《HTTP權威指南》算法

  1. TCP重發機制,Nagle算法
  2. TCP的擁塞控制使用的算法和具體過程
  3. TCP的窗口滑動

HTTP

  • http/https 1.0、1.一、2.0的特色和區別
  • get/post 區別
  • HTTP返回狀態碼
  • http 協議頭相關

http數據由請求行,首部字段,空行,報文主體四個部分組成
首部字段分爲:通用首部字段,請求首部字段,響應首部字段,實體首部字段

  • https與http的區別?如何實現加密傳輸?加解密方式?
  • 瀏覽器中輸入一個URL發生什麼,用到哪些協議?

安全相關

至少了解攻擊的原理和基本的防護方法,常見的攻擊方法有一下幾種

  • SQL注入
  • XSS
  • CSRF
  • SYN洪水攻擊
  • APR欺騙

數據庫

主要參考書籍:《數據庫系統概念》,《高性能MySQL》

  • SQL語言(內外鏈接,子查詢,分組,彙集,嵌套,邏輯)
  • MySQL索引方法?索引的優化?
  • InnoDB與MyISAM區別?
  • 事務的ACID
  • 事務的四個隔離級別
  • 查詢優化(從索引上優化,從SQL語言上優化)
  • B-與B+樹區別?
  • MySQL的聯合索引(又稱多列索引)是什麼?生效的條件?
  • 分庫分表

Linux

主要參考書籍:《現代操做系統》,《APUE》,《UNP》,《LINUX內核設計與實現》,《深刻理解LINUX內核》

(1) 進程與線程區別?
(2) 線程比進程具備哪些優點?
(3) 何時用多進程?何時用多線程?
(4) LINUX中進程和線程使用的幾個函數?
(5) 線程同步?
在Windows下線程同步的方式有:互斥量,信號量,事件,關鍵代碼段
在Linux下線程同步的方式有:互斥鎖,自旋鎖,讀寫鎖,屏障(併發完成同一項任務時,屏障的做用特別好使) 知道這些鎖之間的區別,使用場景?

  1. 匿名管道與命名管道的區別:匿名管道只能在具備公共祖先的兩個進程間使用。
  2. 共享文件映射mmap
    mmap創建進程空間到文件的映射,在創建的時候並不直接將文件拷貝到物理內存,一樣採用缺頁終端。mmap映射一個具體的文件能夠實現任意進程間共享內存,映射一個匿名文件,能夠實現父子進程間共享內存。
  3. 常見的信號有哪些?:SIGINT,SIGKILL(不能被捕獲),SIGTERM(能夠被捕獲),SIGSEGV,SIGCHLD,SIGALRM
  1. 虛擬內存的做用?
  2. 虛擬內存的實現?
  3. 操做系統層面對內存的管理?
  4. 內存池的做用?STL裏內存池如何實現
  5. 進程空間和內核空間對內存的管理不一樣?
  6. Linux的slab層,VAM?
  7. 夥伴算法
  8. 高端內存
  • 進程調度
  1. Linux進程分爲兩種,實時進程和非實時進程;
  2. 優先級分爲靜態優先級和動態優先級,優先級的範圍;
  3. 調度策略
  4. 交互進程經過平均睡眠時間而被獎勵;

(1) 死鎖產生的條件;
(2) 死鎖的避免;

  • 命令行
  1. Linux命令 在一個文件中,倒序打印第二行前100個大寫字母
cat filename | head -n 2 | tail -n 1 | grep '[[:upper:]]' -o | tr -d '\n'| cut -c 1-100 | rev
  1. 與CPU,內存,磁盤相關的命令(top,free, df, fdisk)
  2. 網絡相關的命令netstat,tcpdump等
  3. sed, awk, grep三個超強大的命名,分別用與格式化修改,統計,和正則查找
  4. ipcs和ipcrm命令
  5. 查找當前目錄以及字母下以.c結尾的文件,且文件中包含」hello world」的文件的路徑
  6. 建立定時任務
  • IO模型
  1. 五種IO模型:阻塞IO,非阻塞IO,IO複用,信號驅動式IO,異步IO
  2. select,poll,epoll的區別
  • 線程池,內存池 本身動手實現一遍

Linux的API

  • fork與vfork區別
    fork和vfork都用於建立子進程。可是vfork建立子進程後,父進程阻塞,直到子進程調用exit()或者excle()。
    對於內核中過程fork經過調用clone函數,而後clone函數調用do_fork()。do_fork()中調用copy_process()函數先複製task_struct結構體,而後複製其餘關於內存,文件,寄存器等信息。fork採用寫時拷貝技術,所以子進程和父進程的頁表指向相同的頁框。可是vfork不須要拷貝頁表,由於父進程會一直阻塞,直接使用父進程頁表。
  • exit()與_exit()區別
    exit()清理後進入內核,_exit()直接陷入內核。
  • 孤兒進程與僵死進程
  1. 孤兒進程是怎麼產生的?
  2. 僵死進程是怎麼產生的?
  3. 僵死進程的危害?
  4. 如何避免僵死進程的產生?
  • Linux是如何避免內存碎片的
  1. 夥伴算法,用於管理物理內存,避免內存碎片;
  2. 高速緩存Slab層用於管理內核分配內存,避免碎片。
  • 共享內存的實現原理?
  • 系統調用與庫函數(open, close, create, lseek, write, read)
  • 同步方法有哪些?
  1. 互斥鎖,自旋鎖,信號量,讀寫鎖,屏障
  2. 互斥鎖與自旋鎖的區別:互斥鎖得不到資源的時候阻塞,不佔用cpu資源。自旋鎖得不到資源的時候,不停的查詢,而然佔用cpu資源。
  3. 死鎖

其餘

  • ++i是不是原子操做
    明顯不是,++i主要有三個步驟,把數據從內存放在寄存器上,在寄存器上進行自增,把數據從寄存器拷貝會內存,每一個步驟均可能被中斷。
  • 判斷大小端

設計模式

分佈式系統

相關文章
相關標籤/搜索