1. 程式人生 > >Java面試流程及核心面試題

Java面試流程及核心面試題

 

  • 面試整體流程

 1.1 簡單的自我介紹

      我是xxxx,工作xxx年.我先後在xxxx公司、yyyy公司工作。先後做個xxxx專案、yyyy專案。

 1.2 你簡單介紹一下xxxx專案

    為了解決xxxx問題,開發了一套xxxx系統,該系統主要有那些部分組成。簡單介紹專案的整體架構。參與某個模組的開發。就要求你說一下這個模組的業務及設計。

 1.3 會問一下JAVA的專業技能

     後面詳細講解

 1.4你還有什麼需要詢問我的嗎

     公司要做的專案?專案中會使用一下什麼技術?

 

注意:經歷了多輪面試後,對於你的自我介紹和專案專案經驗面試官就不太關心了。

   你說一下你最擅長的什麼?你簡單說一下?

最終技術面試完成後,都會讓你回家等訊息,或者等hr來和你談薪資和福利。

  • java的專業技能

2.1 java的基礎部分

2.1.1 簡單講一下java的跨平臺原理

      由於各作業系統(windows,liunx等)支援的指令集,不是完全一致的。就會讓我們的程式在不同的作業系統上要執行不同程式程式碼。Java開發了適用於不同作業系統及位數的java虛擬機器來遮蔽個系統之間的差異,提供統一的介面。對於我們java開發者而言,你只需要在不同的系統上安裝對應的不同java虛擬機器、這時你的java程式只要遵循java規範,就可以在所有的作業系統上面執行java程式了。

 

Java通過不同的系統、不同版本、不同位數的java虛擬機器(jvm),來遮蔽不同的系統指令集差異而對外體統統一的介面(java API),對於我們普通的java開發者而言,只需要按照介面開發即可。如果我係統需要部署到不同的環境時,只需在系統上面按照對應版本的虛擬機器即可。

 

2.2.2 搭建一個java開發環境的步驟

Java開發環境需要些什麼?

 

  1. 適用於我們開發環境的jdk
  2. 對應開發環境eclipse
  3. 還需要web伺服器(tomcat)

 

  • 下載對應元件
  • 安裝

Jdk,安裝正常流程安裝即可,配置我們的JAVA_HOME,因為後面的eclispe和tomcat會依賴於這個變數.

Eclispe正常解壓就ok,設定workspace的預設編碼

Tomcat 正常解壓就ok,把tomcat整合到eclispe中,安裝外掛就OK。

.......

Svn/git

 

 

2.1.3講一下java中int資料佔幾個位元組

Java中有幾種基本資料型別?8種

 

Int佔 4個位元組,32位

Boolean 1位

 

2.1.4 面向物件的特徵有哪些方面

有四大基本特徵:封裝、抽象、繼承、多型

      面向物件的封裝性,即將物件封裝成一個高度自治和相對封閉的個體,物件狀態(屬性)由這個物件自己的行為(方法)來讀取和改變。

張三這個人,他的姓名等屬性,要有自己提供的獲取或改變的方法來操作。private name setName getName

      抽象就是找出一些事物的相似和共性之處,然後將這些事物歸為一個類,這個類只考慮這些事物的相似和共性之處,並且會忽略與當前主題和目標無關的那些方面,將注意力集中在與當前目標有關的方面。 就是把現實生活中的物件,抽象為類。

在定義和實現一個類的時候,可以在一個已經存在的類的基礎之上來進行,把這個已經存在的類所定義的內容作為自己的內容,並可以加入若干新的內容,或修改原來的方法使之更適合特殊的需要,這就是繼承。遺產繼承

多型是指程式中定義的引用變數所指向的具體型別和通過該引用變數發出的方法呼叫在程式設計時並不確定,而是在程式執行期間才確定,即一個引用變數倒底會指向哪個類的例項物件,該引用變數發出的方法呼叫到底是哪個類中實現的方法,必須在由程式執行期間才能決定。

 

Object obj = new xxx();

UserDao userDao = new UserDaoJdbcImpl();

UserDao userDao = new UserDaoHibernateImpl();

靠的是父類或介面定義的引用變數可以指向子類或具體實現類的例項物件,而程式呼叫的方法在執行期才動態繫結,就是引用變數所指向的具體例項物件的方法,也就是記憶體里正在執行的那個物件的方法,而不是引用變數的型別中定義的方法。

 

 

原則:回答比較抽象問題的時候,要舉例說明

 

2.1.5有了基本資料型別,為什麼還需要包裝型別?

基本資料型別,java中提供了8中基本的資料型別。boolean int float等

 

包裝型別:每一個基本的資料型別都會一一對應一個包裝型別。

boolean ----->Boolean

Int -------->Integer

 

 

裝箱和拆箱

裝箱:把基本的資料型別轉換成對應的包裝型別.

Integer .valueOf(1)

Integer i = 1;自動裝箱,實際上在編譯時會呼叫Integer .valueOf方法來裝箱

拆箱:就是把包裝型別轉換為基本資料型別.基本資料型別 名稱 = 對應的包裝型別。

Integer i = 1;

int j = i;//自動拆箱//int j = i=intValue();手動拆箱

自動拆箱:實際上會在編譯呼叫intValue

 

Java是一個面向物件的語言,而基本的資料型別,不具備面向物件的特性。

null Integer--->null int---->0 用Integer和int分別表示Person這個類的ID

Max 最大值

min 最小值

快取值:物件快取,Integer i=1; integer j= 1;i ==j

 

 

 

2.1.6、說一下"=="和equals方法究竟有什麼區別?

非常經典的一個面試題?先說清楚一個,再來說另一個?

==用來判斷兩個變數之間的的值是否相等。變數就可以分為基本資料型別變數,引用型別。

如果是基本資料型別的變數直接比較值而引用型別要比較對應的引用的記憶體的首地址。

 

equals 用來比較兩個物件長得是否一樣。判斷兩個物件的某些特徵是否一樣。實際上就是呼叫物件的equals方法進行比較。

 

2.1.7講一下String和StringBuilder的區別(final)?StringBuffer和StringBuilder的區別?

 

1.在java中提供三個類String StringBuillder StringBuffer來表示和操作字串。字串就是多個字元的集合。

String是內容不可變的字串。String底層使用了一個不可變的字元陣列(final char[])

String str =new String(“bbbb”);

而StringBuillder StringBuffer,是內容可以改變的字串。StringBuillder StringBuffer底層使用的可變的字元陣列(沒有使用final來修飾)

 

2.最經典就是拼接字串。

  1. String進行拼接.String c = “a”+”b”;
  2. StringBuilder或者StringBuffer

StringBuilder sb = new StringBuilder(); sb.apend(“a”).apend(“b”)

 

拼接字串不能使用String進行拼接,要使用StringBuilder或者StringBuffer

 

3.StringBuilder是執行緒不安全的,效率較高.而StringBuffer是執行緒安全的,效率較低。

 

2.1.8、講一下java中的集合?

Java中的集合分為value,key--vale(Conllection Map)兩種。

儲存值有分為List 和Set.

List是有序的,可以重複的。

Set是無序的,不可以重複的。根據equals和hashcode判斷,也就是如果

一個物件要儲存在Set中,必須重寫equals和hashCode方法。

儲存key-value的為map.

 

 

  1. ArrayList和LinkedList的區別?

  List常用的ArrayList和LinkedList。區別和使用場景?

  ArrayList底層使用時陣列。LinkedList使用的是連結串列。

  陣列查詢具有所有查詢特定元素比較快。而插入和刪除和修改比較慢(陣列在記憶體中是一塊連續的記憶體,如果插入或刪除是需要移動記憶體)。

  連結串列不要求記憶體是連續的,在當前元素中存放下一個或上一個元素的地址。查詢時需要從頭部開始,一個一個的找。所以查詢效率低。插入時不需要移動記憶體,只需改變引用指向即可。所以插入或者刪除的效率高。

 

ArrayList使用在查詢比較多,但是插入和刪除比較少的情況,而LinkedList使用在查詢比較少而插入和刪除比較多的情況。

 

 

 

 

 

2.1.9講一下HashMap哈HashTable的區別?HashTable和ConcurrentHashMap的區別?

相同點:HashMap和HasheTalbe都可以使用來儲存key--value的資料。

區別:

  1. HashMap是可以把null作為key或者value的,而HashTable是不可以的。
  2. HashMap是執行緒不安全的,效率較高。而HashTalbe是執行緒安全的,效率較低。

 

?我想執行緒安全但是我又想效率高?

通過把整個Map分為N個Segment(類似HashTable),可以提供相同的執行緒安全,但是效率提升N倍,預設提升16倍。

   

2.1.10、實現一個拷貝檔案的工具類使用位元組流還是字元流?

我們拷貝的檔案不確定是隻包含字元流,有可以能有位元組流(圖片、聲音、影象等),為考慮到通用性,要使用位元組流。

 

 

2.1.11、講一下執行緒的幾種實現方式?啟動方式?區分方式?

①實現方式

  1. 通過繼承Thread類實現一個執行緒
  2. 通過實現Runnable介面實現一個執行緒

   繼承擴充套件性不強,java總只支援單繼承,如果一個類繼承Thread就不能繼承其他的類了。

②怎麼啟動?

   Thread thread = new Thread(繼承了Thread的物件/實現了Runnable的物件)

   thread.setName(“設定一個執行緒名稱”);

   thread.start();

   啟動執行緒使用start方法,而啟動了以後執行的是run方法。

③怎麼區分執行緒?在一個系統中有很多執行緒,每個執行緒都會列印日誌,我想區分是哪個執行緒列印的怎麼辦?

   thread.setName(“設定一個執行緒名稱”); 這是一種規範,在建立執行緒完成後,都需要設定名稱。

 

 

2.1.12有沒有使用過執行緒併發庫?

簡單瞭解過?

JDK5中增加了Doug Lea的併發庫,這一引進給Java執行緒的管理和使用提供了強大的便利性。 java.util.current包中提供了對執行緒優化、管理的各項操作,使得執行緒的使用變得的心應手。該包提供了執行緒的執行,執行緒池的建立,執行緒生命週期的控制.

 

Java通過Executors提供四個靜態方法建立四種執行緒池,分別為:

newCachedThreadPool建立一個可快取執行緒池,如果執行緒池長度超過處理需要,可靈活回收空閒執行緒,若無可回收,則新建執行緒。

newFixedThreadPool 建立一個定長執行緒池,可控制執行緒最大併發數,超出的執行緒會在佇列中等待。

newScheduledThreadPool 建立一個定長執行緒池,支援定時及週期性任務執行。

newSingleThreadExecutor 建立一個單執行緒化的執行緒池,它只會用唯一的工作執行緒來執行任務,保證所有任務按照指定順序(FIFO, LIFO, 優先順序)執行

 

2.1.13執行緒池的作用?

  1. 限定執行緒的個數,不會導致由於執行緒過多導致系統執行緩慢或崩潰
  2. 執行緒池不需要每次都去建立或銷燬,節約了資源、
  3. 執行緒池不需要每次都去建立,響應時間更快。

連線池也是一樣?

 

2.1.14講一下什麼是設計模式?常用的設計模式有哪些?

設計模式就是經過前人無數次的實踐總結出的,設計過程中可以反覆使用的、可以解決特定問題的設計方法

 

單例(飽漢模式、飢漢模式)

  1. 構造方法私有化,讓出了自己類中能建立外其他地方都不能建立

2、在自己的類中建立一個單例項(飽漢模式是一出來就建立建立單例項,而飢漢模式需要的時候才建立)

3、提供一個方法獲取該例項物件(建立時需要進行方法同步)

工廠模式:Spring IOC就是使用了工廠模式.

       物件的建立交給一個工廠去建立。

代理模式:Spring AOP就是使用的動態代理。

 

2.2 java web部分

2.2.1講一下http get和post請求的區別?

 

GET和POST請求都是http的請求方式,使用者通過不同的http的請求方式完成對資源(url)的不同操作。GET,POST,PUT,DELETE就對應著對這個資源的查 ,改 ,增 ,刪 4個操作,具體點來講GET一般用於獲取/查詢資源資訊,而POST一般用於更新資源資訊

 

 

 

1、Get請求提交的資料會在位址列顯示出來,而post請求不會再位址列顯示出來.

GET提交,請求的資料會附在URL之後(就是把資料放置在HTTP協議頭中),以?分割URL和傳輸資料,多個引數用&連線;POST提交:把提交的資料放置在是HTTP包的包體中。 因此,GET提交的資料會在位址列中顯示出來,而POST提交,位址列不會改變

2、傳輸資料的大小

http Get請求由於瀏覽器對地址長度的限制而導致傳輸的資料有限制。而POST請求不會因為地址長度限制而導致傳輸資料限制。

3、安全性,POST的安全性要比GET的安全性高。由於資料是會在地址中呈現,所以可以通過歷史記錄找到密碼等關鍵資訊。

2.2.2 說一下你對servlet的理解?或者servlet是什麼?

Servlet(Server Applet),全稱Java Servlet是用Java編寫的伺服器端程式。而這些Sevlet都要實現Servlet這個藉口。其主要功能在於互動式地瀏覽和修改資料,生成動態Web內容。Servlet運行於支援Java的應用伺服器中。

 

HttpServlet 重寫doGet和doPost方法或者你也可以重寫service方法完成對get和post請求的響應

2.2.3簡單說一下servlet的生命週期?

servlet有良好的生存期的定義,包括載入例項化初始化處理請求以及服務結束。這個生存期由javax.servlet.Servlet介面的init,service和destroy方法表達。

 

載入Servlet的class---->例項化Servlet----->呼叫Servlet的init完成初始化---->響應請求(Servlet的service方法)----->Servlet容器關閉時(Servlet的destory方法)

 

Servlet啟動時,開始載入servlet生命週期開始。Servlet被伺服器例項化後,容器執行其init方法,請求到達時執行其service方法,service方法自動派遣執行與請求對應的doXXX方法(doGet,doPost)等,當伺服器決定將例項銷燬的時候(伺服器關閉)呼叫其destroy方法。

 

 

2.2.4 Servlet API中forward() 與redirect()的區別?

  1. forward是伺服器端的轉向而redirect是客戶端的跳轉。
  2. 使用forward瀏覽器的地址不會發生改變。而redirect會發生改變。
  3. Forward是一次請求中完成。而redirect是重新發起請求。
  4. Forward是在伺服器端完成,而不用客戶端重新發起請求,效率較高。

 

 

2.2.5 JSP和Servlet有哪些相同點和不同點?

JSP是Servlet技術的擴充套件,所有的jsp檔案都會被翻譯為一個繼承HttpServlet的類。也就是jsp最終也是一個Servlet.這個Servlet對外提供服務。

Servlet和JSP最主要的不同點在於JSP側重於檢視,Servlet主要用於控制邏輯。

 

Servlet如果要實現html的功能,必須使用Writer輸出對應的html,比較麻煩。而JSP的情況是Java和HTML可以組合成一個副檔名為.jsp的檔案,做介面展示比較方便而嵌入邏輯比較複雜。

 

 

2.2.6 jsp有哪些內建物件?作用分別是什麼?

9個內建的物件:

request 使用者端請求,此請求會包含來自GET/POST請求的引數

response 網頁傳回使用者端的迴應

pageContext 網頁的屬性是在這裡管理

session 與請求有關的會話期

application servlet正在執行的內容

out 用來傳送回應的輸出

config servlet的構架部件

page JSP網頁本身

exception 針對錯誤網頁,未捕捉的例外

四大作用域:pageContext request session application 可以通過jstl從四大作用域中取值.

Jsp傳遞值request session application cookie也能傳值

 

 

2.2.7說一下session和cookie的區別?你在專案中都有哪些地方使用了?

Session和cookie都是會話(Seesion)跟蹤技術。Cookie通過在客戶端記錄資訊確定使用者身份,Session通過在伺服器端記錄資訊確定使用者身份。但是Session的實現依賴於Cookie,sessionId(session的唯一標識需要存放在客戶端).

cookie 和session 的區別:

1、cookie資料存放在客戶的瀏覽器上,session資料放在伺服器上。

2、cookie不是很安全,別人可以分析存放在本地的COOKIE並進行COOKIE欺騙
   考慮到安全應當使用session。

3、session會在一定時間內儲存在伺服器上。當訪問增多,會比較佔用你伺服器的效能,考慮到減輕伺服器效能方面,應當使用COOKIE。

4、單個cookie儲存的資料不能超過4K,很多瀏覽器都限制一個站點最多儲存20個cookie。

5、所以個人建議:
   將登陸資訊等重要資訊存放為SESSION
   其他資訊如果需要保留,可以放在COOKIE中,比如購物車

 

購物車最好使用cookie,但是cookie是可以在客戶端禁用的,這時候我們要使用cookie+資料庫的方式實現,當從cookie中不能取出資料時,就從資料庫獲取。

 

2.2.8、MVC的各個部分都有那些技術來實現?

M(Model) 模型 javabean

V(View) 檢視  html jsp volicity freemaker

C(Control) 控制器 Servlet,Action

 

 

Jsp+Servlet+javabean 最經典mvc模式,實際上就是model2的實現方式,就是把檢視和邏輯隔離開來

Model1的方式 jsp+service+dao

MOdel2的方式 jsp+servlet+service+dao

 

使用struts2和springmvc這樣的mvc框架後,jsp+核心控制器+action+javabean

 

2.3資料庫部分

2.3.1資料庫的分類及常用的資料庫

      資料庫分為:關係型資料庫和非關係型資料庫

          關係型:mysql oracle sqlserver等

          非關係型:redis,memcache,mogodb,hadoop等

2.3.2簡單介紹一下關係資料庫三正規化?

    正規化就是規範,就是關係型資料庫在設計表時,要遵循的三個規範。

要想滿足第二正規化必須先滿足第一正規化,要滿足第三正規化必須先滿足第二正規化。

 

第一正規化(1NF)是指資料庫表的每一列都是不可分割的基本資料項,同一列中不能有多個值,即實體中的某個屬性不能有多個值或者不能有重複的屬性。列資料的不可分割

 

二正規化(2NF)要求資料庫表中的每個行必須可以被唯一地區分。為實現區分通常需要為表加上一個列,以儲存各個例項的唯一標識。(主鍵)

 

 滿足第三正規化(3NF)必須先滿足第二正規化(2NF)。簡而言之,第三正規化(3NF)要求一個數據庫表中不包含已在其它表中已包含的非主關鍵字資訊。(外來鍵)

 

反三正規化,有的時候為了效率,可以設定重複或者可以推匯出的欄位.

        訂單(總價)和訂單項(單價)

 

2.3.3事務四個基本特徵或 ACID 特性。

事務是併發控制的單位,是使用者定義的一個操作序列。這些操作要麼都做,要麼都不做,是一個不可分割的工作單位。

一個轉賬必須 A賬號扣錢成功,B賬號加錢成功,才算正真的轉賬成功。

  事務必須滿足四大特徵:原子性,一致性,隔離性永續性/持續性

 原子性:表示事務內操作不可分割。要麼都成功、要麼都是失敗.

 一致性:要麼都成功、要麼都是失敗.後面的失敗了要對前面的操作進行回滾。

 隔離性:一個事務開始後,不能後其他事務干擾。

 永續性/持續性:表示事務開始了,就不能終止。

2.3.4 mysql資料庫的預設的最大連線數?

100

 為什麼需要最大連線數?特定伺服器上面的資料庫只能支援一定數目同時連線,這時候我們一般都會設定最大連線數(最多同時服務多少連線)。在資料庫安裝時都會有一個預設的最大連線數為100

 

2.3.5說一下msyql的分頁?Oracle的分頁?

為什麼需要分頁?在很多資料是,不可能完全顯示資料。進行分段顯示.

 

Mysql是使用關鍵字limit來進行分頁的 limit offset,size 表示從多少索引去多少位.

Oracle的分頁,大部分情況下,我們是記不住了。說思路,要使用三層巢狀查詢。

   Oracle的分頁有點兒記不住了,只記得一些大概。是使用了三層巢狀查詢。如果在工作中使用了,可以到原來的專案中拷貝或上網查詢。

mysql:

  

String sql =

"select * from students order by id limit " + pageSize*(pageNumber-1) + "," + pageSize;



oracle:



String sql =

 "select * from " +  

 (select *,rownum rid from (select * from students order by postime desc) where rid<=" + pagesize*pagenumber + ") as t" +

 "where t>" + pageSize*(pageNumber-1);

 

2.3.6簡單講一下資料庫的觸發器的使用場景?

觸發器,需要有觸發條件,當條件滿足以後做什麼操作。

 

觸發器用處還是很多的,比如校內網、開心網、Facebook,你發一個日誌,自動通知好友,其實就是在增加日誌時做一個後觸發,再向通知表中寫入條目。因為觸發器效率高。而UCH沒有用觸發器,效率和資料處理能力都很低。

 

每插入一個帖子,都希望將版面表中的最後發帖時間帖子總數欄位進行同步更新,用觸發器做效率就很高。

 

 

create table board1(id int primary key auto_increment,name varchar(50),ar

ticleCount int);

 

create table article1(id int primary key auto_increment,title varchar(50)

,bid int references board1(id));

 

delimiter |#把分割符;改成|

 

create trigger insertArticle_Trigger after insert on article1 for each ro

w begin

    -> update board1 set articleCount=articleCount+1 where id= NEW.bid;

    -> end;

    -> |

 

delimiter ;

 

insert into board1 value (null,'test',0);

 

insert into article1 value(null,'test',1);

 

 

2.3.7 簡單講一下資料庫的儲存過程的使用場景?

資料庫儲存過程具有如下優點:

1、儲存過程只在建立時進行編譯,以後每次執行儲存過程都不需再重新編譯,而一般 SQL 語句每執行一次就編譯一次,因此使用儲存過程可以大大提高資料庫執行速度。

2、通常,複雜的業務邏輯需要多條 SQL 語句。這些語句要分別地從客戶機發送到伺服器,當客戶機和伺服器之間的操作很多時,將產生大量的網路傳輸。如果將這些操作放在一個儲存過程中,那麼客戶機和伺服器之間的網路傳輸就會大大減少,降低了網路負載。

3、儲存過程建立一次便可以重複使用,從而可以減少資料庫開發人員的工作量。

4、安全性高,儲存過程可以遮蔽對底層資料庫物件的直接訪問,使用 EXECUTE 許可權呼叫儲存過程,無需擁有訪問底層資料庫物件的顯式許可權。

 

正是由於儲存過程的上述優點,目前常用的資料庫都支援儲存過程,例如 IBM DB2,Microsoft SQL Server,Oracle,Access 等,開源資料庫系統 MySQL 也在 5.0 的時候實現了對儲存過程的支援。

 

定義儲存過程:

create procedure insert_Student (_name varchar(50),_age int ,out _id int)

begin

insert into student value(null,_name,_age);

select max(stuId) into _id from student;

end;

 

call insert_Student('wfz',23,@id);

select @id;

 

 

 

2.3.8 用jdbc怎麼呼叫儲存過程?

賈璉欲執事

載入驅動

獲取連線

設定引數

執行

釋放連線

 

package com.huawei.interview.lym;

 

import java.sql.CallableStatement;

import java.sql.Connection;

import java.sql.DriverManager;

import java.sql.SQLException;

import java.sql.Types;

 

public class JdbcTest {

 

/**

 * @param args

 */

public static void main(String[] args) {

// TODO Auto-generated method stub

Connection cn = null;

CallableStatement cstmt = null;

try {

//這裡最好不要這麼幹,因為驅動名寫死在程式中了

Class.forName("com.mysql.jdbc.Driver");

//實際專案中,這裡應用DataSource資料,如果用框架,

//這個資料來源不需要我們編碼建立,我們只需Datasource ds = context.lookup()

//cn = ds.getConnection();

cn = DriverManager.getConnection("jdbc:mysql:///test","root","root");

cstmt = cn.prepareCall("{call insert_Student(?,?,?)}");

cstmt.registerOutParameter(3,Types.INTEGER);

cstmt.setString(1, "wangwu");

cstmt.setInt(2, 25);

cstmt.execute();

//get第幾個,不同的資料庫不一樣,建議不寫

System.out.println(cstmt.getString(3));

} catch (Exception e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

finally

{

 

/*try{cstmt.close();}catch(Exception e){}

try{cn.close();}catch(Exception e){}*/

try {

if(cstmt != null)

cstmt.close();

if(cn != null)

cn.close();

} catch (SQLException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

}

}

 

2.3.9常用SQL

2.3.10簡單說一下你對jdbc的理解?

Java database connection java資料庫連線.資料庫管理系統(mysql oracle等)是很多,每個資料庫管理系統支援的命令是不一樣的。

 

Java只定義介面,讓資料庫廠商自己實現介面,對於我們者而言。只需要匯入對應廠商開發的實現即可。然後以介面方式進行呼叫.(mysql + mysql驅動(實現)+jdbc)

 

2.3.11 寫一個簡單的jdbc的程式。寫一個訪問oracle資料的jdbc程式?

賈璉欲執事

載入驅動(com.mysql.jdbc.Driver,oracle.jdbc.driver.OracleDriver)

獲取連線(DriverManager.getConnection(url,usernam,passord))

設定引數  Statement PreparedStatement

           cstmt.setXXX(index, value);

執行   executeQuery executeUpdate

釋放連線(是否連線要從小到大,必須放到finnaly)

 

2.3.12 JDBC中的PreparedStatement相比Statement的好處

大多數我們都使用PreparedStatement代替Statement

1:PreparedStatement是預編譯的,比Statement速度快 

2:程式碼的可讀性和可維護性

雖然用PreparedStatement來代替Statement會使程式碼多出幾行,但這樣的程式碼無論從可讀性還是可維護性上來說.都比直接用Statement的程式碼高很多檔次:

stmt.executeUpdate("insert into tb_name (col1,col2,col2,col4) values ('"+var1+"','"+var2+"',"+var3+",'"+var4+"')"); 

perstmt = con.prepareStatement("insert into tb_name (col1,col2,col2,col4) values (?,?,?,?)");

perstmt.setString(1,var1);

perstmt.setString(2,var2);

perstmt.setString(3,var3);

perstmt.setString(4,var4);

perstmt.executeUpdate();

不用我多說,對於第一種方法,別說其他人去讀你的程式碼,就是你自己過一段時間再去讀,都會覺得傷心。

 

3:安全性

PreparedStatement可以防止SQL注入攻擊,而Statement卻不能。比如說:

String sql = "select * from tb_name where name= '"+varname+"' and passwd='"+varpasswd+"'";

如果我們把[' or '1' = '1]作為varpasswd傳入進來.使用者名稱隨意,看看會成為什麼?

select * from tb_name = '隨意' and passwd = '' or '1' = '1';

因為'1'='1'肯定成立,所以可以任何通過驗證,更有甚者:

把[';drop table tb_name;]作為varpasswd傳入進來,則:

select * from tb_name = '隨意' and passwd = '';drop table tb_name;有些資料庫是不會讓你成功的,但也有很多資料庫就可以使這些語句得到執行。

而如果你使用預編譯語句你傳入的任何內容就不會和原來的語句發生任何匹配的關係只要全使用預編譯語句你就用不著對傳入的資料做任何過慮。而如果使用普通的statement,有可能要對drop等做費盡心機的判斷和過慮。

2.3.13 資料庫連線池作用

1、限定資料庫的個數,不會導致由於資料庫連線過多導致系統執行緩慢或崩潰

2、資料庫連線不需要每次都去建立或銷燬,節約了資源

3、資料庫連線不需要每次都去建立,響應時間更快。

2.4 前端部分

2.4.1簡單說一下html,css,javascript在網頁開發中的定位?

HTML 超文字標記語言 定義網頁的結構

CSS 層疊樣式表,用來美化頁面

JavaScript主要用來驗證表單,做動態互動(其中ajax)

 

2.4.2簡單介紹一下Ajax?

  什麼是Ajax? 非同步的javascript和xml

  作用是什麼?通過AJAX與伺服器進行資料交換,AJAX可以使網頁實現佈局更新。

      這意味著可以在不重新載入整個網頁的情況下,對網頁的某部分進行更新。

  怎麼來實現Ajax XmlHttpRequest物件,使用這個物件可以異步向伺服器傳送請求,獲取獲取響應,完成區域性更新。Open send responseText/responseXML 區域性響應.

  使用場景 登陸失敗時不跳轉頁面,註冊時提示使用者名稱是否存在,二級聯動等等使用場景

2.4.3 js和jQuery的關係?

  jQuery是一個js框架,封裝了js的屬性和方法。讓使用者使用起來更加便利。

,並且增強了js的功能.

 

使用原生js是要處理很多相容性的問題(註冊事件等),由jQuery封裝了底層,就不用處理相容性問題。

原生的js的dom和事件繫結和Ajax等操作非常麻煩,jQuery封裝以後操作非常方便。

2.4.4 jQuery的常用選擇器?

ID選擇器   通過ID獲取一個元素

Class選擇器 通過類(css)獲取元素

標籤選擇器 通過標籤獲取元素

通用選擇器(*) 獲取所以的元素

div.myCls  獲取有myCls這個類的div

層次選擇器

     兒子選擇器 > 獲取下面的子元素

     後代選擇器 空格 獲取下面後代,包括兒子、孫子等後代

屬性選擇器

    Tag[attrName=’test’] 獲取有屬性名為xxxx並且屬性的值為test的所有xxx標籤

    <input type=”checkbox” name=”hobby”/> 吃飯<br/>

    <input type=”checkbox” name=”hobby”/> 睡覺<br/>

   Input[name=’hobby’],表示獲取屬性名為name並且name屬性值為hobby的的所有input標籤元素

 

 

2.4.5 jQuery的頁面載入完畢事件?

    很多時候我們需要獲取元素,但是必須等到該元素被載入完成後才能獲取。我們可以把js程式碼放到該元素的後面,但是這樣就會造成js在我們的body中存在不好管理。所有頁面載入完畢後所有的元素當然已經載入完畢。一般獲取元素做操作都要在頁面載入完畢後操作。

第一種:

$(document).ready(function(){

});

 

$(document)把原生的document這個dom物件轉換為jQuery物件,轉換完成後才能呼叫ready方法

 

ready(fn),表示的是頁面結構被載入完畢後執行傳入函式fn

第二種:

$(function(){

});

 

當頁面載入完畢後執行裡面的函式,這一種相對簡單,用得最多。

window.onload的區別

  1. jQuery中的頁面載入完畢事件,表示的是頁面結構被載入完畢。
  2. window.onload 表示的是頁面被載入完畢。

  <img src=”htttp://baidu.com/1.jpg”/> onload必須等等頁面中的圖片、聲音、影象等遠端資源被載入完畢後才呼叫而jQuery中只需要頁面結構被載入完畢。

 

 

2.4.6 Jquery的Ajax和原生Js實現Ajax有什麼關係?

jQuery中的Ajax也是通過原生的js封裝的。封裝完成後讓我們使用起來更加便利,不用考慮底層實現或相容性等處理。

 

如果採用原生js實現Ajax是非常麻煩的,並且每次都是一樣的。如果我們不使用jQuery我們也要封裝Ajax物件的方法和屬性。有像jQuery這些已經封裝完成,並經過很多企業實際的框架,比較可靠並且開源。我們就不需要封裝,直接使用成熟的框架(jQuery)即可.

 

2.4.7簡單說一下html5?你對現在的那些新技術有了解?

Html5是最新版本的html,是在原來html4的基礎上增強了一些標籤。

 

Html增加一些像畫板、聲音、視訊、web儲存等高階功能。但是html5有一個不好的地方,那就是html5太強調語義了,導致開發中都不知道要選擇那個標籤。

  在做頁面佈局是,無論頭部、主題、導航等模組都使用div來表示,但是html5的規範,需要使用不同的標籤來表示。(header footer等)

 

 

你對現在的那些新技術有了解

Html5 css3等

 

2.4.8 簡單說一下css3?

   Css3是最新版本的css,是對原理css2的功能增強。

 

   Css3中提供一些原來css2中實現起來比較困難或者不能實現的功能。

     1、盒子圓角邊框

     2、盒子和文字的陰影

     3、漸變

     4、轉換 移動、縮放、旋轉等

     5、過渡、動畫都可以使用動畫。

     6、可以使用媒體查詢實現響應式網站。

   Css3最大缺點就是要根據不同的瀏覽器處理相容性。對應有一些處理相容性的工具。不用擔心.

2.4.9 bootstrap是什麼?

BootStrap是一個移動裝置優先的UI框架。我們可以不用謝任何css,js程式碼就能實現比較漂亮的有互動性的頁面我們程式設計師對頁面的編寫是有硬傷的,所有要自己寫頁面的話就要使用類似於bootstrap這樣的UI框架。

 

平時用得很多的:

  1. 模態框
  2. 表單,表單項
  3. 佈局
  4. 刪格系統

 

 

 

2.5 框架部分

2.5.1什麼是框架?

  框架(Framework)是一個框子——指其約束性,也是一個架子——指其支撐性。

 

  IT語境中的框架,特指為解決一個開放性問題而設計的具有一定約束性支撐結構。在此結構上可以根據具體問題擴充套件、安插更多的組成部分,從而更迅速和方便地構建完整的解決問題的方案。

 

1)框架本身一般不完整到可以解決特定問題,但是可以幫助您快速解決特定問題;

   沒有框架所有的工作都從零開始做,有了框架,為我們提供了一定的功能,我們就可以在框 架的基礎上開發,極大的解放了生產力。

不同的框架,是為了解決不同領域的問題。一定要為了解決問題才去學習框架。

2)框架天生就是為擴充套件而設計的;

3)框架裡面可以為後續擴充套件的元件提供很多輔助性、支撐性的方便易用的實用工具(utilities),也就是說框架時常配套了一些幫助解決某類問題的庫(libraries)或工具(tools)。

  java中就是一系列的jar包,其本質就是對jdk功能的擴充套件.

 

2.5.2 MVC模式

   MVC全名是Model View Controller,是模型(model)-檢視(view)-控制器(controller)的縮寫,一種軟體設計典範,用一種業務邏輯、資料、介面顯示分離的方法組織程式碼,將業務邏輯聚集到一個部件裡面,在改進和個性化定製介面及使用者互動的同時,不需要重新編寫業務邏輯。

 

最簡單的、最經典就是Jsp(view) +Servlet(controller) + JavaBean(model)

 

 

  1. 當控制器收到來自使用者的請求
  2. 控制器呼叫JavaBean完成業務
  3. 完成業務後通過控制器跳轉JSP頁面的方式給使用者反饋資訊
  4. Jsp個 使用者做出響應。

    控制器都是核心

 

2.5.3 MVC框架

什麼是MVC框架?

  是為了解決傳統MVC模式(Jsp + Servlet + JavaBean)的一些問題而出現的框架

 

傳統MVC模式問題

  1. 所有的Servlet和Servlet對映都要配置在web.xml中,如果專案太