JAVA面試筆記

1、面試總體流程javascript

 1.1 簡單的自我介紹

      我是xxxx,工做xxx年.我前後在xxxx公司、yyyy公司工做。前後作個xxxx項目、yyyy項目。css

 1.2 你簡單介紹一下xxxx項目

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

 1.3 會問一下JAVA的專業技能

     後面詳細講解前端

 1.4你還有什麼須要詢問個人嗎

     公司要作的項目?項目中會使用一下什麼技術?html5

 

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

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

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

2、java的專業技能

2.1 java的基礎部分

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

      因爲各操做系統(windows,liunx等)支持的指令集,不是徹底一致的。就會讓咱們的程序在不一樣的操做系統上要執行不一樣程序代碼。Java開發了適用於不一樣操做系統及位數的java虛擬機來屏蔽個系統之間的差別,提供統一的接口。對於咱們java開發者而言,你只須要在不一樣的系統上安裝對應的不一樣java虛擬機、這時你的java程序只要遵循java規範,就能夠在全部的操做系統上面運行java程序了。android

 

 

Java經過不一樣的系統、不一樣版本、不一樣位數的java虛擬機(jvm),來屏蔽不一樣的系統指令集差別而對外體通通一的接口(java API),對於咱們普通的java開發者而言,只須要按照接口開發便可。若是我係統須要部署到不一樣的環境時,只需在系統上面按照對應版本的虛擬機便可。ios

 

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

Java開發環境須要些什麼?

 

一、適用於咱們開發環境的jdk

二、對應開發環境eclipse

三、還須要web服務器(tomcat)

 

1、下載對應組件

2、安裝

Jdk,安裝正常流程安裝便可,配置咱們的JAVA_HOME,由於後面的eclispe和tomcat會依賴於這個變量.

Eclispe正常解壓就ok,設置workspace的默認編碼

Tomcat 正常解壓就ok,把tomcat集成到eclispe中,安裝插件就OK。

.......

Svn/git

 

 

2.1.3講一下javaint數據佔幾個字節

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講一下StringStringBuilder的區別(final)StringBufferStringBuilder的區別?

 

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

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

 

String str =new String(「bbbb」);

而StringBuillder StringBuffer,是內容能夠改變的字符串。StringBuillder StringBuffer底層使用的可變的字符數組(沒有使用final來修飾)

 

 

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

一、String進行拼接.String c = 「a」+」b」;

二、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.

 

 

八、ArrayList和LinkedList的區別?

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

  ArrayList底層使用時數組。LinkedList使用的是鏈表。

  數組查詢具備全部查詢特定元素比較快。而插入和刪除和修改比較慢(數組在內存中是一塊連續的內存,若是插入或刪除是須要移動內存)。

  鏈表不要求內存是連續的,在當前元素中存放下一個或上一個元素的地址。查詢時須要從頭部開始,一個一個的找。因此查詢效率低。插入時不須要移動內存,只需改變引用指向便可。因此插入或者刪除的效率高。

 

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

 

 

 

 

 

2.1.9講一下HashMapHashTable的區別?HashTableConcurrentHashMap的區別?

相同點:HashMap和HasheTalbe均可以使用來存儲key--value的數據。

區別:

一、HashMap是能夠把null做爲key或者value的,而HashTable是不能夠的。

二、HashMap是線程不安全的,效率較高。而HashTalbe是線程安全的,效率較低。

 

?我想線程安全可是我又想效率高?

經過把整個Map分爲N個Segment(相似HashTable),能夠提供相同的線程安全,可是效率提高N倍,默認提高16倍。

  

2.1.10、實現一個拷貝文件的工具類使用字節流仍是字符流?

咱們拷貝的文件不肯定是隻包含字符流,有能夠能有字節流(圖片、聲音、圖像等),爲考慮到通用性,要使用字節流。

 

 

2.1.11、講一下線程的幾種實現方式?啓動方式?區分方式?

①實現方式

一、經過繼承Thread類實現一個線程

二、經過實現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線程池的做用?

一、限定線程的個數,不會致使因爲線程過多致使系統運行緩慢或崩潰

二、線程池不須要每次都去建立或銷燬,節約了資源、

三、線程池不須要每次都去建立,響應時間更快。

鏈接池也是同樣?

 

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

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

 

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

一、構造方法私有化,讓出了本身類中能建立外其餘地方都不能建立

二、在本身的類中建立一個單實例(飽漢模式是一出來就建立建立單實例,而飢漢模式須要的時候才建立)

三、提供一個方法獲取該實例對象(建立時須要進行方法同步)

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

       對象的建立交給一個工廠去建立。

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

 

2.2 java web部分

2.2.1講一下http getpost請求的區別?

 

GET和POST請求都是http的請求方式,用戶經過不一樣的http的請求方式完成對資源(url)的不一樣操做。GET,POST,PUT,DELETE就對應着對這個資源的查 ,改 ,增 ,刪 4個操做,具體點來說GET通常用於獲取/查詢資源信息,而POST通常用於更新資源信息

 

 

 

一、Get請求提交的數據會在地址欄顯示出來,而post請求不會再地址欄顯示出來.

GET提交,請求的數據會附在URL以後(就是把數據放置在HTTP協議頭中),以?分割URL和傳輸數據,多個參數用&鏈接;POST提交:把提交的數據放置在是HTTP包的包體中。 所以,GET提交的數據會在地址欄中顯示出來,而POST提交,地址欄不會改變

二、傳輸數據的大小

http Get請求因爲瀏覽器對地址長度的限制而致使傳輸的數據有限制。而POST請求不會由於地址長度限制而致使傳輸數據限制。

三、安全性,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 APIforward() redirect()的區別?

一、forward是服務器端的轉向而redirect是客戶端的跳轉。

二、使用forward瀏覽器的地址不會發生改變。而redirect會發生改變。

三、Forward是一次請求中完成。而redirect是從新發起請求。

四、Forward是在服務器端完成,而不用客戶端從新發起請求,效率較高。

 

 

2.2.5 JSPServlet有哪些相同點和不一樣點?

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說一下sessioncookie的區別?你在項目中都有哪些地方使用了?

Session和cookie都是會話(Seesion)跟蹤技術。Cookie經過在客戶端記錄信息肯定用戶身份,Session經過在服務器端記錄信息肯定用戶身份。可是Session的實現依賴於Cookie,sessionId(session的惟一標識須要存放在客戶端).

cookie session 的區別:

1cookie數據存放在客戶的瀏覽器上,session數據放在服務器上。

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

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

4、單個cookie保存的數據不能超過4K,不少瀏覽器都限制一個站點最多保存20cookie

5、因此我的建議:
   將登錄信息等重要信息存放爲SESSION
  
其餘信息若是須要保留,能夠放在COOKIE中,好比購物車

 

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

 

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

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 簡單講一下數據庫的存儲過程的使用場景?

數據庫存儲過程具備以下優勢:

一、存儲過程只在建立時進行編譯,之後每次執行存儲過程都不需再從新編譯,而通常 SQL 語句每執行一次就編譯一次,所以使用存儲過程能夠大大提升數據庫執行速度。

二、一般,複雜的業務邏輯須要多條 SQL 語句。這些語句要分別地從客戶機發送到服務器,當客戶機和服務器之間的操做不少時,將產生大量的網絡傳輸。若是將這些操做放在一個存儲過程當中,那麼客戶機和服務器之間的網絡傳輸就會大大減小,下降了網絡負載。

三、存儲過程建立一次即可以重複使用,從而能夠減小數據庫開發人員的工做量。

四、安全性高,存儲過程能夠屏蔽對底層數據庫對象的直接訪問,使用 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 數據庫鏈接池做用

一、限定數據庫的個數,不會致使因爲數據庫鏈接過多致使系統運行緩慢或崩潰

二、數據庫鏈接不須要每次都去建立或銷燬,節約了資源

三、數據庫鏈接不須要每次都去建立,響應時間更快。

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 jsjQuery的關係?

  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的區別

一、jQuery中的頁面加載完畢事件,表示的是頁面結構被加載完畢。

二、window.onload 表示的是頁面被加載完畢。

  <img src=」htttp://baidu.com/1.jpg」/> onload必須等等頁面中的圖片、聲音、圖像等遠程資源被加載完畢後才調用而jQuery中只須要頁面結構被加載完畢。

 

 

2.4.6 JqueryAjax和原生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中實現起來比較困難或者不能實現的功能。

     一、盒子圓角邊框

     二、盒子和文字的陰影

     三、漸變

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

     五、過渡、動畫均可以使用動畫。

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

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

2.4.9 bootstrap是什麼?

BootStrap是一個移動設備優先的UI框架。咱們能夠不用謝任何css,js代碼就能實現比較漂亮的有交互性的頁面。咱們程序員對頁面的編寫是有硬傷的,全部要本身寫頁面的話就要使用相似於bootstrap這樣的UI框架。

 

平時用得不少的:

一、模態框

二、表單,表單項

三、佈局

四、刪格系統

 

 

 

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)

 

 

 

一、當控制器收到來自用戶的請求

二、控制器調用JavaBean完成業務

三、完成業務後經過控制器跳轉JSP頁面的方式給用戶反饋信息

四、Jsp個 用戶作出響應。

    控制器都是核心

 

2.5.3 MVC框架

什麼是MVC框架?

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

 

傳統MVC模式問題

一、全部的Servlet和Servlet映射都要配置在web.xml中,若是項目太大,web.xml就太龐大,而且不能實現模塊化管理。

二、Servlet的主要功能就是接受參數、調用邏輯、跳轉頁面,好比像其餘字符編碼、文件上傳等功能也要寫在Servlet中,不能讓Servlet主要功能而須要作處理一下特例。

三、接受參數比較麻煩(String name = request.getParameter(「name」),User user=new User user.setName(name)),不能經過model接收,只能單個接收,接收完成後轉換封裝model.

四、跳轉頁面方式比較單一(forword,redirect),而且當個人頁面名稱發生改變時須要修改Servlet源代碼.

 

如今比較經常使用的MVC框架有:

   struts

   webwork

   Struts2

   Spring MVC

 

 

 

2.5.4 簡單講一下struts2的執行流程?

Struts2的原理?

 

 

 

一個請求在Struts2框架中的處理大概分爲如下幾個步驟:

一、客戶端瀏覽器發送請求

二、這個請求通過一系列的過濾器(Filter)(這些過濾器中有一個叫作ActionContextCleanUp的可選過濾器,這個過濾器對於Struts2和其餘框架的集成頗有幫助,例如:SiteMesh Plugin);

三、接着FilterDispatcher(StrutsPrepareAndExecuteFilter)被調用,FilterDispatcher

(StrutsPrepareAndExecuteFilter)詢問ActionMapper來決定這個請求是否須要調用某個Action;

四、若是ActionMapper決定須要調用某個Action,FilterDispatcher

    (StrutsPrepareAndExecuteFilter)把請求的處理交給ActionProxy;

五、ActionProxy經過Configuration Manager詢問框架的配置文件,找到須要調用的Action類;

六、ActionProxy建立一個ActionInvocation的實例。

七、ActionInvocation實例使用命名模式來調用,在調用Action的過程先後,涉及到相關攔截器(Intercepter)的調用。

八、一旦Action執行完畢,ActionInvocation負責根據struts.xml中的配置找到對應的返回結果。返回結果一般是(但不老是,也多是另外的一個Action鏈)一個須要被表示的JSP或者FreeMarker的模版。在表示的過程當中可使用Struts2框架中繼承的標籤。在這個過程當中須要涉及到ActionMapper。

 

 

 

面試:

一、瀏覽器發送請求,通過一系列的過濾器後,到達核心過濾器(StrutsPrepareAndExecuteFilter).

二、StrutsPrepareAndExecuteFilter經過ActionMapper判斷當前的請求是否須要某個Action處理,若是不須要,則走原來的流程。若是須要則把請求交給ActionProxy來處理

三、ActionProxy經過Configuration Manager詢問框架的配置文件(Struts.xml),找到須要調用的Action類;

四、建立一個ActionInvocation實例,來調用Action的對應方法來獲取結果集的name,在調用先後會執行相關攔截器。

五、經過結果集的Name知道對應的結果集來對瀏覽器進行響應。

 

攔截、判斷、尋找、執行、響應

 

 

2.5.5 Struts2中的攔截器,你都用它幹什麼?

         java裏的攔截器是動態攔截Action調用的對象。它提供了一種機制可使開發者能夠定義在一個action執行的先後執行的代碼,也能夠在一個action執行前阻止其執行,同時也提供了一種能夠提取action中可重用部分的方式。

         在AOP(Aspect-Oriented Programming)中攔截器用於在某個方法或字段被訪問以前,進行攔截而後在以前或以後加入某些操做。

 

面試:

    struts2中的的功能(參數處理、文件上傳、字符編碼等)都是經過系統攔截器實現的。

若是業務須要,固然咱們也能夠自定義攔截器,進行可插拔配置,在執行Action的方法先後、加入相關邏輯完成業務。

使用場景:

一、用戶登陸判斷,在執行Action的前面判斷是否已經登陸,若是沒有登陸的跳轉到登陸頁面。

二、用戶權限判斷,在執行Action的前面判斷是否具備,若是沒有權限就給出提示信息。

三、操做日誌......

    四、......

 

 

 

2.5.6 簡單講一下SpringMVC的執行流程?

 

 

 

  1. 用戶向服務器發送請求,請求被Spring 前端控制Servelt DispatcherServlet捕獲;

  2. DispatcherServlet對請求URL進行解析,獲得請求資源標識符(URI)。而後根據該URI,調用HandlerMapping得到該Handler配置的全部相關的對象(包括Handler對象以及Handler對象對應的攔截器),最後以HandlerExecutionChain對象的形式返回;

 3. DispatcherServlet 根據得到的Handler,選擇一個合適的HandlerAdapter。(附註:若是成功得到HandlerAdapter後,此時將開始執行攔截器的preHandler(...)方法)

   4.  提取Request中的模型數據,填充Handler入參,開始執行Handler(Controller)。 在填充Handler的入參過程當中,根據你的配置,Spring將幫你作一些額外的工做:

      HttpMessageConveter: 將請求消息(如Json、xml等數據)轉換成一個對象,將對象轉換爲指定的響應信息

      數據轉換:對請求消息進行數據轉換。如String轉換成Integer、Double等

      數據根式化:對請求消息進行數據格式化。 如將字符串轉換成格式化數字或格式化日期等

      數據驗證: 驗證數據的有效性(長度、格式等),驗證結果存儲到BindingResult或Error中

      5.  Handler執行完成後,向DispatcherServlet 返回一個ModelAndView對象;

      6.  根據返回的ModelAndView,選擇一個適合的ViewResolver(必須是已經註冊到Spring容器中的ViewResolver)返回給DispatcherServlet ;

      7. ViewResolver 結合Model和View,來渲染視圖

      8. 將渲染結果返回給客戶端。

 

面試:

一、 用戶向服務器發送請求,請求被Spring 前端控制Servelt DispatcherServlet捕獲(捕獲)

二、 DispatcherServlet對請求URL進行解析,獲得請求資源標識符(URI)。而後根據該URI,調用HandlerMapping得到該Handler配置的全部相關的對象(包括Handler對象以及Handler對象對應的攔截器),最後以HandlerExecutionChain對象的形式返回;(查找handler)

三、 DispatcherServlet 根據得到的Handler,選擇一個合適的HandlerAdapter。 提取Request中的模型數據,填充Handler入參,開始執行Handler(Controller), Handler執行完成後,向DispatcherServlet 返回一個ModelAndView對象(執行handler)

四、DispatcherServlet 根據返回的ModelAndView,選擇一個適合的ViewResolver(必須是已經註冊到Spring容器中的ViewResolver) (選擇ViewResolver)

五、經過ViewResolver 結合Model和View,來渲染視圖,DispatcherServlet 將渲染結果返回給客戶端。(渲染返回)

 

快速記憶技巧:

核心控制器捕獲請求、查找Handler、執行Handler、選擇ViewResolver,經過ViewResolver渲染視圖並返回

 

2.5.7 說一下struts2springMVC有什麼不一樣?

 

目前企業中使用SpringMvc的比例已經遠遠超過Struts2,那麼二者到底有什麼區別,是不少初學者比較關注的問題,下面咱們就來對SpringMvc和Struts2進行各方面的比較:

 

1. 核 心控制器(前端控制器、預處理控制器):對於使用過mvc框架的人來講這個詞應該不會陌生,核心控制器的主要用途是處理全部的請求,而後對那些特殊的請求 (控制器)統一的進行處理(字符編碼、文件上傳、參數接受、異常處理等等),spring mvc核心控制器是Servlet,而Struts2是Filter。

 

2.控制器實例:Spring Mvc會比Struts快一些(理論上)。Spring Mvc是基於方法設計,而Sturts是基於對象,每次發一次請求都會實例一個action,每一個action都會被注入 屬性,而Spring更像Servlet同樣,只有一個實例,每次請求執行對應的方法便可(注意:因爲是單例實例,因此應當避免全局變量的修改,這樣會產生線程安全問題)。

 

3. 管理方式:大部分的公司的核心架構中,就會使用到spring,而spring mvc又是spring中的一個模塊,因此spring對於spring mvc的控制器管理更加簡單方便,並且提供了全 註解方式進行管理,各類功能的註解都比較全面,使用簡單,而struts2須要採用XML不少的配置參數來管理(雖然也能夠採用註解,可是幾乎沒有公司那 樣使用)。

 

4.參數傳遞:Struts2中自身提供多種參數接受,其實都是經過(ValueStack)進行傳遞和賦值,而SpringMvc是經過方法的參數進行接收。

 

5.學習難度:Struts更加不少新的技術點,好比攔截器、值棧及OGNL表達式,學習成本較高,springmvc 比較簡單,很較少的時間都能上手。

 

6.intercepter 的實現機制:struts有以本身的interceptor機制,spring mvc用的是獨立的AOP方式。這樣致使struts的配置文件量仍是比spring mvc大,雖然struts的配置能繼承,因此我以爲論使用上來說,spring mvc使用更加簡潔,開發效率Spring MVC確實比struts2高。spring mvc是方法級別的攔截,一個方法對應一個request上下文,而方法同時又跟一個url對應,因此說從架構自己上spring3 mvc就容易實現restful url。struts2是類級別的攔截,一個類對應一個request上下文;實現restful url要費勁,由於struts2 action的一個方法能夠對應一個url;而其類屬性卻被全部方法共享,這也就沒法用註解或其餘方式標識其所屬方法了。spring3 mvc的方法之間基本上獨立的,獨享request response數據,請求數據經過參數獲取,處理結果經過ModelMap交回給框架方法之間不共享變量,而struts2搞的就比較亂,雖然方法之間 也是獨立的,但其全部Action變量是共享的,這不會影響程序運行,卻給咱們編碼,讀程序時帶來麻煩。

 

7.spring mvc處理ajax請求,直接經過返回數據,方法中使用註解@ResponseBody,spring mvc自動幫咱們對象轉換爲JSON數據。而struts2是經過插件的方式進行處理

 

在SpringMVC流行起來以前,Struts2在MVC框架中佔核心地位,隨着SpringMVC的出現,SpringMVC慢慢的取代struts2,可是不少企業都是原來搭建的框架,使用Struts2較多。

2.5.8 說一下Spring中的兩大核心?

Spring是什麼?

spring是J2EE應用程序框架,是輕量級的IoC和AOP的容器框架(相對於重量級的EJB),主要是針對javaBean的生命週期進行管理的輕量級容器,能夠單獨使用,也能夠和Struts框架,ibatis框架等組合使用。

 

一、IOC(Inversion of Control )或DI(Dependency Injection)

       IOC控制權反轉

          原來:個人Service須要調用DAO,Service就須要建立DAO

          Spring:Spring發現你Service依賴於dao,就給你注入.

       核心原理:就是配置文件+反射(工廠也能夠)+容器(map)  

二、AOP:面向切面編程

       核心原理:使用動態代理的設計模式在執行方法先後或出現異常作加入相關邏輯。

      咱們主要使用AOP來作:

      一、事務處理

      二、權限判斷

      三、日誌

      四、....

    

 

2.5.9 AOP是什麼?你都拿它作什麼?       

三、AOP:面向切面編程

       核心原理:使用動態代理的設計模式在執行方法先後或出現異常作加入相關邏輯。

      咱們主要使用AOP來作:

      一、事務處理 執行方法前,開啓事務、執行完成後關閉事務、出現異常後回滾事務

      二、權限判斷 在執行方法前,判斷是否具備權限

      三、日誌     在執行前進行日誌處理

      四、....

 

 

2.5.10講一下Spring的事務傳播特性

多個事務存在是怎麼處理的策略

 

 

1. PROPAGATION_REQUIRED: 若是存在一個事務,則支持當前事務。若是沒有事務則開啓
2. PROPAGATION_SUPPORTS: 若是存在一個事務,支持當前事務。若是沒有事務,則非事務的執行
3. PROPAGATION_MANDATORY: 若是已經存在一個事務,支持當前事務。若是沒有一個活動的事務,則拋出異常。
4. PROPAGATION_REQUIRES_NEW: 老是開啓一個新的事務。若是一個事務已經存在,則將這個存在的事務掛起。
5. PROPAGATION_NOT_SUPPORTED: 老是非事務地執行,並掛起任何存在的事務。
6. PROPAGATION_NEVER: 老是非事務地執行,若是存在一個活動事務,則拋出異常
7. PROPAGATION_NESTED:若是一個活動的事務存在,則運行在一個嵌套的事務中. 若是沒有活動事務, 則按TransactionDefinition.PROPAGATION_REQUIRED 屬性執行

 

 

Propagation

Required 須要 若是存在一個事務,則支持當前事務。若是沒有事務則開啓

Supports 支持 若是存在一個事務,支持當前事務。若是沒有事務,則非事務的執行

Mandatory 必要的 若是已經存在一個事務,支持當前事務。若是沒有一個活動的事務,則拋出異常。

required_new 老是開啓一個新的事務。若是一個事務已經存在,則將這個存在的事務掛起。

Not_support 老是非事務地執行,並掛起任何存在的事務。

Never 毫不 老是非事務地執行,若是存在一個活動事務,則拋出異常

Nested 嵌套的 若是有就嵌套、沒有就開啓事務






2.5.11 Spring事務的隔離級別
1. ISOLATION_DEFAULT: 這是一個PlatfromTransactionManager默認的隔離級別,使用數據庫默認的事務隔離級別.

另外四個與JDBC的隔離級別相對應
2. ISOLATION_READ_UNCOMMITTED: 這是事務最低的隔離級別,它充許令外一個事務能夠看到這個事務未提交的數據。
      這種隔離級別會產生髒讀,不可重複讀和幻像讀。
3. ISOLATION_READ_COMMITTED: 保證一個事務修改的數據提交後才能被另一個事務讀取。另一個事務不能讀取該事務未提交的數據
4. ISOLATION_REPEATABLE_READ: 這種事務隔離級別能夠防止髒讀,不可重複讀。可是可能出現幻像讀。
      它除了保證一個事務不能讀取另外一個事務未提交的數據外,還保證了避免下面的狀況產生(不可重複讀)。
5. ISOLATION_SERIALIZABLE 這是花費最高代價可是最可靠的事務隔離級別。事務被處理爲順序執行。

除了防止髒讀,不可重複讀外,還避免了幻像讀。

 

其中的一些概念的說明:

  髒讀: 指當一個事務正在訪問數據,而且對數據進行了修改,而這種修改尚未提交到數據庫中,這時,另一個事務也訪問這個數據,而後使用了這個數據。由於這個數據是尚未提交的數據, 那麼另一 個事務讀到的這個數據是髒數據,依據髒數據所作的操做多是不正確的。

不可重複讀: 指在一個事務內,屢次讀同一數據。在這個事務尚未結束時,另一個事務也訪問該同一數據。 那麼,在第一個事務中的兩次讀數據之間,因爲第二個事務的修改,那麼第一個事務兩次讀到的數據多是不同的。這樣就發生了在一個事務內兩次讀到的數據是不同的,所以稱爲是不可重複讀。

 幻覺讀: 指當事務不是獨立執行時發生的一種現象,例如第一個事務對一個表中的數據進行了修改,這種修改涉及 到表中的所有數據行。同時,第二個事務也修改這個表中的數據,這種修改是向表中插入一行新數據。那麼,之後就會發生操做第一個事務的用戶發現表中還有沒有修改的數據行,就好象發生了幻覺同樣。

 

2.5.12 什麼是ORM?

 對象關係映射(Object Relational Mapping,簡稱ORM)模式是一種爲了解決面向對象關係數據庫存在的互不匹配的現象的技術。簡單的說,ORM是經過使用描述對象和數據庫之間映射的元數據,將程序中的對象自動持久化到關係數據庫中。那麼,到底如何實現持久化呢?一種簡單的方案是採用硬編碼方式(jdbc操做sql方式),爲每一種可能的數據庫訪問操做提供單獨的方法。

這種方案存在如下不足:

    1.持久化層缺少彈性。一旦出現業務需求的變動,就必須修改持久化層的接口

    2.持久化層同時與域模型與關係數據庫模型綁定,無論域模型仍是關係數據庫模型發生變化,都要修改持久化曾的相關程序代碼,增長了軟件的維護難度。

 

   ORM提供了實現持久化層的另外一種模式,它採用映射元數據來描述對象關係的映射,使得ORM中間件能在任何一個應用的業務邏輯層和數據庫層之間充當橋樑。Java典型的ORM框架有:Hibernate,ibatis(mybatis),speedframework。

   ORM的方法論基於三個核心原則:

     簡單:以最基本的形式建模數據。

     傳達性:數據庫結構被任何人都能理解的語言文檔化。

     精確性:基於數據模型建立正確標準化了的結構。

 

 

   對象關係映射(Object Relational Mapping,簡稱ORM)模式是一種爲了解決面向對象關係數據庫存在的互不匹配的現象的技術。能夠簡單的方案是採用硬編碼方式(jdbc操做sql方式),爲每一種可能的數據庫訪問操做提供單獨的方法。這種方法存在不少缺陷,使用

使用ORM框架(爲了解決解決面向對象關係數據庫存在的互不匹配的現象的框架)來解決.

 

   Hibernate,ibatis(mybatis),

2.5.13 iBatis(mybatis)Hibernate有什麼不一樣?

相同點:

   都是java中orm框架、屏蔽jdbc api的底層訪問細節,使用咱們不用與jdbc api打交道,就能夠完成對數據庫的持久化操做。jdbc api編程流程固定,還將sql語句與java代碼混雜在了一塊兒,常常須要拼湊sql語句,細節很繁瑣。

   ibatis的好處:屏蔽jdbc api的底層訪問細節;將sql語句與java代碼進行分離;提供了將結果集自動封裝稱爲實體對象和對象的集合的功能.queryForList返回對象集合,用queryForObject返回單個對象;提供了自動將實體對象的屬性傳遞給sql語句的參數。

 

   Hibername的好處:Hibernate是一個全自動的orm映射工具,它能夠自動生成sql語句,並執行並返回java結果。

 

不一樣點:

   一、hibernate要比ibatis功能強大不少。由於hibernate自動生成sql語句。

   二、ibatis須要咱們本身在xml配置文件中寫sql語句,hibernate咱們沒法直接控制該語句,咱們就沒法去寫特定的高效率的sql。對於一些不太複雜的sql查詢,hibernate能夠很好幫咱們完成,可是,對於特別複雜的查詢,hibernate就很難適應了,這時候用ibatis就是不錯的選擇,由於ibatis仍是由咱們本身寫sql語句。

  ibatis能夠出來複雜語句,而hibernate不能。

   三、ibatis要比hibernate簡單的多。ibatis是面向sql的,不一樣考慮對象間一些複雜的映射關係。

 

2.5.14 Hibernate映射對象的狀態

臨時狀態/瞬時狀態(transient):剛剛用new語句建立,沒有被持久化

         不處於session中(沒有使用session的方法去操做臨時對象)。該對象成爲臨時對象

 

持久化狀態/託管狀態(persistent):已經被持久化,加入到session的緩存中。session是沒有關閉該狀態的對象爲持久化對象。

 

遊離狀態/脫管狀態(detached):已經被持久化,但不處於session中。

         該狀態的對象爲遊離對象。

 

刪除狀態(removed):對象有關聯的ID,而且在Session管理下,可是已經被計劃(事務提交的時候,commit())刪除。若是沒有事務就不能刪除

 

相互轉換

 

 

2.5.15 介紹一下Hibernate的緩存?

 

1、why(爲何要用Hibernate緩存?)

 

Hibernate是一個持久層框架,常常訪問物理數據庫。

 

爲了下降應用程序對物理數據源訪問的頻次,從而提升應用程序的運行性能。

 

緩存內的數據是對物理數據源中的數據的複製,應用程序在運行時從緩存讀寫數據,在特定的時刻或事件會同步緩存和物理數據源的數據。

 

爲了提供訪問速度,把磁盤或數據庫訪問變成內存訪問。

 

 

 

2、what(Hibernate緩存原理是怎樣的?)Hibernate緩存包括兩大類:Hibernate一級緩存和Hibernate二級緩存。

 

1.Hibernate一級緩存又稱爲「Session的緩存」。

 

Session緩存內置不能被卸載,Session的緩存是事務範圍的緩存(Session對象的生命週期一般對應一個數據庫事務或者一個應用事務)。

 

一級緩存中,持久化類的每一個實例都具備惟一的OID。

 

 

2.Hibernate二級緩存又稱爲「SessionFactory的緩存」。

 

因爲SessionFactory對象的生命週期和應用程序的整個過程對應,所以Hibernate二級緩存是進程範圍或者集羣範圍的緩存,有可能出現併發問題,所以須要採用適當的併發訪問策略,該策略爲被緩存的數據提供了事務隔離級別。

 

第二級緩存是可選的,是一個可配置的插件,默認下SessionFactory不會啓用這個插件。

 

Hibernate提供了org.hibernate.cache.CacheProvider接口,它充當緩存插件與Hibernate之間的適配器。

 

 

面試:

   Hibernate中的緩存分一級緩存和二級緩存。

   一級緩存就是Session級別的緩存,在事務範圍內有效是,內置的不能被卸載。二級緩存是SesionFactory級別的緩存,從應用啓動到應用結束有效。是可選的,默認沒有二級緩存,須要手動開啓。

    保存數據庫後,在內存中保存一份,若是更新了數據庫就要同步更新。

 什麼樣的數據適合存放到第二級緩存中?   

1) 不多被修改的數據  帖子的最後回覆時間 

2) 常常被查詢的數據   電商的地點

2) 不是很重要的數據,容許出現偶爾併發的數據   

3) 不會被併發訪問的數據   

4) 常量數據

擴展:hibernate的二級緩存默認是不支持分佈式緩存的。使用memcahe,redis等中央緩存來代替二級緩存。  

  

2.5.16 簡單講一下webservice使用的場景?

webservice是一個SOA(面向服務的編程)的架構,它是不依賴於語言,不依賴於平臺,能夠實現不一樣的語言間的相互調用,經過Internet進行基於Http協議的網絡應用間的交互。

 

一、異構系統(不一樣語言)的整合

二、不一樣客戶端的整合 瀏覽器、手機端(android,ios.塞班)、微信單、PC端等終端來訪問

 

三、實實在在的列子:

       天氣預報:能夠經過實現webservice客戶端調用遠程天氣服務實現的。

       單點登陸:一個服務是全部系統的登陸

2.5.17 簡單介紹一下activiti?

    Activiti是一個業務流程管理(BPM)和工做流系統,適用於開發人員和系統管理員。其核心是超快速,穩定的BPMN2流程引擎。它易於與 Spring集成使用。

 

主要要在OA中,把線下流程放到線上。 把現實生活中一些流程固話定義到系統中,而後經過輸入表單數據完成業務。

 

他可用在OA系統的流程管理中:

請假流程 小於三天,一級主管審批,大於三天二級才能審批。

報銷流程 1000 2000 3000>....

 

若是你想找專門這方面的工做,要下去複習。

2.6 高級部分

2.6.1 有沒有用過linux?你都用它來作什麼?

Linux是一個長時間運行比較穩定的操做系統,全部咱們通常會拿它做爲服務器(web,db,app等)。

Linux自己具備C的編譯環境、咱們的一些軟件是沒有軟件包(redis、nginx等)的,須要在Linux的C編譯環境編譯獲得軟件包.

 

2.6.2 說一下linux下面的一下經常使用命令?

經常使用:

Pwd 獲取當前路徑

Cd 跳轉到目錄

Su -u 切換到管理員

Ls ls 列舉目錄

文件操做命令:

文件

   tail 查看

   rm -rf

   vi

文件夾

   mkdir

   rm -r

 

2.6.3 你是使用什麼來鏈接遠程的Linux服務器的?

須要依賴於Linux服務器安裝ssh服務端,通常這個ssh服務的端口22.

須要依賴於Linux服務器安裝sftp服務端,通常這個sftp服務的端口25.

 

使用ssh客戶端鏈接linux服務器,就有點兒像windows下面的遠程鏈接。可是linux經過ssh鏈接上之後是沒有圖形界面,全是命令行。

Putty

Xshell

使用sftp客戶端來鏈接sftp服務端,來上傳和下載文件.(上傳安裝包,修改了配置文件上傳。)

 

Winscp

xftp

 

企業中經常使用的兩種組合:

     putty+winscp

     Xshell+xftp=xmanager

 

 

面試:使用xshell、putty等ssh客戶端來鏈接服務器,使用xftp、winscp等sftp客戶端來上傳和如今文件。鏈接和上傳、下載必須依賴於服務器的ssh、sftp服務,也就是linux服務器須要啓動這兩個服務。

 

2.6.4 有沒有使用過雲主機?

使用過,在原來的公司,咱們沒有使用本身的服務器,而是租用阿里的雲主機。

沒有使用過,可是有所瞭解。

 

雲主機就是一些雲服務運營商(阿里、華爲、西部數碼、新浪等),提供的遠程的服務器功能,咱們開發者或者企業只需按需付費就能夠租用對應的服務器。

 

使用ssh和sftp來進行操做。

 

2.6.5 有沒有作過數據庫優化方面的事情?

 作過mysql數據庫的優化、其餘數據庫相似

定位:查找、定位慢查詢

優化手段:

a)         建立索引:建立合適的索引,咱們就能夠如今索引中查詢,查詢到之後直接找對應的記錄。

b)        分表   :當一張表的數據比較多或者一張表的某些字段的值比較多而且不多使用時,採用水平分表和垂直分表來優化

c)         讀寫分離:當一臺服務器不能知足需求時,採用讀寫分離的方式進行集羣。

d)        緩存:使用redis來進行緩存

e)         一些經常使用優化技巧

 

   2.6.6 查找慢查詢並定位慢查詢?

   在項目自驗項目轉測試以前,在啓動mysql數據庫時開啓慢查詢,而且把執行慢的語句寫到日誌中,在運行必定時間後。經過查看日誌找到慢查詢語句。

 

要找出項目中的慢Sql時

一、關閉數據庫服務器(關閉服務)

二、把慢查詢記錄到日誌中

 

三、設置慢查詢時間

 

四、找出日誌中的慢查詢SQL

 

   使用explain 慢查詢語句,來詳細分析語句的問題.

 

 

 

 

2.6.6 數據庫優化之遵循範式?

 數據庫表設計時須要遵循方式

 表的範式,是首先符合1NF, 才能知足2NF , 進一步知足3NF

1NF: 即表的列的具備原子性,不可再分解,即列的信息,不能分解.只要數據庫是關係型數據庫(mysql/oracle/db2/sysbase/sql server),就自動的知足1NF.關係型數據庫中是不容許分割列的。

2NF:表中的記錄是惟一的.一般咱們設計一個主鍵來實現

3NF:即表中不要有冗餘數據, 就是說,表的信息,若是可以被推導出來,就不該該單獨的設計一個字段來存放.(外鍵)

反3NF :沒有冗餘的數據庫未必是最好的數據庫,有時爲了提升運行效率,就必須下降範式標準,適當保留冗餘數據。具體作法是: 在概念數據模型設計時遵照第三範式,下降範式標準的工做放到物理數據模型設計時考慮。下降範式就是增長字段,容許冗餘 訂單和訂單項、相冊瀏覽次數和照片的瀏覽次數

2.6.7 選擇合適的存儲引擎

在開發中,咱們常用的存儲引擎 myisam / innodb/ memory

MyISAM存儲引擎

若是表對事務要求不高,同時是以查詢和添加爲主的,咱們考慮使用myisam存儲引擎. 好比 bbs 中的 發帖表,回覆表.

 

INNODB存儲引擎:

對事務要求高,保存的數據都是重要數據,咱們建議使用INNODB,好比訂單表,帳號表.

 

Memory 存儲

         咱們數據變化頻繁,不須要入庫,同時又頻繁的查詢和修改,咱們考慮使用memory, 速度極快.

 

問 MyISAM 和 INNODB的區別(主要)

1. 事務安全 myisam不支持事務而innodb支持

2. 查詢和添加速度 myisam不用支持事務就不用考慮同步鎖,查找和添加和添加的速度快

3. 支持全文索引 myisam支持innodb不支持

4. 鎖機制 myisam支持表鎖而innodb支持行鎖(事務)

5. 外鍵 MyISAM 不支持外鍵, INNODB支持外鍵. (一般不設置外鍵,一般是在程序中保證數據的一致)

 

 

 

 

 

2.6.8 數據庫優化之建立合適的索引?

索引(Index)是幫助DBMS高效獲取數據的數據結構。

分類:普通索引/惟一索引/主鍵索引/全文索引

普通索引:容許重複的值出現

惟一索引:除了不能有重複的記錄外,其它和普通索引同樣(用戶名、用戶身份證、email,tel)

主鍵索引:是隨着設定主鍵而建立的,也就是把某個列設爲主鍵的時候,數據庫就會給改列建立索引。這就是主鍵索引.惟一且沒有null值

全文索引:用來對錶中的文本域(char,varchar,text)進行索引, 全文索引針對MyIsam

explain select * from articles where match(title,body) against(‘database’);【會使用全文索引】

2.6.9 索引使用小技巧?*****

索引弊端

1.佔用磁盤空間。

2.對dml(插入、修改、刪除)操做有影響,變慢。

使用場景:

a: 確定在where條件常用,若是不作查詢就沒有意義

b: 該字段的內容不是惟一的幾個值(sex)

c: 字段內容不是頻繁變化.

 

具體技巧:

1. 對於建立的多列索引(複合索引),不是使用的第一部分就不會使用索引。

alter table dept add index my_ind (dname,loc); // dname 左邊的列,loc就是右邊的列

explain select * from dept where dname='aaa'\G 會使用到索引

explain select * from dept where loc='aaa'\G 就不會使用到索引

 

2. 對於使用like的查詢,查詢若是是’%aaa’不會使用到索引而‘aaa%’會使用到索引。

   explain select * from dept where dname like '%aaa'\G不能使用索引

   explain select * from dept where dname like 'aaa%'\G使用索引.

因此在like查詢時,‘關鍵字’的最前面不能使用 % 或者 _這樣的字符.,若是必定要前面有變化的值,則考慮使用 全文索引->sphinx.

 

3. 若是條件中有or,有條件沒有使用索引,即便其中有條件帶索引也不會使用。換言之,就是要求使用的全部字段,都必須單獨使用時能使用索引.

  

 

4. 若是列類型是字符串,那必定要在條件中將數據使用引號引用起來。不然不使用索引。

expain select * from dept where dname=’111’;

expain select * from dept where dname=111;(數值自動轉字符串)

expain select * from dept where dname=qqq;報錯

也就是,若是列是字符串類型,不管是否是字符串數字就必定要用 ‘’ 把它包括起來.

5. 若是mysql估計使用全表掃描要比使用索引快,則不使用索引。

   表裏面只有一條記錄

 

2.6.10 數據庫優化之分表?

分表分爲水平(按行)分表和垂直(按列)分表

 

根據經驗,Mysql表數據通常達到百萬級別,查詢效率會很低,容易形成表鎖,甚至堆積不少鏈接,直接掛掉;水平分表可以很大程度較少這些壓力。

按行數據進行分表。

 

若是一張表中某個字段值很是多(長文本、二進制等),並且只有在不多的狀況下會查詢。這時候就能夠把字段多個單獨放到一個表,經過外鍵關聯起來。

     考試詳情,通常咱們只關注分數,不關注詳情。

水平分表策略:

1.按時間分表

這種分表方式有必定的侷限性,當數據有較強的實效性,如微博發送記錄、微信消息記錄等,這種數據不多有用戶會查詢幾個月前的數據,如就能夠按月分表。

2.按區間範圍分表

通常在有嚴格的自增id需求上,如按照user_id水平分表:

table_1  user_id從1~100w

table_2  user_id從101~200w

table_3  user_id從201~300w

3.hash分表*****

經過一個原始目標的ID或者名稱經過必定的hash算法計算出數據存儲表的表名,而後訪問相應的表。

2.6.11 數據庫優化之讀寫分離

一臺數據庫支持的最大併發鏈接數是有限的,若是用戶併發訪問太多。一臺服務器知足不要要求是就能夠集羣處理。Mysql的集羣處理技術最經常使用的就是讀寫分離。      

 

主從同步

數據庫最終會把數據持久化到磁盤,若是集羣必須確保每一個數據庫服務器的數據是一直的。能改變數據庫數據的操做都往主數據庫去寫而其餘的數據庫從主數據庫上同步數據。

讀寫分離

   使用負載均衡來實現寫的操做都往主數據去,而讀的操做往從服務器去。

2.6.12 數據庫優化之緩存

        在持久層(dao)和數據庫(db)之間添加一個緩存層,若是用戶訪問的數據已經緩存起來時,在用戶訪問時直接從緩存中獲取,不用訪問數據庫。而緩存是在操做內存級,訪問速度快。

 

做用:減小數據庫服務器壓力,減小訪問時間。

 

Java中經常使用的緩存有,

   一、hibernate的二級緩存。該緩存不能完成分佈式緩存。

 

二、可使用redis(memcahe等)來做爲中央緩存。

        對緩存的數據進行集中處理

2.6.13 語句優化小技巧

DDL優化:

1 、經過禁用索引來提供導入數據性能 。 這個操做主要針對有數據庫的表,追加數據

//去除鍵

alter table test3 DISABLE keys;

//批量插入數據

insert into test3 select * from test;

//恢復鍵

alter table test3 ENABLE keys;

 

二、 關閉惟一校驗

set unique_checks=0  關閉

set unique_checks=1  開啓

 

三、修改事務提交方式(導入)(變屢次提交爲一次)

set autocommit=0   關閉

//批量插入

set autocommit=1   開啓

DML優化(變屢次提交爲一次)        

insert into test values(1,2);

insert into test values(1,3);

insert into test values(1,4);

//合併多條爲一條

insert into test values(1,2),(1,3),(1,4)

DQL優化

Order by優化

                 一、多用索引排序

二、普通結果排序(非索引排序)Filesort

   group by優化

      是使用order by null,取消默認排序

   子查詢優化

在客戶列表找到不在支付列表的客戶

#在客戶列表找到不在「支付列表」的客戶 , 查詢沒買過東西的客戶

explain

select * from customer where customer_id not in (select DISTINCT customer_id from payment); #子查詢      -- 這種是基於func外鏈

 

explain

select * from customer c left join payment p on(c.customer_id=p.customer_id) where p.customer_id is null   -- 這種是基於「索引」外鏈

   Or優化

在兩個獨立索引上使用or的性能優於

一、 or兩邊都是用索引字段作判斷,性能好!!

二、 or兩邊,有一邊不用,性能差

三、 若是employee表的name和email這兩列是一個複合索引,可是若是是 :name='A' OR email='B' 這種方式,不會用到索引!

  limit優化

select film_id,description from film order by title limit 50,5;

 

select a.film_id,a.description from film a inner join (select film_id from film order by title limit 50,5)b on a.film_id=b.film_id

 

 

 

2.6.14 jdbc批量插入幾百萬數據怎麼實現?*****

一、變屢次提交爲一次

三、使用批量操做

 

 

省出的時間可觀。

 

像這樣的批量插入操做能不使用代碼操做就不使用,可使用存儲過程來實現。

2.6.15 有沒有使用過redis? Redis是什麼 

 

Redis是一個key-value的nosql數據庫.先存到內存中,會根據必定的策略持久化到磁盤,即便斷電也不會丟失數據。支持的數據類型比較多。

 

主要用來作緩存數據庫的數據和web集羣時當作中央緩存存放seesion

 

2.4.15 Redis和memche的比較?

 

 

一、 Redis和Memcache都是將數據存放在內存中,都是內存數據庫。不過memcache還可用於緩存其餘東西,例如圖片、視頻等等。

二、Redis不只僅支持簡單的k/v類型的數據,同時還提供list,set,hash等數據結構的存儲。

三、虛擬內存--Redis當物理內存用完時,能夠將一些好久沒用到的value 交換到磁盤

  

2.6.16 簡單說一下redis的使用場景?         

緩存:

把常常須要查詢的、不多修改數據,放到讀速度很快的空間(內存),以便下次訪問減小時間。減輕壓力,減小訪問時間.

計數器:

     redis中的計數器是原子性的內存操做。                             

       能夠解決庫存溢出問題.進銷存系統庫存溢出。                   

session緩存服務器:

web集羣時做爲session緩存服務器

 

緩存隊列等

2.6.17 redis對象保存方式?

Json字符串:

須要把對象轉換爲json字符串,當作字符串處理。直接使用set get來設置或者或。

優勢:設置和獲取比較簡單

缺點:沒有提供專門的方法,須要把把對象轉換爲json。(jsonlib)

字節:

   須要作序列號,就是把對象序列化爲字節保存。

 

若是是擔憂JSON轉對象會消耗資源的狀況,這個問題須要考量幾個地方,

第一點:就是使用的JSON轉換lib是否就會存在性能問題。

第二點:就是數據的數據量級別,若是是存儲百萬級的大數據對象,建議採用存儲序列化對象方式。若是是少許的數據級對象,或者是數據對象字段很少,仍是建議採用JSON轉換成String方式。

畢竟redis對存儲字符類型這部分優化的很是好。具體採用的方式與方法,還要看你所使用的場景。

 

 

2.6.18 Redis數據淘汰機制

在 redis 中,容許用戶設置最大使用內存大小 server.maxmemory,在內存限定的狀況下是頗有用的。譬如,在一臺 8G 機子上部署了 4 個 redis 服務點,每個服務點分配 1.5G 的內存大小,減小內存緊張的狀況,由此獲取更爲穩健的服務。

 

內存大小有限,須要保存有效的數據?

redis 內存數據集大小上升到必定大小的時候,就會施行數據淘汰策略。

redis 提供 6種數據淘汰策略:

 

volatile-lru:從已設置過時時間的數據集(server.db[i].expires)中挑選最近最少使用的數據淘汰

volatile-ttl:從已設置過時時間的數據集(server.db[i].expires)中挑選將要過時的數據淘汰

volatile-random:從已設置過時時間的數據集(server.db[i].expires)中任意選擇數據淘汰

allkeys-lru:從數據集(server.db[i].dict)中挑選最近最少使用的數據淘汰

allkeys-random:從數據集(server.db[i].dict)中任意選擇數據淘汰

no-enviction(驅逐):禁止驅逐數據

 

 

2.6.19 Java訪問Redis

一、使用jedis java客戶端來訪問redis服務器,有點相似經過jdbc訪問mysql同樣。

二、固然若是是spring進行集成時,可使用spring data來訪問redis,spring data只是對jedis的二次封裝。jdbcTemplate jdbc關係同樣

2.6.20 Redis集羣

當一臺數據沒法知足要求,可使用reids集羣來處理,相似於mysql的讀寫分離。

2.6.21簡單介紹一下微信公共號的分類?

   公衆號:我的和企業都能申請

   服務號:企業才能申請

   企業號:企業才能申請

2.6.22 微信開發原理

 

 

 

微信公衆平臺開發者,經過接入認證的方式,讓咱們的服務器能處理來自微信服務器轉發的微信用戶的請求,處理完成後返回給微信服務器,有微信服務器對用戶響應。

2.6.23怎麼把微信和業務平臺綁定?

 

微信用戶和註冊用戶綁定?

讓微信用戶也能完成註冊用戶的功能。

用戶註冊實體中包含一個微信號的字段,當我進行綁定時就是修改用戶的微信號字段。

固然咱們在進行菜單跳轉到頁面後,咱們是沒法直接獲取微信號的。要經過微信網頁受權來獲取微信號

 

第一步:用戶贊成受權,獲取code

https://open.weixin.qq.com/connect/oauth2/authorize?appid=APPID&redirect_uri=REDIRECT_URI&response_type=code&scope=SCOPE&state=STATE#wechat_redirect 若提示「該連接沒法訪問」,請檢查參數是否填寫錯誤,是否擁有scope參數對應的受權做用域權限。

第二步:經過code換取網頁受權openId也就是咱們微信號

獲取code後,請求如下連接獲取access_token  https://api.weixin.qq.com/sns/oauth2/access_token?appid=APPID&secret=SECRET&code=CODE&grant_type=authorization_code

{ "access_token":"ACCESS_TOKEN",   

 "expires_in":7200,   

 "refresh_token":"REFRESH_TOKEN",   

 "openid":"OPENID",   

 "scope":"SCOPE" }

 

 

 

 

 

2.7 項目和業務部分 

2.7.1項目分類

在公司中作的項目能夠分爲兩種產品、項目.

項目:就是給一些公司接的項目,項目開發完成後。就交互,後面這個項目代碼就不在維護了

產品:充分考慮擴展性和基本業務,來作一個產品。在這個產品上能夠進行定製開發。

                                                      

2.7.2 項目參與者

   產品經理?PM?架構師(SE)?(開發PL? MDE?可能會有多個) (測試PL ? TSE可能會有多個)   UI 資料

 

 

開發團隊:開始代碼能完成需求

測試團隊:測試功能

UI:負責界面設計、靜態代碼的編寫

資料:負責界面的文字描述。

QA     :經過項目質量監控,和PM,SE同級

 

開發和UI和資料,協同設計和開發,開發完成後轉測試(測試策略)交給測試團隊進行測試,測試完成後會出一個測試報告。

2.7.3 項目流程

   可行性分析和立項和開工會

   需求分析

   需求設計

   項目開發(多個迭代)

        迭代開工會

        迭代設計

               迭代開發

               迭代測試

               集成測試

               迭代發佈

        迭代總結

        ....不斷迭代

   項目驗收

   項目總結

  

 

2.7.4 業務注意事項

一、不要多個項目都說你同一個模塊。若是要說,就說後面是進行改進。

   在pss,crm,shopping都寫權限模塊

二、多寫點業務

相關文章
相關標籤/搜索