java學習心得
目錄
第一篇:java學習心得筆記第二篇:java學習心得第三篇:關於java學習的一點心得體會第四篇:java學習心得第五篇:java學習的心得體會更多相關範文正文
第一篇:java學習心得筆記
j2ee學習筆記
注:框架可以用word菜單中的 “視圖/文檔結構圖” 看到
j2ee模式
value object(值對象)用於把數據從某個對象/層傳遞到其他對象/層的任意java對象。
通常不包含任何業務方法。
也許設計有公共屬性,或者提供可以獲取屬性值的get方法。
jsp
1.jsp的基礎知識
__
_____ |directive(指令)
| |-- scripting (腳本)
jsp -------| |__ action(動作)
|
|_____template data :除jsp語法外,jsp引擎不能解讀的東西
1)在jsp中使用的directive(指令)主要有三個:
a) page指令
b) include指令
c) taglib指令
在jsp的任何地方,以任何順序,一個頁面可以包含任意數量的page指令
2)scripting(腳本)包括三種類型
a) <%!declaraction%>;
b) <%scriptlet %>;
c) <%= expression%>;
3)action(動作)
標準的動作類型有:
a)<jsp:usebean>;
b)<jsp:setproperty>;
d) <jsp:getproperty>;
e) <jsp:param>;
f) <jsp:include>;
g) <jsp:forward>;
h) <jsp:plugin>;
1. 註釋: <% -----jsp comment-------%>;
<! -----html comment-------%>;
2. <%@ page session = “true”import =”.*” %>;
session可以不賦值,默認為true,如果session=”false”,則在jsp頁面中,隱含的變量session就不能使用。
3. 請求控制器結構(request controller)
也被稱之為jsp model 2 architecture
這種途徑涉及到使用一個servlet或一個jsp作為一個應用程序或一組頁面的入口點。
為創建可維護的jsp系統,request controller是最有用的方式之一。
不是jsp,而是java類才是放置控制邏輯的正確的地方。
請求控制器的命名模式為:
請求控制器類的命名模式為: xxxrequestcontroller
2.jsp中的javabean
jsp三種bean的類型
1) 頁面bean
2) 會話bean
3) 應用bean
大多數的系統會使用一個會話bean來保持狀態,而對每一個頁面使用一個頁面bean 來對複雜的數據進行表示。
頁面bean是一個模型,而jsp是一個視圖。
3.custom tag
bean是信息的攜帶者,
而tag更適用於處理信息。
標記庫包含一個標記庫描述符(tld)和用於實現custom tag的java類
在翻譯階段,jsp容器將使用tld來驗證頁面中的所有的tag是否都被正確的使用。
標記處理程序只是一個簡單的適配器,而真正的邏輯是在另一個類中實現的,標記處理程序只是提供了一個供其他的可複用的類的jsp接口
servlet
1.servletconfig
 一個servletconfig對象是servlet container在servlet initialization的時候傳遞給servlet的。
servletconfig包涵 servletcontext 和 一些 name/value pair (來自於deployment descriptor)
 servletcontext接口封裝了web應用程序的上下文概念。
2.會話跟蹤
1) session
 當一個client請求多個servlets時,一個session可以被多個servlet共享。
 通常情況下,如果server detect到browser支持cookie,那麼url就不會重寫。
2) cookie
 在java servlet中,如果你光cookie cookie = new cookie(name,value)
那麼當用户退出browser時,cookie會被刪除掉,而不會被存儲在客户端的硬盤上。
如果要存儲 cookie,需加一句axage(200)
 cookie是跟某一個server相關的,運行在同一個server上的servlet共享一個cookie.
3) url rewriting
在使用url rewriting來維護session id的時候,每一次http請求都需要encodeurl()
典型的用在兩個地方
1) t(“form action=” ”);
t(deurl(“sessionexample”));
t(“form action=” ”);
t(“method = get>;”);
2) t(“<p>;<a href=” ”);
t(deurl(“sessionexample?database=foo&datavalue=bar”));
tln(“” >;url encoded </a>;”);
3.singlethreadmodel
默認的,每一個servlet definition in a container只有一個servlet class的實例。
只有實現了singlethreadmodel,container才會讓servlet有多個實例。
servlet specification上建議,不要使用synchronized,而使用singlethreadmodel。
singlethreadmodel(沒有方法)
保證servlet在同一時刻只處理一個客户的請求。
singlethreadmodel是耗費資源的,特別是當有大量的請求發送給servlet時,singlethreadmodel的作用是使包容器以同步時鐘的方式調用service方法。
這等同於在servlet的service()方法種使用synchronized.
single thread model一般使用在需要響應一個heavy request的時候,比如是一個需要和數據庫打交道的連接。
2. 在重載servlet地init( )方法後,一定要記得調用( );
3. the client通過發送一個blank line表示它已經結束request
而the server通過關閉the socket來表示response已結束了。
4. 一個http servlet可以送三種東西給client
1) a single status code
2) any number of http headers
3) a response body
5. servlet之間信息共享的一個最簡單的方法就是
roperties()(“key”,”value”);
6. post和get
post:將form內各字段名稱和內容放置在html header內傳送給server
get:?之後的查詢字符串要使用urlencode,經過urlencode後,這個字符串不再帶有空格,以後將在server上恢復所帶有的空格。
get是web上最經常使用的一種請求方法,每個超鏈接都使用這種方法。
7. 就是web applicatin 的deployment descriptor
作用有:組織各類元素
設置init param
設置安全性
8. request dispatcher用來把接收到的request forward processing到另一個servlet
要在一個response裏包含另一個servlet的output時,也要用到request dispatcher.
9. servlet和jsp在同一個jvm中,可以通過serveltcontext的
setattribute( )
getattribute( )
removeattribute( )
來共享對象
10. 利用arameter( )得到的string存在字符集問題。
可以用strtitle = arameter(“title”);
strtitle = new string(ytes(“8859-1”),”gb2312”);
如果你希望得到更大得兼容性
string encoding = haracterencoding();
//確定application server用什麼編碼來讀取輸入的。
strtitle = new string(ytes(encoding),”gb2312”);
xml
1.xml基礎知識
1. 一個xml文檔可以分成兩個基本部分:
首部( header )
內容( content )
2. xml名字空間規範中指定:
xml文檔中的每一個元素都處在一個名字空間中;如果沒有指定的名字空間,缺省的名字空間就是和該元素相關聯的名字空間。
3. a document that is well-formed obeys all of the rules of xml documents (nested tags, etc.)
" if a well-formed document uses a document type definition (more on these in a minute), and it follows all the rules of the dtd, then it is also a valid document
4. a tag is the text between the <angle brackets>;
" an element is the start tag, the end tag,and everything (including other elements) in between
5. 標籤( tags ) 實際上包含了“元素”( elements ) 和 “屬性”( attributes )兩部分。
用元素( elements )來描述有規律的數據。
用屬性( attributes ) 來描述系統數據。
如果你有一些數據要提供給某個應用程序,該數據就可能要用到一個元素。
如果該數據用於分類,或者用於告知應用程序如何處理某部分數據,或者該數據從來沒有直接對客户程序公開,那麼它就可能成為一種屬性。
6. cdata (讀作:c data ) c是character的縮寫。
er
/|
eader
/|
arser
2.webservice
2.1 webservice的基本概念
webservice是一種可以接收從internet或者intranet上的其它系統中傳遞過來的請求,輕量級的獨立的通訊技術。
這種技術允許網絡上的所有系統進行交互。隨着技術的發展,一個web服務可以包含額外的指定功能並且可以在多個b2b應用中協作通訊。
web服務可以理解請求中上下文的關係,並且在每一個特定的情況下產生動態的結果。這些服務會根據用户的身份,地點以及產生請求的原因來改變不同的處理,用以產生一個唯一的,定製的方案。這種協作機制對那些只對最終結果有興趣的用户來説,是完全透明的。
uddi
在用户能夠調用web服務之前,必須確定這個服務內包含哪些商務方法,找到被調用的接口定義,還要在服務端來編制軟件。所以,我們需要一種方法來發布我們的web服務。
uddi (universal description, discovery, and integration) 是一個主要針對web服務供應商和使用者的新項目。uddi 項目中的成員可以通過uddi business registry (ubr) 來操作web服務的調用,ubr是一個全球性的服務。
web服務供應商可以在ubr中描述並且註冊他們的服務。
用户可以在ubr中查找並定位那些他們需要的服務。
uddi是一種根據描述文檔來引導系統查找相應服務的機制。
uddi包含標準的“白皮書”類型的商業查詢方式,
“黃皮書”類型的局部查找,以及
“綠皮書”類型的服務類型查找。
uddi利用soap消息機制(標準的xml/http)來發布,編輯,瀏覽以及查找註冊信息。它採用xml格式來封裝各種不同類型的數據,並且發送到註冊中心或者由註冊中心來返回需要的數據。
wsdl
對於商業用户來説,要找到一個自己需要使用的服務,他必須知道如何來調用。
wsdl (web services description language) 規範是一個描述接口,語義以及web服務為了響應請求需要經常處理的工作的xml文檔。這將使簡單地服務方便,快速地被描述和記錄。
以下是一個wsdl的樣例:
<?xml version="1.0"?>;
<definitions name="stockquote"
targetnamespace=""
xmlns:tns=""
xmlns:xsd1=""
xmlns:soap=""
xmlns="">;
<types>;
<schema targetnamespace=
xmlns="">;
<element name="tradepricerequest">;
<complextype>;
<all>;
<element name="tickersymbol" type="string"/>;
</all>;
</complextype>;
</element>;
<element name="tradeprice">;
<complextype>;
<all>;
<element name="price" type="float"/>;
</all>;
</complextype>;
</element>;
</schema>;
</types>;
<message name="getlasttradepriceinput">;
<part name="body" element="xsd1:tradepricerequest"/>;
</message>;
<message name="getlasttradepriceoutput">;
<part name="body" element="xsd1:tradeprice"/>;
</message>;
<porttype name="stockquoteporttype">;
<operation name="getlasttradeprice">;
<input message="tns:getlasttradepriceinput"/>;
<output message="tns:getlasttradepriceoutput"/>;
</operation>;
</porttype>;
<binding name="stockquotesoapbinding"
type="tns:stockquoteporttype">;
<soap:binding style="document"
transport=""/>;
<operation name="getlasttradeprice">;
<soap:operation
soapaction=""/>;
<input>;
<soap:body use="literal"/>;
</input>;
<output>;
<soap:body use="literal"/>;
</output>;
</operation>;
</binding>;
<service name="stockquoteservice">;
<documentation>;my first service</documentation>;
<port name="stockquoteport" binding="tns:stockquotebinding">;
<soap:address location=""/>;
</port>;
</service>;
</definitions>;
它包含了以下的關鍵信息:
消息的描述和格式定義可以通過xml文檔中的<types>;和<message>; 標記來傳送。
<porttype>; 標記中表示了消息傳送機制。 (e.g. request-only, request-response, response-only) 。
<binding>; 標記指定了編碼的規範 。
<service>; 標記中表示服務所處的位置 (url)。
wsdl在uddi中總是作為一個接口描述文檔。因為uddi是一個通用的用來註冊wsdl規範的地方,uddi的規範並不限制任何類型或者格式描述文檔。這些文檔可能是一個wsdl文檔,或者是一個正規的包含導向文檔的web頁面,也可能只是一個包含聯繫信息的電子郵件地址。
現在java提供了一個 java api for wsdl (jwsdl)規範。它提供了一套能快速處理wsdl文檔的方法,並且不用直接對xml文檔進行操作,它會比jaxp更方便,更快速。
soap
當商業用户通過uddi找到你的wsdl描述文檔後,他通過可以simple object access protocol (soap) 調用你建立的web服務中的一個或多個操作。
soap是xml文檔形式的調用商業方法的規範,它可以支持不同的底層接口,象http(s)或者smtp。
之所以使用xml是因為它的獨立於編程語言,良好的可擴展性以及強大的工業支持。之所以使用http是因為幾乎所有的網絡系統都可以用這種協議來通信,由於它是一種簡單協議,所以可以與任何系統結合,還有一個原因就是它可以利用80端口來穿越過防火牆。
soap的強大是因為它簡單。soap是一種輕量級的,非常容易理解的技術,並且很容易實現。它有工業支持,可以從各主要的電子商務平台供應商那裏獲得。
從技術角度來看,soap詳細指明瞭如何響應不同的請求以及如何對參數編碼。一個soap封裝了可選的頭信息和正文,並且通常使用http post方法來傳送到一個http 服務器,當然其他方法也是可以的,例如smtp。soap同時支持消息傳送和遠程過程調用。以下是一個soap請求。
post /stockquote http/1.1
host:
content-type: text/xml; charset="utf-8"
content-length: nnnn
soapaction: "some-uri"
<soap-env:envelope
xmlns:soap-env=""
關。
以下是你應該回避使用的一些java特色,並且在你的ejb組件的實現代碼中要嚴格限
制它們的使用:
1.使用static,非final 字段。建議你在ejb組件中把所有的static字段都聲明為final型的。這樣可以保證前後一致的運行期語義,使得ejb容器有可以在多個java虛擬機之間分發組件實例的靈活性。
2.使用線程同步原語來同步多個組件實例的運行。避免這個問題,你就可以使ejb容器靈活的在多個java虛擬機之間分發組件實例。
3.使用awt函數完成鍵盤的輸入和顯示輸出。約束它的原因是服務器方的商業組件意味着提供商業功能而不包括用户界面和鍵盤的i/o功能。
4.使用文件訪問/ 操作。ejb商業組件意味着使用資源管理器如jdbc來存儲和檢索數據而不是使用文件系統api。同時,部署工具提供了在部署描述器(descriptor)中存儲環境實體,以至於ejb組件可以通過環境命名上下文用一種標準的方法進行環境實體查詢。所以,使用文件系統的需求基本上是被排除了。
5.監聽和接收socket連接,或者用socket進行多路發送。ejb組件並不意味着提供網絡socket服務器功能,但是,這個體系結構使得ejb組件可以作為socket客户或是rmi客户並且可以和容器所管理的環境外面的代碼進行通訊。
6.使用映象api查詢ejb組件由於安全規則所不能訪問的類。這個約束加強了java平台的安全性。
7.欲創建或獲得一個類的加載器,設置或創建一個新的安全管理器,停止java虛擬機,改變輸入、輸出和出錯流。這個約束加強了安全性同時保留了ejb容器管理運行環境的能力。
8.設置socket工廠被url's serversocket,socket和stream handler使用。避免這個特點,可以加強安全性同時保留了ejb容器管理運行環境的能力。
9.使用任何方法啟動、停止和管理線程。這個約束消除了與ejb容器管理死鎖、線程
和併發問題的責任相沖突的可能性。
通過限制使用10-16幾個特點,你的目標是堵上一個潛在的安全漏洞:
10.直接讀寫文件描述符。
11.為一段特定的代碼獲得安全策略信息。
12.加載原始的類庫。
13.訪問java一般角色所不能訪問的包和類。
14.在包中定義一個類。
15.訪問或修改安全配置對象(策略、安全、提供者、簽名者和實體)。
16.使用java序列化特點中的細分類和對象替代。
17.傳遞this引用指針作為一個參數或者作為返回值返回this引用指針。你必須使用
sessioncontext或entitycontext中的getejbobject()的結果。
java2平台的安全策略
以上所列的特點事實上正是java編程語言和java2標準版中的標準的、強有力的特色。ejb容器允許從j2se中使用一些或全部的受限制的特色,儘管對於ejb組件是不可用的,但需通過j2se的安全機制來使用而不是通過直接使用j2se的api。
java2平台為ejb1.1規範中的ejb容器所制定的安全策略定義了安全許可集,這些許可在ejb組件的編程限制中出現。通過這個策略,定義了一些許可諸如:permission,ermission,ectpermission,ritypermission,以便加強先前所列出的編程限制。
許多ejb容器沒有加強這些限制,他們希望ejb組件開發者能遵守這些編程限制或者是帶有冒險想法違背了這些限制。違背這些限制的ejb組件,比標準方法依賴過多或過少的安全許可,都將很少能在多個ejb容器間移植。另外,代碼中都將隱藏着一些不確定的、難以預測的問題。所有這些都足以使ejb組件開發者應該知道這些編程限制,同時也應該認真地遵守它們。
任何違背了這些編程限制的ejb組件的實現代碼在編譯時都不能檢查出來,因為這些特點都是java語言和j2se中不可缺少的部分。
對於ejb組件的這些限制同樣適用於ejb組件所使用的幫助/訪問(helper/access)類,j2ee應用程序使用java文檔(jar)文件格式打包到一個帶(代表enterprise archive)擴展名的文件中,這個ear文件對於發送給文件部署器來説是標準的格式。ear文件中包括在一個或多個ejb-jar文件中的ejb組件,還可能有ejb-jar所依賴的庫文件。所有ear文件中的代碼都是經過深思熟慮開發的應用程序並且都遵守編程限制和訪問許可集。
未來版本的規範可能會指定通過部署工具來定製安全許可的能力,通過這種方法指定了一個合法的組件應授予的許可權限,也指定了一個標準方法的需求:如從文件系統中讀文件應有哪些要求。一些ejb容器/服務器目前在它們的部署工具中都提供了比標準權限或多或少的許可權限,這些並不是ejb1.1規範中所需要的。
理解這些約束
ejb容器是ejb組件生存和執行的運行期環境,ejb容器為ejb組件實例提供了一些服務如:事務管理、安全持久化、資源訪問、客户端連接。ejb容器也負責ejb組件實例整個生命期的管理、擴展問題以及併發處理。所以,ejb組件就這樣寄居在一個被管理的執行環境中--即ejb容器。
因為ejb容器完全負責ejb組件的生命期、併發處理、資源訪問、安全等等,所以與容器本身的鎖定和併發管理相沖突的可能性就需要消除,許多限制都需要使用來填上潛在的安全漏洞。除了與ejb容器責任與安全衝突的問題,ejb組件還意味着僅僅聚焦於商務邏輯,它依賴於ejb容器所提供的服務而不是自己來直接解決底層的系統層的問題。
可能的問題
通常,ejb組件在容器之間的移植不可避免地與如下問題相關:
1.它需要依靠的受限制的特點在特定ejb容器中沒有得到加強。
2.它需要依靠的非標準的服務從容器中可獲得。
為了保證ejb組件的可移植性和一致的行為,你應該使用一個具有與java2平台安全
策略集相一致的策略集的容器來測試ejb組件,並且其加強了前述的編程限制。
總結
ejb組件開發者應該知道這些推薦的關於ejb組件的編程限制,明白它們的重要性,並且從組件的穩定性和可移植性利益方面考慮來遵循它們。因為這些編程限制能阻止你使用標準的java語言的特點,違背了這些編程限制在編譯時不會知道,並且加強這些限制也不是ejb容器的責任。所有這些原因都使你應很小心地遵守這些編程限制,這些限制在組件的合同中已經成為了一個條款,並且它們對於建造可靠的、可移植的組件是非常重要的。
2. 優化ejb
entity bean為在應用程序和設計中描述持久化商業對象(persistent business objec ts)提供了一個清晰的模型。在java對象模型中,簡單對象通常都是以一種簡單的方式進行處理但是,很多商業對象所需要的事務化的持久性管理沒有得到實現。entity bean將持久化機制封裝在容器提供的服務裏,並且隱藏了所有的複雜性。entity bean允許應用程序操縱他們就像處理一個一般的java對象應用。除了從調用代碼中隱藏持久化的形式和機制外,entity bean還允許ejb容器對對象的持久化進行優化,保證數據存儲具有開放性,靈活性,以及可部署性。在一些基於ejb技術的項目中,廣泛的使用oo技術導致了對entity bean的大量使用,sun的工程師們已經積累了很多使用entity bean的經驗,這篇文章就詳細闡述的這些卡發經驗:
*探索各種優化方法
*提供性能優化和提高適用性的法則和建議
*討論如何避免一些教訓。
法則1:只要可以,儘量使用cmp
cmp方式不僅減少了編碼的工作量,而且在container中以及container產生的數據庫訪問代碼中包括了許多優化的可能。container可以訪問內存緩衝中的bean,這就允許它可以監視緩衝中的任何變化。這樣的話就在事物沒有提交之前,如果緩存的數據沒有變化就不用寫到數據庫中。就可以避免許多不必要的數據庫寫操作。另外一個優化是在調用find方法的時候。通常情況下find方法需要進行以下數據庫操作:
查找數據庫中的紀錄並且獲得主鍵
將紀錄數據裝入緩存
cmp允許將這兩步操作優化為一步就可以搞定。[具體怎麼做我也沒弄明白,原文沒有具體闡述]
法則2:寫代碼時儘量保證對bmp和cmp都支持
許多情況下,ejb的開發者可能無法控制他們寫的bean怎麼樣被部署,以及使用的container是不是支持cmp.
一個有效的解決方案是,將商業邏輯的編碼完全和持久化機制分離。再cmp類中實現商業邏輯,然後再編寫一個bmp類,用該類繼承cmp類。這樣的話,所有的商業邏輯都在cmp類中,而持久化機制在bmp中實現。[我覺得這種情況在實際工作中很少遇到,但是作者解決問題的思路值得學習]
法則3:把ejbstore中的數據庫訪問減小到最少。
如果使用bmp,設置一個緩存數據改變標誌dirty非常有用。所有改變數據庫中底層數據的操作,都要設置dirty,而在ejbstore()中,首先檢測dirty的值,如果dirty的值沒有改變,表明目前數據庫中的數據與緩存的一致,就不必進行數據庫操作了,反之,就要把緩存數據寫入數據庫。
法則4:總是將從lookup和find中獲得的引用進行緩存。(cache)
引用緩存對session bean和entity bean 都是適用的。
通過jndi lookup獲得ejb資源。比如datasource,bean的引用等等都要付出相當大的代價。因此應該避免多餘的lookup.可以這樣做:
將這些引用定義為實例變量。
從setentitycontext(session bean使用setsessioncontext)方法查找他們。setentitycontext方法對於一個bean實例只執行一次,所有的相關引用都在這一次中進行查找,這樣查找的代價就不是那麼昂貴了。應該避免在其他方法中查找引用。尤其是訪問數據庫的方法:ejbload()和ejbstore(),如果在這些頻繁調用的方法中進行datasource的查找,勢必造成時間的浪費。
調用其他entity bean的finder方法也是一種重量級的調用。多次調用finder()方法的代價非常高。如果這種引用不適合放在setentitycontext這樣的初始化時執行的方法中執行,就應該在適當的時候緩存finder的執行結果。只是要注意的是,如果這個引用只對當前的entity有效,你就需要在bean從緩衝池中取出來代表另外一個實體時清除掉這些引用。,這些操作應該在ejbactivate()中進行。
法則5:總是使用prepare statements
這條優化法則適用於所有訪問關係數據庫的操作。
數據庫在處理每一個sql statement的時候,執行前都要對statement進行編譯。一些數據庫具有緩存statement和statement的編譯後形式的功能。數據庫可以把新的statement和緩存中的進行匹配。然而,如果要使用這一優化特性,新的statement要必須和緩存中的statement完全匹配。
對於non-prepared statement,數據和statement本身作為一個字符串傳遞,這樣由於前後調用的數據不同而不能匹配,就導致無法使用這種優化。而對於prepared statement,數據和statement是分開傳遞給數據庫的,這樣statement就可以和cache中已編譯的statement進行匹配。statement就不必每次都進行編譯操作。從而使用該優化屬性。
這項技術在一些小型的數據庫訪問中能夠減少statement將近90%的執行時間。
法則6:完全關閉所有的statement
在編寫bmp的數據庫訪問代碼時,記住一定要在數據庫訪問調用之後關閉statement,因為每個打開的statement對應於數據庫中的一個打開的遊標。
security
1.加密
對稱加密
(1)分組密碼
(2)流密碼
常用的對稱加密算法:
des和tripledes
blowfish
rc4
aes
非對稱加密
常用的非對稱加密算法
rsa
elgamal
會話密鑰加密(對稱加密和非對稱加密一起使用)
常用的會話密鑰加密協議
s/mime
pgp
ssl和tlsssl是在application level protocal和transport protocal之間的。
比如:http和tcp/ip之間
ssl 提供了服務器端認證和可選的客户端認證,保密性和數據完整性。
提供基於ssl方式的傳輸加密和認證,確保以下三種安全防護:
數據的機密性和準確性、
服務器端認證
客户端認證。
客户端認證比服務器端認證不很普遍的原因是每一個要被認證的客户都必須有一張verisign這樣的ca簽發的證書。
通常,在進行身份認證的時候,應當只接受一個ca,這個ca的名字包含在客户證書中。
由於不可能隨意創建一個由指定ca簽發的證書,所以這可以有效的防禦通過偽造證書來進行的攻擊嘗試。
2.認證(authentication)
認證就是確定一條消息或一個用户的可靠性的過程。
1.消息摘要
md5
sha和sha-1
2.消息認證碼(message authientication codes,mac)
3.數字簽名
用户可以用自己的密鑰對信息加以處理,由於密鑰僅為本人所有,這樣就產生了別人無法生成的文件,也就形成了數字簽名
數字簽名可以
1)保證數據的完整性
2)驗證用户的身份
數字簽名採用一個人的私鑰計算出來,然後用公鑰去檢驗。
hash算法 私鑰加密
原報文 ――――――>;報文摘要( message digest ) ―――――>;數字簽名
原報文和數字簽名一起被髮送到接受者那裏,接受者用同樣的hash算法得到報文摘要,然後用發送者的公鑰解開數字簽名。
比較是否相同,則可以確定報文確定來自發送者。
驗證數字簽名必須使用公鑰,但是,除非你是通過安全的方式直接得到,否則不能保證公鑰的正確性。(數字證書可以解決這個問題)
一個接受者在使用公鑰(public key)檢查數字簽名(digital signature)的可信度時,通常先要檢查收到的公鑰(public key)是否可信的。
因此發送方不是單單地發送公鑰(public key),而是發送一個包含公鑰(public key)的數字證書(cetificate )。
4.數字證書
數字證書是一個經證書授權中心數字簽名的包含公開密鑰所有者信息以及公開密鑰的文件。
數字證書cetificate中包括:
i. 用户的公鑰(public key)
ii. 用户的一些信息,如姓名,email
iii. 發行機構的數字簽名(digital signature), 用於保證證書的可信度
iv. 發行機構的一些信息
數字證書的格式遵循x.509國際標準。
注意:一個數字證書certificate並不適用於多種browser,甚至一種browser的多個版本。
數字標識由公用密鑰、私人密鑰和數字簽名三部分組成。
當在郵件中添加數字簽名時,您就把數字簽名和公用密鑰加入到郵件中。數字簽名和公用密鑰統稱為證書。您可以使用 outlook express 來指定他人向您發送加密郵件時所需使用的證書。這個證書可以不同於您的簽名證書。
收件人可以使用您的數字簽名來驗證您的身份,並可使用公用密鑰給您發送加密郵件,這些郵件必須用您的私人密鑰才能閲讀。
要發送加密郵件,您的通訊簿必須包含收件人的數字標識。這樣,您就可以使用他們的公用密鑰來加密郵件了。當收件人收到加密郵件後,用他們的私人密鑰來對郵件進行解密才能閲讀。
在能夠發送帶有數字簽名的郵件之前,您必須獲得數字標識。如果您正在發送加密郵件,您的通訊簿中必須包含每位收件人的數字標識。
數字證書,可以是個人證書或 web 站點證書,用於將身份與"公開密鑰"關聯。只有證書的所有者才知道允許所有者"解密"或進行"數字簽名"的相應"私人密鑰"。當您將自己的證書發送給其他人時,實際上發給他們的是您的公開密鑰,這樣他們就可以向您發送只能由您使用私人密鑰解密和讀取的加密信息。
通過瀏覽器使用數字證書,必須先要設置瀏覽器軟件 internet explorer 或 netscape使用此證書,才能開始發送加密或需要數字簽名的信息。訪問安全的 web 站點(以"https"打頭的站點)時,該站點將自動向您發送他們的web站點證書。
3.ca(證書授證中心)
ca機構,又稱為證書授證(certificate authority)中心,作為電子商務交易中受信任的第三方,承擔公鑰體系中公鑰的合法性檢驗的責任。ca中心為每個使用公開密鑰的用户發放一個數字證書,數字證書的作用是證明證書中列出的用户合法擁有證書中列出的公開密鑰。ca機構的數字簽名使得攻擊者不能偽造和篡改證書。在set交易中,ca不僅對持卡人、商户發放證書,還要對獲款的銀行、網關發放證書。它負責產生、分配並管理所有參與網上交易的個體所需的數字證書,因此是安全電子交易的核心環節。
對證書的信任基於對根證書的信任. 例如在申請sheca的個人數字證書前,需要先下載根證書,然後再進行各類證書的申請。
下載根證書的目的:
網絡服務器驗證(s);安全電子郵件(e)
申請個人數字證書可以為internet用户提供發送電子郵件的安全和訪問需要安全連接(需要客户證書)的站點。
1)個人數字證書
a.個人身份證書
個人身份證書是用來表明和驗證個人在網絡上的身份的證書,它確保了網上交易和作業的安全性和可靠性。可應用於:網上炒股、網上理財、網上保險、網上繳費、網上購物、網上辦公等等。個人身份證書可以存儲在軟盤或ic卡中。
b.個人安全電子郵件證書
個人安全電子郵件證書可以確保郵件的真實性和保密性。申請後一般是安裝在用户的瀏覽器裏。用户可以利用它來發送簽名或加密的電子郵件。
用户在申請安裝完安全安全電子郵件數字證書後,就可以對要發送的郵件進行數字簽名。收信人收到該郵件後,就可以看到數字簽名的標記,這樣就可以證明郵件肯定來自發信者本人,而不是別人盜用該帳號偽造信件,同時也保證該郵件在傳送過程中沒被他人篡改過任何數據。
安全電子郵件中使用的數字證書可以實現:
保密性通過使用收件人的數字證書對電子郵件加密。如此以來,只有收件人才能閲讀加密的郵件,在internet上傳遞的電子郵件信息不會被人竊取,即使發錯郵件,收件人也無法看到郵件內容。
認證身份在internet上傳遞電子郵件的雙方互相不能見面,所以必須有方法確定對方的身份。利用發件人數字證書在傳送前對電子郵件進行數字簽名即可確定發件人身份,而不是他人冒充的。
完整性利用發件人數字證書在傳送前對電子郵件進行數字簽名不僅可確定發件人身份,而且傳遞的電子郵件信息也不能被人在傳輸過程中修改。
不可否認性由於發件人的數字證書只有發件人唯一擁有,故發件人利用其數字證書在傳送前對電子郵件進行數字簽名,發件人就無法否認發過這個電子郵件。
outlook express中的個人安全電子郵件證書
簽名郵件帶有簽名郵件圖標。
簽名郵件可能出現的任何問題都將在本信息之後可能出現的“安全警告”中得到描述。如果存在問題,您應該認為郵件已被篡改,或並非來自所謂的發件人。
當收到一封加密郵件時,您應該可以自信地認為郵件未被任何第三者讀過。outlook express 會自動對電子郵件解密, 如果在您的計算機上裝有正確的數字標識。
2)企業數字證書
a.企業身份證書
企業身份證書是用來表明和驗證企業用户在網絡上身份的證書,它確保了企業網上交易和作業的安全性和可靠性。可應用於:網上證券、網上辦公、網上交税、網上採購、網上資金轉帳、網上銀行等。企業身份證書可以存儲在軟盤和ic卡中。
b.企業安全電子郵件證書
企業安全電子郵件證書可以確保郵件的真實性和保密性。申請後一般是安裝在用户的瀏覽器裏。企業可以利用它來發送簽名或加密的電子郵件。
可使用 windows xx 中的證書服務來創建證書頒發機構 (ca),它負責接收證書申請、驗證申請中的信息和申請者的身份、頒發證書、吊銷證書以及發佈證書吊銷列表 (crl)。
通常,當用户發出證書申請時,在其計算機上的加密服務提供程序 (csp) 為用户生成公鑰和私鑰對。用户的公鑰隨同必要的識別信息發送至 ca。如果用户的識別信息符合批准申請的 ca 標準,那麼 ca 將生成證書,該證書由客户應用程序檢索並就地存儲。
4.set
安全接口層協議——ssl(se cure socketslayer),並且已經幾乎成為了目前www 世界的事實標準。這一標準使用公共密鑰編碼方案來對傳輸數據進行加密,在雙方之間建立一個internet 上的加密通道,從而使第三方無法獲得其中的信息,其思路與目前流行的vpn方案大致相同,目的都是要保護數據不被未經授權的第三方所竊聽,或即使竊聽到也不知所云。但就象vpn 一樣,ssl 在認證方面沒有任何作為,它們都需要通過另外的手段來確認身份和建立雙方彼此間的信任,然後再通過ssl 進行交易。
正是由於ssl 標準在認證方面的缺憾,所以set 才有存在的必要。set(secure electronic transactions) 規範由masterc ard 和visa 公司於1996 年發佈,專家們認為set 是保證用户與商家在電子商務與在線交易中免受欺騙的重要手段。傳統的信用卡交易者總在擔心不誠實的店員會將自己的信用卡號碼透露給他人,而在線交易也是如此,持卡者總在擔心服務器端的管理員會將信用卡號碼泄露出去,或者擔心黑客會在管理員不知情的情況下盜取信用卡號碼。事實上這些擔心都是必要的,而set 標準則可以保證用户的信用卡號碼只傳送給信用卡公司進行認證,不會被系統管理員看到,也不會留在交易服務器的硬盤上給黑客以可乘之機。
5.pki
pki是一種易於管理的、集中化的網絡安全方案。它可支持多種形式的數字認證: 數據加密、數字簽字、不可否認、身份鑑別、密鑰管理以及交叉認證等。pki可通過一個基於認證的框架處理所有的數據加密和數字簽字工作。p ki標準與協議的開發迄今已有15年的歷史,目前的pki已完全可以向企業網絡提供有效的安全保障。
pki是一種遵循標準的密鑰管理平台,它能夠為所有網絡應用透明地提供採用加密和數字簽名等密碼服務所必需的密鑰和證書管理。pki必須具有
1)ca、
2)證書庫、
3)密鑰備份及恢復系統、
4)證書作廢處理系統、
5)客户端證書處理系統
等基本成分,構建pki也將圍繞着這五大系統來構建
一個pki由眾多部件組成,這些部件共同完成兩個主要功能:
1)為數據加密
2)創建數字認證。
服務器(即後端)產品是這一系統的核心,這些數據庫管理着數字認證、公共密鑰及專用密鑰( 分別用於數據的加密和解密)。
ca數據庫負責發佈、廢除和修改x.509數字認證信息,它裝有用户的公共密鑰、證書有效期以及認證功能(例如對數據的加密或對數字簽字的驗證) 。為了防止對數據簽字的篡改,ca在把每一數字簽字發送給發出請求的客户機之前,需對每一個數字簽字進行認證。一旦數字認證得以創建, 它將會被自動存儲於x.500目錄中,x.500目錄為樹形結構。ldap(lightweight directory access protocol)協議將響應那些要求提交所存儲的公共密鑰認證的請求。ca為每一用户或服務器生成兩對獨立的公共和專用密鑰。其中一對用於信息的加密和解密, 另一對由客户機應用程序使用,用於文檔或信息傳輸中數字簽字的創建。
大多數pki均支持證書分佈,這是一個把已發佈過的或續延生命期的證書加以存儲的過程。這一過程使用了一個公共查詢機制,x.500目錄可自動完成這一存儲過程。影響企業普遍接受p ki的一大障礙是不同ca之間的交叉認證。假設有兩家公司,每一家企業分別使用來自不同供應商的ca,現在它們希望相互託管一段時間。如果其後援數據庫支持交叉認證, 則這兩家企業顯然可以互相托管它們的ca,因而它們所託管的所有用户均可由兩家企業的ca所託管。
* 認證機關
ca是證書的簽發機構,它是pki的核心。眾所周知,構建密碼服務系統的核心內容是如何實現密鑰管理,公鑰體制涉及到一對密鑰,即私鑰和公鑰, 私鑰只由持有者祕密掌握,無須在網上傳送,而公鑰是公開的,需要在網上傳送,故公鑰體制的密鑰管理主要是公鑰的管理問題,目前較好的解決方案是引進證書(certificate)機制。
證書是公開密鑰體制的一種密鑰管理媒介。它是一種權威性的電子文檔,形同網絡計算環境中的一種身份證,用於證明某一主體(如人、服務器等)的身份以及其公開密鑰的合法性。在使用公鑰體制的網絡環境中, 必須向公鑰的使用者證明公鑰的真實合法性。因此,在公鑰體制環境中,必須有一個可信的機構來對任何一個主體的公鑰進行公證,證明主體的身份以及他與公鑰的匹配關係。c a正是這樣的機構,它的職責歸納起來有:
1、驗證並標識證書申請者的身份;
2、確保ca用於簽名證書的非對稱密鑰的質量;
3、確保整個簽證過程的安全性,確保簽名私鑰的安全性;
4、證書材料信息(包括公鑰證書序列號、ca標識等)的管理;
5、確定並檢查證書的有效期限;
6、確保證書主體標識的唯一性,防止重名;
7、發佈並維護作廢證書表;
8、對整個證書籤發過程做日誌記錄;
9、向申請人發通知。
其中最為重要的是ca自己的一對密鑰的管理,它必須確保其高度的機密性,防止他方偽造證書。ca的公鑰在網上公開,整個網絡系統必須保證完整性。
* 證書庫
證書庫是證書的集中存放地,它與網上"白頁”類似,是網上的一種公共信息庫,用户可以從此處獲得其他用户的證書和公鑰。
構造證書庫的最佳方法是採用支持ldap協議的目錄系統,用户或相關的應用通過ldap來訪問證書庫。系統必須確保證書庫的完整性,防止偽造、篡改證書。
* 密鑰備份及恢復系統
* 證書作廢處理系統
* pki應用接口系統
pki的價值在於使用户能夠方便地使用加密、數字簽名等安全服務,因此一個完整的pki必須提供良好的應用接口系統,使得各種各樣的應用能夠以安全、一致、可信的方式與p ki交互,確保所建立起來的網絡環境的可信性,同時降低管理維護成本。最後,pki應用接口系統應該是跨平台的。
許多權威的認證方案供應商(例如verisign、thawte以及gte)目前都在提供外包的pki。外包pki最大的問題是,用户必須把企業託管給某一服務提供商, 即讓出對網絡安全的控制權。如果不願這樣做,則可建造一個專用的pki。專用方案通常需把來自entrust、baltimore technologies以及xcert的多種服務器產品與來自主流應用程序供應商(如microsoft、netscape以及qualcomm)的產品組合在一起。專用pk i還要求企業在準備其基礎設施的過程中投入大量的財力與物力。
7.jaas
擴展jaas實現類實例級授權
“java 認證和授權服務”(java authentication and authorization service,jaas)
在 jaas 下,可以給予用户或服務特定的許可權來執行 java 類中的代碼。在本文中,軟件工程師 carlos fonseca 向您展示如何為企業擴展 jaas 框架。向 jaas 框架添加類實例級授權和特定關係使您能夠構建更動態、更靈活並且伸縮性更好的企業應用程序。
大多數 java 應用程序都需要某種類實例級的訪問控制。例如,基於 web 的、自我服務的拍賣應用程序的規範可能有下列要求:
public static object
doas(subject subject, ilegedaction action)
throws ilegedactionexception
注意,用來保護敏感代碼的方法與“java 2 代碼源訪問控制”(java 2 codesource access control)概述中描述的方法相同。請參閲參考資料部分以瞭解更多關於 jaas 中代碼源訪問控制和認證的信息。
jaas 中的授權
清單 4 顯示一個授權請求的結果,該請求使用清單 3 中顯示的 jaas 策略文件。假設已經安裝了 securitymanager,並且 logincontext 已經認證了一個帶有名為“admin”的 cipalexample 主體的 subject。
清單 4. 一個簡單的授權請求
public class jaasexample {
public static void main(string[] args) {
...
// where authenticateduser is a subject with
// a principalexample named admin.
(authenticateduser, new jaasexampleaction());
...
}
}
public class jaasexampleaction implements privilegedaction {
public object run() {
filewriter fw = new filewriter("");
e("hello, world!");
e();
}
}
這裏,敏感代碼被封裝在 jaasexampleaction 類中。還要注意,調用類不要求為 jaasexampleaction 類代碼源授予許可權,因為它實現了一個 privilegedaction。
擴展 jaas
大多數應用程序都有定製邏輯,它授權用户不僅僅在類上執行操作,而且還在該類的實例上執行操作。這種授權通常建立在用户和實例之間的關係上。這是 jaas 的一個小缺點。然而,幸運的是,這樣設計 jaas 使得 jaas 可以擴展。只要做一點工作,我們將可以擴展 jaas,使其包含一個通用的、類實例級的授權框架。
在文章開頭處我已經説明了,抽象類 cy 被用於代表 jaas 安全性策略。它的缺省實現是由 cyfile 類提供。policyfile 類從 jaas 格式的文件(象清單 3 中顯示的那個一樣)中讀取策略。
我們需要向這個文件添加一個東西為類實例級授權擴展策略定義:一個與許可權語句相關的可選關係參數。
缺省 jaas 許可權語句的格式如下:
permission <permission implementation class>; [name], [actions];
我們在這個許可權語句的末尾添加一個可選的關係參數來完成策略定義。下面是新許可權語句的格式:
permission <permission implementation class>;
[name], [actions], [relationship];
在為類實例級授權擴展 jaas 時要注意的最重要的一點是:許可權實現類必須有一個帶三個參數的構造函數。第一個參數是名稱參數,第二個是行為參數,最後一個是關係參數。
解析新文件格式
既然文件格式已經改變,就需要一個新的 cy 子類來解析文件。
為簡單起見,我們的示例使用了一個新的 cy 子類 olicyfile,來從 xml 文件讀取策略。在實際的企業應用程序中,關係數據庫更適合執行這個任務。
使用 xmlpolicyfile 類代替缺省的 jaas 訪問控制策略實現的最容易的方法是向 rity 屬性文件添加 ider=olicyfile 條目。rity 屬性文件位於 java 2 平台運行時的 lib/security 目錄下。清單 5 是與 xmlpolicyfile 類一起使用的樣本 xml 策略文件:
清單 5. 一個 xml 策略文件
<?xml version="1.0"?>;
<policy>;
<grant codebase="file:/d:/sample_">;
<principal classname=
"cipalexample" name="users">;
<permission classname=
"urcepermission"
name="ion"
actions="create" />;
<permission classname=
"urcepermission"
name="ion"
actions="read" />;
<permission classname=
"urcepermission"
name="ion"
actions="write"
relationship="owner" />;
<permission classname=
"urcepermission"
name=""
actions="create" />;
<permission classname=
"urcepermission"
name=""
actions="read" />;
<permission classname=
"urcepermission"
name=""
actions="write"
relationship="owner" />;
<permission classname=
"urcepermission"
name=""
actions="accept"
relationship="actionowner" />;
</principal>;
</grant>;
</policy>;
在這個示例策略文件中,任何與名為 principalexample 的用户有關的用户(subject)都可以創建並讀取一個 s 實例。但是,只有創建該實例的用户才可以更新(寫)它。這是第三個 permission 元素定義的,該元素包含值為 owner 的 relationship 屬性。s 實例也是一樣,除了相應 s 實例的所有者可以更改投標接受標誌。
resource 接口
要求類實例級訪問控制的類必須實現 resource 接口。該接口的 getowner() 方法返回類實例的所有者。fulfills(subject subject, string relationship) 方法被用於處理特定關係。另外,這些類使用 urcepermission 類保護敏感代碼。例如,auction 類擁有下列構造函數:
public auction() {
permission permission =
new resourcepermission("ion", "create");
kpermission(permission);
}
所有者關係
resourcepermission 類的 implies(permission p) 方法是這個框架的關鍵。implies() 方法就等同性比較名稱和行為屬性。如果定義了一個關係,那麼必須把受保護的類實例(resource)傳遞到 resourcepermission 構造函數中。resourcepermission 類理解所有者關係。它將類實例的所有者與執行代碼的 subject(用户)進行比較。特定關係被委託給受保護類的 fulfills() 方法。
例如,在清單 5 中所示的 xml 策略文件中,只有 auction 類實例的所有者可以更新(寫)文件。該類的 setter 方法使用清單 6 中顯示的保護代碼:
清單 6. 運行中的 implies(permission) 方法
public void setname(string newname) {
permission permission =
new resourcepermission("ion", "write", this);
kpermission(permission);
// sensitive code
= newname;
}
被傳遞到 resourcepermission 構造函數中的 this 引用代表 auction 類實現的 resource 接口。由於策略文件中列出的關係是 owner,所以 resourcepermission 類使用這個引用檢查當前 subject(用户)是否擁有與實例所有者相匹配的主體。如果指定了另一個關係,那麼 resourcepermission 類調用 auction 類的 fulfills(subject subject, string relationship) 方法。由 resource 實現類提供 fulfills() 方法中的邏輯。
xml 策略文件中列出的 bid 類擁有清單 7 中所示的方法(假設 bid 類實例有一個對相應 auction 類實例的引用 — auction)。
清單 7. 處理特定關係
public void setaccepted(boolean flag) {
permission permission =
new resourcepermission("ion", "accept", this);
kpermission(permission);
// sensitive code
pted = flag;
}
public boolean fulfills(subject user, string relationship) {
if( lsignorecase("auctionowner") ) {
string auctionowner = wner();
iterator principaliterator = rincipals()ator();
while(ext()) {
principal principal = (principal) ();
if( ame()ls(auctionowner) )
return true;
}
}
return false;
}
傳遞到 fulfills() 方法中的關係字符串是策略文件中列出的關係。在這個案例中,我們使用了“auctionowner”字符串。
缺省情況下,xmlpolicyfile 類在當前工作目錄中查找名為 的文件。系統屬性 cy 可以用於指定另一個不同的文件名和位置。
websphere application server 示例
除命令行示例之外,您可能還想運行這個簡單的程序,該程序為了 ibm websphere application server,version 4.0.2 而被優化。
一個可運行的示例
綜合這些信息,我們將運行一個簡單的命令行示例。該示例程序包含三個 jar 文件:
文件包含允許實例級訪問控制的 jaas 擴展框架。它還包含一個 loginmoduleexample 類,這個類從 xml 文件讀取用户認證信息。用户標識和密碼存儲在 文件中。用户組存儲在 文件中。關於 loginmoduleexample 的更多信息,請參閲參考資料部分。
該示例包含四個附加的文件:
policy
在試圖運行這個示例程序之前,請確保更新了 、policy 和 文件中的路徑。缺省情況下,所有的密碼都是“passw0rd”。
示例如何工作
該示例程序提示輸入用户標識和密碼。它用 文件中的條目核對所提供的用户標識和密碼。在認證了用户之後,程序設法創建一個 userprofile 類實例,修改它並從中讀取。缺省情況下,userprofile 類的所有者是 jane(jane)。當 jane 登錄時,三個操作全部成功。當 john(john)登錄時,只有創建操作成功。當 jane 的經理 lou(lou)登錄時,只有第一個和最後一個操作成功。當系統管理員(admin)登錄時,操作全部成功。當然,只有當提供的 文件未被修改時,上述這些才都是真的。
示例安裝
下面的安裝指導假設您正在使用 jdk 1.3 並且已經把文件解壓縮到 d:jaasexample 目錄。通過將文件解壓縮到這個目錄,您可以省去一些工作;否則您就必須使用正確的路徑名修改 policy 和 策略文件。
下面是運行該示例需要做的工作:
下載這個示例的源文件。
把 和 複製到 jdk jrelibext 目錄(即 d:jdk1.3jrelibext)。
向位於 jdk 的 jrelibsecurity 目錄(即 d:jdk1.3jrelibsecurity)中的 rity 文件的末尾添加下面的字符串:ider=olicyfile。
執行 文件。
結束語
類實例級授權把訪問控制分離到一個通用框架(該框架使用基於所有權和特定關係的策略)中。然後管理員可以在應用程序的生命週期內更改這些策略。用這種方法擴展 jaas 減少了您或另一個程序員必須在應用程序生命週期內業務規則發生更改時重寫代碼的可能性。
通過將關係字符串抽象為類可以進一步擴展特定關係這個概念。不調用 resource 實現類的 fulfills(subject user, string relationship) 方法,而只要調用 relationship 實現類中定義的新 fulfills(subject user, resource resource) 方法。這樣就會允許許多 resource 實現類使用相同的關係邏輯。
6.java的安全性
1. the security manager是一個application-wide object ( ritymanager)
每個java application都可以有自己地security manager,但是默認地java application沒有一個security manager
可以通過下面地代碼得到一個security manager
try
{
ecuritymanager(new securitymanager(“--”));
}
catch( )
{}
2.
jdbc
在 jdbc 2 開發的過程中,sql99 還處在一種變化不定的情況下。現在規範已經完成了,而且數據庫廠商已經採用了部分標準。所以自然地,jdbc 規範就跟着將自己與 sql99 功能的一部分相統一。最新的 jdbc 規範已經採用了 sql99 標準中那些已經被廣泛支持的功能,還有那些在五年內可能會獲得支持的功能。
1. datasource
在jdbc2.0 optional package中,提供了透明的連接池(connection pooling)。
一旦配置了j2ee應用服務器後,只要用datasource獲取連接(connection),連接池(connection pooling)就會自動的工作。
如果用户希望建立一個數據庫連接,通過查詢在jndi服務中的datasource,可以從datasource中獲取相應的數據庫連接。
datasource被認為是從jndi中獲取的網絡資源。
datasource在池中保存的對象都實現了pooledconnection接口。
當應用程序向datasource請求一個connection時,它會找到一個可用的pooledconnection對象。
如果連接池空了,它就向connectionpoolecdatasource請求一個新的pooledconnection對象
通過使用 datasource 接口 (jdbc 2.0) 或 drivermanager (jdbc 1.0) 接口,j2ee 組件可以獲得物理數據庫連接對象(connection)。要獲得邏輯(合用的)連接,j2ee 組件必須使用以下這些 jdbc 2.0 合用管理器接口:
ectionpooldatasource 接口,該接口充當合用的 ection 對象的資源管理器連接 factory。每家數據庫服務器供應商都提供該接口的實現
(例如,oracle 實現 leconnectionpooldatasource 類)。
edconnection 接口,該接口封裝到數據庫的物理連接。同樣,數據庫供應商提供其實現。
對於那些接口和 xa 連接的每一個,都存在一個 xa(x/open 規範)等價定義。
2. resultset
在jdbc2.0中,為了獲得一個uptatable result,在query語句裏必須包含primarykey,並且查詢的內容裏必須來自一個table
ltset接口中定義了三種類型的結果集
type_forward_only
type_scroll_insensitive這種類型的結果集支持雙向滾動
type_scroll_sensitive
如果要建立一個雙向滾動的resultset,一定要在建立statement的時候使用如下參數
statement stmt = testatement(_scroll_insensitive,
ur_read_only);
3. jdbc驅動程序
連通oracle8.1.6的jdbc
把oracle8.1.6/lib/jdbc/* copy 到 %java_home%/jre/lib/ext/*
如果光copy不ren為是沒有用的。
4. 事務處理
本地事務
ection接口可以控制事務邊界(即開始和結束)。
在事務開始的時候調用setautocommit( false ), 而在中止事務時調用rollback或commit()方法。這類事務叫本地事務。
分佈式事務
但是,在特定的情況下,可能有多個客户(例如兩個不同的servlet或ejb組件)參與了同一個事務。
或者,客户在同一個事務中可能會執行跨越多個數據庫的數據庫操作。
jdbc2.0 optional package 同jta一起來實現分佈式樣事務。
5. 一些技巧
檢索自動產生的關鍵字
為了解決對獲取自動產生的或自動增加的關鍵字的值的需求,jdbc 3.0 api 現在將獲取這種值變得很輕鬆。要確定任何所產生的關鍵字的值,只要簡單地在語句的 execute() 方法中指定一個可選的標記,表示您有興趣獲取產生的值。您感興趣的程度可以是 rn_generated_keys,也可以是 _generated_keys。在執行這條語句後,所產生的關鍵字的值就會通過從 statement 的實例方法 getgeneratedkeys() 來檢索 resultset 而獲得。resultset 包含了每個所產生的關鍵字的列。清單 1 中的示例創建一個新的作者並返回對應的自動產生的關鍵字。
清單 1. 檢索自動產生的關鍵字
statement stmt = testatement();
// obtain the generated key that results from the query.
uteupdate("insert into authors " +
'(first_name, last_name) " +
"values ('george', 'orwell')",
rn_generated_keys);
resultset rs = eneratedkeys();
if ( () ) {
// retrieve the auto generated key(s).
int key = nt();
}
jta/jts
1.jta/jts基本知識
服務器實現jts是否對應用程序開發人員來説不是很重要的。
對你來説,應該把jta看作是可用的api。
jta是用來開發distributed tansaction的 api.
而jts定義了支持jta中實現transaction manager 的規範。
javatransaction service (jts) specifies the implementation of a transaction manager which supports the java transaction api (jta) 1.0 specification at the high-level and implements the java mapping of the omg object transaction service (ots) 1.1 specification at the low-level. jts uses the standard corba orb/ts interfaces and internet inter-orb protocol (iiop) for transaction context propagation between jts transaction managers.
a jts transaction manager provides transaction services to the parties involved in distributed transactions: the application server, the resource manager, the standalone transactional application, and the communication resource manager (crm).
2.jta
1.1 事務處理的概念
jta實際上是由兩部分組成的:一個高級的事務性客户接口和一個低級的 x/open xa接口。
我們關心的是高級客户接口,因為bean可以訪問它,而且是推薦的客户應用程序的事務性接口。
低級的xa接口是由ejb服務器和容器使用來自動協調事務和資源(如數據庫)的
1.1.1事務劃分
a.程序劃分
使用usertransaction啟動jta事務
the usertransaction interface defines the methods that allow an application to explicitly manage transaction boundaries.(from j2ee api document)
第二篇:java學習心得
java學習心得之一——鼠標事件處理
java中,鼠標事件一般由用户界面個組件的內部實現,用户不用關心太多細節。然而,在處理一些鼠標自適應事件如鼠標繪圖、鼠標移動特定組件時,就需要對鼠標事件做專門的處理了。
和其他用户界面組件的實現一樣,java對鼠標事件的處理也是通過awt事件處理機制來實現的,即:事件源(在此,鼠標事件的事件源可以看做隱藏,或為需要對鼠標事件響應的相關組件,如panel對象等)註冊監聽器(mouselistener or mousemotionlistener)對象,併發送事件對象的對象(mouseevent)。當事件發生時(如鼠標點擊、指針移動等),事件源將事件對象傳遞給所註冊的監聽器,監聽器對象利用事件對象中的信息 決定如何對事件做出響應。
在此,將引用一段源碼()來具體説明。這段源碼實現瞭如下功能:
1. 繪製方塊:在鼠標任意鍵被按下時,繪製一個正方形。
2. 改變指針狀態:當鼠標指針移動至圖形內部時,指針變為十字形狀,移出方塊時,指針恢復。
3. 拖動方塊:當鼠標指針移至圖形內部,按下任意鍵,拖動指針時,圖形將隨之移動,直到鬆開按鈕為止。
4. 擦除方塊,當指針移至圖形內部,雙擊鼠標任意鍵,可擦除當前方塊。
具體源碼如下:
import .*;
import t.*;
import .*;
import g.*;
import .*;
public class mousetest
{
public static void main(string[] args)
{
mouseframe frame=new mouseframe();
efaultcloseoperation(_on_close);
isible(true);
}
}
class mouseframe extends jframe
{
public mouseframe()
{
settitle("mouse test");
setsize(default_width,default_height);
mousepanel panel=new mousepanel();
add(panel);
}
public static final int default(請繼續 關注本站)_width=500;
public static final int default_height=400;
}
class mousepanel extends jpanel
{
//繪製圖形
public mousepanel()
{
squares=new arraylist<rectangle2d>();
current=null;
addmouselistener(new mousehandler());
addmousemotionlistener(new mousemotionhandler());
}
public void paintcomponent(graphics g)
{
tcomponent(g);
graphics2d g2=(graphics2d)g;
for(rectangle2d r: squares)
{
olor();
(r);
}
}
/*
* 查詢當前點是否已經存在
*/
public rectangle2d find(point2d p)
{
for(rectangle2d r: squares)
{
if(ains(p))
return r;
}
return null;
}
/*
* 用當前鼠標點擊的點生成圖形,並存入圖形數組列表,同時重畫
*/
public void add(point2d p)
{
double x=();
double y=();
current=new
le(x-side_length/2,y-side_length/2,side_length,side_length);
(current);
repaint();
}
/*
* 刪除圖形
*/
public void remove(rectangle2d s)
{
if(s==null) return;
if(s==current) current=null;
ve(s);
repaint();
}
private static final int side_length=20;//正方形的邊長
private arraylist<rectangle2d> squares;//存放所有已繪製的方塊(鼠標有效繪製路徑)
private rectangle2d current;//當前需要繪製的方塊
private class mousehandler extends mouseadapter
{
/*
* 當鼠標按鈕被按下時,先查找當前點是否已經包含在前期圖新內,* 否,則添加至數組列表
*/
public void mousepressed(mouseevent event)
{
current=find(oint());
if(current==null)
add(oint());
}
/*
* 處理鼠標點擊事件,如果當前點包含於圖形之中,且鼠標連續點擊兩次以上,則擦除該圖形。
*/
public void mouseclicked(mouseevent event)
{
current=find(oint());
if(current!=null && lickcount()>=2)
remove(current);
}
}
private class mousemotionhandler implements mousemotionlistener
{
/*
* 改變鼠標形狀
h);*/public void mousemoved(mouseevent event){if(find(oint())==null)setcursor(efaultcursor());elsesetcursor(redefinedcursor(shair_cursor));}/** 拖動圖形*/public void mousedragged(mouseevent event){if(current!=null){int x=oint().x;int y=oint().y;rame(x-side_length/2,y-side_length/2,side_length,side_lengt
}}}} repaint();
第三篇:關於java學習的一點心得體會
管理科學與工程學院11信管2班孫鑫20144548
關於java學習的一點心得體會
我是學信管專業的,這學期除了學習了java軟件開發綜合實驗這門選修課外,還有自己本專業要學的java面向對象的程序設計。學習了近一學期的java課程,覺得是該總結自己的心得體會了。開始學習任何一門課(包括java),興趣最重要。一直覺得自己在學習了計算機編程語言(也就是c語言),學到了很多東西,再學習java的話,應該問題不大,但在學習了幾個星期後,還是明確感到了,有點吃力,於是趁學校開設這門選修課,並且有自己院的老師講解,還有了上機的機會,比自己自學省事多了,於是鼓足信心,開始了漫長的java征途。
還記得我編寫的第一個程序是簡單的輸出程序。當時自己不是很理解為什麼main方法要這樣來定義public static void main(string[] args),問了好多同學,他們告訴我的答案是一樣的“java本身要求就是這樣子的”,但我自己不甘心,就自己進行了探索:把main改個名字運行一下,看看報什麼錯誤,然後根據出錯信息進行分析;把main的public取掉,在試試看,報什麼錯誤;static去掉還能不能運行;不知道main方法是否一定要傳一個string[]數組的,把string[]改掉,改成int[],或者string試試看;不知道是否必須寫args參數名稱的,也可以把args改成別的名字,看看運行結果如何。 結果一個簡單程序反覆改了七八次,不斷運行,分析運行結果,最後就徹底明白為什麼了main方法是這 1
樣定義的了。接着在以後的學習中我也採用這樣的方法解決問題,卻發現自己的速度比別人慢了好多,我就把自己的課餘時間也分一部分給了java。
因為基礎是最重要的,只有基礎牢固才有可能對後面的學習有更加深刻的認識!
學習一門新的語言,參考書是離不開的。聽專業課老師説訂的教材偏難,不適合我們初學者,於是我在圖書館借了本參考書(一本篇幅較短的入門書來學習那些最簡單、最基本的東西,包括學習java語法等)。同時,對一個最簡單的程序也應該多去調試,多想想如果改動一下會出現什麼結果?為什麼必須那樣寫?多去想想這些問題然後去操作,會讓你有更多的收穫。這樣反覆地思考是很有用的。
在學習java的語法時,java的語法是類似c語言的,所以學習的比較輕鬆。唯一需要注意的是有幾個不容易搞清楚的關鍵字的用法,public,protected,private,static,什麼時候用,為什麼要用,怎麼用,和同學一起討論了好久才得以解決。
在學習java的面向對象的編程語言的特性。比如繼承,抽象類,方法的多態,重載,覆蓋。對於一個沒有面向對象語言背景的人來説,我覺得這個過程需要花很長很長時間,因為學習java之前沒有c++的經驗,只有c語言的經驗,花了很長時間,才徹底把這些概念都搞清楚,把書上面的例子反覆的揣摩,修改,嘗試,把那幾章內容反覆的看過來,看過去,看了很多遍,才徹底領悟了。
此外,我對於static,public,private等等一開始都不是很懂,
都是把書上面的例子運行成功,然後就開始破壞它,不斷的根據自己心裏面的疑問來重新改寫程序,看看能不能運行,運行出來是個什麼樣子,是否可以得到預期的結果。這樣雖然比較費時間,不過一個例子程序這樣反覆破壞幾次之後。我就對這個相關的知識徹底學通了。有時候甚至故意寫一些錯誤的代碼來運行,看看能否得到預期的運行錯誤。這樣對於編程的掌握是及其深刻的。
在學習java的過程中我得出這樣的結論:
1.學習中,要養成良好的習慣(寫括號時要成對,字母大小寫要區分,單詞拼寫要準確)。
2.在學習的過程中,最好不是僅僅停留在java表層,不是抄書上的例子運行出結果就可以。要注意,即便對一個簡單的例子也要有耐心去琢磨、調試、改動。
3.在學習的過程中一定要動手做、試着寫代碼,而不是抱一本書看看就行。很多東西和體會必須自己動手才能真正屬於自己。
4. 在 java 的學習過程中,可能會遇到形形色色的問題不容易解決,應多去專業論壇瞭解相關的知識,書本上的知識有限。要會從網上搜索有用的信息 加以整理,促進學習的深入和知識水平的提高。
看了好多網上課程,説學到一定程度要嘗試着自己做東西,但覺得自己僅僅經過一學期的學習,還遠遠不夠,希望自己在以後學習中繼續努力,能夠真真正正擁有一門編程語言,對自己今後的發展起到作用。
第四篇:java學習心得
java學習心得
一、 如何學好java??
1. 就本人認為學好java關鍵就在於態度。態度是學習好java的前
提,積極的態度註定你就比別人學得認真,自然最終學的一定
比不認真的人學的好!
2. 有良好的前提,不努力也不行的,所以呀!還得練習。要做到
常練習,多看,多思考(舉一反三,多方位的,全面的使你的
程序更加的完美);
3. 最後一點,就是多多交流!閉門造車永遠是落後的學習方式,
所以好要和身邊的一切可以交流技術的人積極交流,畢竟個人
的力量有限的!
二、 java中那些重要知識點!!(本人認為最主要的是思想,
知識點也很重要,關鍵是在學習中總結出自己的一套思想,好的槍手都是子彈喂出來的,好的程序員都是寫代
碼寫出來的)
1. java數據類型
a) 基本數據類型:byte、short、int、long、float、double、char、
boolean(注意各自的取值範圍,還有轉換方式)
b) 引用數據類型: 數組、類、接口。
2. 運算符號
a) 算術運算符:+、 - 、* 、/ 、 %、++、--;
b) 賦值運算符:=、+= 、-= 、*= 、/=、%=;
c) 比較運算符:<、>、=<、=>、!=;(返回值都是false/true) d) 邏輯運算符:&&、||、!
e) 位運算符:用於操作二進制位的運算符:<<、>>、>>>……
4. 基本數據結構:
a) 順序結構
b) 選擇結構(if……else……,switch……case……
default……);
c) 循環結構(for()、do……while、while)(分清break與
continue的用法)
5. 數組(用於存儲同一類型數據的一個容器)
a) 表現形式:
i.
ii. 元素類型[] 變量名 = new 元素類型[元素的個數]; 元素類型[] 變量名 = {元素1,元素2...};(new 元素類
型[]{元素1,元素2...};)
b) 數組排序方法:插入排序,二分法排序,希爾排序,還有
最主要的——冒泡排序
6. 內存(1:寄存器2:本地方法區3:方法區4:棧5:堆)
a) 棧(存儲的都是局部變量)只要數據運算完成所在的區域
結束,該數據就會被釋放。
b) 堆(用於存儲數組和對象,也就是實體——用於封裝多個
數據的)
i.
每一個實體都有內存首地址值。
ii. 堆內存中的變量都有默認初始化值。因為數據類型不
同,值也不一樣。
iii. 垃圾回收機制
7. 面向對象
a) 特點:
i.
ii.
iii. 將複雜的事情簡單化。 面向對象將以前的過程中的執行者,變成了指揮者。 面向對象這種思想是符合現在人們思考習慣的一種思
想。
b) 對事物進行屬性和行為的分析
i.
ii. 屬性:特點 行為:函數(方法)
8. 訪問權限
a) private(私有的訪問權限最低,只有在本類中的訪問有效)
(set方法設置,get方法提取)
b) protected(安全的)受保護權限,體現在繼承,即子類可
以訪問父類受保護成員,同時相同包內的其他類也可以訪問protected成員。
c) 無修飾詞(默認),表示包訪問權限(friendly, java語言
中是沒有friendly這個修飾符的,這樣稱呼應該是來源於
c++ ),同一個包內可以訪問,訪問權限是包級訪問權限
d) public修飾詞,表示成員是公開的,所有其他類都可以訪
問
9. 方法重載與方法重寫
a) 方法重載(一個類中可以有多個具有相同名字的方法,但
這些方法的參數不同(類型、個數、順序不同))
b) 方法重寫(子類定義一個方法,並且這個方法的名字、返
回類型、參數的個數、參數類型與父類繼承的方法完全相同)
10. java面向對象三大特性(繼承,封裝,多態)
a) 封裝(private):主要是set方法與get方法合作應用
b) 繼承(extends):注意訪問權限,看看是否能繼承!
c) 多態:父類引用或者接口的引用指向了自己的子類對象,
eg(動物——1.食草動物2.食肉動物——老虎,獅子,狗);
11. 抽象類與接口
a) 抽象類(abstract)特點:1.不能new2.可以由抽象方法(但
是非抽象類不能有抽象方法)
b) 接口(interface聲明)
i. 接口使用(implements):一個類可以實現一個或多個
接口,用逗號隔開。
ii. 接口強調的是功能:has——a的問題!
12. 多線程(thread類與runable接口)
a) 主要方法:
i.
start()啟動線程
ii.
iii.
iv. run()程序運行的方法,功能實現區域 sleep()休眠,使程序處於休眠狀態 interrupt()吵醒:吵醒處於休眠狀態的程序,使進入正
常狀態;
b) 線程同步(synchronized鎖)關鍵在於this與object的區別,
各自使用的範圍與壞境。
13. 流(input/output)
a) 分類:主要是字節流與字符流,還有緩衝流,數據流,對
象流……
b) 方法都差不多:主要是writer()與read()還有各自對應的數
組應用!
c) 出現亂碼時注意你用的流是否合適以及你使用的編碼格式
以否可以支持
14. 套接字(socket)
a) 主要功能就是通信(安全的)(利用port進行連接)
b) 利用流連接進行通信,數據傳送
15.……還有好多,自己慢慢研究吧!java博大精深!
三、 我們在學習中的那些難題?
1. 總是遇到難以理解的東西?
2. 總是以為自己回了,但是又寫不出來?
3. 總是覺得問題很難,但是經過別人的指點就會覺得好簡
單?
第五篇:java學習的心得體會
國家隊每一次踢球失敗後都要説這麼一句:我們回去後要好好總結,下次會打得更好!
總結不代表就能改過原有的不足,也不代表就能進步了
(一)充分利用msdn因為我個人覺得它勝過任何一本編程參考書
msdn是 microsoft 當前提供的有關編程信息的最全面的資源,它包含微軟最新的技術數據庫,加上易學易用的全文檢索功能,讓您迅速找到任何您需要的技術參考數據
(二)加強自我管理,善於作自我總結,分析自已的優點及缺點
中國境內百分之八十以上的領導人在百分之八十以上的場合的講話中都有類似的觀點,所以在這裏我是不多説了,反正這一條用在什麼行業什麼地方都不會有錯的,人生最大的敵人不是就是自已嗎?管好自已認清自已,那還有什麼搞不定的?
(三)養成良好的文檔習慣
良好的文檔是正規研發流程中非常重要的環節,一個好的程序是先寫好設計文檔再進行編程的,在設計文檔的指導下,才能寫出安全的代碼。如果你不寫文檔,一開始就寫程序,這樣你就不會按已設計好的路線走,而是想到哪寫到哪。小功能還好説,要是大功能,就容易混亂甚至失控.那麼如何寫文檔呢?其實我認為沒有統一的標準,雖然國家及一些nb的人總結了很多的模板,但每個人的習慣不同,如果你不加以修改或創新,就套用某個標準,我相信寫起來會很吃力及説不清的難受,因此我覺得只要能將你的設計思想及實現算法或步驟描述清楚就是好的文檔,我強烈建議廣大程序員朋友們在寫文檔時要善於用圖表來説明你的思想,我們不是作家,也可能作文都經常性地不及格,寫出五官端正的文章對我們來説可能不容易啊!好好地利用visio,rose或別的工具來表達你的思想吧!
(五)代碼風格要規範,嚴謹,效率要高。
(六)掌握好跟蹤調試技巧.
跟蹤調試程序是一件繁瑣而又複雜的事情,所以掌握必要的調試策略及技巧卻可以使這些工作變得輕鬆起來.強烈建議你去看一下老美everett y及mike wooding寫的書<<debugging windows programs>>,你一定受益匪淺.
(七)養成自我測試的習慣
測試工作應由測試工程師來做,但在你寫完一個模塊或一個軟件時,還是要自已先測試一下,保證不要出現一些低級的錯誤.
(八)善於交流善於溝通,特別是經常與一些高手交流一下學習的心得體會
有人説,程序員的性格大多內向不喜歡説話,其實是有些誤會了,不是不喜歡而是話不投機,我的腦袋一天到晚都在不停地轉,函數,數據,算法啊充滿了我的世界,我那還有時間與你談一些無聊的話題,話要找對人了,才容易談下去,書上説過"聽君一席話,勝讀十年書",你要找的就是這種豁然開朗!
(九)階段性地做一下專題總結
知識要温故而知新,因此我程序員要養成階段性地做專題總結的習慣,比如你這個月學習或在做與多線程有關的模塊或項目,那麼在你做完後,你就可以好好地總結一下所有與多線程相關的技術,包括理論知識,實踐方法以及各種技巧及優秀文章等等,這對你各種能力的提高將有
很大的幫助,你試過了嗎,如果沒有,那就快點行動吧!
(十)要有持之以恆的精神
我只是想説明要學好任何一門技術,最好要有持之以恆精益求精的精神,特別是學一些比較抽象比較難的技術,除了思考一下你的學習方法以外,還必須堅定你的目標及信念!
我們向你推薦更多精彩內容:
java學習心得體會
java學習心得
java學習心得
java學習心得 (1)
java學習心得
-
班主任崗位培訓心得多篇
班主任崗位培訓心得篇1我有幸參加了xx市新班主任崗位培訓活動。雖然培訓時間很短只有半天,但也使我學到了很多很多。在學習中使我對新時期的班主任工作有了更進一步的認識,對班主任這個崗位有了更深層次的理解。在這次培訓學習中,xx老師給我們作了報告。聆聽了x老...
-
學習中國式現代化理論心得體會
深刻領悟中國式現代化理論,實幹擔當推動高質量發展——學習中國式現代化理論心得體會一、學習體會:黨的二十大科學擘畫了以中國式現代化全面推進中華民族偉大復興的宏偉藍圖。概括提出並深入闡述中國式現代化理論,是黨的二十大一個重大理論創新,是科學社會主義最新...
-
教師暑期培訓心得(精品多篇)
暑期教師培訓心得體會篇一遠程培訓結束了,回憶培訓前,帶着一些隨意,一點迷茫、一些疑慮參加這次培訓的心情—“這次培訓是否和以往的課程培訓有什麼不一樣?到底學些什麼?”回憶培訓的足跡,這六天是跨躍時空的陽光之旅,給我留下一串串思考與感言,當時學習的情景依然浮現...
-
立德樹人學習心得體會(精品多篇)
學習立德樹人心得體會篇一立德樹人是大學的立身之本,是對人才培養的根本要求。立德就是確立培養崇高的思想品德,樹人即培養高素質的人才。縱觀世界高等教育史,大學的功能隨着時代的發展變化而逐步拓展,但培養具有崇高道德水準和高素質的人才這一基本功能、中心任務...