1.abstract class 和interface 有什么區別?
- 抽象類可以有構造方法 接口不行
- 抽象類可以有普通成員變量 接口沒有
- 抽象類可以有非抽象的方法 接口必須全部抽象
- 抽象類的訪問類型都可以 接口只能是 public inrerface
- 一個類可以實現多個接口 但只能繼承一個抽象類
2.HashMap 和Hashtable 的區別?
- HashMap 沒有排序,允許一個null鍵和多個null值,而Hashtable不允許;
- HashMap 把Hashtable的contains方法去掉了,改成containsValue和containsKey,因為contains方法容易讓人引起誤解;
- Hashtable 繼承自Dictionary類,HashMap是Java1.2引進的Map接口的實現;
- Hashtable 的方法是Synchronize的,而HashMap不是
3.List和set的區別
- 1、List,Set都是繼承自Collection接口
- 2、List特點:元素有放入順序,元素可重復 ,Set特點:元素無放入順序,元素不可重復(注意:元素雖然無放入順序,但是元素在set中的位置是有該元素的HashCode決定的,其位置其實是固定的)
- 3、List接口有三個實現類:LinkedList,ArrayList,Vector ,Set接口有兩個實現類:HashSet(底層由HashMap實現),LinkedHashSet
4.ArrayList和LinkedList的底層實現 以及各自的優缺點
- ArrayList是實現了基于動態數組的數據結構,LinkedList基于雙向鏈表的數據結構。
- ArrayList允許直接按序號索引元素,但是插入元素要涉及數組元素移動等內存操作,所以索引(查詢)數據快,插入數據慢,
- LinkedList 使用雙向鏈表實現存儲,按序號索引數據需要進行前向或后向遍歷,但是插入數據時只需要記錄本項的前后項即可,所以插入速度較快,查詢數據慢。
5.請描述在多線程中修飾符volatile的含義和作用
- volatile是一個類型修飾符(type specifier)。它是被設計 用來修飾被不同線程訪問和修改的變量。如果沒有volatile,就會導致這樣的結果:要么無法編寫多線程程序,要么編譯器失去大量優化的機會。
6.請描述數據庫中事物的特點
- (Atomic)原子性
- (Consistent)一致性
- (Insulation)隔離性
- (Duration)持久性
- A: atomicity(原子性) - 一個事務(transaction)中的所有操作,要么全部完成,要么全部不完成,不會結束在中間某個環節。事務在執行過程中發生錯誤,會被回滾(Rollback)到事務開始前的狀態,就像這個事務從來沒有執行過一樣。
- C: consistency(一致性) - 在事務開始之前和事務結束以后,數據庫的完整性沒有被破壞。即從一個一致性狀態轉換到另一個一致性狀態。
- I: isolation(隔離性) - 當兩個或者多個事務并發訪問(此處訪問指查詢和修改的操作)數據庫的同一數據時所表現出的相互關系。通常來說,一個事務所做的修改在最終提交以前,對其他事務是不可見的。
- D: durability(持久性) - 在事務完成以后,該事務對數據庫所作的更改便持久地保存在數據庫之中。
7.請說出sql語句中 left join ,inner join 和right join的區別
- INNER JOIN 關鍵字在表中存在至少一個匹配時返回行. 如果沒有匹配,就不會列出這些行.
- LEFT JOIN 關鍵字會從左表 (table_name1) 那里返回所有的行,即使在右表 (table_name2) 中沒有匹配的行.
- RIGHT JOIN 關鍵字會右表 (table_name2) 那里返回所有的行,即使在左表 (table_name1) 中沒有匹配的行.
8.請描述jsp中application session request cookie 生命周期
Request 的范圍是指在一JSP 網頁發出請求到另一個JSP 網頁之間,隨 這個屬性就失效。設定Request 的范圍時可利用request 對象中的setAttribute( )和getAttribute( )
Session 的作用范圍為一段用戶持續和服務器所連接的時間(一次會話范圍內),但與服務 器斷線 ,這個屬性就無效。只要將數據存入session對象,數據的范圍就為Session
Application 的作用范圍在服務器一開始執行服務,到服務器關閉為止Application 的范圍最、停留的時間也最久,所以使用時要特別注意不然可能會造成服務器負載越來越重的情況。只要將數據存入application對象,數據的范圍范圍 (Scope) 就為Application
cookie是在客戶端保存的方案.而session是在服務端保存的方案.
如果cookie不設定時間的話就表視它的生命周期為瀏覽器會話的期間,只要關閉IE,cookie就消失了
這種cookie被稱為會話cookie.其一般不保存在硬盤上.而是保存在內存中.如果設置了過期時間.那么瀏覽器會把cookie保存到硬盤中,再次打IE時會依然有效.直到它的有效期超時;
注:存儲在硬盤中的cookie可以在不同IE間共享;
9.object類中的方法
Equals ToString Finalize
10.請描述hibernate中一級緩存和二級緩存的區別
- 1.一級緩存是針對session級別的,當這個session關閉后這個緩存就不存在了。
- 2.二級緩存是SessionFactory級別的,二級緩存我們通常使用其他的一些開源組件,比如hibernate經常使用的就是ECache,這個緩存在整個應用服務器中都會有效的。
- 區別:兩者的作用范圍不同。
11.請說出Hibernate中get()和load()方法的區別
- 1.get()采用立即加載方式,而load()采用延遲加載;
- 2.get()方法執行的時候,會立即向數據庫發出查詢語句, 而load()方法返回的是一個代理(此代理中只有一個id屬性),只有等真正使用該對象屬性的時候,才會發出sql語句
- 3.如果數據庫中沒有對應的記錄,get()方法返回的是null.而load()方法出現異常ObjectNotFoundException
12.請說出SpringMvc中常用的注解以及其含義
- 1.@RequestMapping 可以定義不同的處理器映射規則
URL 映射路徑 Method 請求方法限定 - @ResponseBody 用于讀取HTTP請求的內容 然后將讀取的內容轉換為java對象并綁定到 controller方法的參數上,加上@ResponseBody注解,就不會走視圖解析器,不會返回頁面,目前返回json數據
- @PathVariable是獲取url上數據的
- @RequestParam獲取請求參數的(包括post表單提交的參數)
- @Controller
13.請用java代碼寫出單例模式(高頻)
-
懶漢式 常用模式
public class SingletonClass{ private static SingletonClass instance=null; public static synchronized SingletonClass getInstance() { if(instance==null) { instance=new SingletonClass(); } return instance; } private SingletonClass(){ } }
餓漢式
//對第一行static的一些解釋
// java允許我們在一個類里面定義靜態類。比如內部類(nested class)。
//把nested class封閉起來的類叫外部類。
//在java中,我們不能用static修飾頂級類(top level class)。
-
//只有內部類可以為static。
public class Singleton{ //在自己內部定義自己的一個實例,只供內部調用 private static final Singleton instance = new Singleton(); private Singleton(){ //do something } //這里提供了一個供外部訪問本class的靜態方法,可以直接訪問 public static Singleton getInstance(){ return instance; } }
14.Spring如何處理線程并發問題(面試高頻)
- ThreadLocal可以在無需同步的情況下就化解線程安全的難題
當使用ThreadLocal維護變量時,ThreadLocal為每個使用該變量的線程提供獨立的變量副本,所以每一個線程都可以獨立地改變自己的副本,而不會影響其它線程所對應的副本。
15.什么是存儲過程 它有什么優點?(高頻)
- 存儲過程(Stored Procedure)是在大型數據庫系統中,一組為了完成特定功能的SQL 語句集,經編譯后存儲在數據庫中,用戶通過指定存儲過程的名字并給出參數(如果該存儲過程帶有參數)來執行它。存儲過程是數據庫中的一個重要對象,任何一個設計良好的數據庫應用程序都應該用到存儲過程。
- 將常用的或很復雜的工作,預先用sql語句寫好,并用一個指定的名稱存儲起來,以后需要這個工作的時候,只需要調用execute就可以自動完成命令。
16.存儲過程和存儲函數的區別?
本質上沒有區別,只是函數只能返回一個變量的限制,而存儲過程可以返回多個。函數是可以嵌套在sql中使用的,可以在select中調用,而存儲過程不行。存儲過程可以調用存儲函數。
17.什么是觸發器 什么是游標 什么是視圖
- 數據庫觸發器:是一個與表相關聯的、存儲的PL/SQL程序。每當一個特定的數據操作語句(Insert,update,delete)在指定的表上發出時,Oracle自動地執行觸發器中定義的語句序列。
- 游標:在寫java程序中有結果集的概念,那么在pl/sql中也會用到多條記錄,這時候我們就要用到游標,游標可以存儲查詢返回的多條數據。游標可以理解為是PL/SQL中的結果集,我們通過游標可以提取結果集中的每行記錄。
- 視圖:視圖就是封裝了一條復雜查詢的語句。
18.簡述map的幾種迭代方式
-
方式1:根據鍵找值的方式(keySet())
//a, 獲取到Map集合中所有的鍵 //b, 遍歷鍵的集合,獲取到每一個鍵 //c, 通過鍵,找到對應的值
//獲取到Map集合中所有的鍵
Set<String> keys = map.keySet();
//遍歷鍵的集合,獲取到每一個鍵
for (String key : keys) {
//通過鍵,找到對應的值
Student s = map.get(key);
System.out.println( key + "..." + s.getName() + "..." + s.getAge() );
}
-
方式2:根據鍵值對對象找鍵和值的方式(entrySet())
//a, 獲取Map集合中所有的鍵值對元素,返回對應的集合 //b, 遍歷鍵值對元素集合,獲取到每一個鍵值對元素對象 //c, 通過鍵值對元素對象,獲取對應的鍵,和對應的值
//獲取Map集合中所有的鍵值對元素,返回對應的集合
Set< Map.Entry<String, Student>> entrySet = map.entrySet();
//遍歷鍵值對元素集合,獲取到每一個鍵值對元素對象
for (Map.Entry<String, Student> entry : entrySet) {
//通過鍵值對元素對象,獲取對應的鍵,和對應的值
//找鍵
String key = entry.getKey();
//找值
Student s = entry.getValue();
//打印
System.out.println( key+"..."+s.getName()+"..."+s.getAge() );
}
方式3:for循環
19.Spring怎么進行事物管理
- ①編程式事務管理:這意味你通過編程的方式管理事務,給你帶來極大的靈活性,但是難維護。
- ②聲明式事務管理:這意味著你可以將業務代碼和事務管理分離,你只需用注解和XML配置來管理事務
- 聲明式事務管理XML方式
- 聲明式事務的注解方式
20.簡述EJB和javabean 的區別
- 答:Java Bean 是可復用的組件,對Java Bean 并沒有嚴格的規范,理論上講,任何一個Java 類都可以是一個Bean。但通常情況下,由于Java Bean 是被容器所創建(如Tomcat)的,所以Java Bean 應具有一個無參的構造器,另外,通常Java Bean 還要實現Serializable 接口用于實現Bean 的持久性。Java Bean實際上相當于微軟COM 模型中的本地進程內COM 組件,它是不能被跨進程訪問的。Enterprise Java Bean 相當于DCOM,即分布式組件。它是基于Java 的遠程方法調用(RMI)技術的,所以EJB 可以被遠程訪問(跨進程、跨計算機)。但EJB必須被布署在諸如Webspere、WebLogic 這樣的容器中,EJB 客戶從不直接訪問真正的EJB 組件,而是通過其容器訪問。EJB 容器是EJB 組件的代理,EJB 組件由容器所創建和管理。客戶通過容器來訪問真正的EJB 組件。
21.forward 和redirect 的區別?
- 1.從地址欄顯示來說
- 答:forward 是容器中控制權的轉向,是服務器請求資源,服務器直接訪問目標地址的URL,把那個URL 的響應內容讀取過來,然后把這些內容再發給瀏覽器,瀏覽器根本不知道服務器發送的內容是從哪兒來的,所以它的地址欄中還是原來的地址。
- redirect 就是服務端根據邏輯,發送一個狀態碼,告訴瀏覽器重新去請求那個地址,一般來說瀏覽器會用剛才請求的所有參數重新請求,所以 session,request 參數都可以獲取,并且從瀏覽器的地址欄中可以看到跳轉后的鏈接地址。
- 2.從數據共享來說
- Forward轉發頁面和轉發到的頁面可以共享request里面的數據,redirect不能共享數據
- 3.從運用地方來說
- Forward一般用于用戶登錄的時候,根據角色轉發到相應的模塊
- Redirect一般用于用戶注銷登錄時返回的主頁面和跳轉到其他的網站等
22.get 和post 的區別?
- 1)Get 是用來從服務器上獲得數據,而Post 是用來向服務器上傳遞數據;
- 2)Get 將表單中數據按照variable=value 的形式,添加到action 所指向的URL 后面,并且兩者使用“?”連接,而各個變量之間使用“&”連接;Post 是將表單中的數據放在form 的數據體中,按照變量和值相對應的方式,傳遞到action所指向URL;
- 3)Get 是不安全的,因為在傳輸過程,數據被放在請求的URL 中;Post 的所有操作對用戶來說都是不可見的;
- 4)Get 傳輸的數據量小,這主要是因為受URL 長度限制;而Post 可以傳輸大量的數據,所以在上傳文件只能使用Post;
- 5)Get 限制Form 表單的數據集必須為ASCII 字符,而Post 支持整個ISO10646字符集;
- 6)Get 是Form 的默認方法。
23.linux的軟鏈式命令?
- ln -s 源文件 目標文件
24.來說幾個linux命令?
- 切換到根目錄: cd /
- 列出文件列表:ll
- 創建目錄和移除目錄:mkdir rmdir
- 打包或解壓:tar
- Mv cp
25.sleep() 和wait() 有什么區別?
- sleep()方法(休眠)是線程類(Thread)的靜態方法,調用此方法會讓當前線程暫停執行指定的時間,將執行機會(CPU)讓給其他線程,但是對象的鎖依然保持,因此休眠時間結束后會自動恢復.
- wait()是Object類的方法,調用對象的wait()方法導致當前線程放棄對象的鎖(線程暫停執行),進入對象的等待池(wait pool),只有調用對象的notify()方法(或notifyAll()方法)時才能喚醒等待池中的線程進入等鎖池(lock pool),如果線程重新獲得對象的鎖就可以進入就緒狀態。
26.你們用過的線程安全的類?
- Vector
- StringBuffer
- Hashtable
27.多線程實現以及線程同步方法?
- 多線程實現方式主要有2種:
- 繼承Thread類、實現Runnable接口
- 線程同步方法:
- wait():使一個線程處于等待(阻塞)狀態,并且釋放所持有的對象的鎖;
- sleep():使一個正在運行的線程處于睡眠狀態,是一個靜態方法;
- notify():喚醒一個處于等待狀態的線程,當然在調用此方法的時候,并不能確切的喚醒某一個等待狀態的線程,而是由JVM確定喚醒哪個線程,而且與優先級無關;
- notityAll():喚醒所有處于等待狀態的線程,該方法并不是將對象的鎖給所有線程,而是讓它們競爭,只有獲得鎖的線程才能進入就緒狀態;
28.簡述struts2的工作流程
- 客戶端瀏覽器發出HTTP請求。
- 根據web.xml配置,該請求被FilterDispatcher接收。
- 根據struts.xml配置,找到需要調用的Action類和方法, 并通過IoC方式,將值注入給Aciton。4、Action調用業務邏輯組件處理業務邏輯,這一步包含表單驗證。
- Action執行完畢,根據struts.xml中的配置找到對應的返回結果result,并跳轉到相應頁面。
- 返回HTTP響應到客戶端瀏覽器
29.JSP 和Servlet 有哪些相同點和不同點,他們之間的聯系是什么?
- 答:JSP是Servlet技術的擴展,本質上是Servlet的簡易方式,更強調應用的外表表達。JSP編譯后是"類servlet"。Servlet和JSP最主要的不同點在于,Servlet的應用邏輯是在Java文件中,并且完全從表示層中的HTML里分離開來。而JSP的情況是Java和HTML可以組合成一個擴展名為.jsp的文件。JSP側重于視圖,Servlet主要用于控制邏輯。
30.SpringMVC流程.
- 1.用戶發送請求到前端控制器
- 2.前端控制器收到請求調用處理器映射器
- 3.處理器映射器根據請求URL找到具體的處理器,生出處理器對象以及處理器攔截器,返回給 前端控制器
- 4.前端控制器通過處理器適配器調用處理器
- 5.執行處理器Controller
- 6.處理器執行完成后返回ModelAndView
- 7.處理器適配器將執行結果ModelAndView返回給前端控制器
- 8.前端控制器將ModelAndView傳給視圖解析器
- 9.視圖解析器解析后返回具體view
- 10.前端控制器對view進行渲染視圖(即將模型數據填充到視圖中)
- 11.前端控制器響應用戶
31.springMvc和struts2的區別?
入口不同,開發方式不同,存儲數據不同,參數傳遞不同
1.springMVC入口是一個servlet即前端控制器,而struts2的入口是一個filter過濾器
2.springMVC是基于方法開發(一個URL對應一個方法),請求參數傳遞到方法的形參,可以設計為單例或多例(建議單例),struts2是基于類開發,傳遞參數是通過類的屬性,只能設計為多例。
3.struts2采用值棧存儲請求和響應的數據,通過OGNL存取數據,springMVC通過參數解析器是將request請求內容解析,并給方法形參賦值,將數據和視圖封裝成ModelAndView對象,最后又將ModelAndView中的模型數據通過request域傳輸到頁面。JSP視圖解析器默認使用jstl
32.你是怎么理解spring?
- Spring 框架是一個熱門的流行框架,由 7 個定義良好的模塊組成。
組成 Spring 框架的每個模塊(或組件)都可以單獨存在,或者與其他一個或多個模塊聯合實現。每個模塊的功能如下: - 1、核心容器:核心容器提供 Spring 框架的基本功能。核心容器的主要組件是 BeanFactory,它是工廠模式的實現。BeanFactory 使用控制反轉 (IOC)模式將應用程序的配置和依賴性規范與實際的應用程序代碼分開。
- 2、Spring 上下文:Spring 上下文是一個配置文件,向 Spring 框架提供上下文信息。Spring 上下文包括企業服務,例如 JNDI、EJB、電子郵件、國際化、校驗和調度功能。
- 3、Spring AOP:通過配置管理特性,Spring AOP 模塊直接將面向方面的編程功能集成到了 Spring 框架中。所以,可以很容易地使 Spring 框架管理的任何對象支持 AOP。Spring AOP 模塊為基于 Spring 的應用程序中的對象提供了事務管理服務。通過使用 Spring AOP,不用依賴 EJB 組件,就可以將聲明性事務管理集成到應用程序中。
- 4、Spring DAO:JDBC DAO 抽象層提供了有意義的異常層次結構,可用該結構來管理異常處理和不同數據庫供應商拋出的錯誤消息。異常層次結構簡化了錯誤處理,并且極大地降低了需要編寫 的異常代碼數量(例如打開和關閉連接)。Spring DAO 的面向 JDBC 的異常遵從通用的 DAO 異常層次結構。
- 5、 Spring ORM:Spring 框架插入了若干個 ORM 框架,從而提供了 ORM 的對象關系工具,其中包括 JDO、Hibernate 和 iBatis SQL Map。所有這些都遵從 Spring 的通用事務和 DAO 異常層次結構。
- 6、Spring Web 模塊:Web 上下文模塊建立在應用程序上下文模塊之上,為基于 Web 的應用程序提供了上下文。所以,Spring 框架支持與 Jakarta Struts 的集成。Web 模塊還簡化了處理多部分請求以及將請求參數綁定到域對象的工作。
- 7、Spring MVC 框架:MVC 框架是一個全功能的構建 Web 應用程序的 MVC 實現。通過策略接口,MVC 框架變成為高度可配置的,MVC 容納了大量視圖技術,其中包括 JSP、Velocity、Tiles、iText 和 POI。
IOC ,DI和 AOP - 控制反轉的基本概念是:調用者不再創建被調用者的實例,由spring容器創建,所以稱為控制反轉
- 依賴注入的基本概念是:依賴注入是spring框架中的解耦的一種策略,主要有set方式(提供set和get方法)和constractor(構造方法)方式,它使得類與類之間以配置文件的形式組織在一起,而不是硬編碼的方式,
- 面向切面變成概念是:面向切面編程,主要意圖是將日志記錄,安全控制,事物處理,異常處理等代碼從業務邏輯代碼中分出來,我們希望可以將他們獨立到非邏輯業務的方法中,進而改變這些行為的時候不影響業務邏輯的代碼。
33.講一下jdbc流程?
- 1)注冊驅動; Class.forName("com.mysql.jdbc.Driver");
- 2)建立連接; DriverManager.getConnection(url, user, password);
- 3)創建Statement;
- 4)執行sql 語句;
- 5)處理結果集`
- 6)關閉連接。
34.數據庫連接池的工作機制?
- 1.J2EE服務器啟動時會建立一定數量的池連接,并一直維持不少于此數目的池連接。客戶端程序需要連接時,池驅動程序會返回一個未使用的池連接并將其標記為忙。如果當前沒有空閑連接,池驅動程序就新建一定數量的連接,新建連接的數量由配置參數決定。
- 2.當使用的池連接調用完成后,池驅動程序將此連接表記為空閑,其他調用就可以使用這個連接。
35.hibernate和mybatis區別?
- 1.Mybatis不完全是一個ORM框架,因為它需要程序員自己編寫sql語句,而hibernate完全是一個ORM框架。
- 2.Mybatis學習門檻低,簡單易學,而hibernate學習門檻高,不易精通。
- 3.Mybatis程序員直接編寫原生態sql,可以嚴格控制sql執行性能,進行更為細致的sql優化,靈活度高,非常適合對關系型數據模型要求不高的軟件開發,例如互聯網軟件,企業運營類軟件,而hibernate不需要編寫sql語句,靈活性不高,
對于關系模型要求高的軟件,用它開發可以節省很多代碼,提高開發效率。 - 4.mybatis本身提供的緩存機制不佳,而hibernate有更好的一級緩存和二級緩存機制,可以使用第三方緩存,如ECache
36.spring的運行流程?
- 1.用戶發送請求到前端控制器
- 2.前端控制器收到請求調用處理器
- 3.處理器執行完成后返回處理結果給前端控制器
- 4.前端控制器將處理結果轉發給jsp
- 5.Jsp頁面返回html頁面給前端控制器、
- 6.前端控制器響應給用戶
37.Collection 和Collections 的區別?
- Collection是java.util下的接口,它是各種集合的父接口,繼承于它的接口主要有Set 和List; Collections是個java.util下的類,是針對集合的幫助類,提供一系列靜態方法實現對各種集合的搜索、排序、線程安全化等操作。
38.JSP 和Servlet 中的請求轉發分別如何實現?
- JSP中的請求轉發可利用forward動作實現<jsp:forward />;
- Serlvet轉發的方式getServletContext().getRequestDispatcher(path).forward(req,res)。
39.說出ArrayList,Vector, LinkedList 的存儲性能和特性?
- ArrayList和Vector都是使用數組方式存儲數據,此數組元素數大于實際存儲的數據以便增加和插入元素,它們都允許直接按序號索引元素,但是插入元素要涉及數組元素移動等內存操作,所以索引數據快而插入數據慢
- Vector由于使用synchronized方法(線程安全),通常性能上較ArrayList差
- LinkedList使用雙向鏈表實現存儲,插入數據時只需要記錄本項的前后項即可,所以插入速度較快。
40.Arraylist 與Vector 區別?
- 答:就ArrayList 與Vector 主要從二方面來說:
- 1)同步性:Vector 是線程安全的(同步),而ArrayList 是線程序不安全的;
- 2)數據增長:當需要增長時,Vector 默認增長一倍,而ArrayList 卻是一半。
41.wait,join,sleep,notify區別?
- wait():使一個線程處于等待(阻塞)狀態,并且釋放所持有的對象的鎖;
- sleep():使一個正在運行的線程處于睡眠狀態,是一個靜態方法
- notify():喚醒一個處于等待狀態的線程,當然在調用此方法的時候,并不能確切的喚醒某一個等待狀態的線程,而是由JVM確定喚醒哪個線程,而且與優先級無關;
- notityAll():喚醒所有處于等待狀態的線程,該方法并不是將對象的鎖給所有線程,而是讓它們競爭,只有獲得鎖的線程才能進入就緒狀態;
42.構造器Constructor 是否可被override?
- 答:構造器Constructor 不能被繼承,因此不能重寫Overriding,但可以被重載Overloading。
43.A繼承Base,A引用C.哪種耦合度更高?
- 繼承的耦合度更高,繼承屬于強耦合
44、XML 文檔定義有幾種形式?它們之間有何本質區別?解析(讀取)XML 文檔有哪幾種方式?
- 1)兩種形式:dtd 以及schema;
- 2)本質區別:schema 本身是xml 的,可以被XML 解析器解析(這也是從DTD上發展schema 的根本目的);
- 3)解析方式:有DOM,SAX,STAX 等:
DOM:處理大型文件時其性能下降的非常厲害。這個問題是由DOM 的樹結構所造成的,這種結構占用的內存較多,而且DOM 必須在解析文件之前把整個文檔裝入內存,適合對XML 的隨機訪問;SAX:不同于DOM,SAX 是事件驅動型的XML 解析方式。它順序讀取XML 文件,不需要一次全部裝載整個文件。當遇到像文件開頭,文檔結束,或者標簽開頭與標簽結束時,它會觸發一個事件,用戶通過在其回調事件中寫入處理代碼來處理XML 文件,適合對XML 的順序訪問; - STAX:Streaming API for XML (StAX)。
45.JSP 中動態INCLUDE 與靜態INCLUDE 的區別?
- 動態INCLUDE 用jsp:include 它總是會檢查所含文件中的變化,適合用于包含動態頁面,并且可以帶參數;
- 靜態INCLUDE 用include 偽碼實現,它不會檢查所含文件的變化,適用于包含靜態頁面
- 動態包含,包含其他頁面的運行的結果.最終翻譯成多個Servlet解釋執行的.
- 靜態包含相對于代碼的copy,最終被翻譯成一個Servlet解釋執行的.
46.hashmap,treemap底層結構?
- HashMap:底層是哈希表數據結構。線程不同步。適用于在Map中插入、刪除和定位元素。
- TreeMap:底層是二叉樹(紅黑樹)數據結構,線程不同步,可用于給Map集合中的鍵進行排序。適用于按自然順序或自定義順序遍歷鍵(key)。
47.加密算法用到了什么?
- MD5 、 SHA 、 HMAC
48.異常分類?
- 系統中異常包括兩類:預期異常和運行時異常RuntimeException,前者通過捕獲異常從而獲取異常信息,后者主要通過規范代碼開發,測試通過手段減少運行時異常的發生。
49.Spring創建對象方式?
- 一、通過構造函數創建對象。
- 二、通過靜態方法創建對象
- 三、通過工廠方法創建對象。
50.線程的生命周期
- 線程的生命周期:
- 新建:創建線程對象
- 就緒:有執行資格 沒有執行權
- 運行:有執行資格 有執行權
- 阻塞:由于一些操作讓線程處于該狀態 沒有執行資格 沒有執行權
而另一些操作卻可以把它給激活 激活后處于就緒狀態 - 死亡:線程對象變成垃圾 等待被回收
51.java 中常用的設計模式?說明工廠模式?
- 答:Java 中的23 種設計模式:Factory( 工廠模式),Builder( 建造模式), Factory Method(工廠方法模式),Prototype(原始模型模式),Singleton(單例模式),Facade(門面模式),Adapter(適配器模式), Bridge(橋梁模式), Composite(合成模式),Decorator(裝飾模式), Flyweight(享元模式), Proxy(代理模式),Command(命令模式), Interpreter(解釋器模式), Visitor(訪問者模式),Iterator(迭代子模式), Mediator(調停者模式), Memento(備忘錄模式),Observer(觀察者模式),State(狀態模式),Strategy(策略模式),Template Method(模板方法模式), Chain Of Responsibleity(責任鏈模式)。
- 工廠模式:工廠模式是一種經常被使用到的模式,根據工廠模式實現的類可以根據提供的數據生成一組類中某一個類的實例,通常這一組類有一個公共的抽象父類并且實現了相同的方法,但是這些方法針對不同的數據進行了不同的操作。首先需要定義一個基類,該類的子類通過不同的方法實現了基類中的方法。然后需要定義一個工廠類,工廠類可以根據條件生成不同的子類實例。當得到子類的實例后,開發人員可以調用基類中的方法而不必考慮到底返回的是哪一個子類的實例。
52.Overload 和Override 的區別。Overloade的方法是否可以改變返回值的類型?
- 答:方法的重載和重寫都是實現多態的方式,區別在于前者實現的是編譯時的多態性,而后者實現的是運行時的多態性。重載發生在一個類中,同名的方法如果有不 同的參數列表(參數類型不同、參數個數不同或者二者都不同)則視為重載;重寫發生在子類與父類之間,重寫要求子類被重寫方法與父類被重寫方法有相同的返回 型,比父類被重寫方法更好訪問,不能比父類被重寫方法聲明更多的異常(里氏代換原則)。重載對返回類型沒有特殊的要求,可以改變返回值類型。
53.char 型變量中能不能存貯一個中文漢字?為什么?
- 答:能夠定義成為一個中文的,因為java中以unicode編碼,一個char占16個字節,所以放一個中文是沒問題的。
54.error 和exception 有什么區別?
- error表示系統級的錯誤和程序不必處理的異常,是恢復很困難的一種嚴重問題;比如內存溢出,不可能指望程序能處理這樣的情況
- exception表示需要捕捉或者需要程序進行處理的異常,是一種設計或實現問題;也就是說,它表示如果程序運行正常,從不會發生的情況
55.final, finally, finalize 的區別?
- final:修飾符(關鍵字)有三種用法:如果一個類被聲明為final,它就不能被繼承,將變量聲明為final,可以保證它們在使用中不被改變,被聲明為final的變量必須在聲明時給定初值,而在以后的引用中只能讀取不可修改。被聲明為final的方法也同樣只能使用,不能在子類中被重寫。
- finally:通常放在try…catch…的后面構造總是執行代碼塊,這就意味著程序無論正常執行還是發生異常,這里的代碼只要JVM不關閉都能執行。
- finalize:Object類中定義的方法,Java中允許使用finalize()方法在垃圾收集器將對象從內存中清除出去之前做必要的清理工作。
56.Bean Factory 與 ApplicationContext 的區別?
- Bean Factory 只提供基礎的 DI(Dependes inject) 支持
- Application contexts 提供了處理 text messages 的功能,讀取 file resources 的功能, 發布事件給已經注冊為 listener 的 bean.
57.String, StringBuffer StringBuilder 的區別。
- String的長度是不可變的;StringBuffer的長度是可變的,如果你對字符串中的內容經常進行操作,特別是內容要修改時,那么使用*、StringBuffer,如果最后需要String,那么使用StringBuffer的toString()方法;線程安全;
- StringBuilder是從JDK 5 開始,為StringBuffer該類補充了一個單個線程使用的等價類;通常應該優先使用 StringBuilder類,因為它支持所有相同的操作,但由于它不執行同步,所以速度更快。
58.悲觀鎖和樂觀鎖有何區別?
- 悲觀鎖:數據開始更改時,就鎖住數據,直到修改完成后才釋放
訪問數據庫時間長,效率低 - 樂觀鎖:數據更改完畢后才鎖住數據,修改完成后釋放
訪問數據庫時間短,效率高
59.Git和svn各自的優點
-
1.Git的優點:
- Git分布式優于svn集中式
- Git分布式數據倉庫速度快,效率更高和多副本
- Git可離線工作
- GIT任意兩個開發者之間很容易解決沖突
缺點:
學習周期長,
不符合常規思維
-
2.Svn的優點:
- Svn的理念符合常規思維
- Svn支持空目錄
- Svn有更好的windows平臺支持
- Svn支持二進制文件 更容易處理大文件
60.為什么要使用Ajax技術 ,有什么好處?
- 使用Ajax的最大優點,就是能在不更新整個頁面的前提下維護數據,減少網頁重新載入的次數。這使得Web應用程序更為迅捷地回應用戶動作,并避免了在網絡上發送那些沒有改變過的信息,提高客戶的體驗性。
61.如何解決ajax跨域問題
- 什么是跨域問題?
- Js使用AJAX請求進行跨域請求,無法返回數據(json,xml等)
- 為什么會有跨域問題?
- 瀏覽器基于安全考慮,不允許Ajax請求跨域調用數據(json,xml等)
- 什么是跨域?
- 跨域是跨域名或端口號進行調用
- Jsonp核心原理:js使用ajax無法跨域調用數據(json,xml等),但是跨域跨域調用js數據,我們跨域把json偽裝成js,再進行調用
使用接收到的請求參數callback作為方法名對json數據進行包裹
62.Hibernate的優化
- 優先使用緩存技術。檢索策略:一般情況下都用默認的
- 1: 是設定JDBC的Statement讀取數據的時候每次從數據庫中取出的記錄條數,一般設置為30、50。如果繼續增大,超出100,性能提升不明顯,反而會消耗內存。Oracle數據庫的JDBC驅動默認的Fetch
Fetch Size設的越大,讀數據庫的次數越少,速度越快;FetchSize越小,讀數據庫的次數越多,速度越慢。 - 2、如果是超大的系統,建議生成htm文件。加快頁面提升速度。
- 3、對代碼進行重構,減少對數據庫的操作,盡量避免在數據庫查詢時使用in操作,以及避免遞歸查詢操作,代碼質量、系統設計的合理性決定系統性能的高低。
- 4、 對大數據量查詢時,慎用list()或者iterator()返回查詢結果,
- 5、在一對多、多對一的關系中,使用延遲加載機制,會使不少的對象在使用時方會初始化,這樣可使得節省內存空間以及減少數據庫的負荷,而且若PO中的集合沒有被使用時,就可減少互數據庫的交互從而減少處理時間。
- 6、對于大數據量新增、修改、刪除操作或者是對大數據量的查詢,與數據庫的交互次數是決定處理時間的最重要因素,減少交互的次數是提升效率的最好途徑,所以在開發過程中,請將show_sql設置為true,深入了解Hibernate的處理過程,嘗試不同的方式,可以使得效率提升。盡可能對每個頁面的顯示,對數據庫的操作減少到100----150條以內。越少越好。
63.spring依賴注入的幾種方式和三大核心思想是什么?
- 使用構造器注入
- 使用setter方法注入
- 使用Filed注入(用于注解方式)
- 三大核心思想:AOP IOC DI
64.struts2中 # % $的作用
號的使用
- 獲取context的數據
- <s:property value=”#request.name”/>
- 用于構建一個map集合,使用struts的UI標簽的時候
- <s:iterator value=”#{‘aaa’:’111’,’bbb’:’222’}” var=”entry”/>
- %號的使用
- 強制解析OGNL表達式<s:textfield name=”name” value=”%{#request.name}”/>
- 強制不解析OGNL表達式<s:property value=”%{#request.name}”/>
- $號的使用
- 在配置文件中使用OGNL表達式
- 在struts的配置文件中使用.xml文件或者是屬性文件。
65.&和&&的區別?
- 答:&運算符有兩種用法:(1)按位與;(2)邏輯與。
&&運算符是短路與運算。 - 邏輯與跟短路與的差別是非常巨大的,雖然二者都 要求運算符左右兩端的布爾值都是true整個表達式的值才是true。&&之所以稱為短路運算是因為,如果&&左邊的表 達式的值是false,右邊的表達式會被直接短路掉,不會進行運算。很多時候我們可能都需要用&&而不是&,例如在驗證用戶登錄 時判定用戶名不是null而且不是空字符串,應當寫為:username != null &&!username.equals(""),二者的順序不能交換,更不能用&運算符,因為第一個條件如果不成立,根本不能進 行字符串的equals比較,否則會產生NullPointerException異常。注意:邏輯或運算符(|)和短路或運算符(||)的差別也是如 此。
66.cookie與session的區別與聯系
- 1.Cookie是一種客戶端的技術,將數據保存到客戶端瀏覽器的內存中,Session是一種服務器端技術,將數據保存到服務器端
- 2.Cookie不是很安全,別人可以分析存放在本地的cookie并進行cookie欺騙,考慮到安全應該用session
- 3.Session會在一定時間內保存在服務器上,當訪問增多,會比較占用服務器的性能,考慮到減輕服務器性能方面,應當使用cookie
所以建議:將登陸信息等重要信息存放在session,其他信息如需要保留,可以放在cookie中
67.TCP與UDP的區別
- TCP協議是面向連接的通信協議,即在傳輸數據前先在發送端和接收端建立邏輯連接,然后再傳輸數據。每次連接的創建都需要經過“三次握手”。
- 第一次握手,客戶端向服務器端發出連接請求,等待服務器確認
- 第二次握手,服務器端向客戶端回送一個響應,通知客戶端收到了連接請求
- 第三次握手,客戶端再次向服務器端發送確認信息,確認連接
- UDP是面向非連接的協議,它不與對方建立連接,而是直接就把數據包發送過去!
- UDP適用于一次只傳送少量數據、對可靠性要求不高的應用環境。比如,我們經常使用“ping”命令來測試兩臺主機之間TCP/IP通信是否正常,其實“ping”命令的原理就是向對方主機發送UDP數據包,然后對方主機確認收到數據包,如果數據包是否到達的消息及時反饋回來,那么網絡就是通的。* UDP協議是面向非連接的協議,沒有建立連接的過程。正因為UDP協議沒有連接的過程,所以它的通信效果高;但也正因為如此,它的可靠性不如TCP協議高。QQ就使用UDP發消息,因此有時會出現收不到
68.jQuery優缺點 和工作中用到哪些?
- 優點:
- 實現腳本與頁面的分離
- 最少的代碼做最多的事情
- 性能支持比較好
- 節約學習成本
- 缺點:
- 不能向后兼容
- 多個插件沖突
- 對動畫和特效的支持差
- 工作中jQuery基本選擇器和屬性選擇器用的比較多,
69.JSP 和Servlet 有哪些相同點和不同點,他們之間的聯系是什么?
- JSP 是Servlet 技術的擴展,本質上是Servlet 的簡易方式,更強調應用的外表表達。JSP 編譯后是"類servlet"。Servlet 和JSP 最主要的不同點在于,Servlet 的應用邏輯是在Java 文件中,并且完全從表示層中的HTML 里分離開來。而JSP 的情況是Java 和HTML 可以組合成一個擴展名為.jsp 的文件。JSP 側重于視圖,Servlet 主要用于控制邏輯。
70.error 和exception 有什么區別?
- 答:error 表示系統級的錯誤和程序不必處理的異常,是恢復不是不可能但很困難的情況下的一種嚴重問題;比如內存溢出,不可能指望程序能處理這樣的情況;
- exception 表示需要捕捉或者需要程序進行處理的異常,是一種設計或實現問題;也就是說,它表示如果程序運行正常,從不會發生的情況。
71.請說明SQLsever中delete from tablea & truncate table tablea的區別
- 1.Delete from table會刪除表數據和表結構,truncate table 摧毀表數據和結構,并重新創建一張空表
- 2.Delete事物提交后才生效,truncate操作立即生效,不能回滾
72.在測試生命周期中,測試過程分為幾個階段
- 測試過程一般有4個步驟:單元測試、集成測試、確認測試、系統測試。
73.int 和Integer 有什么區別?
- 答:Java 提供兩種不同的類型:引用類型和原始類型(或內置類型);
int 是java 的原始數據類型,Integer 是java 為int 提供的封裝類。
Int的默認值為0,Integer的默認值為null
74有沒有length()這個方法? String 有沒有length()這個方法?
- 答:數組沒有length()方法,有length 的屬性。String 有length()方法。JavaScript中,獲得字符串的長度是通過length屬性得到的,這一點容易和Java混淆。
75.構造器Constructor 是否可被override?
- 答:構造器Constructor 不能被繼承,因此不能重寫Overriding,但可以被重載Overloading。
76.String 和StringBuffer 的區別?
- 答:JAVA 平臺提供了兩個類:String 和StringBuffer,它們可以儲存和操作字符串,即包含多個字符的字符數據。這個String 類提供了數值不可改變的字符串。而這個StringBuffer 類提供的字符串進行修改。當你知道字符數據要改變的時候你就可以使用StringBuffer。典型地,你可以使用StringBuffers 來動態構造字符數據。
77.描述一下JVM 加載class 文件的原理機制?
- 答:JVM 中類的裝載是由ClassLoader 和它的子類來實現的,Java ClassLoader是一個重要的Java 運行時系統組件。它負責在運行時查找和裝入類文件的類。
78.char 型變量中能不能存貯一個中文漢字?為什么?
- 答:能夠定義成為一個中文的,因為java 中以unicode編碼,一個char 占16個字節,所以放一個中文是沒問題的。
79.String s=new String(“xyz”);創建了幾個String Object?
- 答:兩個對象,一個是靜態區的"xyz",一個是用new創建在堆上的對象。
80.數據類型之間的轉換:
- 1)如何將數值型字符轉換為數字?
- 2)如何將數字轉換為字符?
- 3)如何取小數點前兩位并四舍五入? 【基礎】
- 答:1)調用數值類型相應包裝類中的方法parse***(String)或valueOf(String)即可返回相應基本類型或包裝類型數值;
- 2)將數字與空字符串相加即可獲得其所對應的字符串;另外對于基本類型數字還可調用String 類中的valueOf(…)方法返回相應字符串,而對于包裝類型數字則可調用其toString()方法獲得相應字符串;
- 3)可用該數字構造一java.math.BigDecimal 對象,再利用其round()方法進行四舍五入到保留小數點后兩位,再將其轉換為字符串截取最后兩位。
81.你在項目中用到了xml 技術的哪些方面?如何實現的?
- 答:用到了數據存貯,信息配置兩方面。在做數據交換平臺時,將不能數據源的數據組裝成XML 文件,然后將XML 文件壓縮打包加密后通過網絡傳送給接收者,接收解密與解壓縮后再同XML 文件中還原相關信息進行處理。在做軟件配置時,利用XML 可以很方便的進行,軟件的各種配置參數都存貯在XML 文件中。
82.jsp 有哪些內置對象?作用分別是什么?
- 答:JSP 共有以下9 種基本內置組件(可與ASP 的6 種內部組件相對應):
- request:用戶端請求,此請求會包含來自GET/POST 請求的參數;
- response:網頁傳回用戶端的回應;
- pageContext:網頁的屬性是在這里管理;
- session:與請求有關的會話期;
- application:servlet 正在執行的內容;
- out:用來傳送回應的輸出;
- config:servlet 的構架部件;
- page:JSP 網頁本身;
- exception:針對錯誤網頁,未捕捉的例外。
83.什么情況下調用doGet()和doPost()?
- 答:Jsp頁面中的form標簽里的method屬性為get時調用doGet(),為post時調用doPost()。
84.如何從form 表單中得取checkbox 的值
- 答:可在頁面把checkbox 的name 屬性取同一個,value 屬性取每個條目的id,后臺用getParamter(“name”)能取到checkbox 的一組值。
85.SQL優化,數據庫優化以及據庫表設計?
- 一、mysql如何優化:
- 1、開啟mysql數據庫的緩存(內存)
- 2、分表,分庫
- 3、建立索引(提高查詢效率)
- 4、采用集群
- 5、主主互備,主從復制,讀寫分離
- 二、sql語句如何優化
- 1、建立索引:create index 索引名 on id名;
- 2、盡可能的使用 NOT NULL
- 3、使用 ENUM 而不是 VARCHAR
- 4、避免 SELECT *
- 5、當知道只有一行數據的時候使用 LIMIT 1
- 6、當有一批處理的插入或更新時,我會用批量插入或批量更新,不會一條條記錄的去更新!
- 7.慎用distinct關鍵字
- 8.不要在in關鍵字中使用子查詢
- 9.不要在where條件中使用函數
- 10.使用LECCO SQL Expert人工智能自動SQL優化
86.對MVC的理解
- 答:基于Java 的Web 應用系統采用MVC 架構模式,即model(模型)、view(視圖)、control(控制)分離設計;這是目前WEB 應用服務系統的主流設計方向。
- Model:即處理業務邏輯的模塊,每一種處理一個模塊;
- View:負責頁面顯示,顯示MODEL 處理結果給用戶,主要實現數據到頁面轉換過程;
- Control:負責每個請求的分發,把FORM 數據傳遞給MODEL 處理,把處理結果的數據傳遞給VIEW 顯示。
- MVC 是Model-View-Controller 的簡寫。"Model" 代表的是應用的業務邏輯(通過JavaBean,EJB 組件實現), "View" 是應用的表示面(由JSP 頁面產生),"Controller" 是提供應用的處理過程控制(一般是一個Servlet),通過這種設計模型把應用邏輯,處理過程和顯示邏輯分成不同的組件實現。這些組件可以進行交互和重用。
87.清空表結構
- truncate table
88.Solr和lucene區別
- Lucene只是有個工具包
- Solr是服務器,底層是lucene,可以直接運行
89..dubbo的配置
- 服務端
- <dubbo:application name="taotao-manager-service" />
- <dubbo:registry protocol="zookeeper" * address="192.168.37.161:2181" />
- <dubbo:protocol name="dubbo" port="20880" />
<dubbo:service interface="com.taotao.manager.service.TestService" ref="testServiceImpl" />
- 客戶端
- <dubbo:application name="taotao-manager-web" />
- <dubbo:registry protocol="zookeeper" address="192.168.37.161:2181" />
- <dubbo:reference interface="com.taotao.manager.service.TestService" id="testService" timeout="1000000" />
90.ajax和jquery的寫法
- $.post(URL,{data},function(dt){});
91.Hibernate的幾種查詢方式?
- Sql HQL QBC QBE EJBQL
92.reaultType和resultMap區別
- resultType:
- 1.指定輸出的結果類型,將sql查詢結果的一行記錄數據映射為resultType指定類型的對象,如果有多條數據,則分別進行映射,并把對象放到list中
- 2.可以將指定查詢結果映射為pojo,但需要pojo的屬性名和sql查詢的列名一致才可映射成功
- resultMap:
- 1.如果sql查詢字段和pojo的屬性名不一致,可以用resultMap將字段名和屬性名做一個對應關系
- 2.可以將查詢結果映射為復雜的pojo,比如在查詢結果映射對象中包括pojo和list實現一對一查詢和一堆多查詢
93.請手寫出一段冒泡排序的代碼?
public class BubbleSort
{
public void sort(int[] a)
{
int temp = 0;
for (int i = a.length - 1; i > 0; --i)
{
for (int j = 0; j < i; ++j)
{
if (a[j + 1] < a[j])
{
temp = a[j];
a[j] = a[j + 1];
a[j + 1] = temp;
}
}
}
}
}
94.java線程池?
使用線程池的好處:
1.減少在創建和銷毀線程上所花的時間以及系統資源的開銷
2.如不使用線程池,有可能造成系統創建大量線程而導致消耗完系統內存
95.Soa和普通架構區別
- soa(Serice-oriented architecture,面向服務架構)是在計算環境下設計、開發、應用、管理分散的邏輯(服務)單元的一種規范。SOA的一個中心思想就是使得企業應用擺脫面向技術的解決方案的束縛,輕松應對企業商業服務變化、發展的需要。
96.什么是依賴注入
- 依賴注入是spring框架中的解耦的一種策略,稱為DI或IOC(控制反轉),主要有set方式(提供set和get方法)和constractor(構造方法)方式,它使得類與類之間以配置文件的形式組織在一起,而不是硬編碼的方式,
97.描述Spring中的編程式事物處理及聲明式事物處理
- 編程式事物就是自己寫Try catch語句調用commit/rollback等函數來實現那段業務數據改變的事務性
- 聲明式業務是通過框架和事物定義配置給自己的業務代碼添加事務性,比如Spring里面的AOP
- 前者需要自己寫大量重復的事物控制代碼 后者通過設置可以一次性給所有的業務方法添加上事物特性
98.描述JSP MVC模式下重復提交問題產生的原因和解決辦法
- 生成一個令牌保存在用戶session中,在form中加一個hidden域,顯示該令牌的值,form提交后重新生成一個新的令牌,將用戶提交的令牌和session中的令牌比較,如相同則是重復提交,有效地防止了重復提交的發生。
99.數據庫的硬優化和軟優化?
- 硬優化:硬件方面就可以優化硬盤IO,內存分配,就是安裝時候調整的一系列操作系統級的內核參數,
- 軟優化:數據庫架構上的優化,如邏輯、數據結構等等,最后就是代碼上的優化。
100.對dubbo內部結構了解不?
- 主要核心部件
- Remoting:網絡通信框架,實現了sync-over-async和request-response消息機制
- RPC: 一個遠程過程調用的抽象,支持負載均衡、容災和集群功能
-
Registry: 服務目錄框架用于服務的注冊和服務事件發布和訂閱
100.png
101.介紹redis
- 什么是redis
- Redis是一個開源的使用C語言編寫、支持網絡、可基于內存亦可持久化的日志型、Key-Value形式的Nosql數據庫
- 為什么要添加緩存?(端口號6379)
- 網站性能優化第一定律:優先使用緩存優化性能
- 隨著訪問用戶越來越多,并發越來越大,直接從Mysql數據庫查詢性能低,可以使用把數據進行緩存,從緩存讀取速度更快
- 什么樣的數據需要添加緩存?
- 訪問頻率高,更新頻率低
- 可以使用redis增加緩存,因為redis的讀寫速度,訪問速度快,服務層把需要緩存的數據放在redis中,先從redis中查詢數據,如果redis沒有數據嗎,再去mysql查詢
- Redis把數據存放到內存中,內存的讀寫速度比硬盤的讀寫速度快
- Redis是非關系型數據庫,即Nosql數據庫,存儲的數據模型是key-value
- 數據類型:
- String(字符串) Hash(哈希類型) List(鏈表) Set(集合) zSet(有序集合)
- Redis是單線程,但是Redis的讀寫速度太快了
- 搭建Redis集群
- 為了保證可以進行投票(容錯機制),需要至少3個主節點
每個主節點都需要至少一個從節點,所以需要至少3個從節點(高可用)
一共需要6臺redis服務器,可以使用6個redis實例
102.單點登錄 購物車 商品添加(高頻)
- 后臺管理系統:
- 商品添加流程:
- 商品添加功能主要有2個地方稍微復雜一點:
-
一個是選擇商品目錄,我們要把商品目錄按樹形結構展示在頁面上,這時我們用到的是easyUI-tree。使用parentId作為查詢條件進行查詢,第一次請求是沒有id參數,需要設置默認的parentId為0,查詢一級目錄,然后點擊某個一級目錄,會傳遞此父節點的id作為parentId對其子節點進行查詢并顯示在頁面上,所以這樣我們就能把商品目錄全部展示出來。
第二個是圖片上傳功能,用到的服務器是FastDFS,它是一個分布式文件系統,存儲空間可擴展,訪問效率高,充分考慮了負載均衡,橫向擴展等機制,并注重高可用,高性能等指標。
單點登錄.png
單點登錄系統:
- 為什么要使用單點登錄流程?
- 由于此項目使用了dubbo分布式架構,搭建可tomcat服務器集群,使得用戶每次訪問新的服務器,都需要登錄,所以用戶信息不放在session中,可以放在redis中,由redis實現session的功能,使得相互信任的系統之間的訪問不用繼續登錄
- 單點登錄流程:
- 1.用戶登錄商城系統首頁,輸入相關信息
- 2.商城系統跨域調用單點登錄sso系統
- 3.單點登錄系統調用單點登錄系統服務,查詢Mysql數據庫查詢用戶信息
- 4.根據攜帶用戶輸入信息和查詢到的數據判斷用戶是否登錄成功
- 5.登陸成功的話會同時生成key_ticket,將用戶信息緩存到redis數據庫
- 6.返回到商城系統首頁,提示登錄成功,并將ticket保存在cookie中。
- 7.當用戶需要訪問此商城別的系統時,訪問會攜帶cookie中的ticket* 從redis數據庫中查詢用戶信息而可以直接登錄
需要開發2個接口,一個是檢查用戶數據是否可用,另一個是通過用戶傳遞過來的ticket查詢redis數據庫中用戶的信息
103.RESTful的了解
- RESTful web service是一種遵守REST風格的服務
- RESTful風格的一大特色就是使用URI來標識資源
- URL(統一資源定位符),URN(統一資源名稱)是URI(統一資源標識符)的子類
- GET 獲取一個資源
- POST創建一個新的資源
- PUT 修改一個資源的狀態
- DELETE刪除一個資源
http響應碼
- 200 操作成功
- 201 對象創建成功
- 204 操作已執行成功,但是沒有返回數據
- 303 重定向
- 404 資源服務找不到
- 500 系統內部錯誤
104.dubbo服務開發流程,運行流程?zookeeper注冊中心的作用?端口是多少?
- 使用dubbo進行遠程調用實現服務交互,只需要在配置中指定使用的協議即可
- Dubbo的客戶端和服務端有三種連接方式,分別是廣播,直連,和使用zookeeper注冊中心
- Zookeeper注冊中心負責服務地址的注冊與查找,相當于目錄服務,服務提供者在啟動時與注冊中心交互,消費者不斷的發起請求獲取服務信息,注冊中心不轉發請求,壓力較小、
- 端口號為2181
105.jvm執行流程?
106.rpc?
107.ActiveMQ使用場景?
Mysql數據庫和Solr索引庫都進行商品數據的保存,會存在數據同步的問題,后臺增加商品數據的時候,索引庫并沒有同步更新,這時候就需要用到MQ
后臺商品進行商品修改,通知MQ,其他系統監聽MQ是否有消息,如果沒有消息,持續監聽,如果有消息,處理相關業務邏輯
存在的問題:1.MQ要是掛了,所有相關服務都掛了
2.MQ性能瓶頸的問題,在使用時,盡量減少消息內容大小
MQ消息的傳遞有兩種類型:
1.queue點對點的,即一個生產者和一個消費者一一對應
2.topic發布、訂閱模式,即一個生產者產生消息并進行發送后,可以由多個消費者進行接收
108.操作共享數據的安全性?
109.沒登錄的時候添加購物車了 登陸以后怎么返回原來的頁面
110.WebService shiro?
- WebService就是實現兩個系統之間遠程調用的技術
不過一般不直接使用webService, 而是使用其框架apache CXF - 服務端提供接口,客戶端使用接口
- 權限控制一般要用到5張表,function role user user_role role_function
- Apache shiro是一個強大而靈活的開源安全框架
- 四大核心功能:
- 認證
- 授權
- 會話管理
- 加密
- 步驟:
- 第一步:引入shiro框架相關的jar
- 第二步:在web.xml中配置spring框架提供的用于整合shiro框架的過濾器
- 第三步:在spring配置文件中配置shiro框架的過濾工廠bean
- 第四步:配置安全管理器
- 第五步:修改UserAction中的login方法,使用shiro提供的方式進行認證操作
- 第六步:自定義realm,并注入給安全管理器
- Shiro框架提供的權限控制方式
- URL攔截權限控制
- 方法注解權限控制
- 頁面標簽權限控制
- 代碼級別權限控制
111.FreeMarker(商品詳情頁)的介紹
商品詳情頁是消費者了解商品的主要途徑,訪問的頻率非常高,所以需要對其進行優化,提高訪問的速度。
優化方案:
1.使用redis添加緩存,如果使用緩存的方式,需要注意數據同步的問題
2.使用頁面靜態化,把動態頁面轉化為靜態頁面html,
好處:
a訪問靜態頁面不需要經過程序處理,可以提高速度
B.穩定性高
C 從安全角度講,靜態頁面不容易遭到黑客攻擊
D 靜態頁面相對于動態頁面更容易被搜索引擎收入(SEO)
靜態訪問的流程
Freemarker是一個模板引擎,可以基于模板生成文本(html)
企業一般用freemarker做生成靜態頁面功能
過程: 添加依賴
配置文件(Spring與freemarker整合,Spring與MQ整合,web.xml)
接收消息并消費消息(靜態化java實現)
獲取消息,消息不能為空
根據消息,生成靜態頁面
-
編寫商品模板
靜態訪問.png