目錄javascript
一. Java基礎部分................................................................. 9css
一、一個".java"源文件中是否能夠包括多個類(不是內部類)?有什麼限制? 9html
二、說說&和&&的區別。........................................................... 9前端
三、在JAVA中如何跳出當前的多重嵌套循環?........................ 9html5
四、switch語句可否做用在byte上,可否做用在long上,可否做用在String上? 10java
六、用最有效率的方法算出2乘以8等於幾?......................... 10node
七、請設計一個一百億的計算器............................................. 10mysql
八、使用final關鍵字修飾一個變量時,是引用不能變,仍是引用的對象不能變? 10jquery
九、"=="和equals方法究竟有什麼區別?............................. 10git
十、靜態變量和實例變量的區別?........................................ 11
十一、是否能夠從一個static方法內部發出對非static方法的調用? 11
十二、Integer與int的區別................................................... 11
1三、Math.round(11.5)等於多少? Math.round(-11.5)等於多少? 11
1四、請說出做用域public,private,protected,以及不寫時的區別 11
1五、Overload和Override的區別。Overloaded的方法是否能夠改變返回值的類型?............................................................................................ 12
1七、寫clone()方法時,一般都有一行代碼(不是必須有),是什麼? 12
1八、面向對象的特徵有哪些方面........................................... 12
1九、java中實現多態的機制是什麼?................................... 12
20、abstract class和interface有什麼區別?................... 12
2一、abstract的method是否可同時是static,是否可同時是native,是否可同時是synchronized?..................................................................... 13
2二、什麼是內部類?Static Nested Class和Inner Class的不一樣。 13
2三、內部類能夠引用它的包含類的成員嗎?有沒有什麼限制? 13
2四、String是最基本的數據類型嗎?..................................... 13
2七、String和StringBuffer的區別..................................... 14
2八、如何把一段逗號分割的字符串轉換成一個數組?............. 14
30、final, finally, finalize的區別。............................ 14
3一、運行時異常(Runtime)與檢查異常(Checked)有何異同?. 15
3二、error和exception有什麼區別?................................... 15
3三、Java中的異常處理機制的簡單原理和應用。.................. 15
3四、請寫出你最多見到的5個RuntimeException。.............. 15
3五、Java語言如何進行異常處理,關鍵字:throws,throw,try,catch,finally分別表明什麼意義?在try塊中能夠拋出異常嗎?............................. 16
36,Java中有幾種方法能夠實現一個線程?用什麼關鍵字修飾同步方法? stop()和suspend()方法爲什麼不推薦使用?......................................... 16
3八、同步和異步有何異同,在什麼狀況下分別使用他們?舉例說明。 17
39. 下面兩個方法同步嗎?(本身發明)............................. 17
40、多線程有幾種實現方法?同步有幾種實現方法?............... 18
4一、啓動一個線程是用run()仍是start()?......................... 18
4二、當一個線程進入一個對象的一個synchronized方法後,其它線程是否可進入此對象的其它方法?......................................................................... 18
4三、線程的基本概念、線程的基本狀態以及狀態之間的關係. 18
4五、介紹Collection框架的結構......................................... 18
4六、ArrayList和Vector的區別.......................................... 19
4七、HashMap和Hashtable的區別........................................ 19
4八、List和 Map區別?......................................................... 19
4九、List, Set, Map是否繼承自Collection接口?.............. 19
50、List、Map、Set三個接口,存取元素時,各有什麼特色? 19
5一、說出ArrayList,Vector, LinkedList的存儲性能和特性 19
5一、去掉一個Vector集合中重複的元素............................... 19
5三、Collection和 Collections的區別。........................... 20
5四、Set裏的元素是不能重複的,那麼用什麼方法來區分重複與否呢?是用==仍是equals()?它們有何區別?..................................................... 20
5五、你所知道的集合類都有哪些?主要方法?...................... 20
5六、兩個對象值相同(x.equals(y) == true),但卻可有不一樣的hash code,這句話對不對?....................................................................................... 20
6八、說出一些經常使用的類,包,接口,請各舉5個.................. 20
5九、Java中有幾種類型的流?JDK爲每種類型的流提供了一些抽象類以供繼承,請說出他們分別是哪些類?............................................................ 21
60、字節流與字符流的區別.................................................. 21
6一、什麼是java序列化,如何實現java序列化?或者請解釋Serializable接口的做用。..................................................................................... 21
6二、描述一下JVM加載class文件的原理機制?.................... 21
6三、heap和stack有什麼區別。.......................................... 21
6四、垃圾回收器的基本原理是什麼?垃圾回收器能夠立刻回收內存嗎?有什麼辦法主動通知虛擬機進行垃圾回收?.................................................. 21
6五、何時用assert。..................................................... 22
6六、能不能本身寫個類,也叫java.lang.String?.............. 22
6七、SSH集成方式................................................................. 22
二.算法與編程..................................................................... 23
一、編寫一個程序,將a.txt文件中的單詞與b.txt文件中的單詞交替合併到c.txt文件中,a.txt文件中的單詞用回車符分隔,b.txt文件中用回車或空格進行分隔。 23
二、編寫一個程序,將d:\java目錄下的全部.java文件複製到d:\jad目錄下,並將原來文件的擴展名從.java改成.jad。..................................... 24
三、編寫一個截取字符串的函數,輸入爲一個字符串和字節數,輸出爲按字節截取的字符串,但要保證漢字不被截取半個,如「我ABC」,4,應該截取「我AB」,輸入「我ABC漢DEF」,6,應該輸出「我ABC」,而不是「我ABC+漢的半個」。 25
四、有一個字符串,其中包含中文字符、英文字符和數字字符,請統計和打印出各個字符的個數。.............................................................................. 25
五、說明生活中遇到的二叉樹,用java實現二叉樹............... 26
八、遞歸算法題1................................................................... 27
九、遞歸算法題2................................................................... 28
十、排序都有哪幾種方法?請列舉。用JAVA實現一個快速排序。 28
十一、有數組a[n],用java代碼將數組元素順序顛倒............ 30
12 不使用遞歸遍歷二叉樹.................................................... 30
三.前端頁面部分.................................................................. 32
3.當service有一個實例變量,doGet和doPost去調用這個變量,會出現什麼問題,你是如何解決的。................................................................... 32
4.有三臺服務器,若是在一臺服務器上登錄了這個用戶,其餘兩臺就不能再登錄這個用戶,使用session共享,你是怎麼作的。............................. 32
5.寫一個自定義標籤要繼承什麼類....................................... 32
6.Jsp如何處理json............................................................ 32
7.Jsp的重定向和轉發的流程有什麼區別.............................. 32
8.Jsp和servlet的區別...................................................... 32
9.jsp能夠操做窗口嗎?...................................................... 32
10.session的主要幾個方法的區別....................................... 33
11.jsp的三大指令,七大動做的具體功能............................ 33
12.獲取頁面的元素和值有幾種方式,分別說一下................. 33
13.servlet和javaScript的區別,他們分別是什麼做用..... 33
14.jsp的執行原理............................................................... 34
16.HTML和Servlet的異同................................................... 34
17.會話跟蹤有哪些,他們的區別是什麼............................... 34
18.session和application的做用....................................... 34
19.request ,response,session 和 application是怎麼用的 34
20.有幾種方式將頁面的值傳到後臺...................................... 34
21.一個form表單的值如何獲取........................................... 34
22.傳遞參數到後臺有幾種方式............................................. 35
23.Jsp中父頁面中怎麼拿到子頁面的表單元素,不是拿值怎麼拿 35
24.定義一個String類型的字符串,若是重定向以後還能不能得到這個數據 35
25.404和500是什麼意思..................................................... 35
26.寫出5種JSTL經常使用標籤.................................................. 35
28.
頁面把一個元素隱藏的方法.................................................. 35
29.Session,application,cookie的區別.......................... 35
30.咱們在web應用開發過程當中常常遇到輸出某種編碼的字符,如ISO-8859-1,如何輸出一個某種編碼的字符串..................................................... 35
32.怎麼判斷用戶請求時是第一次,若是客戶端和服務端斷開怎麼連到上一次操做 35
33.若是建立servlet實例不用構造方法,怎麼建立一個servlet實例 35
34.Servlet是安全的嗎?當service有一個實例變量,doGet和doPost去調用這個變量,會出現什麼問題,你是如何解決的................................ 36
36.說明一下jsp中<jsp: include page..>和<%@ include file%>的區別 36
<jsp:include page=""/> 動態導入...................................... 36
37. pageContext有什麼做用............................................... 36
39.Filter與攔截器怎麼執行的............................................ 36
40.Jsp中如何進行分頁,項目中如何進行分頁?.................. 36
41,關於Ajax的技術組成與核心原理.................................. 37
43.Xhtml和html有什麼區別。............................................ 38
44.css的引入方式有哪些?link和@import的區別是?....... 38
45.css選擇符有哪些?哪些屬性能夠繼承?優先級如何計算?內聯和important哪一個優先級高?.............................................................................. 38
46.前端頁面由哪三層構成,分別是什麼?做用是什麼?...... 38
47.你曾經在哪些瀏覽器測試過兼容?這些瀏覽器的內核分別是什麼? 38
48.<img>標籤上title與alt屬性的區別是什麼?............... 38
49.寫出幾種IE6 BUG的解決方法?...................................... 38
50.描述css reset的做用和用途。...................................... 39
51.你如何對網站的文件和資源進行優化?期待的解決方案包括: 39
52.什麼是語義化的html?................................................... 39
53.清除浮動有幾種方式?各自的優缺點是?........................ 39
54.解釋下 CSS sprites,以及你要如何在頁面或網站中使用它? 39
55,html5有哪些新特性、移除了那些元素?如何處理HTML5新標籤的瀏覽器兼容問題?如何區分 HTML 和HTML5??.......................................... 40
56.javascript的同源策略。............................................... 40
5七、HTML的 form提交以前如何驗證數值文本框的內容所有爲數字?不然的話提示用戶並終止提交?............................................................................ 40
59. jsp有哪些內置對象?做用分別是什麼?分別有什麼方法? 40
60. jsp有哪些動做?做用分別是什麼?................................. 41
6一、JSP的經常使用指令............................................................. 41
62. JSP中動態INCLUDE與靜態INCLUDE的區別?................ 41
6三、頁面間對象傳遞的方法.................................................. 42
三. Java web部分............................................................... 42
一、Tomcat的優化經驗.......................................................... 42
二、HTTP請求的GET與POST方式的區別................................ 42
三、解釋一下什麼是servlet;............................................... 42
四、說一說Servlet的生命週期?........................................... 42
五、Servlet的基本架構........................................................ 42
六、Servlet API中forward()與redirect()的區別?........... 42
七、Request對象的主要方法:.............................................. 43
八、request.getAttribute()和 request.getParameter()有何區別? 43
九、MVC的各個部分都有那些技術來實現?如何實現?.............. 43
十、咱們在web應用開發過程當中常常遇到輸出某種編碼的字符,如iso-8859-1等,如何輸出一個某種編碼的字符串?.............................................. 44
四.數據庫部分..................................................................... 44
一、用兩種方式根據部門號從高到低,工資從低到高列出每一個員工的信息。 44
二、ORACLE和MySQL的區別。............................................... 44
三、存儲過程和函數的區別。................................................ 45
四、Oracle導入和導出方式................................................... 45
五、Oracle分頁方法............................................................. 45
六、mysql的分頁方法............................................................ 45
七、解釋什麼是死鎖,如何解決Oracle中的死鎖?............... 46
八、列出各個部門中工資高於本部門的平均工資的員工數和部門號,並按部門號排序............................................................................................ 46
九、存儲過程與觸發器必須講,常常被面試到?...................... 46
十、數據庫三範式是什麼?.................................................... 48
十一、說出一些數據庫優化方面的經驗?.................................. 49
十二、union和union all有什麼不一樣?................................... 49
13.用一條SQL語句查詢出每門課都大於80分的學生姓名.... 49
14.全部部門之間的比賽組合................................................ 50
15.顯示文章標題,發帖人、最後回覆時間........................... 50
16.刪除除了id號不一樣,其餘都相同的學生冗餘信息............. 50
18.求出發帖最多的人:....................................................... 50
1九、一個用戶表中有一個積分字段,假如數據庫中有100多萬個用戶,若要在每一年第一天凌晨將積分清零,你將考慮什麼,你將想什麼辦法解決?... 51
2一、註冊Jdbc驅動程序的三種方式...................................... 51
2二、用JDBC如何調用存儲過程............................................. 51
2三、JDBC中的PreparedStatement相比Statement的好處.... 51
2四、Class.forName的做用?爲何要用?.............................. 51
2五、大數據量下的分頁解決方法。....................................... 52
2六、用 JDBC查詢學生成績單,把主要代碼寫出來(考試機率極大). 52
2七、說出數據鏈接池的工做機制是什麼?............................... 52
2八、爲何要用 ORM? 和 JDBC有何不同?......................... 53
29. 數據庫大數據處理......................................................... 53
30. 如何寫出一個快排......................................................... 53
31. 什麼是事務?什麼是鎖?.............................................. 54
32. 維護數據庫的完整性和一致性,你喜歡用觸發器仍是自寫業務邏輯?爲何?............................................................................................ 54
33. 什麼是內存泄漏?......................................................... 54
34.觸發器的做用?.............................................................. 54
觸發器是一中特殊的存儲過程,主要是經過事件來觸發而被執行的。它能夠強化約束,來維護數據的完整性和一致性,能夠跟蹤數據庫內的操做從而不容許未經許可的更新和變化。能夠聯級運算。如,某表上的觸發器上包含對另外一個表的數據操做,而該操做又會致使該表觸發器被觸發。.................................................. 54
35. 經常使用的oracle操做的命令............................................. 54
36, 索引的優缺點............................................................ 55
37.使用oracle僞列刪除表中重複記錄:?......................... 55
五. XML部分........................................................................ 55
一、xml有哪些解析技術?區別是什麼?................................... 55
二、你在項目中用到了xml技術的哪些方面?如何實現的?...... 55
四、XML文檔定義有幾種形式?它們之間有何本質區別?解析XML文檔有哪幾種方式?............................................................................................ 56
六.流行的框架與新技術....................................................... 56
一、.................................................. 談談你對Struts的理解。. 56
二、Struts優缺點................................................................. 56
三、STRUTS的應用(如STRUTS架構)....................................... 57
四、談談你對Hibernate的理解。......................................... 57
五、你對Spring的理解。..................................................... 58
6.Spring由哪些模塊組成?................................................... 58
7. 核心容器模塊。.............................................................. 58
九、寫Hibernate的一對多和多對一雙向關聯的orm配置?.... 58
十、在DAO中如何體現DAO設計模式?.................................. 59
十一、spring+Hibernate中委託方案怎麼配置?....................... 59
12. hibernate進行多表查詢每一個表中各取幾個字段,也就是說查詢出來的結果集沒有一個實體類與之對應如何解決;........................................... 59
13.介紹一下Hibernate的二級緩存...................................... 59
1四、Jdo是什麼?................................................................... 60
16. IOC的優勢是什麼?................................................. 61
18. 什麼是Spring的依賴注入?....................................... 61
19. 有哪些不一樣類型的IOC(依賴注入)方式?.............. 61
20. 哪一種依賴注入方式你建議使用,構造器注入,仍是 Setter方法注入? 61
21. Spring對DAO的支持................................................... 61
22. 解釋AOP................................................................... 61
23. Aspect 切面.............................................................. 61
24. 在Spring AOP 中,關注點和橫切關注的區別是什麼? 62
25. 鏈接點......................................................................... 62
26. 通知............................................................................ 62
29 SpringMvc怎麼和AJAX相互調用的................................. 62
30當一個方法向AJAX返回特殊對象,譬如Object,List等,須要作什麼處理 62
31 SpringMvc裏面攔截器是怎麼寫的................................... 62
32講下SpringMvc的執行流程.............................................. 63
33解釋Spring支持的幾種bean的做用域。......................... 63
34,Spring框架中的單例bean是線程安全的嗎?.................. 63
35. 解釋Spring框架中bean的生命週期。........................ 63
36.哪些是重要的bean生命週期方法? 你能重載它們嗎?. 64
38. 什麼是基於Java的Spring註解配置? 給一些註解的例子. 64
39. 什麼是基於註解的容器配置?....................................... 64
40. 怎樣開啓註解裝配?.................................................... 64
41. 使用Spring經過什麼方式訪問Hibernate?................... 64
42. Spring支持的ORM....................................................... 64
43.如何經過HibernateDaoSupport將Spring和Hibernate結合起來? 64
44. Spring支持的事務管理類型........................................ 65
45. Spring框架的事務管理有哪些優勢?.......................... 65
49. 什麼是Spring MVC框架的控制器?........................... 65
50. 講下SpringMvc的核心入口類是什麼,Struts1,Struts2的分別是什麼 65
51. SpringMvc的控制器是否是單例模式,若是是,有什麼問題,怎麼解決 65
52. SpingMvc中的控制器的註解通常用那個,有沒有別的註解能夠替代 65
53. 若是在攔截請求中,我想攔截get方式提交的方法,怎麼配置 65
54. 若是在攔截請求中,我想攔截提交參數中包含"type=test"字符串,怎麼配置 65
55. SpringMvc中函數的返回值是什麼................................. 66
56. SpringMVC怎麼樣設定重定向和轉發的.......................... 66
57. SpringMvc用什麼對象從後臺向前臺傳遞數據的............ 66
58. SpringMvc中有個類把視圖和數據都合併的一塊兒的,叫什麼 66
59. 怎麼樣把ModelMap裏面的數據放入Session裏面.......... 66
61. 當一個方法向AJAX返回特殊對象,譬如Object,List等,須要作什麼處理 66
63. 講下SpringMvc的執行流程........................................... 66
64,Hibernate是如何延遲加載?.......................................... 66
66,如何優化Hibernate?................................................... 67
67,在數據庫中條件查詢速度很慢的時候,如何優化?........... 67
69,Hibernate的主鍵生成機制............................................ 68
69,Mybatis比IBatis比較大的幾個改進是什麼?.............. 68
70,什麼是MyBatis的接口綁定,有什麼好處........................ 69
71,接口綁定有幾種實現方式,分別是怎麼實現的?............... 69
72,什麼狀況下用註解綁定,什麼狀況下用xml綁定............. 69
73,MyBatis實現一對一有幾種方式?具體怎麼操做的........... 69
74,MyBatis實現一對多有幾種方式,怎麼操做的.................. 69
75,MyBatis裏面的動態Sql是怎麼設定的?用什麼語法?..... 69
78,講下MyBatis的緩存..................................................... 69
七.軟件工程與設計模式....................................................... 70
一、j2ee經常使用的設計模式?說明工廠模式。.......................... 70
二、開發中都用到了那些設計模式?用在什麼場合?................. 70
八. j2ee部分...................................................................... 71
二、應用服務器與WEB SERVER的區別?................................ 71
三、應用服務器有那些?....................................................... 71
四、J2EE是什麼?................................................................. 71
五、J2EE是技術仍是平臺仍是框架?什麼是J2EE.................. 71
六、如何給weblogic指定大小的內存?.................................. 71
七、如何設定的weblogic的熱啓動模式(開發模式)與產品發佈模式? 71
八、如何啓動時不需輸入用戶名與密碼?................................ 71
九、在weblogic管理制臺中對一個應用域(或者說是一個網站,Domain)進行jms及ejb或鏈接池等相關信息進行配置後,實際保存在什麼文件中?........ 71
十、在weblogic中發佈ejb需涉及到哪些配置文件............. 71
十一、如何在weblogic中進行ssl配置與客戶端的認證配置或說說j2ee(標準)進行ssl的配置?................................................................................ 72
九,項目功能實現技術問題(附帶源碼)............................. 72
1,java實現excel模板導出:http://www.cnblogs.com/Mr-kevin/p/5793276.html............................................................................................ 72
2,java中生成驗證碼:http://www.cnblogs.com/syscn/p/5794391.html 72
3,Java-->實現羣聊功能(C/S模式--TCP協議):http://www.cnblogs.com/xmcx1995/p/5793879.html........... 72
4,Activiti工做流學習-----基於5.19.0版本(4):........... 72
5,Java關於IO流的介紹:................................................. 72
6,MVC權限管理的實現流程:.............................................. 72
7,批量數據上傳的sql.xml:.............................................. 72
8, struts—文件的上傳和下載:........................................... 72
十. 其餘問題....................................................................... 72
1,svn的使用和搭建?........................................................ 72
2,git 命令總結?.............................................................. 74
3.tomcat給你你怎樣去調優?............................................... 75
4,Tomcat有幾種部署方式................................................... 76
第一種方法:....................................................................... 76
5,eclipse中server location灰色,如何修改?.............. 77
7,如何加大tomcat能夠使用的內存?................................ 77
8,如何加大tomcat鏈接數?.............................................. 78
能夠有多個類,但只能有一個public的類,而且public的類名必須與文件名相一致。
一個文件中能夠只有非public類,若是隻有一個非public類,此類能夠跟文件名不一樣
&和&&均可以用做邏輯與的運算符,&&爲短路與,&不是短路與。
另外&能夠作爲整數的位運算符
例1:對於if(str != null&& !str.equals(「」))表達式,當str爲null時,後面的表達式不會執行,因此不會出現NullPointerException若是將&&改成&,則會拋出NullPointerException異常。
例2:If(x==33 &++y>0) y會增加,If(x==33 && ++y>0)不會增加
1. Break + 標籤
2. 使用多個條件判斷
3. 使用方法的return
在Java中,要想跳出多重循環,能夠在外面的循環語句前定義一個標號,而後在裏層循環體的代碼中使用帶有標號的break語句,便可跳出外層循環。例如,
ok: for (int i = 0; i < 10; i++) {
for (int j = 0; j < 10; j++) {
System.out.println("i=" + i + ",j=" + j);
if (j == 5)
break ok;
}
}
另外,我我的一般並不使用標號這種方式,而是讓外層的循環條件表達式的結果能夠受到裏層循環體代碼的控制,例如,要在二維數組中查找到某個數字。
int arr[][] ={{1,2,3},{4,5,6,7},{9}};
boolean found = false;
for(int i=0;i<arr.length&& !found;i++) {
for(int j=0;j<arr[i].length;j++){
System.out.println("i=" + i + ",j=" + j);
if(arr[i][j] ==5) {
found = true;
break;
}
}
}
第三種,使用方法的return
private static int test() {
int count = 0;
for (int i = 0; i < 10; i++) {
for (int j = 0; j < 10; j++) {
count++;
System.out.println("i=" + i + ",j=" + j);
if (j == 5) {
return count;
}
}
}
return 0;
}
做用在byte, short, char, int, enum
封裝類對象,其它基本數據類型及引用數據類型都不能作爲case的條件
2 << 3
由於將一個數左移n位,就至關於乘以了2的n次方,那麼,一個數乘以8只要將其左移3位便可,而位運算cpu直接支持的,效率最高,因此,2乘以8等於幾的最效率的方法是2 << 3。
若是隻是大整數運算,使用BigInteger就能夠
若是有浮點數據參與去處,須要使用BigDecimal進行運算
Java中基本類型的浮點數運算是不精確的,須要使用BigDecimal運算,尤爲是金融、會計方向的軟件
引用變量不能從新賦值,可是引用指向的對象的內容能夠變化
例1:final StringBuffer a=new StringBuffer("immutable");
a=new StringBuffer("");
有編譯錯
例2:
final StringBuffer a=new StringBuffer("immutable");
a.append(「123」);
正確
他們的區別主要存在在引用數據類型上
==爲比較兩側的對象是否同一對象,是用內存地址來比較的
equals是方法,默認是用內存地址比較,重寫後,主要是用來比較兩側的對象的值是否相同,和equals方法中的實現有關
==能夠兩側都爲null,但equals左側的引用指向的對象不能空,否則有NullPointerException
除非須要比較兩個引用指向的對象是同一對象,通常都使用equals方法進行比較。尤爲是String之類的值對象,另外,常量儘可能放在比較的左側
在語法定義上的區別:靜態變量前要加static關鍵字,而實例變量前則不加。
在程序運行時的區別:實例變量屬於某個對象的屬性,必須建立了實例對象,其中的實例變量纔會被分配空間,才能使用這個實例變量。靜態變量不屬於某個實例對象,而是屬於類,因此也稱爲類變量,只要程序加載了類的字節碼,不用建立任何實例對象,靜態變量就會被分配空間,靜態變量就能夠被使用了。
總之,實例變量必須建立對象後才能夠經過這個對象來使用,靜態變量則能夠直接使用類名來引用。
不能夠。由於非static方法(實例方法)是要與對象關聯在一塊兒的,必須建立一個對象後,才能夠在該對象上進行方法調用,而static方法調用時不須要建立對象,能夠直接調用。也就是說,當一個static方法被調用時,可能尚未建立任何實例對象,若是從一個static方法中發出對非static方法的調用,那個非static方法是關聯到哪一個對象上的呢?這個邏輯沒法成立,因此,一個static方法內部發出對非static方法的調用。
int是java提供的8種原始數據類型之一,意思整型,佔用4字節。
Integer是java爲int提供的封裝類,是引用數據類型。
int的默認值爲0,而Integer的默認值爲null,即Integer能夠區分出未賦值和值爲0的區別,int則沒法表達出未賦值的狀況。
例如,要想表達出沒有參加考試和考試成績爲0的區別,則只能使用Integer
在JSP開發中,Integer的默認爲null,因此用el表達式在文本框中顯示時,值爲空白字符串,而int默認的默認值爲0,因此用el表達式在文本框中顯示時,結果爲0,因此,int不適合做爲web層的表單數據的類型。
在Hibernate中,若是將OID定義爲Integer類型,那麼Hibernate就能夠根據其值是否爲null而判斷一個對象是不是臨時的,若是將OID定義爲了int類型,還須要在hbm映射文件中設置其unsaved-value屬性爲0。
另外,Integer提供了多個與整數相關的操做方法,例如,將一個字符串轉換成整數,Integer中還定義了表示整數的最大值和最小值的常量。
Math類中提供了三個與取整有關的方法:ceil、floor、round,這些方法的做用與它們的英文名稱的含義相對應,例如,ceil的英文意義是天花板,該方法就表示向上取整,Math.ceil(11.3)的結果爲12,Math.ceil(-11.3)的結果是-11;floor的英文意義是地板,該方法就表示向下取整,Math.ceil(11.6)的結果爲11,Math.ceil(-11.6)的結果是-12;最難掌握的是round方法,它表示「四捨五入」,算法爲Math.floor(x+0.5),即將原來的數字加上0.5後再向下取整,因此,Math.round(11.5)的結果爲12,Math.round(-11.5)的結果爲-11。
這四個做用域的可見範圍以下表所示。
說明:若是在修飾的元素上面沒有寫任何訪問修飾符,則表示friendly/default。
做用域 |
當前類 |
同package |
子孫類 |
其餘package |
public |
√ |
√ |
√ |
√ |
protected |
√ |
√ |
√ |
× |
friendly |
√ |
√ |
× |
× |
private |
√ |
× |
× |
× |
備註:只要記住了有4種訪問權限,4個訪問範圍,而後將全選和範圍在水平和垂直方向上分別按排從小到大或從大到小的順序排列,就很容易畫出上面的圖了。
Overload是重載的意思,Override是覆蓋的意思,也就是重寫。
Overload和Override有共同之處,兩個方法的方法名都必須相同,若是不一樣,既不構成Overload,也不構成Override。
a) 參數列表徹底相同:個數相同、類型相同、順序相同
b) 子類的返回值不能比父類的返回值範圍大
c) 子類方法拋出的異常不能比父類方法拋出的異常範圍大
d) 修飾符只能爲public、protected、friendly,不能爲private
e) 父子類方法不能使用static修飾
clone 有缺省行爲,super.clone();由於首先要把父類中的成員複製到位,而後纔是複製本身的成員。
1. 封裝,隱藏內部實現,只暴露公共行爲
2. 繼承,提升代碼的重用性
3. 多態,體現現實生活中類似對象的差別性
4. 抽象,抽取現實世界中類似對象的共同點
經過繼承父類或實現接口。不一樣子類或實現類對同一父類方法有不一樣的實現。根據對象調用相應的實現方法。另外對於類似的方法,能夠使用重載。
含有abstract修飾符的class即爲抽象類,abstract類不能建立的實例對象。含有abstract方法的類必須定義爲abstract class,abstract class類中的方法沒必要是抽象的。abstract class類中定義抽象方法必須在具體(Concrete)子類中實現,因此,不能有抽象構造方法或抽象靜態方法。若是的子類沒有實現抽象父類中的全部抽象方法,那麼子類也必須定義爲abstract類型。
接口(interface)能夠說成是抽象類的一種特例,接口中的全部方法都必須是抽象的。接口中的方法定義默認爲public abstract類型,接口中的成員變量類型默認爲public static final。
下面比較一下二者的語法區別:
1.抽象類能夠有構造方法,接口中不能有構造方法。
2.抽象類中能夠有普通成員變量,接口中沒有普通成員變量
3.抽象類中能夠包含非抽象的普通方法,接口中的全部方法必須都是抽象的,不能有非抽象的普通方法。
4. 抽象類中的抽象方法的訪問類型能夠是public,protected和(默認類型,雖然
eclipse下不報錯,但應該也不行),但接口中的抽象方法只能是public類型的,而且默認即爲public abstract類型。
5. 抽象類中能夠包含靜態方法,接口中不能包含靜態方法
6. 抽象類和接口中均可以包含靜態成員變量,抽象類中的靜態成員變量的訪問類型能夠任意,但接口中定義的變量只能是public static final類型,而且默認即爲public static final類型。
7. 一個類能夠實現多個接口,但只能繼承一個抽象類。
下面接着再說說二者在應用上的區別:
接口更多的是在系統架構設計方法發揮做用,主要用於定義模塊之間的通訊契約;
而抽象類在代碼實現方面發揮做用,能夠實現代碼的重用。
abstract的method不能夠是static的,由於抽象的方法是要被子類實現的,而static與子類扯不上關係!
native方法表示該方法要用另一種依賴平臺的編程語言實現的,不存在着被子類實現的問題,因此,它也不能是抽象的,不能與abstract混用。
synchronized和abstract合用的問題不能共用,abstract方法只能存在於抽象類或接口中,它不能直接產生對象,而默認synchronized方法對當前對象加鎖,沒有對象是不能加鎖。
另外synchronized不能被繼承,子類繼承時,須要另加修改符。
內部類就是在一個類的內部定義的類。內部能夠定義在除參數位置上的任意位置。印象中有四種方式。
1. 靜態內部類須要使用static修飾,而普通內部類不能使用static修飾
2. 靜態內部類只能定義在和屬性同級,普通內部類能夠定義在除參數位置之外的任意位置
3. 靜態內部類必需有名稱,而普通內部類能夠是匿名的
4. 靜態內部類沒有this引用,只此只能訪問外部類的靜態成員,而普通內部類能夠訪問外部類的所有成員
5. 靜態內部類訪問外部類的同名函數時,使用「外部類名.方法名」便可,而普通內部類須要使用「外部類名.this.外部方法」
6. 靜態內部類能夠定義靜態方法,而普通內部類不能定義靜態方法
1. 若是內部類爲靜態內部類,只能調用外部類的靜態成員;若是有重名成員,須要用「外部類名.成員名」訪問;不能調用外部類的對象成員。
2. 若是內部類爲非靜態內部類,則能夠調用外部類的全部成員;若是有重名成員,須要使用「外部類名.this.外部方法」
基本數據類型包括byte、int、char、long、float、double、boolean和short。
String是引用數據類型。
java.lang.String類是final類型的,所以不能夠繼承這個類、不能修改這個類。爲了提升效率節省空間,咱們應該用StringBuffer/StringBuilder類
這兩個類都實現了CharSequence接口。
1. 類型不一樣,由於不是一個類,也沒有繼承關係,作參數時不能共用
2. String對象是不可變對象,不能修改值。而StringBuffer是可變對象,能修改值。
3. 拼接字符串時,String會產生新對象,而StringBuffer只是增長新字符,不產生新對象,所以效率高。
4. String覆蓋了equals方法和hashCode方法,而StringBuffer沒有覆蓋equals方法和hashCode方法,因此,將StringBuffer對象存儲進Java集合類中時會出現問題。
若是不查jdk api,我很難寫出來!我能夠說說個人思路:
StringTokenizer tokener = new StringTokenizer(s, ",");
String[] result = new String[tokener.countTokens()];
Integer i = 0;
while (tokener.hasMoreTokens()) {
result[i++] = tokener.nextToken();
}
int index = -1;
int oldIndex = 0;
List<String> ss = new ArrayList<String>();
while ((index = s.indexOf(',', index + 1)) != -1) {
ss.add(s.substring(oldIndex, index));
oldIndex = index + 1;
}
if (s.charAt(s.length() - 1) == ',') {
ss.add("");
}
String[] array = ss.toArray(new String[ss.size()]);
System.out.println(Arrays.toString(array));
final 用於聲明屬性,方法和類,分別表示屬性不可變,方法不可覆蓋,類不可繼承。
內部類要訪問局部變量,局部變量必須定義成final類型
final int[] number = { 20 };
new Thread() {
@Override
public void run() {
for (int k = 0; k < 20; k++) {
number[0]++;
}
}
}.start();
Thread.sleep(10);
System.out.println(number[0]);
finally是異常處理語句結構的一部分,表示老是執行,用來釋放資源。
finalize是Object類的一個方法,在垃圾收集器執行的時候會調用被回收對象的此方法,能夠覆蓋此方法提供垃圾收集時的其餘資源回收,例如關閉文件等。JVM不保證此方法總被調用
異常表示程序運行過程當中可能出現的非正常狀態,運行時異常表示虛擬機的一般操做中可能遇到的異常,是一種常見運行錯誤。java編譯器要求方法必須聲明拋出可能發生的非運行時異常,可是並不要求必須聲明拋出未被捕獲的運行時異常。
error 表示恢復不是不可能但很困難的狀況下的一種嚴重問題。好比說內存溢出,不可能期望程序能處理這樣的狀況。exception表示一種設計或實現問題,也就是說,它表示若是程序運行正常,從不會發生的狀況。
異常是指java程序運行時(非編譯)所發生的非正常狀況或錯誤。
Java使用面向對象的方式來處理異常,它把程序中發生的每一個異常也都分別封裝到一個對象中,該對象中包含有異常的信息。
Java能夠自定義異常類,全部異常的根類爲java.lang.Throwable,Throwable下面又派生了兩個子類:Error和Exception。
Java爲運行時異常和檢查異常提供了不一樣的解決方案,編譯器強制檢查異常必須try..catch處理或用throws聲明繼續拋給上層調用方法處理,因此檢查異常也稱爲checked異常,而運行異常能夠處理也能夠不處理,因此編譯器不強制用try..catch處理或用throws聲明,因此運行異常也稱爲Runtime異常。
提示答題者:就按照三個級別去思考:虛擬機必須宕機的錯誤,程序能夠死掉也能夠不死掉的錯誤,程序不該該死掉的錯誤
NullPointerException、ArrayIndexOutOfBoundsException、ClassCastException、IllegelArgumentException、SecurityException。
throw程序出錯時,手工拋出異常
try嘗試執行,裏面的語句可能出現異常,如出現異常須要處理
catch處理try中出現的異常
finally在try後執行清理操做,用於釋放資源
java5之前,有以下兩種:
第一種:
new Thread(){}.start();這表示調用Thread子類對象的run方法,new Thread(){}表示一個Thread的匿名子類的實例對象,子類加上run方法後的代碼以下:
new Thread() {
public void run() {
}
}.start();
第二種:
new Thread(new Runnable(){}).start();這表示調用Thread對象接受的Runnable對象的run方法,new Runnable(){}表示一個Runnable的匿名子類的實例對象,runnable的子類加上run方法後的代碼以下:
new Thread(new Runnable() {
public void run() {
}
}).start();
從Java5開始,還有以下一些線程池建立多線程的方式:
ExecutorService pool = Executors.newFixedThreadPool(3);
for (int i = 0; i < 10; i++) {
pool.execute(new Runable() {
public void run() {
}
});
}
Executors.newCachedThreadPool().execute(new Runable() {
public void run() {
}
});
Executors.newSingleThreadExecutor().execute(new Runable() {
public void run() {
}
});
有兩種實現方法,分別使用new Thread()和new Thread(runnable)形式,第一種直接調用thread的run方法,因此,咱們每每使用Thread子類,即new SubThread()。第二種調用runnable的run方法。
同步是指全部操做串行化執行,順序不能改變,前一操做未完成,後個操做不執行。
異步是指全部操做能夠並行執行,順序無關。
例如寄信
同步:若是沒有寄完,不能吃飯,郵遞員10天后送到,發送人被餓死
異步:寄出後能夠當即吃飯,郵遞員送完後,通知發送人送信結果。
若是強調執行順序的話,用同步。若是順序無關,則能夠用異步。
異步執行效率比同步高。
class Test {
synchronized static void sayHello3() {
}
synchronized void getX() {
}
}
多線程有兩種實現方法,分別是繼承Thread類與實現Runnable接口
同步的實現方面有五種,分別是synchronized、wait與notify、sleep、suspend、join
synchronized: 一直持有鎖,直至執行結束
wait():使一個線程處於等待狀態,而且釋放所持有的對象的lock,需捕獲異常。
sleep():使一個正在運行的線程處於睡眠狀態,是一個靜態方法,需捕獲異常,不釋放鎖。
notify():喚醒一個處於等待狀態的線程,注意的是在調用此方法的時候,並不能確切的喚醒某一個等待狀態的線程,而是由JVM肯定喚醒哪一個線程,並且不是按優先級。
notityAll():喚醒全部處入等待狀態的線程,注意並非給全部喚醒線程一個對象的鎖,而是讓它們競爭。
啓動一個線程是調用start()方法,使線程就緒狀態,之後能夠被調度爲運行狀態,一個線程必須關聯一些具體的執行代碼,run()方法是該線程所關聯的執行代碼。
若是其它方法中使用當前對象做爲鎖對象,則不能;
若是其它方法中沒有使用當前對象做爲鎖對象,則能。
在多任務操做系統中,爲了提升CPU的利用率,能夠使用多進程編程。但對進程通訊比較困難,進程間數據不能共享,所以能夠使用多線程編程。一個進程至少包含一個主入口線程。
單個CPU,在同一時間只能處理一個線程的數據,可是操做系統的任務調度很是快,人眼沒法識別,感受上是多個線程同時執行。有的線程能夠已經用完CPU,正在做磁盤操做,此時並不使用CPU,可讓出CPU資源給其它線程使用,提升效率。
線程有生命週期及相關關係和對應方法以下圖:
Iterable
->Collection
->List
->ArrayList
->LinkedList
->Vector
->Stack
->Set
->HashSet
->TreeSet
Map
->Hashtable
->HashMap
->LinkedHashMap
Collections,不屬於集合,是集合類的工具類
Arrays,不屬於集合類,是數據對象的工具類
1. 線程同步,Vector線程安全,ArrayList線程不安全
2. 效率問題,Vector效率低,ArrayList效率高
3. 增加數量,Vector以1.5倍增加,ArrayList以2倍增加
1. 線程同步,Hashtable線程安全,HashMap線程不安全
2. 效率問題,Hashtable效率低,HashMap效率高
3. HashMap能夠使用null做爲key,Hashtable不能夠使用null爲key
4. HashMap使用的是新實現,繼承AbstractMap,而Hashtable是繼承Dictionary類,實現比較老
5. Hash算不一樣,HashMap的hash算法比Hashtable的hash算法效率高
6. HashMap把Hashtable的contains方法去掉了,改爲containsValue和containsKey。由於contains方法容易讓人引發誤解。
7. 取值不一樣,HashMap用的是Iterator接口,而Hashtable中還有使用Enumeration接口
一個是存儲單列數據的集合,另外一個是存儲鍵和值的雙列數據的集合,List中存儲的數據是有順序,而且容許重複;Map中存儲的數據是沒有順序的,其鍵是不能重複的,它的值是能夠有重複的。
List,Set是,Map不是
List使用get(index)取值,也能夠使用Iterator、toArray取值
Set只能經過Iterator、toArray取值
Map取值使用get(key)取值,也能夠使用keySet取鍵值集合,也可以使用values取值集合,entrySet取所有映射。
1. ArrayList和Vector使用數組存儲元素;LinkedList使用鏈表存儲元素
2. ArrayList和Vector插入刪除數據時,須要搬運數據,效率較差;LinkedList使用鏈表,不須要搬運數據,效率高
3. ArrayList和Vectory查詢時,按數組下標查詢,不須要遍歷,效率高;LinkedList須要遍歷,查詢效率底
4. ArrayList和Vector的區別見59條
1. 自行遍歷,用另一個Vector來判斷是否有重複
2. 用Set(TreeSet或HashSet)來去重
3. 用Apache的CollectionUtil工具類去重
Vector newVector = new Vector();
for (int i = 0; i < vector.size(); i++) {
Object obj = vector.get(i);
if (!newVector.contains(obj))
newVector.add(obj);
}
還有一種簡單的方式,HashSet set = new HashSet(vector);
Collection是集合類的上級接口,繼承與他的接口主要有Set和List.
Collections是針對集合類的一個工具類,他提供一系列靜態方法實現對各類集合的搜索、排序、線程安全化等操做。
Set裏的元素是不能重複的,元素重複與否視具體狀況而定:
1. HashSet使用equals比較
2. TreeSet使用compareTo進行比較
最經常使用的集合類接口是List 和 Map。
List的具體實現包括ArrayList、Vector、LinkedList,它們是可變大小的列表,比較適合構建、存儲和操做任何類型對象的元素列表。List適用於按數值索引訪問元素的情形。
Set的具體實現包括HashSet和TreeSet,它們也是可變大小集合,但不適合用索引取值。
Map 提供了一個更通用的元素存儲方法。Map集合類用於存儲元素對(稱做"鍵"和"值"),其中每一個鍵映射到一個值。
ArrayList/Vector、LinkedList
HashSet/TreeSetàSet
Properties/HashTable/TreeMap/HashMap
List的主要方法有:
add、get、remove、set、iterator、contains、addAll、removeAll、indexOf、toArray、clear、isEmpty
Set的主要方法有:
add、remove、iterator、contains、addAll、removeAll、toArray、clear、isEmpty
Map的主要方法有:
put、get、keySet、values、entrySet、clear、remove、isEmpty
1. equals等,hashCode同,所以重寫equals方法必須重寫hashCode
2. hashCode等,equals不必定同,但hashCode最好散列化
3. 任何對象equals null都得false
4. 沒有繼承關係的兩個類,equals都得false
5. 重寫equals方法的類最好是值類,即不可變
要讓人家感受你對java ee開發很熟,因此,不能僅僅只列core java中的那些東西,要多列你在作ssh項目中涉及的那些東西。就寫你最近寫的那些程序中涉及的那些類。
經常使用的類:BufferedReader,BufferedWriter,FileReader,FileWirter,String,Integer,
java.util.Date,System,Class,List,HashMap
經常使用的包:java.lang,java.io,java.util,java.sql,javax.servlet,org.apache.strtuts.action,org.hibernate
經常使用的接口: List,Map,Document,NodeList,Servlet,HttpServletRequest,HttpServletResponse,Transaction(Hibernate) ,Session(Hibernate),HttpSession
字節流,字符流。字節流繼承於InputStream、OutputStream,字符流繼承於Reader、Writer。在java.io包中還有許多其餘的流,主要是爲了提升性能和使用方便。
FileInputStream、FileReader、BufferedInputStream、BufferedReader、ZipInputStream、PrintStream、StringReader、ObjectInputStream、RandomAccessFile(不屬於流,但像流)
字節流是按字節讀取或寫入設備,但字符流是以字符爲單位讀取或寫入設備。
若是是二進制文件,須要用字節流讀取。通常來講,字符流只處理文本文件。在設備中,大多數狀況是以字節形式存儲數據的,所以字符流經過須要傳入字節流當參數。
序列化是把內存Java對象保存到存儲介質中,反序列化就是把存儲介質中的數據轉化爲Java對象。Java經過ObjectInputStream和ObjectOutputStream實現序列化和反序列化。須要進行序列化的對象的類必須實現Serializable接口,一般狀況下須要知足如下條件:
1. 強烈建議手動生成serialVersionUID常量
2. 若是須要加解密的話,須要實現兩個方法readObject和writeObject方法
3. 若是使用Hibernate二級緩存或其它緩存服務器的話,對象必須是可序列化的
4. 若是須要遠程調用對象或傳值的話,則對像須要序列化
5. 序列化類的可序列化成員必須也是可序列化的,不須要序列化的屬性用transient修飾
1. 查找當前ClassLoader中是否有此class的類對象,有則返回
2. 若沒有的話,向上遞歸全部的父ClassLoader中有無此class類對象,有則返回
3. 若尚未,查找BootstrapClassLoader中有無此class類對象,有則返回
4. 若尚未的話,使用findClass或resolveClass加載類對象
a. 讀取class二進制文件
b. 根據字節數組生成Class對象
c. 緩存到當前ClassLoader中
JVM加載class對象是懶加載,按需加載
Java的內存分爲兩類,一類是棧內存,一類是堆內存。
棧中存儲的是當前線程的方法調用、基本數據類型和對象的引用,棧是有序的。
堆中存儲的是對象的值,堆是無序的。
方法中的局部變量使用final修飾後,放在堆中,而不是棧中。
對於GC來講,當程序員建立對象時,GC就開始監控這個對象的地址、大小以及使用狀況。一般,GC採用有向圖的方式記錄和管理堆(heap)中的全部對象。經過這種方式肯定哪些對象是"可達的",哪些對象是"不可達的"。當GC肯定一些對象爲"不可達"時,GC就有責任回收這些內存空間。能夠。程序員能夠手動執行System.gc(),通知GC運行,可是Java語言規範並不保證GC必定會執行。
assertion(斷言)在軟件開發中是一種經常使用的調試方式,不少開發語言中都支持這種機制。在實現中,assertion就是在程序中的一條語句,它對一個boolean表達式進行檢查,一個正確程序必須保證這個boolean表達式的值爲true;若是該值爲false,說明程序已經處於不正確的狀態下,assert將給出警告或退出。通常來講,assertion用於保證程序最基本、關鍵的正確性。assertion檢查一般在開發和測試時開啓。爲了提升性能,在軟件發佈後,assertion檢查一般是關閉的。
能夠,若是非要實現java.lang.String,須要自已寫ClassLoader,否則JVM優先加載默認rt.jar中的java.lang.String。
能夠,但在應用的時候,須要用本身的類加載器去加載,不然,系統的類加載器永遠只是去加載rt.jar包中的那個java.lang.String。因爲在tomcat的web應用程序中,都是由webapp本身的類加載器先本身加載WEB-INF/classess目錄中的類,而後才委託上級的類加載器加載,若是咱們在tomcat的web應用程序中寫一個java.lang.String,這時候Servlet程序加載的就是咱們本身寫的java.lang.String,可是這麼幹就會出不少潛在的問題,原來全部用了java.lang.String類的都將出現問題。
雖然java提供了endorsed技術,能夠覆蓋jdk中的某些類,可是,可以被覆蓋的類是有限制範圍,反正不包括java.lang這樣的包中的類。
(下面的例如主要是便於你們學習理解只用,不要做爲答案的一部分,不然,人家懷疑是題目泄露了)例如,運行下面的程序:
package java.lang;
public class String {
public static void main(String[] args) {
System.out.println("string");
}
}
報告的錯誤以下:
java.lang.NoSuchMethodError:main
Exception inthread "main"
這是由於加載了jre自帶的java.lang.String,而該類中沒有main方法。
1. 在web.xml中配置struts的servlet或filter入口類,同時在web.xml中配置spring的listener和配置文件路徑
2. 引用SSH所需的jar包放在WEB-INF/lib下,須要有struts-spring-plugin.jar
3. 在struts.xml配置中,把Struts的Action類交由Spring託管
4. 把Hibernate所需的DataSource, SessionFactory, Transcation, HibernateTemplate配置在Spring的配置文件中
5. Dao層的類有時須要繼承HiberateDaoSupport類,若是有HibernateTemplate時,能夠不繼承
6. 把Action、Service、Dao等類註冊到Spring中管理
答:
package com.bwie.interview;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintStream;
import java.util.StringTokenizer;
public class AnswerB01 {
public static void main(String[] args) throws IOException {
StringTokenizer tokenizer1 = getTokenzer("/a.txt");
StringTokenizer tokenizer2 = getTokenzer("/b.txt");
PrintStream out = new PrintStream("C:/c.txt");
while (tokenizer1.hasMoreTokens() && tokenizer2.hasMoreTokens()) {
out.println(tokenizer1.nextToken());
out.println(tokenizer2.nextToken());
}
out.close();
}
private static StringTokenizer getTokenzer(String fileName) throws IOException {
InputStreamReader reader = new InputStreamReader(AnswerB01.class.getResourceAsStream(fileName));
StringBuilder builder = new StringBuilder(1000);
int length = -1;
char[] cs = new char[1024];
while ((length = reader.read(cs)) != -1) {
builder.append(cs, 0, length);
}
reader.close();
return new StringTokenizer(builder.toString());
}
}
(你們正在作上面這道題,網上遲到的朋友也請作作這道題,找工做必須能編寫這些簡單問題的代碼!)
答:listFiles方法接受一個FileFilter對象,這個FileFilter對象就是過慮的策略對象,不一樣的人提供不一樣的FileFilter實現,即提供了不一樣的過濾策略。
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.FilenameFilter;
import java.io.IOException;
public class AnswerB02 {
public static void main(String[] args) throws IOException {
File sourceFolder = new File("D:/java");
File[] files = sourceFolder.listFiles(new JavaFileFilter());
for (File file : files) {
String absolutePath = file.getName();
String targetFile = "D:/jad/" + absolutePath.substring(0, absolutePath.length() - 5) + ".jad";
copy(file, new File(targetFile));
}
}
private static void copy(File source, File target) throws IOException {
FileInputStream input = new FileInputStream(source);
FileOutputStream out = new FileOutputStream(target);
int length = -1;
byte[] bs = new byte[1024];
while ((length = input.read(bs)) != -1) {
out.write(bs, 0, length);
}
input.close();
out.close();
}
private static final class JavaFileFilter implements FilenameFilter {
@Override
public boolean accept(File dir, String name) {
return name.endsWith(".java");
}
}
}
import java.io.IOException;
public class AnswerB03 {
public static void main(String[] args) throws IOException {
String s = "我ABC漢DEF";
System.out.println(substring(s, 6));
}
public static String substring(String s, int length) {
char[] cs = s.toCharArray();
StringBuilder builder = new StringBuilder();
int count = 0;
for (char c : cs) {
if (isAsc(c)) {
count++;
} else {
count += 2;
}
if (count > length) {
break;
}
builder.append(c);
}
return builder.toString();
}
public static boolean isAsc(char c) {
return c < 128;
}
}
答:哈哈,其實包含中文字符、英文字符、數字字符原來是出題者放的煙霧彈。
String content = "中國aadf的111薩bbb菲的zz薩菲";
HashMap map = new HashMap();
for (int i = 0; i < content.length; i++) {
char c = content.charAt(i);
Integer num = map.get(c);
if (num == null)
num = 1;
else
num = num + 1;
map.put(c, num);
}
for (Map.EntrySet entry : map) {
system.out.println(entry.getkey() + ":" + entry.getValue());
}
估計是當初面試的那個學員表述不清楚,問題極可能是:
若是一串字符如"aaaabbc中國1512"要分別統計英文字符的數量,中文字符的數量,和數字字符的數量,假設字符中沒有中文字符、英文字符、數字字符以外的其餘特殊字符。
int engishCount;
int chineseCount;
int digitCount;
for (int i = 0; i < str.length; i++) {
char ch = str.charAt(i);
if (ch >= '0' && ch <= '9') {
digitCount++;
} else if ((ch >= 'a' && ch <= 'z') || (ch >= 'A' && ch <= 'Z')) {
engishCount++;
} else {
chineseCount++;
}
}
這是組合設計模式。
我有不少個(假設10萬個)數據要保存起來,之後還須要從保存的這些數據中檢索是否存在某個數據,(我想說出二叉樹的好處,該怎麼說呢?那就是說別人的缺點),假如存在數組中,那麼,碰巧要找的數字位於99999那個地方,那查找的速度將很慢,由於要從第1個依次日後取,取出來後進行比較。平衡二叉樹(構建平衡二叉樹須要先排序,咱們這裏就不做考慮了)能夠很好地解決這個問題,但二叉樹的遍歷(前序,中序,後序)效率要比數組低不少,原理以下圖:
代碼以下:
public class AnswerB04 {
public static void main(String[] args) {
Node root = makeupTree();
traverse(root);
}
private static void traverse(Node node) {
if (node == null) {
return;
}
traverse(node.left);
System.out.println(node.value);
traverse(node.right);
}
private static Node makeupTree() {
Node root = new Node(0);
Node node1 = new Node(1);
Node node2 = new Node(2);
Node node11 = new Node(11);
Node node12 = new Node(12);
Node node21 = new Node(21);
Node node22 = new Node(22);
root.left = node1;
root.right = node2;
node1.left = node11;
node1.right = node12;
node2.left = node21;
node2.right = node22;
return root;
}
public static class Node {
public Node left;
public Node right;
public int value;
public Node(int value) {
this.value = value;
}
}
}
一個整數,大於0,不用循環和本地變量,按照n,2n,4n,8n的順序遞增,當值大於5000時,把值按照指定順序輸出來。
例:n=1237
則輸出爲:
1237,
2474,
4948,
9896,
9896,
4948,
2474,
1237,
提示:寫程序時,先致謝按遞增方式的代碼,寫好遞增的之後,再增長考慮遞減部分。
public static void doubleNum(int n) {
System.out.println(n);
if (n <= 5000)
doubleNum(n * 2);
System.out.println(n);
}
Gaibaota(N) = Gaibaota(N-1) + n
第1我的10,第2個比第1我的大2歲,依次遞推,請用遞歸方式計算出第8我的多大?
package cn.itcast;
import java.util.Date;
public class A1 {
public static void main(String[] args) {
System.out.println(computeAge(8));
}
public static int computeAge(int n) {
if (n == 1)
return 10;
return computeAge(n - 1) + 2;
}
}
public static void toBinary(int n, StringBuffer result) {
if (n / 2 != 0)
toBinary(n / 2, result);
result.append(n % 2);
}
本人只研究過冒泡排序、選擇排序和快速排序,下面是快速排序的代碼:
冒泡排序:
private static void bubbleSort(int[] array) {
for (int i = 1; i < array.length; i++) {
for (int j = 0; j < i; j++) {
if (array[i] < array[j]) {
int temp = array[i];
array[i] = array[j];
array[j] = temp;
}
}
}
}
快速排序:
public class QuickSort {
public void quickSort(String[] strDate, int left, int right) {
String middle, tempDate;
int i, j;
i = left;
j = right;
middle = strDate[(i + j) / 2];
do {
while (strDate[i].compareTo(middle) < 0 && i < right)
i++; // 找出左邊比中間值大的數
while (strDate[j].compareTo(middle) > 0 && j > left)
j--; // 找出右邊比中間值小的數
if (i <= j) { // 將左邊大的數和右邊小的數進行替換
tempDate = strDate[i];
strDate[i] = strDate[j];
strDate[j] = tempDate;
i++;
j--;
}
} while (i <= j); // 當二者交錯時中止
if (i < right) {
quickSort(strDate, i, right);
}
if (j > left) {
quickSort(strDate, left, j);
}
}
public static void main(String[] args) {
String[] strVoid = new String[] { "11", "66", "22", "0", "55", "22", "0", "32" };
QuickSort sort = new QuickSort();
sort.quickSort(strVoid, 0, strVoid.length - 1);
for (int i = 0; i < strVoid.length; i++) {
System.out.println(strVoid[i] + " ");
}
}
}
public class AnswerB11 {
public static void main(String[] args) {
int[] array = { 2, 25, 21, 63, 234, 83 };
reverse(array);
System.out.println(Arrays.toString(array));
}
private static void reverse(int[] array) {
for (int i = 0; i < array.length / 2; i++) {
int temp = array[i];
array[i] = array[array.length - 1 - i];
array[array.length - 1 - i] = temp;
}
}
}
import java.util.Stack;
public class AnswerB13 {
public static void main(String[] args) {
Node tree = makeupTree();
Stack<Node> stack = new Stack<Node>();
Node currentNode = tree;
while (currentNode != null) {
System.out.println(currentNode.value);
stack.push(currentNode);
currentNode = currentNode.left;
if (currentNode == null) {
Node parent = stack.pop();
currentNode = parent.right;
if (currentNode == null) {
if (stack.isEmpty()) {
break;
}
Node parentParent = stack.pop();
currentNode = parentParent.right;
}
}
}
}
private static Node makeupTree() {
Node root = new Node(0);
Node node1 = new Node(1);
Node node2 = new Node(2);
Node node11 = new Node(11);
Node node12 = new Node(12);
Node node21 = new Node(21);
Node node22 = new Node(22);
root.left = node1;
root.right = node2;
node1.left = node11;
node1.right = node12;
node2.left = node21;
node2.right = node22;
return root;
}
public static class Node {
public Node left;
public Node right;
public int value;
public Node(int value) {
this.value = value;
}
}
}
會出現線程不安全問題。不管是doGet仍是doPost去調用,服務器端處理的過程都是同樣的,那麼咱們能夠把處理過程單獨寫在另一個方法handle裏,讓兩個方法都去調用handle,根據不一樣請求去調用不一樣的方法。
把全部的session的數據保存到Mysql服務器上,全部Web服務器都來這臺Mysql服務器來獲取Session數據。
SimpleTagSupport,通常調用doTag方法或者實現SimpleTag接口
在 jsp 中處理 JSON,一般須要配套使用 JQuery 控件,而且導入一些 Common jar 包。使用 JQuery 控件是由於它能有效的解析而且展現 JSON 數據,導入Common 則是由於 Java 中的對象並非純粹的數據,須要經過這些 Jar 包的處理使之轉化成真實數據。
重定向是客戶端行爲,轉發是服務器端行爲
重定向時服務器產生兩次請求,轉發產生一次請求,重定向時能夠轉發到項目之外的任何網址,轉發只能在當前項目裏轉發
重定向會致使request對象信息丟失。轉發則不會
轉發的url不會變,request.getRequestDispatch()。forward()
重定向的url會改變,response.getRedirect();
jsp的可讀性強,容易維護,而且jsp在最後會編譯成servlet,servlet容易調試。
Jsp不可以直接調用窗口,只能先 生成打開窗口的js,再由js調用
Session不能經過new建立,須要經過調用getSession()或者getSession(true)方法建立,getSession()是自動建立session,getSession(true)是強制建立session,setAttribute()方法能夠用於傳值,getAttribute()能夠用於取值
(第一次建立session的時候,就是訪問第一次一個jsp頁面<這個頁面的page指令 沒有設置session=false>)
銷燬session調用invalidate方法
經過setMaxInactiveInterval()能夠設定session的生存時間(web.xml能夠設置session的生存時間)
Page :指令是針對當前頁面的指令
Include :用於指定如何包含另外一個頁面
Taglib :用於定義和指定自定義標籤
Forward,執行頁面跳轉,將請求的處理轉發到另外一個頁面
Param :用於傳遞參數
Include :用於動態引入一個jsp頁面
Plugin :用於下載javaBean或applet到客戶端執行
useBean :使用javaBean
setProperty :修改javaBean實例的屬性值
getProperty :獲取javaBean實例的屬性值
request.getParameter()返回客戶端的請求參數與值
request.getParameterNames()返回全部可用屬性名的枚舉
request.getParameterValues()返回包含參數的全部值的數組
一個是服務端,一個是客戶端
Servlet是獨立於平臺和協議的服務器端的java應用程序,能夠動態生成web頁面,並採用響應--請求的模式提供web服務
javaScript是一種解釋性語言,用於向html頁面提供交互行爲,一般被直接嵌入在html頁面中
servlet是java語言編寫的web應用
js是基於html上的一種解釋語言
客戶端發出請求(request),jsp引擎將jsp頁面翻譯成servlet的java源文件,在Tomcat中將源文件編譯成class文件,並加載到內存中執行,把結果返回(response)給客戶端。
不一樣:
Html是靜態,servlet是動態
html頁面由服務器直接返回,
servlet是用來處理客戶請求,並返回html頁面
//servlet須要服務器調用servlet方法生成動態html頁面,且須要在web.xml中配置url路徑
Cookie,session和application,
Cookie是http對象,客戶端與服務端均可以操縱
cookie是在客戶端保持狀態,session是在服務器端保持狀態,因爲cookie是保存在客戶端本地的,因此數據很容易被竊取,當訪問量不少時,使用session則會下降服務器的性能,application的做用域是整個工程裏只有一個,能夠在不一樣瀏覽器之間共享數據,全部人均可以共享,所以application也是不安全的
Session用於客戶端與服務器之間保持狀態的解決方案,數據保存在服務器內存中,底層是有cookie實現的
Application的做用域是整個工程裏只有一個,能夠在不一樣瀏覽器之間共享數據,全部人均可以共享,所以application是不安全的。
Request是客戶端向服務端發送請求
Response是服務端對客戶端請求作出響應
Session在servlet中不能直接使用,須要經過getSession()建立,若是沒有設定它的生命週期,或者經過invildate()方法銷燬,關閉瀏覽器session就會消失
Application不能直接建立,存在於服務器的內存中,由服務器建立和銷燬
可經過form表單的get或post將值傳遞到後臺,也可經過setAttribute()方法將值傳遞到後臺
在servlet中經過request.getParameter()方法能夠獲取表單的值
或者是request.getParameterValuse();
表單傳參,url傳參,jquery.ajax傳參
經過設置屬性setAttribute(),經過getAttribute()拿值,getParameter()方法能夠作到
不能
404:找不到url請求的路徑,通常是工程名不對或者拼寫錯誤
500:服務器內部錯誤,通常是服務器內部代碼編寫錯誤,也有多是拋異常致使
<c:if>,<c:item>,<c:foreach>,<c:out>,<c:set>
經過使用屬性hidden能夠將元素隱藏
Session不能經過new建立,要經過調用getSession()方法建立,數據保存在服務器端,單個客戶端session是共享的,底層是由cookie實現的,大小沒有限制
Application的做用域是整個工程只有共享一個,生命週期比session大
Cookie須要經過new建立,數據保存在客戶端中,cookie保存的數據不能超過4k,不安全
如將ISO-8859-1輸出爲GBK格式的字符, 經過new String(byte[] bytes,String charset) 構造器設置編碼構造一個新的String(new String("ISO-8859-1","GBK"));
經過session中的isNew()能夠判斷是不是新用戶
Web容器會自動爲servlet寫一個無參的構造器,它使用class.forName("").newInstance()反射來建立servlet實例的
是線程不安全的,由於servlet是單例模式,當多個客戶端共同訪問的時候線程不安全。
儘可能用局部變量,同步塊,若是當前字段是不會改變的,用final修飾
是行爲元素、是在請求處理階段引入的,引入執行頁面或servlet所生成的應答文本
先編譯,後包含,就是將每一個jsp頁面都單獨轉化成html頁面,最後再將全部的html頁面相加,若是有相同變量不會衝突
是指令元素
是編譯時包含,引入靜態文本(html,jsp),在JSP頁面被轉化成servlet以前和它融和到一塊兒。先包含,後編譯
就是將多個jsp一塊兒解析,最後再一塊兒生成html頁面,若是有相同變量會衝突
能夠使用pageContext對象來設定屬性,並指定屬性的做用範圍,提供了對JSP頁面內全部的對象及名字空間的訪問
首先初始化過濾器,而後服務器組織過濾器鏈,全部的請求都必須須要先經過過濾器鏈,
過濾器鏈是一個棧,遵循先進後出的原則 ,全部的請求須要通過一個一個的過濾器,執行順序要根據web.xml裏配置的<filter-mapping>的位置先後執行,每一個過濾器之間經過chain.doFilter鏈接, 最後抵達真正請求的資源,執行完後再從過濾器鏈退出
須要上一頁和下一頁的超連接(至少須要這兩個),經過計算當前頁的頁碼獲取下一頁數據
的起始位置,而後在 MySql 中查詢,若是使用 Oracle 則須要另外計算下一頁數據的結
束位置。
使用hibernate框架,它能夠針對不一樣的數據庫自動產生爲你分頁的代碼。
一、Ajax特色:
局部刷新、提升用戶的體驗度,數據從服務器商加載。
二、AJax的技術組成:不是新技術,而是以前技術的整合
Ajax: Asynchronous Javascript And Xml;(異步的JavaScript和XML)
包括的技術:JavaScript、XML、CSS、XMLHttpRequest
異步:發送請求之後,不等結果,由回調函數處理。
JavaScript:向服務器發送請求,得到返回結果,更新頁面
XML: 用來封裝數據
三、Ajax核心原理
XMLHttpRequst對象:經過該對象向服務器發送請求。
它是異步請求的技術,全部現代瀏覽器都支持(Chrome、IE5+)
1)建立XMLHttpReuest對象
非IE瀏覽器(Mozilla/Safari):
var xhr=new XMLHttpRequest();
IE:
xhr=new ActiveXObject("Msxml2.XMLHTTP");
低版本IE:
xhr=new ActiveXObject("Microsfot.XMLHTTP");
2)XMLHttpRequest對象的屬性與方法
a)方法:
open("GET/POST",URL,true/false):用來向服務器創建鏈接
有三個參數:
參數1:提交方式,post或get
參數2:請求的URL
參數3:表示同步或異步請求,true:表示異步請求
false: 表示同步請求
send(data):發送請求
參數:提交的內容。
POST方式:data就是提交的參數,send(username=root&password=abc123);
GET方式:send(null)
b)屬性:
onreadystatechange:設置狀態改變時的回調函數,回調函數用來獲取服務器數據。
onreadystatechange=function(){
}
readyState:服務器狀態響應
狀態碼:
0:未初始化
1:正在加載
2:加載完成
3:請求進行中
4:請求完成
responseText:服務器返回的數據(文本格式)
responseXML:服務器返回的數據(XML格式)
Html(超文本標記語言)是標準通用標記語言下的一個應用,也是一種規範,一種標準。
Xhtml(可擴展超文本標記語言)是一種置標語言,表現方式與html相似,不過語法上更加嚴格,主要不一樣:
1,全部元素必須被正確嵌套,
2,全部標記必須閉合,
3,標籤名,屬性名必須小寫字母,
4,全部的屬性必須用「」括起來,
5,全部非標籤一部分的><&都必須以編碼形式,
6,全部屬性必需要有值,
7,註釋中不要有--
8,圖片必需要有說明文字
四種:內聯,內嵌,外鏈,導入
區別:
1,link屬於xhtml標籤,@import徹底是css提供的一種方式,link除了加載css還能夠定義rss,定義rel屬性等,@import只能加載css。
2,加載順序差異:link引用的css是同時被加載的,@import引用的css會等到頁面所有被下載完纔會再被加載。
3,兼容性差異,@import是css2.1提出,ie5以上才支持,link沒有兼容問題。
4,使用dom控制樣式的差異,當用javascript去控制樣式的時候,只能使用link,@import不是dom能控制的。
5,@import能夠在css中再次引入其餘樣式表。
標籤選擇符,類選擇符,id選擇符,繼承的不如指定的,id>class>Tagname
Important優先級高
結構層:html由html或者xhtml負責建立,運用標籤對網頁內容的含義做出描述。
表示層:css由css負責建立,對如何顯示有關內容作出回答。
行爲層:javascript由javascript負責建立,負責回答應該如何對事件做出反應。
Ie(ie內核),火狐(Gecko),谷歌(webkit),opera(presto)
Alt是在你的圖片由於某種緣由不能加載的時候在頁面顯示的提示信息,它會直接輸出在本來加載圖片的地方,title是在鼠標懸停在圖片上的顯示的小提示,鼠標離開就沒了,絕大數html標籤都支持title。
Css reset重置瀏覽器的默認css樣式,瀏覽器種類不一樣,默認樣式不同,經過使用css reset重置,讓他們統一,方便開發。
1,儘量減小http請求數(文件合併)
2,使用CDN(內容分發網絡)
3,添加Expire/Cache-Control頭
4,啓用Gzip壓縮
5,css放在頁面最上面
6,scrip放在頁面最下面
7,避免在css中使用Expressions
8,把js和css放在外部文件中
9,減小dns查詢
10,壓縮javascript和css
11,避免重定向
12,移除重複腳本
13,配置實體標籤
14,使用ajax緩存
根據內容的結構化(內容語義化),選擇合式的標籤(代碼語義化),便於開發者的閱讀和寫出更加優雅的代碼的同時讓瀏覽器的爬蟲和機器更好地解析。
1,父級定義height(優勢:代碼少,簡單易掌握;缺點:只適合固定高度元素,沒法高度自適應)
2,結尾處使用空標籤清除浮動:Clear:both(優勢:理論上能清除全部標籤的浮動,簡代碼少瀏覽器支持好;缺點:增長了無心義的標籤)
3,父級定義僞類after和zoom(優勢:瀏覽器支持好;缺點:代碼多,兩句代碼結合使用才能讓主流瀏覽器都支持)
4,父級定義overflow:hidden(優勢:代碼少,簡單,瀏覽器支持好;缺點:必須定義width或者zoom,同時不能定義height,不能和position配合使用)
5,父級定義overflow:auto(優勢:代碼少,簡單,瀏覽器支持好;缺點:必須定義width或者zoom,同時不能定義height,內部元素高度超過父級會出現滾動條
還有,父級一塊兒浮動,父級定義display:table,結尾加br的clear:both等
是一種網頁圖片應用處理方式。它容許你將一個頁面涉及到的全部零星圖片都包含到一張大圖中去,這樣一來,當訪問該頁面時,載入的圖片就不會像之前那樣一幅一幅地慢慢顯示出來了。頁面icon不少的狀況下使用合適。
HTML5 如今已經不是 SGML 的子集,主要是關於圖像,位置,存儲,多任務等功能的增長。
繪畫 canvas用於媒介回放的 video 和 audio 元素本地離線存儲 localStorage 長期存儲數據,瀏覽器關閉後數據不丟失;sessionStorage 的數據在瀏覽器關閉後自動刪除
語意化更好的內容元素,好比 article、footer、header、nav、section
表單控件,calendar、date、time、email、url、search
新的技術webworker, websockt, Geolocation
移除的元素
純表現的元素:basefont,big,center,font, s,strike,tt,u;
對可用性產生負面影響的元素:frame,frameset,noframes;
支持HTML5新標籤:
IE8/IE7/IE6支持經過document.createElement方法產生的標籤,
能夠利用這一特性讓這些瀏覽器支持HTML5新標籤,
瀏覽器支持新標籤後,還須要添加標籤默認的樣式:
固然最好的方式是直接使用成熟的框架、使用最多的是html5shim框架
<!--[if lt IE 9]>
<script> src="http://html5shim.googlecode.com/svn/trunk/html5.js"</script>
<![endif]-->
如何區分: DOCTYPE聲明\新增的結構元素\功能元素
一段腳本只能讀取來自於同一來源的窗口和文檔的屬性,這裏的同一來源指的是主機名、協議和端口號的組合
<form onsubmit='chkForm(this)'>
<input type="text" name="d1" />
<input type="submit" />
</form>
<script type="text/javascript">
function chkForm(this){
var value1 = this.d1.value;
var len =value1.length;
for(var i=0;i<len;i++){
if(value1.charAt(i)>"9"|| value1.charAt(i)<"0"){
alert("含有非數字字符");
return false;
}
}
return true;
}
</script>
(這個問題彷佛不重要,不明白爲什麼有此題)
答:JSP共有如下6種基本動做
jsp:include:在頁面被請求的時候引入一個文件。
jsp:useBean:尋找或者實例化一個JavaBean。
jsp:setProperty:設置JavaBean的屬性。
jsp:getProperty:輸出某個JavaBean的屬性。
jsp:forward:把請求轉到一個新的頁面。
jsp:plugin:根據瀏覽器類型爲Java插件生成OBJECT或EMBED標記
isErrorPage(是否能使用Exception對象),isELIgnored(是否忽略表達式)
<jsp:include page=included.jsp flush=true />它老是會檢查所含文件中的變化,適合用於包含動態頁面,而且能夠帶參數 靜態INCLUDE用include僞碼實現,不會檢查所含文件的變化,適用於包含靜態頁面 <%@include file=included.htm %>
標籤不一樣
執行的時機不一樣,動態include是在運行時把兩個JSP合併,靜態include是在編譯期合併動態include在頁面發生改變時,能及時更新,而靜態頁面,不會再次從新編譯
1. request
2. session
3. application
4. cookie
5. URL地址
1. 內存優化-Xms
2. 增長線程數maxThreads="150"
3. 修正server.xml中的中文編碼
4. BIO改NIO
答:
1. URL地址長度不一樣, GET支持的字符少
2. GET的密碼是明文,安全問題,容易受到黑客攻擊
3. GET只傳輸文本,不支持文件傳輸
4. GET方式一般用來查詢,不用來修改數據,是冪等操做,修改數據用POST
答: 一般Servlet特指HttpServlet,用來接受瀏覽器的訪問請求,瀏覽器最經常使用的請求爲GET和POST方式,還有其它五種,而HttpServlet分別有七個方法(PUT、DELETE、HEADER、TRACE、OPTION)處理這些類型的請求,另有一個是J2EE不支持的,是CONNECT。Servlet是J2EE規範中的重要成員,是構成WEB的重要組件
1. 加載Servlet類
2. 實例化
3. 初始化init
4. 處理請求 service à 進一步調用doGet/doPost方法
5. 銷燬 destory
1. 定義一個Servlet類,繼承HttpServlet抽象類
2. 在web.xml中定義一個servlet標籤,配置類名和servlet名
3. 配置servlet處理的URL請求鏈接,能夠用模糊匹配
4. 在J2EE生命週期中,一個Servlet只有一個實例
5. 一個Servlet能夠爲多個請求服務,每一個請求在獨立的線程中執行
Forward: 服務器端內部跳轉,URL地址不變,屬於單次請求
Redirect: 服務器通知瀏覽器中轉,URL地址發生改變,是兩次跳轉
Forward不能跨域跳轉
Redirect能夠跨域跳轉
Forward在兩個頁面傳值能夠經過parameter,也能夠經過attribute,能傳遞Java對象
Redirect在兩個頁面傳值只能經過parameter,在URL中傳參
setAttribute(String name,Object):設置名字爲name的request的參數值
getAttribute(String name):返回由name指定的屬性值
getAttributeNames():返回request對象全部屬性的名字集合,結果是一個枚舉的實例
getCookies():返回客戶端的全部Cookie對象,結果是一個Cookie數組
getCharacterEncoding():返回請求中的字符編碼方式
getContentLength():返回請求的Body的長度
getHeader(String name):得到HTTP協議定義的文件頭信息
getHeaders(String name):返回指定名字的request Header的全部值,結果是一個枚舉的實例
getHeaderNames():返回因此request Header的名字,結果是一個枚舉的實例
getInputStream():返回請求的輸入流,用於得到請求中的數據
getMethod():得到客戶端向服務器端傳送數據的方法
getParameter(String name):得到客戶端傳送給服務器端的有name指定的參數值
getParameterNames():得到客戶端傳送給服務器端的全部參數的名字,結果是一個枚舉的實例
getParametervalues(String name):得到有name指定的參數的全部值
getProtocol():獲取客戶端向服務器端傳送數據所依據的協議名稱
getQueryString():得到查詢字符串
getRequestURI():獲取發出請求字符串的客戶端地址
getRemoteAddr():獲取客戶端的IP地址
getRemoteHost():獲取客戶端的名字
getSession([Boolean create]):返回和請求相關Session
getServerName():獲取服務器的名字
getServletPath():獲取客戶端所請求的腳本文件的路徑
getServerPort():獲取服務器的端口號
removeAttribute(String name):刪除請求中的一個屬性
1. getParameter是表單數據或URL參數,不能在server端修改
getAttribute是兩個頁面或servlet之間內部跳轉傳遞對象參數,能夠修改
2. getParameter的類型只能是String
getAttribute的類型能夠是任意Java對象
3. forward跳轉時纔有attribute,redirect時,attribute所有爲null
MVC是Model-View-Controller的簡寫。
Model表明的是應用的業務邏輯(經過JavaBean,EJB組件實現),一般是數據訪問層。
View是應用的表示層(由JSP頁面產生)或模板框架,如freemarker、velocity
Controller是提供應用的處理過程控制(通常是一個Servlet),負責頁面間跳轉
經過這種設計模型把應用邏輯,處理過程和顯示邏輯分紅不一樣的組件實現。這些組件能夠進行交互和重用。
Model:JDBC、Hibernate、MyBatis
View:JSP、FreeMarker、Struts
Controller:Spring MVC、Struts、Servlet
SpringSide集成Spring、Struts、Hibernate、WebService、View展現框架,做者江南白衣
public String translate(String str) {
try {
return new String(str.getBytes("ISO-8859-1"), "GBK").trim();
} catch (Exception e) {
System.err.println(e.getMessage());
throw new RuntimeException(e);
}
}
employee: eid, ename, salary, dept_id
select * from employee order by dept_id desc, salary;
1. Oracle是大型數據庫而Mysql是中小型數據庫,Oracle市場佔有率達40%,Mysql只有20%左右,同時Mysql是開源的而Oracle價格很是高Oracle。
2. Oracle支持大併發,大訪問量,是OLTP最好的工具。(OLTP[聯機事務處理])(OLAP[數據倉庫處理 有了基礎大數據後 根據數據分析 市場定位])。
3. 安裝所用的空間差異也是很大的,Mysql安裝完後才幾百M而Oracle有幾G左右,且使用的時候Oracle佔用特別大的內存空間和其餘機器性能。
4.Oracle和Mysql操做上的一些區別【開發人員接觸的】
①主鍵Mysql通常使用自動增加類型,在建立表時只要指定表的主鍵爲auto_increment,插入記錄時,不須要再指定該記錄的主鍵值,Mysql將自動增加;Oracle沒有自動增加類型,主鍵通常使用的序列,插入記錄時將序列號的下一個值付給該字段便可;只是ORM框架是隻要是native主鍵生成策略便可。
②單引號的處理MYSQL裏能夠用雙引號包起字符串,ORACLE裏只能夠用單引號包起字符串。在插入和修改字符串前必須作單引號的替換:把全部出現的一個單引號替換成兩個單引號。
③翻頁的SQL語句的處理MYSQL處理翻頁的SQL語句比較簡單,用LIMIT開始位置,記錄個數;ORACLE處理翻頁的SQL語句就比較繁瑣了。每一個結果集只有一個ROWNUM字段標明它的位置,而且只能用ROWNUM<100,不能用ROWNUM>80
④ 長字符串的處理長字符串的處理ORACLE也有它特殊的地方。INSERT和UPDATE時最大可操做的字符串長度小於等於4000個單字節,若是要插入更長的字符串,請考慮字段用CLOB類型,方法借用ORACLE裏自帶的DBMS_LOB程序包。插入修改記錄前必定要作進行非空和長度判斷,不能爲空的字段值和超出長度字段值都應該提出警告,返回上次操做。
⑤空字符的處理MYSQL的非空字段也有空的內容,ORACLE裏定義了非空字段就不允許有空的內容。按MYSQL的NOT NULL來定義ORACLE表結構,導數據的時候會產生錯誤。所以導數據時要對空字符進行判斷,若是爲NULL或空字符,須要把它改爲一個空格的字符串。
⑥字符串的模糊比較MYSQL裏用 字段名 like '%字符串%',ORACLE裏也能夠用 字段名like '%字符串%'但這種方法不能使用索引,速度不快。【like ‘%’開頭 沒法使用索引 不使用開頭 能夠使用索引】
⑦Oracle實現了ANSII SQL中大部分功能,如,事務的隔離級別、傳播特性等而Mysql在這方面仍是比較的弱
1). 能夠理解函數是存儲過程的一種 ,都是預編譯的 【塊語句每次運行都會編譯 存儲過程塊 一次編譯屢次運行 效率更高】
Plsql塊語句
Begin
End
存儲過程塊
Create procedure prg_add()
As
Begin
End;
2). 函數能夠沒有參數,可是必定須要一個返回值,存儲過程能夠沒有參數,不須要返回值
3). 函數return返回值沒有返回參數模式,存儲過程經過out參數返回值,若是須要返回多個參數則建議使用存儲過程 【函數oracle 在函數能夠使用in和out mysql不能使用out】
4). 在sql數據操縱(DML)語句中只能調用函數而不能調用存儲過程
使用oracle工具exp/imp
使用plsql相關工具
1. 導入/導出的是二進制的數據,
2.plsql導入/導出的是sql語句的文本文件
Oracle中使用rownum來進行分頁,這個是效率最好的分頁方法,hibernate也是使用rownum來進行oralce分頁的select * from
( select rownum r,a from tabName where rownum <= 20 )where r > 10
select * from content order by id desc limit 0, 10
在中小數據量的狀況下,這樣的SQL足夠用了,惟一須要注意的問題就是確保使用了索引。隨着數據量的增長,頁數會愈來愈多,查看後幾頁的SQL就可能相似:
select * from content order by id desc limit 10000, 10
一言以蔽之,就是越日後分頁,LIMIT語句的偏移量就會越大,速度也會明顯變慢。
此時,咱們能夠經過2種方式:
一,子查詢的分頁方式來提升分頁效率,飄易用的SQL語句以下:
SELECT * FROM `content` WHERE id (SELECT id FROM `content` ORDER BY id desc LIMIT ".($page-1)*$pagesize.", 1) ORDER BY id desc LIMIT $pagesize
爲何會這樣呢?由於子查詢是在索引上完成的,而普通的查詢時在數據文件上完成的,一般來講,索引文件要比數據文件小得多,因此操做起來也會更有效率。(via)經過explain SQL語句發現:子查詢使用了索引!
id select_type table type possible_keys key key_len ref rows Extra
1 PRIMARY content range PRIMARY PRIMARY 4 NULL 6264 Using where
2 SUBQUERY content index NULL PRIMARY 4 NULL 27085 Using index
簡言之就是存在加了鎖而沒有解鎖,多是使用鎖沒有提交或者回滾事務,若是是表級鎖則不能操做表,客戶端處於等在狀態,若是是行級鎖則不能操做鎖定行
解決辦法:
1). 查找出被鎖的表
select b.owner,b.object_name,a.session_id,a.locked_mode
from v$locked_object a,dba_objects b
where b.object_id = a.object_id;
select b.username,b.sid,b.serial#,logon_time
from v$locked_object a,v$session b
where a.session_id = b.sid order by b.logon_time;
2). 殺進程中的會話
alter system kill session "sid,serial#";
employee: eid, ename, salary, dept_id
select count(*), a.dept_id
from employee a
where
a.salary > (select avg(b.salary) from employee b where b.dept_id = '本部門')
group by a.dept_id
order by a.dept_id
create or replace procedure insert_Student (_name varchar, _age int , out_id int)
declear
a varchar
begin
insert into studentvalue(null,_name,_age);
select max(stuId)into _id from student;
end;
call insert_Student('wfz',23,@id);
select @id;
mysql> create trigger update_Student BEFORE update on student FOR EACH ROW
-> select * from student;
觸發器不容許返回結果
create trigger update_StudentBEFORE update on student FOR EACH ROW
insert into student value(null,'zxx',28);
mysql的觸發器目前不能對當前表進行操做
create trigger update_StudentBEFORE update on student FOR EACH ROW
delete from articles where id=8;
這個例子不是很好,最好是用刪除一個用戶時,順帶刪除該用戶的全部帖子
這裏要注意使用OLD.id
觸發器用處仍是不少的,好比校內網、開心網、Facebook,你發一個日誌,自動通知好友,其實就是在增長日誌時作一個後觸發,再向通知表中寫入條目。由於觸發器效率高。而UCH沒有用觸發器,效率和數據處理能力都很低。
存儲過程的實驗步驟:
mysql> delimiter |
mysql> create procedure insertArticle_Procedure (pTitle varchar(50),pBid int,out
pId int)
-> begin
-> insert into article1value(null,pTitle,pBid);
-> select max(id) into pId fromarticle1;
-> end;
-> |
Query OK, 0 rows affected (0.05sec)
mysql> callinsertArticle_Procedure('傳智播客',1,@pid);
-> |
Query OK, 0 rows affected (0.00sec)
mysql> delimiter ;
mysql> select @pid;
@pid |
3 |
1 row in set (0.00 sec)
mysql> select * fromarticle1;
id |
Title |
bid |
1 |
Test |
1 |
2 |
chuanzhiboke |
1 |
3 |
傳智播客 |
1 |
3 rows in set (0.00 sec)
觸發器的實驗步驟:
create table board1(id intprimary key auto_increment,name varchar(50),ar
ticleCount int);
create table article1(id intprimary key auto_increment,title varchar(50)
,bid int referencesboard1(id));
delimiter |
create triggerinsertArticle_Trigger after insert on article1 for each ro
w begin
-> update board1 setarticleCount=articleCount+1 where id= NEW.bid;
-> end;
-> |
delimiter ;
insert into board1 value(null,'test',0);
insert into article1value(null,'test',1);
還有,每插入一個帖子,都但願將版面表中的最後發帖時間,帖子總數字段進行同步更新,用觸發器作效率就很高。下次課設計這樣一個案例,寫觸發器時,對於最後發帖時間可能須要用declare方式聲明一個變量,或者是用NEW.posttime來生成。
第一範式(1NF):字段具備原子性,不可再分。全部關係型數據庫系統都知足第一範式。
數據庫表中的字段都是單一屬性的,不可再分。例如,姓名字段,其中的姓和名必須做爲一個總體,沒法區分哪部分是姓,哪部分是名,若是要區分出姓和名,必須設計成兩個獨立的字段。
第二範式(2NF):在第一範式(1NF)的基礎上創建起來的,即知足第二範式(2NF)必須先知足第一範式(1NF)。
要求數據庫表中的每一個實例或行必須能夠被惟一地區分。一般須要爲表加上一個列,以存儲各個實例的唯一標識。這個唯一屬性列被稱爲主關鍵字或主鍵。
第二範式(2NF)要求實體的屬性徹底依賴於主關鍵字。所謂徹底依賴是指不能存在僅依賴主關鍵字一部分的屬性,若是存在,那麼這個屬性和主關鍵字的這一部分應該分離出來造成一個新的實體,新實體與原實體之間是一對多的關係。爲實現區分一般須要爲表加上一個列,以存儲各個實例的唯一標識。簡而言之,第二範式就是非主屬性非部分依賴於主關鍵字。
第三範式的要求以下:
知足第三範式(3NF)必須先知足第二範式(2NF)。簡而言之,第三範式(3NF)要求一個數據庫表中不包含已在其它表中已包含的非主關鍵字信息。
因此第三範式具備以下特徵:
1,每一列只有一個值
2,每一行都能區分。
3,每個表都不包含其餘表已經包含的非主關鍵字信息。
例如,帖子表中只能出現發帖人的id,而不能出現發帖人的id,還同時出現發帖人姓名,不然,只要出現同一發帖人id的全部記錄,它們中的姓名部分都必須嚴格保持一致,這就是數據冗餘。
1. 程序優化,用PrepareedStatement進行增刪改查
2. 程序優化,儘可能批量處理,避免逐條處理,減少IO數
3. 查詢結果不要用*來查詢全部字段,要明確指明結果字段
4. 減小多表鏈接數,儘可能少的表進行鏈接
5. 錶鏈接時,儘可能用主鍵進行鏈接或用惟一索引
6. 表的查詢多時,必定創建索引
7. 根據查詢條件,創建索引,若是查詢條件不止一個時,使用組合索引
8. 在查詢條件表達式的左側儘可能不要使用函數,不然索引失效
9. 若是不得不用函數,則創建函數索引
10. 使用合適的索引,例如時間索引、哈希索引、聚簇索引
11. 若是有like話,儘可能避免%xxx%兩側都有%的條件,單側%能夠使用索引,多側不能夠
12. 儘可能不用數據庫,使用緩存
13. 能夠考慮用nosql數據庫提升效率
14. SQL的條件表達式,在Oracle中,是按倒序使用索引的
15. 若是用DDL改動了數據庫表字段,須要重建索引,否則索引失效
16. SQL儘可能不要有多餘的空格和換行
17.使用分佈式數據庫
18. 合理建立表分區表空間
19.創建索引時字段不能有null值
20.使用數據庫鏈接池
union和union all都是合併結果集
區別是:
1. union去除兩個結果集的重複記錄,union all不去除重複記錄,是兩個結果集的加和
2. union效率低,union all效率高
name kecheng fenshu
張三 語文 81
張三 數學 75
李四 語文 76
李四 數學 90
王五 語文 81
王五 數學 100
王五 英語 90
答案:
A:select distinct name from score where name not in (select distinct name from score where fenshu <=80)
B:select distinct name t1 from score where 80< all (select fenshu from score where name=t1);
一個叫department的表,裏面只有一個字段name,一共有4條紀錄,分別是a,b,c,d,對應四個球對,如今四個球對進行比賽,用一條sql語句顯示全部可能的比賽組合.
select a.name, b.name
from team a, team b
where a.name > b.name
文章表:article_id, title, post_user, post_date
回覆表:reply_id, article_id, reply_time, content
select
a.title, a.post_user, r.reply_time
from reply r
left join article a on a.article_id = r.article_id
where
r.reply_id =
(
select max(re.reply_id)
from reply re
where
re.article_id = r.article_id
)
學生表(student)以下:
id號 學號 姓名 課程編號 課程名稱 分數
id sid name cno cname score
1 2005001 張三 0001 數學 69
2 2005002 李四 0001 數學 89
3 2005001 張三 0001 數學 69
A: delete from student where id not in(select min(id) from student group by sid, name, cno, cname, score)
select max(post_count), b.post_user_id, u.name
from
(
select count(*) as post_count, a.post_user_id
from article a
group by a.post_user_id
) b
left join user u on u.user_id = b.post_user_id。
方案一:update user set score=0;
方案二:假設上面的代碼要執行好長時間,超出咱們的容忍範圍,使用alter table:
drop columnscore;alter table user add column score int。
在Oracle中,動了表結構,索引失效
方案三:使用Java程序,for循環,效率最差
方案四:使用存儲過程loop循環,效率其次差
1. Class.forName(driver)
2. ClassLoader.loadClass(driver)
3. new XXXDriver();
Class.forName("com.mysql.jdbc.Driver");
String url = "jdbc:mysql:///test";
Connection cn = DriverManager.getConnection(url, "root", "root");
String sql = "{call insert_student(?,?,?)}";
CallableStatement cstmt = cn.prepareCall(sql);
cstmt.registerOutParameter(3, Types.INTEGER);
cstmt.setString(1, "wangwu");
cstmt.setInt(2, 25);
cstmt.execute();
// get第幾個,不一樣的數據庫不同,建議不寫
System.out.println(cstmt.getString(3));
一個sql命令在數據庫執行的步驟爲:語法檢查,語義分析,編譯成內部指令,緩存指令,執行指令等過程。
1. PrepareStatement第一次執行某SQL時能夠把最終結果緩存到數據中,之後再執行同一格式的SQL時,再也不進行優化,直接使用緩存中的優化結果,效率比較高。
2.參數傳值,能夠防止SQL注入
答:按參數中指定的字符串形式的類名去搜索並加載相應的類,若是該類字節碼已經被加載過,則返回表明該字節碼的Class實例對象,不然,按類加載器的委託機制去搜索和加載該類,若是全部的類加載器都沒法加載到該類,則拋出ClassNotFoundException。加載完這個Class字節碼後,接着就能夠使用Class字節碼的newInstance方法去建立該類的實例對象了。
有時候,咱們程序中全部使用的具體類名在設計時(即開發時)沒法肯定,只有程序運行時才能肯定,這時候就須要使用Class.forName去動態加載該類,這個類名一般是在配置文件中配置的,例如,spring的ioc中每次依賴注入的具體類就是這樣配置的,jdbc的驅動類名一般也是經過配置文件來配置的,以便在產品交付使用後不用修改源程序就能夠更換驅動類名。
查詢結果集若是記錄數比較多時,服務器內存和瀏覽器內存均可能溢出,另外,數據量太大客戶端的性能會下降,滾動條較小,操做也不方便,須要數據庫分頁查詢。
SQL Server分頁:
select top #pageSize# * from students where id not in
(select top #pageSize# * (#pageNumber#-1) id from students order by id) order by id
My SQL分頁:
select * from students order by id limit #pageSize#*(#pageNumber#-1),#pageSize#
Oracle分頁:
select * from
(
select *, rownum rid
from
(
select * from students order by postime desc
)
where
rid<=#pagesize#*#pagenumber#
) as t
where t.rid>#pageSize#*(#pageNumber#-1)
J2EE服務器啓動時會創建必定數量的池鏈接,並一直維持很多於此數目的池鏈接。客戶端程序須要鏈接時,池驅動程序會返回一個未使用的池鏈接並將其表記爲忙。若是當前沒有空閒鏈接,池驅動程序就新建必定數量的鏈接,新建鏈接的數量有配置參數決定。當使用的池鏈接調用完成後,池驅動程序將此鏈接標記爲空閒,其餘調用就能夠使用這個鏈接。
實現方式,返回的Connection是原始Connection的代理,代理Connection的close方法不是真正關鏈接,而是把它代理的Connection對象還回到鏈接池中。
ORM是對象和關係型數據庫映射,是把Java中的JavaBean對象和數據庫表進行映射,使數據庫表中的記錄和JavaBean對象一一對應,從而大大簡化原來直接使用JDBC時,手工拼寫SQL帶來的不便。
ORM經過配置文件,使數據庫表和JavaBean類對應起來,提供簡便的操做方法,增、刪、改、查記錄,再也不拼寫字符串生成SQL,編程效率大大提升,同時減小程序出錯機率,加強數據庫的移植性,方便測試。可是原生的JDBC具備更強的靈活性,適合複雜多變的SQL應用。
經常使用的ORM框架有:Hibernate、MyBatis、TopLink、OJB
1. 大數據能夠採用分佈式數據庫和創建分區表(PARTITION)
2. 創建有效索引:主鍵索引、聯合索引、倒序索引、函數索引(INDEX)
3. 使用物化視圖(MATERIALIZED VIEW)
4. 使用存儲過程(PROCDUDER)
5. 讀寫分離(golden gate軟件實現)
6. 歸檔舊數據(新舊數據查詢,保證新數據的效率提升),程序作調整,舊數據和新數據查詢頁面分離
答:事務就是被綁定在一塊兒做爲一個邏輯工做單元的SQL語句分組,若是任何一個語句操做失敗那麼整個操做就被失敗,之後操做就會回滾到操做前狀態,或者是上有個節點。爲了確保要麼執行,要麼不執行,就能夠使用事務。要將有組語句做爲事務考慮,就須要經過ACID測試,即原子性,一致性,隔離性和持久性。
鎖:在因此的DBMS中,鎖是實現事務的關鍵,鎖能夠保證事務的完整性和併發性。與現實生活中鎖同樣,它能夠使某些數據的擁有者,在某段時間內不能使用某些數據或數據結構。固然鎖還分級別的。
我是這樣作的,儘量使用約束,如check,主鍵,外鍵,非空字段等來約束,這樣作效率最高,也最方便。其次是使用觸發器,這種方法能夠保證,不管什麼業務系統訪問數據庫均可以保證數據的完整新和一致性。最後考慮的是自寫業務邏輯,但這樣作麻煩,編程複雜,效率低下。
答:通常咱們所說的內存泄漏指的是堆內存的泄漏。堆內存是程序從堆中爲其分配的,大小任意的,使用完後要顯示釋放內存。當應用程序用關鍵字new等建立對象時,就從堆中爲它分配一塊內存,使用完後程序調用free或者delete釋放該內存,不然就說該內存就不能被使用,咱們就說該內存被泄漏了。
操做的命令:
Sqlplus 登錄用戶
Conn 鏈接數據庫
Disconn 斷開數據庫鏈接
Exit或quit退出sql*plus
Pass 修改用戶口令
Show user 查看當前用戶
List 列出sql緩衝區的內容
Run或/ 執行緩衝區中的全部內容
Save 文件名 把緩衝區的內容保存到sql腳本文件
Get 文件名 將sql腳本文件中的內容加載到緩衝區
Start或@文件名 將指定sql腳本文件加載到緩衝區並執行
Edit 編輯緩衝區或sql腳本文件的內容
Spool 文件名 把sql*plus中的輸入結果複製到指定文件中
Spool off 中止sql*plus中的輸出結果複製,並關閉文件
Help 命令名 查看某個命令的詳細幫助信息。
36, 索引的優缺點
優勢:
1 經過建立惟一性索引,能夠保證數據庫表中每一行數據的惟一性
2 能夠大大加快數據的檢索速度,這也是建立索引的最主要的緣由
3 能夠加速表和表之間的鏈接,
4 在使用分組和排序子句進行數據檢索時,一樣能夠減小查詢中分組和排序的時間。
缺點:
1 下降了dml操做的速度
2 建立索引和維護索引要耗費時間,這種時間隨着數據量的增長而增長
3 索引須要佔據物理空間,建立索引會加大儲存空間
37.使用oracle僞列刪除表中重複記錄:?
Delete table t where t.rowid!=(select max(t1.rowid) from table t1 where t1.name=t.name)
答:有DOM,SAX,STAX等
DOM:處理大型文件時其性能降低的很是厲害。這個問題是由DOM的樹結構所形成的,這種結構佔用的內存較多,並且DOM必須在解析文件以前把整個文檔裝入內存,適合對XML的隨機訪問SAX:不現於DOM,SAX是事件驅動型的XML解析方式。它順序讀取XML文件,不須要一次所有裝載整個文件。當遇到像文件開頭,文檔結束,或者標籤開頭與標籤結束時,它會觸發一個事件,用戶經過在其回調事件中寫入處理代碼來處理XML文件,適合對XML的順序訪問
STAX:Streaming API for XML (StAX)
講解這些區別是不須要特別去比較,就像說傳智播客與其餘培訓機構的區別時,咱們只需說清楚傳智播客有什麼特色和優勢就好了,這就已經間接回答了彼此的區別。
答:用到了數據存貯,信息配置兩方面。在作數據交換平臺時,將不能數據源的數據組裝成XML文件,而後將XML文件壓縮打包加密後經過網絡傳送給接收者,接收解密與解壓縮後再同XML文件中還原相關信息進行處理。在作軟件配置時,利用XML能夠很方便的進行,軟件的各類配置參數都存貯在XML文件中。
a: 兩種形式 dtd schema,b:本質區別:schema自己是xml的,能夠被XML解析器解析(這也是從DTD上發展schema的根本目的),c:有DOM,SAX,STAX等
DOM:處理大型文件時其性能降低的很是厲害。這個問題是由DOM的樹結構所形成的,這種結構佔用的內存較多,並且DOM必須在解析文件以前把整個文檔裝入內存,適合對XML的隨機訪問
SAX:不現於DOM,SAX是事件驅動型的XML解析方式。它順序讀取XML文件,不須要一次所有裝載整個文件。當遇到像文件開頭,文檔結束,或者標籤開頭與標籤結束時,它會觸發一個事件,用戶經過在其回調事件中寫入處理代碼來處理XML文件,適合對XML的順序訪問
STAX:Streaming API forXML (StAX)
1. struts是一個按MVC模式設計的Web層框架,實質是一個強大的Servlet。負責處理請求轉發和路由。
2. struts的基本配置文件爲struts-config.xml,裏面配置了不少Action、ActionForm及中轉規則,這個文件經過web.xml中的ActionServlet進行加載和初始化。
3. 當用戶請求發送到服務器端時,ActionServlet會接收到此請求,而後根據struts.xml中的配置找到相應的Action,同時根據ActionForm的配置,建立ActionForm的實例並進行賦值,當作參數交給Action進行業務處理,返回ActionMapping對象。
4. ActionServlet根據struts.xml中action的配置,forward到指定的頁面,把結果以JSP處理過的HTML返回給客戶的瀏覽器。
5.能夠繼續談一談struts1和struts2的區別
二、Struts優缺點
優勢:
1. 實現MVC模式,結構清晰,使開發者只關注業務邏輯的實現.
2.有豐富的tag能夠用 ,Struts的標記庫(Taglib),如能靈活動用,則能大大提升開發效率
3. 頁面導航
使系統的脈絡更加清晰。經過一個配置文件,便可把握整個系統各部分之間的聯繫,這對於後期的維護有着莫大的好處。尤爲是當另外一批開發者接手這個項目時,這種優點體現得更加明顯。
4. 提供Exception處理機制 .
5. 數據庫連接池管理
6. 支持I18N
缺點
1、轉到展現層時,須要配置forward,若是有十個展現層的jsp,須要配置十次struts,並且還不包括有時候目錄、文件變動,須要從新修改forward,注意,每次修改配置以後,要求從新部署整個項目,而tomcate這樣的服務器,還必須從新啓動服務器
2、Struts的Action必需是thread-safe方式,它僅僅容許一個實例去處理全部的請求。因此action用到的全部的資源都必需統一同步,這個就引發了線程安全的問題。
3、測試不方便. Struts的每一個Action都同Web層耦合在一塊兒,這樣它的測試依賴於Web容器,單元測試也很難實現。不過有一個Junit的擴展工具Struts TestCase能夠實現它的單元測試。
4、類型的轉換. Struts的FormBean把全部的數據都做爲String類型,它能夠使用工具Commons-Beanutils進行類型轉化。但它的轉化都是在Class級別,並且轉化的類型是不可配置的。類型轉化時的錯誤信息返回給用戶也是很是困難的。
5、對Servlet的依賴性過強. Struts處理Action時必須要依賴ServletRequest和ServletResponse,全部它擺脫不了Servlet容器。
6、前端表達式語言方面.Struts集成了JSTL,因此它主要使用JSTL的表達式語言來獲取數據。但是JSTL的表達式語言在Collection和索引屬性方面處理顯得很弱。
7、對Action執行的控制困難. Struts建立一個Action,若是想控制它的執行順序將會很是困難。甚至你要從新去寫Servlet來實現你的這個功能需求。
8、對Action執行前和後的處理. Struts處理Action的時候是基於class的hierarchies,很難在action處理前和後進行操做。
9、對事件支持不夠.在struts中,實際是一個表單Form對應一個Action類(或DispatchAction),換一句話說:在Struts中實際是一個表單只能對應一個事件,struts這種事件方式稱爲application event,application event和component event相比是一種粗粒度的事件。
Struts是採用Java Servlet/JavaServer Pages技術,開發Web應用程序的開放源碼的framework。採用Struts能開發出基於MVC(Model-View-Controller)設計模式的應用構架。 Struts有以下的主要功能:一.包含一個controller servlet,能將用戶的請求發送到相應的Action對象。二.JSP自由tag庫,而且在controller servlet中提供關聯支持,幫助開發員建立交互式表單應用。三.提供了一系列實用對象:XML處理、經過Java reflection APIs自動處理JavaBeans屬性、國際化的提示和消息
它是ORM思想的一個實現,對JDBC進行了很好的封裝,它經過配置使JavaBean對象和數據庫表之間進行映射,並提供對增、刪、改、查便利的操做方法,同時支持事務處理,它對數據庫記錄還提供了緩存機制,提升效率,它能夠使程序員不用書寫SQL,也不用關心數據庫SQL之間的差別,它經過方言對數據庫進行了很好的適配。
1. Hiberante的主配置文件爲hibernate.cfg.xml,其中定義了數據源、鏈接池、緩存、事務、表生成策略等配置
2. 經過*.hbm.xml映射配置文件,定義了JavaBean對象和數據庫表之間的映射關係,還定了對象和對象之間的映射關係,包括:一對1、多對1、一對多、多對多
3. 對於複雜查詢和修改,Hiberante提供了Query對象進行支持,它能夠使用HQL語句處理查詢、修改、刪除和分頁。若是須要處理針對數據庫相關的SQL,能夠SQLQuery對象處理。
4. Hibernate能夠集成到Spring中,經過Spring進行事務處理,事務的配置一般分兩類,一種是AOP方式,一種是註釋方式的聲明式事務。
5. Hiberante從3版本後,支持JPA規範,能夠不使用映射文件配置,而所有采用JPA註解方式進行對象和數據庫表的映射,Hibernate還擴容了JPA規範。
6. Hibernate對經常使用的緩存技術作了封裝,能夠輕鬆的調用各類緩存框架
Spring實質上講就是一個Bean工廠,主要用來管理Bean的生命週期和框架集成。
Spring分爲兩個部分:
1. IOC控制反轉(也叫DI依賴注入,此名由Mardin Fowler給出)。Spring的頂層容器爲BeanFactory,經常使用的ApplicationContext爲它的子接口,實現了工廠模式。Spring須要加載它的配置文件,一般配置文件名爲applicationContext.xml或spring-config.xml,其中Bean的定義爲<bean id=」beanId」 class=」xxx.class」 />
2. Spring容器負責根據配置文件建立Bean對象並進行對其的裝載。Bean有懶加載,屬性配置,自動裝載,parent Bean,abstract Bean,FactoryBean(一般用於框架集成,須要瞭解BeanFactory和FactoryBean的區別),scope(singleton單例,prototype多例)。
3. Spring 2.5後提供了對註釋的支持,更加方便,在重構時做用巨大。
4. Spring的IOC解除了模塊間的耦合,能夠使項目多模塊並行開發。
5. Spring還提供了AOP的支持,方便在切面級開發,例如事務控制、日誌、性能、安全等。Spring的AOP有兩種配置方式,都是經過動態代理技術實現的,一種是JDK自帶的Proxy類的實現,一種是CGLIB動態代理實現,經過<aop:aspect target-class-proxy=」true」 />開關進行設置。
6. Spring的重要作用是集成其它框架。Spring官方提供了許多類庫對其它框架進行了封裝,例如經過的事務模塊、JMS框架的調用模塊、Email支持、調試器Scheduler、JNDI等,同時其它框架也提供了針對Spring的集成包,例如Hibernate、MyBatis、Struts等
。
如下是Spring 框架的基本模塊:
這是基本的Spring模塊,提供spring 框架的基礎功能,BeanFactory 是任何以spring爲基礎的應用的核心。Spring 框架創建在此模塊之上,它使Spring成爲一個容器。
hibernate的inverse屬性的做用?
解決方案一,按照Object[]數據取出數據,而後本身組bean
解決方案二,對每一個表的bean寫構造函數,好比表一要查出field1,field2兩個字段,那麼有一個構造函數就是Bean(type1filed1,type2
field2) ,而後在hql裏面就能夠直接生成這個bean了。
解決方案一,按照Object[]數據取出數據,而後本身組bean
解決方案二,對每一個表的bean寫構造函數,好比表一要查出field1,field2兩個字段,那麼有一個構造函數就是Bean(type1filed1,type2
field2) ,而後在hql裏面就能夠直接生成這個bean了。
解決方案一,按照Object[]數據取出數據,而後本身組bean
解決方案二,對每一個表的bean寫構造函數,好比表一要查出field1,field2兩個字段,那麼有一個構造函數就是Bean(type1filed1,type2
field2) ,而後在hql裏面就能夠直接生成這個bean了。
解決方案一,按照Object[]數據取出數據,而後本身組bean
解決方案二,對每一個表的bean寫構造函數,好比表一要查出field1,field2兩個字段,那麼有一個構造函數就是Bean(type1filed1,type2
field2) ,而後在hql裏面就能夠直接生成這個bean了。
按照如下思路來回答:(1)首先說清楚什麼是緩存,(2)再說有了hibernate的Session就是一級緩存,即有了一級緩存,爲何還要有二級緩存,(3)最後再說如何配置Hibernate的二級緩存。
(1)緩存就是把之前從數據庫中查詢出來和使用過的對象保存在內存中(一個數據結構中),這個數據結構一般是或相似Hashmap,當之後要使用某個對象時,先查詢緩存中是否有這個對象,若是有則使用緩存中的對象,若是沒有則去查詢數據庫,並將查詢出來的對象保存在緩存中,以便下次使用。下面是緩存的僞代碼:
引出hibernate的第二級緩存,用下面的僞代碼分析了Cache的實現原理
Dao
{
hashmap map = newmap();
User getUser(integerid)
{
User user =map.get(id)
if(user ==null)
{
user =session.get(id);
map.put(id,user);
}
return user;
}
}
Dao
{
Cache cache = null
setCache(Cachecache)
{
this.cache =cache
}
User getUser(int id)
{
if(cache!=null)
{
Useruser = cache.get(id);
if(user==null)
{
user= session.get(id);
cache.put(id,user);
}
returnuser;
}
returnsession.get(id);
}
}
(2)Hibernate的Session就是一種緩存,咱們一般將之稱爲Hibernate的一級緩存,當想使用session從數據庫中查詢出一個對象時,Session也是先從本身內部查看是否存在這個對象,存在則直接返回,不存在纔去訪問數據庫,並將查詢的結果保存在本身內部。因爲Session表明一次會話過程,一個Session與一個數據庫鏈接相關連,因此Session最好不要長時間保持打開,一般僅用於一個事務當中,在事務結束時就應關閉。而且Session是線程不安全的,被多個線程共享時容易出現問題。一般只有那種全局意義上的緩存纔是真正的緩存應用,纔有較大的緩存價值,所以,Hibernate的Session這一級緩存的緩存做用並不明顯,應用價值不大。Hibernate的二級緩存就是要爲Hibernate配置一種全局緩存,讓多個線程和多個事務均可以共享這個緩存。咱們但願的是一我的使用過,其餘人也能夠使用,session沒有這種效果。
(3)二級緩存是獨立於Hibernate的軟件部件,屬於第三方的產品,多個廠商和組織都提供有緩存產品,例如,EHCache和OSCache等等。在Hibernate中使用二級緩存,首先就要在hibernate.cfg.xml配置文件中配置使用哪一個廠家的緩存產品,接着須要配置該緩存產品本身的配置文件,最後要配置Hibernate中的哪些實體對象要歸入到二級緩存的管理中。明白了二級緩存原理和有了這個思路後,很容易配置起Hibernate的二級緩存。擴展知識:一個SessionFactory能夠關聯一個二級緩存,也即一個二級緩存只能負責緩存一個數據庫中的數據,當使用Hibernate的二級緩存後,注意不要有其餘的應用或SessionFactory來更改當前數據庫中的數據,這樣緩存的數據就會與數據庫中的實際數據不一致。
JDO是Java對象持久化的新的規範,爲java data object的簡稱,也是一個用於存取某種數據倉庫中的對象的標準化API。JDO提供了透明的對象存儲,所以對開發人員來講,存儲數據對象徹底不須要額外的代碼(如JDBC API的使用)。這些繁瑣的例行工做已經轉移到JDO產品提供商身上,使開發人員解脫出來,從而集中時間和精力在業務邏輯上。另外,JDO很靈活,由於它能夠在任何數據底層上運行。JDBC只是面向關係數據庫(RDBMS)JDO更通用,提供到任何數據底層的存儲功能,好比關係數據庫、文件、XML以及對象數據庫(ODBMS)等等,使得應用可移植性更強。
IOC 或 依賴注入把應用的代碼量降到最低。它使應用容易測試,單元測試再也不須要單例和JNDI查找機制。最小的代價和最小的侵入性使鬆散耦合得以實現。IOC容器支持加載服務時的餓漢式初始化和懶加載。
依賴注入,是IOC的一個方面,是個一般的概念,它有多種解釋。這概念是說你不用建立對象,而只須要描述它如何被建立。你不在代碼裏直接組裝你的組件和服務,可是要在配置文件裏描述哪些組件須要哪些服務,以後一個容器(IOC容器)負責把他們組裝起來。
你兩種依賴方式均可以使用,構造器注入和Setter方法注入。最好的解決方案是用構造器參數實現強制依賴,setter方法實現可選依賴。
Spring對數據訪問對象(DAO)的支持旨在簡化它和數據訪問技術如JDBC,Hibernate or JDO 結合使用。這使咱們能夠方便切換持久層。編碼時也不用擔憂會捕獲每種技術特有的異常。
面向切面的編程,或AOP, 是一種編程技術,容許程序模塊化橫向切割關注點,或橫切典型的責任劃分,如日誌和事務管理。
AOP核心就是切面,它將多個類的通用行爲封裝成可重用的模塊,該模塊含有一組API提供橫切功能。好比,一個日誌模塊能夠被稱做日誌的AOP切面。根據需求的不一樣,一個應用程序能夠有若干切面。在Spring AOP中,切面經過帶有@Aspect註解的類實現。
關注點是應用中一個模塊的行爲,一個關注點可能會被定義成一個咱們想實現的一個功能。
橫切關注點是一個關注點,此關注點是整個應用都會使用的功能,並影響整個應用,好比日誌,安全和數據傳輸,幾乎應用的每一個模塊都須要的功能。所以這些都屬於橫切關注點。
鏈接點表明一個應用程序的某個位置,在這個位置咱們能夠插入一個AOP切面,它其實是個應用程序執行Spring AOP的位置。
通知是個在方法執行前或執行後要作的動做,其實是程序執行時要經過SpringAOP框架觸發的代碼段。
Spring切面能夠應用五種類型的通知:
經過Jackson框架就能夠把Java裏面的對象直接轉化成Js能夠識別的Json對象
具體步驟以下
1.加入Jackson.jar
2.在配置文件中配置json的映射
3.在接受Ajax方法裏面能夠直接返回Object,List等,但方法前面要加上@ResponseBody註解
要加上@ResponseBody註解
有兩種寫法,一種是實現接口,另一種是繼承適配器類,而後在SpringMvc的配置文件中配置攔截器便可:
<!--配置SpringMvc的攔截器 -->
<mvc:interceptors>
<!--配置一個攔截器的Bean就能夠了 默認是對全部請求都攔截 -->
<bean id="myInterceptor" class="com.et.action.MyHandlerInterceptor"></bean>
<!--只針對部分請求攔截 -->
<mvc:interceptor>
<mvc:mapping path="/modelMap.do" />
<bean class="com.et.action.MyHandlerInterceptorAdapter" />
</mvc:interceptor>
</mvc:interceptors>
系統啓動的時候根據配置文件建立spring的容器, 首先是發送http請求到核心控制器disPatherServlet,spring容器經過映射器去尋找業務控制器,
使用適配器找到相應的業務類,在進業務類時進行數據封裝,在封裝前可能會涉及到類型轉換,執行完業務類後使用ModelAndView進行視圖轉發,數據放在model中,用map傳遞數據進行頁面顯示。
Spring框架支持如下五種bean的做用域:
缺省的Spring bean 的做用域是Singleton.
不,Spring框架中的單例bean不是線程安全的。
有兩個重要的bean 生命週期方法,第一個是setup , 它是在容器加載bean的時候被調用。第二個方法是 teardown 它是在容器卸載類的時候被調用。
The bean 標籤有兩個重要的屬性(init-method和destroy-method)。用它們你能夠本身定製初始化和註銷方法。它們也有相應的註解(@PostConstruct和@PreDestroy)。
基於Java的配置,容許你在少許的Java註解的幫助下,進行你的大部分Spring配置而非經過XML文件。
以@Configuration 註解爲例,它用來標記類能夠當作一個bean的定義,被Spring IOC容器使用。另外一個例子是@Bean註解,它表示此方法將要返回一個對象,做爲一個bean註冊進Spring應用上下文。
相對於XML文件,註解型的配置依賴於經過字節碼元數據裝配組件,而非尖括號的聲明。
開發者經過在相應的類,方法或屬性上使用註解的方式,直接組件類中進行配置,而不是使用xml表述bean的裝配關係。
註解裝配在默認狀況下是不開啓的,爲了使用註解裝配,咱們必須在Spring配置文件中配置 <context:annotation-config/>元素。
在Spring中有兩種方式訪問Hibernate:
Spring支持如下ORM:
用Spring的 SessionFactory 調用 LocalSessionFactory。集成過程分三步:
Spring支持兩種類型的事務管理:
控制器提供一個訪問應用程序的行爲,此行爲一般經過服務接口實現。控制器解析用戶輸入並將其轉換爲一個由視圖呈現給用戶的模型。Spring用一個很是抽象的方式實現了一個控制層,容許用戶建立多種用途的控制器。
SpringMvc的是DispatchServlet,Struts1的是ActionServlet,Struts2的是StrutsPrepareAndExecuteFilter
是單例模式,因此在多線程訪問的時候有線程安全問題,不要用同步,會影響性能的,解決方案是在控制器裏面不能寫字段
通常用@Conntroller註解,表示是表現層,不能用別的註解代替.
能夠在@RequestMapping註解裏面加上method=RequestMethod.GET
能夠在@RequestMapping註解裏面加上params="type=test"
返回值能夠有不少類型,有String, ModelAndView,當通常用String比較好
在返回值前面加"forward:"就可讓結果轉發,譬如"forward:user.do?name=method4" 在返回值前面加"redirect:"就可讓返回值重定向,譬如"redirect:http://www.baidu.com"
經過ModelMap對象,能夠在這個對象裏面用put方法,把對象加到裏面,前臺就能夠經過el表達式拿到
叫ModelAndView
能夠在類上面加上@SessionAttributes註解,裏面包含的字符串就是要放入session裏面的key
要加上@ResponseBody註解
系統啓動的時候根據配置文件建立spring的容器, 首先是發送http請求到核心控制器disPatherServlet,spring容器經過映射器去尋找業務控制器,
使用適配器找到相應的業務類,在進業務類時進行數據封裝,在封裝前可能會涉及到類型轉換,執行完業務類後使用ModelAndView進行視圖轉發,數據放在model中,用map傳遞數據進行頁面顯示。
* Hibernate2延遲加載實現:a)實體對象 b)集合(Collection)
* Hibernate3 提供了屬性的延遲加載功能
當Hibernate在查詢數據的時候,數據並無存在與內存中,當程序真正對數據的操做時,對象才存在與內存中,就實現了延遲加載,他節省了服務器的內存開銷,從而提升了服務器的性能。
Hibernate中怎樣實現類之間的關係?(如:一對多、多對多的關係)
類與類之間的關係主要體如今表與表之間的關係進行操做,它們都市對對象進行操做,咱們程序中把全部的表與類都映射在一塊兒,它們經過配置文件中的many-to-one、one-to-many、many-to-many、
說下Hibernate的緩存機制
* 內部緩存存在Hibernate中又叫一級緩存,屬於應用事物級緩存
* 二級緩存:
a)應用及緩存
b)分佈式緩存
條件:數據不會被第三方修改、數據大小在可接受範圍、數據更新頻率低、同一數據被系統頻繁使用、非 關鍵數據
c) 第三方緩存的實現
Hibernate的查詢方式
Sql、Criteria,object comptosition
Hql:
* 屬性查詢
* 參數查詢、命名參數查詢
* 關聯查詢
* 分頁查詢
* 統計函數
* 使用雙向一對多關聯,不使用單向一對多
* 靈活使用單向一對多關聯
* 不用一對一,用多對一取代
* 配置對象緩存,不使用集合緩存
* 一對多集合使用Bag,多對多集合使用Set
* 繼承類使用顯式多態
* 表字段要少,表關聯不要怕多,有二級緩存撐腰
1.建索引
2.減小表之間的關聯
3.優化sql,儘可能讓sql很快定位數據,不要讓sql作全表查詢,應該走索引,把數據量大的表排在前面
4.簡化查詢字段,沒用的字段不要,已經對返回結果的控制,儘可能返回少許數據
1) assigned
主鍵由外部程序負責生成,無需Hibernate參與。
2) hilo
經過hi/lo 算法實現的主鍵生成機制,須要額外的數據庫表保存主鍵生成歷史狀態。
3) seqhilo
與hilo 相似,經過hi/lo 算法實現的主鍵生成機制,只是主鍵歷史狀態保存在Sequence中,適用於支持Sequence的數據庫,如Oracle。
4) increment
主鍵按數值順序遞增。此方式的實現機制爲在當前應用實例中維持一個變量,以保存着當前的最大值,以後每次須要生成主鍵的時候將此值加1做爲主鍵。這種方式可能產生的問題是:若是當前有多個實例訪問同一個數據庫,那麼因爲各個實例各自維護主鍵狀態,不一樣實例可能生成一樣的主鍵,從而形成主鍵重複異常。所以,若是同一數據庫有多個實例訪問,此方式必須避免使用。
5) identity
採用數據庫提供的主鍵生成機制。如DB二、SQL Server、MySQL中的主鍵生成機制。
6) sequence
採用數據庫提供的sequence 機制生成主鍵。如Oralce 中的Sequence。
7) native
由Hibernate根據底層數據庫自行判斷採用identity、hilo、sequence其中一種做爲主鍵生成方式。
8) uuid.hex
由Hibernate基於128 位惟一值產生算法生成16 進制數值(編碼後以長度32 的字符串表示)做爲主鍵。
9) uuid.string
與uuid.hex 相似,只是生成的主鍵未進行編碼(長度16)。在某些數據庫中可能出現問題(如PostgreSQL)。
10) foreign
使用外部表的字段做爲主鍵。通常而言,利用uuid.hex方式生成主鍵將提供最好的性能和數據庫平臺適應性。
a.有接口綁定,包括註解綁定sql和xml綁定Sql ,b.動態sql由原來的節點配置變成OGNL表達式,c. 在一對一,一對多的時候引進了association,在一對多的時候引入了collection節點,不過都是在resultMap裏面配置
接口映射就是在IBatis中任意定義接口,而後把接口裏面的方法和SQL語句綁定,咱們直接調用接口方法就能夠,這樣比起原來了SqlSession提供的方法咱們能夠有更加靈活的選擇和設置.
接口綁定有兩種實現方式,一種是經過註解綁定,就是在接口的方法上面加上@Select @Update等註解裏面包含Sql語句來綁定,另一種就是經過xml裏面寫SQL來綁定,在這種狀況下,要指定xml映射文件裏面的namespace必須爲接口的全路徑名.
當Sql語句比較簡單時候,用註解綁定,當SQL語句比較複雜時候,用xml綁定,通常用xml綁定的比較多
有聯合查詢和嵌套查詢,聯合查詢是幾個表聯合查詢,只查詢一次,經過在resultMap裏面配置association節點配置一對一的類就能夠完成;嵌套查詢是先查一個表,根據這個表裏面的結果的外鍵id,去再另一個表裏面查詢數據,也是經過association配置,但另一個表的查詢經過select屬性配置
有聯合查詢和嵌套查詢,聯合查詢是幾個表聯合查詢,只查詢一次,經過在resultMap裏面配置collection節點配置一對多的類就能夠完成;嵌套查詢是先查一個表,根據這個表裏面的結果的外鍵id,去再另一個表裏面查詢數據,也是經過配置collection,但另一個表的查詢經過select節點配置
MyBatis裏面的動態Sql通常是經過if節點來實現,經過OGNL語法來實現,可是若是要寫的完整,必須配合where,trim節點,where節點是判斷包含節點有內容就插入where,不然不插入,trim節點是用來判斷若是動態語句是以and 或or開始,那麼會自動把這個and或者or取掉
MyBatis的緩存分爲一級緩存和二級緩存,一級緩存放在session裏面,默認就有,二級緩存放在它的命名空間裏,默認是打開的,使用二級緩存屬性類須要實現Serializable序列化接口(可用來保存對象的狀態),可在它的映射文件中配置<cache/>
總共23種,分爲三大類:建立型,結構型,行爲型
我只記得其中經常使用的六、7種,分別是:
建立型(工廠、工廠方法、抽象工廠、單例)
結構型(包裝、適配器,組合,代理)
行爲(觀察者,模版,策略)
而後再針對你熟悉的模式談談你的理解便可。
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(責任鏈模式)
每一個模式都描述了一個在咱們的環境中不斷出現的問題,而後描述了該問題的解決方案的核心。經過這種方式,你能夠無數次地使用那些已有的解決方案,無需在重複相同的工做。主要用到了MVC的設計模式。用來開發JSP/Servlet或者J2EE的相關應用。簡單工廠模式等。
setAttribute("name",Object obj):設置名字爲name的request參數的值,該值是由Object類型的obj指定
getAttribute("name"):返回name屬性值
getAttributeNames():返回全部可用屬性名的枚舉
invalidate():使當前會話失效
setMaxInactiveInterval():指定在Servlet容器使此會話失效以前客戶端請求之間的時間間隔,以秒爲單位。負數時間指示會話永遠不會超時
getMaxInactivelnterval():返回servlet 容器在客戶端訪問之間將使此會話保持打開狀態的最大時間間隔,以秒爲單位。在此間隔以後,servlet 容器將使會話無效
print():打印信息
println():換行打印信息
getInitParameter(String paramNarne):從web.xml中獲取指定名稱的值
getInitParameterNames():從web.xml中獲取全部的名稱
Exception:針對錯誤網頁,未捕捉的例外
getMessage():返回異常的詳細信息
getClass():返回異常的名稱
應用服務器:Weblogic、Tomcat、Jboss
WEB SERVER:IIS、 Apache
BEA WebLogic Server,IBM WebSphere Application Server,Oracle9i ApplicationServer,jBoss,Tomcat
答:Je22是Sun公司提出的多層(multi-diered),分佈式(distributed),基於組件(component-base)的企業級應用模型(enterpriese applicationmodel).在這樣的一個應用系統中,可按照功能劃分爲不一樣的組件,這些組件又可在不一樣計算機上,而且處於相應的層次(tier)中。所屬層次包括客戶層(clietn tier)組件,web層和組件,Business層和組件,企業信息系統(EIS)層。
一個另類的回答:j2ee就是增刪改查。
(這個問題不做具體回答,列出來只是告訴讀者可能會遇到什麼問題,你不須要面面俱到,什麼都精通。)
在啓動Weblogic的腳本中(位於所在Domian對應服務器目錄下的startServerName),增長set MEM_ARGS=-Xms32m-Xmx200m,能夠調整最小內存爲32M,最大200M
能夠在管理控制檯中修改對應服務器的啓動模式爲開發或產品模式之一。或者修改服務的啓動文件或者commenv文件,增長setPRODUCTION_MODE=true。
修改服務啓動文件,增長 WLS_USER和WLS_PW項。也能夠在boot.properties文件中增長加密過的用戶名和密碼.
保存在此Domain的config.xml文件中,它是服務器的核心配置文件。
不一樣類型的EJB涉及的配置文件不一樣,都涉及到的配置文件包括ejb-jar.xml,weblogic-ejb-jar.xmlCMP實體Bean通常還須要weblogic-cmp-rdbms-jar.xml
缺省安裝中使用DemoIdentity.jks和DemoTrust.jks KeyStore實現SSL,須要配置服務器使用Enable SSL,配置其端口,在產品模式下須要從CA獲取私有密鑰和數字證書,建立identity和trust keystore,裝載得到的密鑰和數字證書。能夠配置此SSL鏈接是單向仍是雙向的。
4,Activiti工做流學習-----基於5.19.0版本(4):http://www.cnblogs.com/liujie037/p/5790698.html
5,Java關於IO流的介紹:http://www.cnblogs.com/crshuai/p/5789648.html
6,MVC權限管理的實現流程:http://www.cnblogs.com/xinxiaoai/p/5801995.html
7,批量數據上傳的sql.xml:http://www.cnblogs.com/Asions/p/5801200.html
8, struts—文件的上傳和下載: http://www.cnblogs.com/xiangkejin/p/5801032.html
9, Shiro系統權限管理、及原理剖析:http://blog.csdn.net/helloworldwt/article/details/51759224
10, Shiro學習--與SpringMVC整合(數據庫,Shiro註解和Shiro標籤): http://blog.csdn.net/frankcheng5143/article/details/50836619
http://blog.csdn.net/defonds/article/details/48716161
軟件下載
服務器和客戶端安裝
創建版本庫(Repository)
配置用戶和權限
運行獨立服務器
初始化導入
基本客戶端操做
1,軟件下載
下載Subversion服務器程序。
到官方網站的下載二進制安裝文件,來到二進制包下載部分,找到 Windows NT, 2000, XP and 2003部分,而後選擇" this directory ",這樣咱們能夠看到許多下載的內容,目前能夠下載 svn-1.4.0-setup.exe 。
下載Subversion的Windows客戶端TortoiseSVN。
TortoiseSVN是擴展Windows Shell的一套工具,能夠看做Windows資源管理器的插件,安裝以後Windows就能夠識別Subversion的工做目錄。
官方網站是TortoiseSVN ,下載方式和前面的svn服務器相似,在Download頁面的咱們能夠選擇下載的版本,目前的最高穩定版本的安裝文件爲TortoiseSVN-1.4.0.7501-win32-svn-1.4.0.msi。
2,服務器和客戶端安裝
服務器安裝,直接運行svn-1.4.0-setup.exe ,根據提示安裝便可,這樣咱們就有了一套服務器能夠運行的環境。
安裝TortoiseSVN,一樣直接運行TortoiseSVN-1.4.0.7501-win32-svn-1.4.0.msi按照提示安裝便可,不過最後完成後會提示是否重啓,其實重啓只是使svn工做拷貝在windows中的特殊樣式生效,與全部的實際功能無關,這裏爲了馬上看到好的效果,仍是從新啓動機器。
3,創建版本庫(Repository)
運行Subversion服務器須要首先要創建一個版本庫(Repository),能夠看做服務器上存放數據的數據庫,在安裝了Subversion服務器以後,能夠直接運行,如:
svnadmin create E:/svndemo/repository
就會在目錄E:/svndemo/repository下建立一個版本庫。
咱們也能夠使用TortoiseSVN圖形化的完成這一步:
在目錄E:/svndemo/repository下"右鍵->TortoiseSVN->Create Repository here...「, 而後能夠選擇版本庫模式, 這裏使用默認便可, 而後就建立了一系列目錄和文件。
4,配置用戶和權限
來到E:/svndemo/repository/conf目錄,修改svnserve.conf:
# [general]
# password-db = passwd
改成:
[general]
password-db = passwd 而後修改同目錄的passwd文件,去掉下面三行的註釋:
# [users]
# harry = harryssecret
# sally = sallyssecret
最後變成:
[users]
harry = harryssecret
sally = sallyssecret
在這裏,由於通常來講,項目的svn的用戶名和密碼是統一認證的,而爲了避免每次都輸入密碼,因此在使用TortoiseSVN的時候,直接都記住了密碼,這裏的用戶名和密碼最好和項目的一致,以避免出現意外狀況。
5,運行獨立服務器
在任意目錄下運行:
svnserve -d -r E:/svndemo/repository 咱們的服務器程序就已經啓動了。注意不要關閉命令行窗口,關閉窗口也會把svnserve中止。
在使用中發現,即便關閉了此窗口,svn同樣好使~~不知道爲啥~
6,初始化導入
來到咱們想要導入的項目根目錄,在這個例子裏是E:/svndemo/initproject,目錄下有一個readme.txt文件:
右鍵->TortoiseSVN->Import...
URL of repository輸入「svn://localhost/」
ok
完成以後目錄沒有任何變化,若是沒有報錯,數據就已經所有導入到了咱們剛纔定義的版本庫中。
須要注意的是,這一步操做能夠徹底在另外一臺安裝了TortoiseSVN的主機上進行。例如運行svnserve的主機的IP是133.96.121.22,則URL部分輸入的內容就是「svn://133.96.121.22/」。
在這裏,不知道爲何,使用svn://localhost/ 一直都搞不定,最後靈機一動使用了file:///E:/svndemo/repository/ 反而搞定了~~
7,基本客戶端操做
取出版本庫到一個工做拷貝:
來到任意空目錄下,在本例中是E:/svndemo/wc1,運行右鍵->Checkout,在URL of repository中輸入svn://localhost/,這樣咱們就獲得了一份工做拷貝。
在工做拷貝中做出修改並提交:
打開readme.txt,做出修改,而後右鍵->Commit...,這樣咱們就把修改提交到了版本庫,咱們能夠運行。
察看所做的修改:
readme.txt上右鍵->TortoiseSVN->Show Log,這樣咱們就能夠看到咱們對這個文件全部的提交。在版本1上右鍵->Compare with working copy,咱們能夠比較工做拷貝的文件和版本1的區別。
pwd命令:顯示當前的目錄
git init:把當前目錄變成git能夠管理的倉庫
git diff 文件名:查看修改了什麼內容
git log:查看commit歷史,包括時間、做者、版本號、commit備註
git log --pretty=oneline:查看commit歷史,只顯示時間和commit備註
git reset --hard 版本號:指定往前或日後穿越到任意一個版本,版本號經過git reflog查看
git reflog:查看版本操做歷史,顯示縮略版本號、commit備註
git checkout ./-- 不帶引號的文件名:撤銷工做區修改。若是存在add但沒有commit的內容,則回到add後的狀態,刪除沒有add的修改;若是沒有add的內容,則回到最近一次commit完的狀態
git checkout -- 文件名:在commit以前執行,可恢復刪除的文件
cat 文件名:查看文件內容
git branch:查看當前全部分支,當前所在的分支前面加*
git branch 分支名:建立新分支,但不切換過去,若是當前已存在該分支則報錯
git checkout 分支名:切換到指定分支,若是該分支不存在則報錯
git checkout -b 分支名:建立新分支並切換到該分支,至關於上面兩條命令前後執行,若是分支已存在則報錯,並不會切換過去
git branch -d 分支名:刪除指定分支,必須在本分支上刪除當前所在的分支,必須在其餘分支上刪除
git merge 分支名:使當前所在分支內容和merge後面指定的分支內容一致,也就是修改當前所在的分支,接着刪除merge後指定的分支也能夠
git remote (-v):查看遠程庫信息,加上-v查看詳細信息
命令退不出來,按ctrl+C
輸入前面輸過的命令,按PgUp/PgDn
http://www.cnblogs.com/tugenhua0707/p/4050072.html git使用教程詳解
1. JVM參數調優:-Xms<size> 表示JVM初始化堆的大小,-Xmx<size>表示JVM堆的最大值。這兩個值的大小通常根據須要進行設置。當應用程序須要的內存超出堆的最大值時虛擬機就會提示內存溢出,而且致使應用服務崩潰。所以通常建議堆的最大值設置爲可用內存的最大值的80%。在catalina.bat中,設置JAVA_OPTS='-Xms256m -Xmx512m',表示初始化內存爲256MB,能夠使用的最大內存爲512MB。
2. 禁用DNS查詢
當web應用程序向要記錄客戶端的信息時,它也會記錄客戶端的IP地址或者經過域名服務器查找機器名轉換爲IP地址。DNS查詢須要佔用網絡,而且包括可能從不少很遠的服務器或者不起做用的服務器上去獲取對應的IP的過程,這樣會消耗必定的時間。爲了消除DNS查詢對性能的影響咱們能夠關閉DNS查詢,方式是修改server.xml文件中的enableLookups參數值:
Tomcat4
<Connector className="org.apache.coyote.tomcat4.CoyoteConnector" port="80" minProcessors="5" maxProcessors="75" enableLookups="false" redirectPort="8443" acceptCount="100" debug="0" connectionTimeout="20000" useURIValidationHack="false" disableUploadTimeout="true" />
Tomcat5
<Connector port="80" maxThreads="150" minSpareThreads="25" maxSpareThreads="75" enableLookups="false" redirectPort="8443" acceptCount="100" debug="0" connectionTimeout="20000" disableUploadTimeout="true"/>
3. 調整線程數
經過應用程序的鏈接器(Connector)進行性能控制的的參數是建立的處理請求的線程數。Tomcat使用線程池加速響應速度來處理請求。在Java中線程是程序運行時的路徑,是在一個程序中與其它控制線程無關的、可以獨立運行的代碼段。它們共享相同的地址空間。多線程幫助程序員寫出CPU最大利用率的高效程序,使空閒時間保持最低,從而接受更多的請求。
Tomcat4中能夠經過修改minProcessors和maxProcessors的值來控制線程數。這些值在安裝後就已經設定爲默認值而且是足夠使用的,可是隨着站點的擴容而改大這些值。minProcessors服務器啓動時建立的處理請求的線程數應該足夠處理一個小量的負載。也就是說,若是一天內每秒僅發生5次單擊事件,而且每一個請求任務處理須要1秒鐘,那麼預先設置線程數爲5就足夠了。但在你的站點訪問量較大時就須要設置更大的線程數,指定爲參數maxProcessors的值。maxProcessors的值也是有上限的,應防止流量不可控制(或者惡意的服務攻擊),從而致使超出了虛擬機使用內存的大小。若是要加大併發鏈接數,應同時加大這兩個參數。web server容許的最大鏈接數還受制於操做系統的內核參數設置,一般Windows是2000個左右,Linux是1000個左右。
在Tomcat5對這些參數進行了調整,請看下面屬性:
maxThreads Tomcat使用線程來處理接收的每一個請求。這個值表示Tomcat可建立的最大的線程數。
acceptCount 指定當全部能夠使用的處理請求的線程數都被使用時,能夠放處處理隊列中的請求數,超過這個數的請求將不予處理。
connnectionTimeout 網絡鏈接超時,單位:毫秒。設置爲0表示永不超時,這樣設置有隱患的。一般可設置爲30000毫秒。
minSpareThreads Tomcat初始化時建立的線程數。
maxSpareThreads 一旦建立的線程超過這個值,Tomcat就會關閉再也不須要的socket線程。
最好的方式是多設置幾回而且進行測試,觀察響應時間和內存使用狀況。在不一樣的機器、操做系統或虛擬機組合的狀況下可能會不一樣,並且並非全部人的web站點的流量都是同樣的,所以沒有一刀切的方案來肯定線程數的值。
在tomcat中的conf目錄中,在server.xml中的,<host/>節點中添加:<Context path="/hello" docBase="D:/eclipse3.2.2/forwebtoolsworkspacehello/WebRoot" debug="0" privileged="true">
</Context> 至於Context 節點屬性,可詳細見相關文檔。
將web項目文件件拷貝到webapps 目錄中。
很靈活,在conf目錄中,新建 Catalina(注意大小寫)\localhost目錄,在該目錄中新建一個xml文件,名字能夠隨意取,只要和當前文件中的文件名不重複就好了,該xml文件的內容爲: <Context path="/hello" docBase="D:eclipse3.2.2forwebtoolsworkspacehelloWebRoot" debug="0" privileged="true">
</Context>
第3個方法有個優勢,能夠定義別名。服務器端運行的項目名稱爲path,外部訪問的URL則使用XML的文件名。這個方法很方便的隱藏了項目的名稱,對一些項目名稱被固定不能更換,但外部訪問時又想換個路徑,很是有效。
第二、3還有優勢,能夠定義一些個性配置,如數據源的配置等。
能夠用tomcat在線後臺管理器,通常tomcat都打開了,直接上傳war就能夠。
Eclipse中tomcat service設置
選擇window ----show view---services能夠看到服務的面板
雙擊tomcat進入配置界面Service Locations(Specify the server path (i.e. catalina.base) and deploy path. Server must be published with no modules present to make changes.)選項變灰色沒法更改配置。
若要更改,則先把tomcat下的全部項目移除。並右擊,clean...以後方可設置。。。啓動後將又變爲黑色。
默認選項爲:
Use workspace metadata(dose not modify Tomcat installation)
修改選項爲:
Use Tomcat installation(takes control of Tomcat installation)
這樣在Eclipse啓動了tomcat服務器,我們也能夠訪問到tomcat本地管理首頁。
不然只能在DOS下使用Tomcat的啓動命令才能訪問Tomcat本地管理首頁。
注意:Deploy path由:wtpwebapps改成webapps
tomcat默承認以使用的內存爲128MB,在較大型的應用項目中,這點內存是不夠的,須要調大。
Unix下,在文件{tomcat_home}/bin/catalina.sh的前面,增長以下設置:
JAVA_OPTS='-Xms【初始化內存大小】 -Xmx【能夠使用的最大內存】'
須要把這個兩個參數值調大。例如:
JAVA_OPTS='-Xms256m -Xmx512m'
表示初始化內存爲256MB,能夠使用的最大內存爲512MB。
8,如何加大tomcat鏈接數?在tomcat配置文件server.xml中的<Connector />配置中,和鏈接數相關的參數有: minProcessors:最小空閒鏈接線程數,用於提升系統處理性能,默認值爲10 maxProcessors:最大鏈接線程數,即:併發處理的最大請求數,默認值爲75 acceptCount:容許的最大鏈接數,應大於等於maxProcessors,默認值爲100 enableLookups:是否反查域名,取值爲:true或false。爲了提升處理能力,應設置爲false connectionTimeout:網絡鏈接超時,單位:毫秒。設置爲0表示永不超時,這樣設置有隱患的。一般可設置爲30000毫秒。 其中和最大鏈接數相關的參數爲maxProcessors和acceptCount。若是要加大併發鏈接數,應同時加大這兩個參數。 web server容許的最大鏈接數還受制於操做系統的內核參數設置,一般Windows是2000個左右,Linux是1000個左右。tomcat5中的配置示例: <Connector port="8080" maxThreads="150" minSpareThreads="25" maxSpareThreads="75" enableLookups="false" redirectPort="8443" acceptCount="100" debug="0" connectionTimeout="20000" disableUploadTimeout="true" /> 對於其餘端口的偵聽配置,以此類推。