1. 程式人生 > >java新知識系列 三

java新知識系列 三

pri el表達式 htable ani 級別 index 繼承 end htm

1:trycatch中需要註意的地方. 2:ServletConfig以及ServletContext對象. 3: Spring事務屬性的種類: 傳播行為、隔離級別、只讀和事務超時. 5:關於程序繼承的報錯. 6:java數組具有協變性,而java集合不是協變的. 7: EL表達式;http://www.cnblogs.com/xushuai123/archive/2013/03/24/2979711.html 8:常見類的線程安全屬性,以及如何去判斷一個類是否是線程安全的方法以及源碼實例; 9: java的移位運算符; 10:JSP九大內置對象 1:trycatch中需要註意的地方
  • finally中return語句會覆蓋try-catch中的return語句
2:ServletConfig以及ServletContext對象:
  1. ServletContext對象:servlet容器在啟動時會加載web應用,並為每個web應用創建唯一的servlet context對象,可以把ServletContext看成是一個Web應用的服務器端組件的共享內存,在ServletContext中可以存放共享數據。ServletContext對象是真正的一個全局對象,凡是web容器中的Servlet都可以訪問。整個web應用只有唯一的一個ServletContext對象
  2. servletConfig對象:用於封裝servlet的配置信息。從一個servlet被實例化後,對任何客戶端在任何時候訪問有效,但僅對servlet自身有效,一個servlet的ServletConfig對象不能被另一個servlet訪問。
3: Spring事務屬性的種類: 傳播行為、隔離級別、只讀和事務超時 a) 傳播行為定義了被調用方法的事務邊界。
傳播行為 意義
PROPERGATION_MANDATORY 表示方法必須運行在一個事務中,如果當前事務不存在,就拋出異常
PROPAGATION_NESTED
表示如果當前事務存在,則方法應該運行在一個嵌套事務中。否則,它看起來和PROPAGATION_REQUIRED 看起來沒什麽倆樣
PROPAGATION_NEVER 表示方法不能運行在一個事務中,否則拋出異常
PROPAGATION_NOT_SUPPORTED 表示方法不能運行在一個事務中,如果當前存在一個事務,則該方法將被掛起
PROPAGATION_REQUIRED 表示當前方法必須運行在一個事務中,如果當前存在一個事務,那麽該方法運行在這個事務中,否則,將創建一個新的事務
PROPAGATION_REQUIRES_NEW 表示當前方法必須運行在自己的事務中,如果當前存在一個事務,那麽這個事務將在該方法運行期間被掛起
PROPAGATION_SUPPORTS 表示當前方法不需要運行在一個是事務中,但如果有一個事務已經存在,該方法也可以運行在這個事務中
b) 隔離級別 在操作數據時可能帶來 3 個副作用,分別是臟讀、不可重復讀、幻讀。為了避免這 3 中副作用的發生,在標準的 SQL 語句中定義了 4 種隔離級別,分別是未提交讀、已提交讀、可重復讀、可序列化。而在 spring 事務中提供了 5 種隔離級別來對應在SQL 中定義的 4 種隔離級別,如下:
隔離級別 意義
ISOLATION_DEFAULT 使用後端數據庫默認的隔離級別
ISOLATION_READ_UNCOMMITTED 允許讀取未提交的數據(對應未提交讀),可能導致臟讀、不可重復讀、幻讀
ISOLATION_READ_COMMITTED 允許在一個事務中讀取另一個已經提交的事務中的數據(對應已提交讀)。可以避免臟讀,但是無法避免不可重復讀和幻讀
ISOLATION_REPEATABLE_READ 一個事務不可能更新由另一個事務修改但尚未提交(回滾)的數據(對應可重復讀)。可以避免臟讀和不可重復讀,但無法避免幻讀
ISOLATION_SERIALIZABLE 這種隔離級別是所有的事務都在一個執行隊列中,依次順序執行,而不是並行(對應可序列化)。可以避免臟讀、不可重復讀、幻讀。但是這種隔離級別效率很低,因此,除非必須,否則不建議使用。
c) 只讀 如果在一個事務中所有關於數據庫的操作都是只讀的,也就是說,這些操作只讀取數據庫中的數據,而並不更新數據,那麽應將事務設為只讀模式( READ_ONLY_MARKER ) , 這樣更有利於數據庫進行優化 。 因為只讀的優化措施是事務啟動後由數據庫實施的,因此,只有將那些具有可能啟動新事務的傳播行為(PROPAGATION_NESTED 、 PROPAGATION_REQUIRED 、 PROPAGATION_REQUIRED_NEW) 的方法的事務標記成只讀才有意義。 如果使用 Hibernate 作為持久化機制,那麽將事務標記為只讀後,會將 Hibernate 的 flush 模式設置為FULSH_NEVER, 以告訴 Hibernate 避免和數據庫之間進行不必要的同步,並將所有更新延遲到事務結束。 d) 事務超時 如果一個事務長時間運行,這時為了盡量避免浪費系統資源,應為這個事務設置一個有效時間,使其等待數秒後自動回滾。與設 置“只讀”屬性一樣,事務有效屬性也需要給那些具有可能啟動新事物的傳播行為的方法的事務標記成只讀才有意義。 5:關於程序繼承的報錯:
在調用子類構造器之前,會先調用父類構造器,當子類構造器中沒有使用"super(參數或無參數)"指定調用父類構造器時,是默認調用父類的無參構造器,如果父類中包含有參構造器,卻沒有無參構造器,則在子類構造器中一定要使用“super(參數)”指定調用父類的有參構造器,不然就會報錯。 6:java數組具有協變性,而java集合不是協變的;7 幾個例子: 1. 假設有一個函數 fun(Animal animal),如果我們傳入一個Dog d 對象進去,編譯器是不會報錯的,這是多態的概念; 2. 假設有一個函數 fun(Animal[] animals),如果我們傳如一個Dog[] dogs數組進去,編譯器也不會報錯,這就是數組的協變性; 3. 假設有一個函數 fun(List<Animal> animal), 如果我們傳如一個List <Dog> dog 集合進去,編譯器就會報錯了,這就是集合泛型的不變性; 那麽該怎麽辦呢?我們可以將泛型改成這樣 fun (List <? extends Animal> ),這樣之後,當我們再 傳入一個List <Dog> dog 集合進去,編譯器就就不會報錯了。也就是說可以傳入包含Animal的子類的List了。 List<Object>:點; List<?>/ List<? extends Object>:範圍 1.不同的點之間不能互相賦值 2.小範圍可以賦值給大範圍,反之則不行 3.小點可以賦值給大範圍(點在範圍之內),範圍不能賦值給點 註意:List list; 如果這樣定義list的話,那麽list可以賦值給任何點或範圍。編譯器不會報錯,但是會警告(警告示例:Type safety: The expression of type List needs unchecked conversion to conform to List<A>) 7: EL表達式 http://www.cnblogs.com/xushuai123/archive/2013/03/24/2979711.html EL 全名為Expression Language,就是為了替代<%= %>腳本表達式。 在j2ee1.4以前默認是不支持el,如果需要需要指定page指令[isELIgnored="true | false" ]為false,j2ee4.0後默認支持el 其主要作用為: EL主要作用: 1、獲取數據: EL表達式主要用於替換JSP頁面中的腳本表達式,以從各種類型的web域中檢索java對象、獲取數據。(某個web域 中的對象,訪問javabean的屬性、訪問list集合、訪問map集合、訪問數組) 2、執行運算: 利用EL表達式可以在JSP頁面中執行一些基本的關系運算、邏輯運算和算術運算,以在JSP頁面中完成一些簡單的邏輯運算。${user==null} 3、獲取web開發常用對象 EL 表達式定義了一些隱式對象,利用這些隱式對象,web開發人員可以很輕松獲得對web常用對象的引用,從而獲得這些對象中的數據。 4、調用Java方法 EL表達式允許用戶開發自定義EL函數,以在JSP頁面中通過EL表達式調用Java類的方法。 8:常見類的線程安全屬性,以及如何去判斷一個類是否是線程安全的方法以及源碼實例;
  • 常見類的是否線程安全
安全 不安全 Vector ArrayList HashTable HashMap StringBuffer StringBuilder
  • 如何去判斷一個類是否是線程安全的?
[]java中的線程安全是什麽: 就是線程同步的意思,就是當一個程序對一個線程安全的方法或者語句進行訪問的時候,其他的不能再對他進行操作了,必須等到這次訪問結束以後才能對這個線程安全的方法進行訪問 []什麽叫線程安全: 如果代碼所在的進程中有多個線程在同時運行,而這些線程可能會同時運行這段代碼。如果每次運行結果和單線程運行的結果是一樣的,而且其他的變量的值也和預期的是一樣的,就是線程安全的。 或者說:一個類或者程序所提供的接口對於線程來說是原子操作或者多個線程之間的切換不會導致該接口的執行結果存在二義性,也就是說我們不用考慮同步的問題。線程安全問題都是由全局變量及靜態變量引起的。 若每個線程中對全局變量、靜態變量只有讀操作,而無寫操作,一般來說,這個全局變量是線程安全的;若有多個線程同時執行寫操作,一般都需要考慮線程同步,否則就可能影響線程安全。 看過vector源碼的會知道他的許多操作都是加了synchronized修飾的比如他的添加元素。
public synchronized void addElement(E obj) { modCount++; ensureCapacityHelper(elementCount + 1); elementData[elementCount++] = obj; } 而HashMap的所有操作都沒有加synchronized修飾 ,put源碼 public V put(K key, V value) { if (key == null) return putForNullKey(value); int hash = hash(key.hashCode()); int i = indexFor(hash, table.length); for(Entry<K,V> e = table[i]; e != null; e = e.next) { Object k; if (e.hash == hash &&((k = e.key) == key || key.equals(k))) { V oldValue = e.value; e.value = value; e.recordAccess(this); return oldValue; } } modCount++; addEntry(hash, key, value, i); return null; } ArrayList的add方法的源碼 public boolean add(E e) { ensureCapacity(size + 1); // Increments modCount!! elementData[size++] = e; return true; } StringBuffer的append源碼,他是有synchronized修飾的 public synchronized StringBuffer append(String str) { super.append(str); return this; }
最後是Properties的setProperty方法,有synchronized修飾的
public synchronized Object setProperty(String key, String value) { return put(key, value); } 9: java的移位運算符; >>為帶符號右移,右移後左邊的空位被填充為符號位 >>>為不帶符號右移,右移後左邊的空位被填充為0 沒有<<< 因為<<後右邊總是補0 10:JSP九大內置對象
1.request對象 客戶端的請求信息被封裝在request對象中,通過它才能了解到客戶的需求,然後做出響應。它是HttpServletRequest類的實例。 2.response對象 response對象包含了響應客戶請求的有關信息,但在JSP中很少直接用到它。它是HttpServletResponse類的實例。 3.session對象 session對象指的是客戶端與服務器的一次會話,從客戶連到服務器的一個WebApplication開始,直到客戶端與服務器斷開連接為止。它是HttpSession類的實例. 4.out對象 out對象是JspWriter類的實例,是向客戶端輸出內容常用的對象 5.page對象 page對象就是指向當前JSP頁面本身,有點象類中的this指針,它是java.lang.Object類的實例 6.application對象 application對象實現了用戶間數據的共享,可存放全局變量。它開始於服務器的啟動,直到服務器的關閉,在此期間,此對象將一直存在;這樣在用戶的前後連接或不同用戶之間的連接中,可以對此對象的同一屬性進行操作;在任何地方對此對象屬性的操作,都將影響到其他用戶對此的訪問。服務器的啟動和關閉決定了application對象的生命。它是ServletContext類的實例。 7.exception對象 exception對象是一個例外對象,當一個頁面在運行過程中發生了例外,就產生這個對象。如果一個JSP頁面要應用此對象,就必須把isErrorPage設為true,否則無法編譯。他實際上是java.lang.Throwable的對象 8.pageContext對象 pageContext對象提供了對JSP頁面內所有的對象及名字空間的訪問,也就是說他可以訪問到本頁所在的SESSION,也可以取本頁面所在的application的某一屬性值,他相當於頁面中所有功能的集大成者,它的本 類名也叫pageContext。 9.config對象 config對象是在一個Servlet初始化時,JSP引擎向它傳遞信息用的,此信息包括Servlet初始化時所要用到的參數(通過屬性名和屬性值構成)以及服務器的有關信息(通過傳遞一個ServletContext對象)

java新知識系列 三