訪問(wèn)值棧中的action的普通屬性: username = <s:property value="username"/>
由于下午有公司來(lái)面試,耽誤了一些時(shí)間,老徐說(shuō)明天再多補(bǔ)一個(gè)小時(shí),太敬業(yè)了啊,佩服!
在線支付時(shí)針對(duì)易寶支付的網(wǎng)關(guān)而開(kāi)設(shè)的,眾所周知,易寶已是三大網(wǎng)上支付平臺(tái)之一,正好明天易寶來(lái)招聘,正好練練,呵呵,下午是面試技巧
好好學(xué)習(xí),畢業(yè)倒計(jì)時(shí):15天
1.支付寶是不能立即拿到現(xiàn)錢(qián)的,這也是商家喜歡在線支付的一個(gè)原因吧,在線支付是直接和銀行對(duì)接的,這樣商家可以立即拿到現(xiàn)錢(qián),避免了和買(mǎi)家產(chǎn)生矛盾后,錢(qián)被封的風(fēng)險(xiǎn)。
下面就來(lái)實(shí)現(xiàn)在線支付吧,首先提出請(qǐng)求,如果通過(guò),會(huì)得到賬號(hào)和密鑰
我們要做的事有兩項(xiàng)
1.向支付網(wǎng)關(guān)發(fā)起請(qǐng)求,就是向http發(fā)起請(qǐng)求,所謂請(qǐng)求就是我們平常使用Http請(qǐng)求(http://www.xxx.cn/xxx.do),請(qǐng)求方式:Get/Post
<form method=”” action=”https://www.yeepay.com/app-method”>
<input name=”?”,value=””/>
<input name=”url” value=”http://www.itcast.cn/re.do”/>
<input name=”hmac” value=””>
…..
Hmac = MD5(pd_FrpId + p0_Cmd + p8_Url,key);32位,不可逆
支付網(wǎng)關(guān):其實(shí)就是一個(gè)http路徑
2.接收支付網(wǎng)關(guān)返回的支付結(jié)果信息
第一次使用瀏覽器重定向技術(shù),
把支付信息發(fā)送給:http://www.itcast.cn/re.do?id=21432&result=1
2.相關(guān)知識(shí)點(diǎn):
一.接入方式:兩種接入方案
①.直接與銀行對(duì)接
優(yōu)點(diǎn):因?yàn)橹苯优c銀行進(jìn)行財(cái)務(wù)結(jié)算,交易資金結(jié)算比較安全
缺點(diǎn):開(kāi)發(fā)工作量比較大,而且銀行會(huì)不定期升級(jí)交易系統(tǒng),隨著銀行系統(tǒng)的升級(jí),企業(yè)也需要作相應(yīng)改動(dòng),所以維護(hù)工作量也是比較大的,而且企業(yè)每年還需要向銀行交納一定數(shù)量的接口使用費(fèi)。
②.通過(guò)中間公司間接與銀行對(duì)接
優(yōu)點(diǎn):開(kāi)發(fā)工作量較少,因?yàn)槭褂玫氖侵虚g企業(yè)提供的接入規(guī)范,所以銀行升級(jí)系統(tǒng),不需要企業(yè)作相應(yīng)修改,除非中間企業(yè)的接入規(guī)范發(fā)生了改變,企業(yè)才作相應(yīng)修改。
缺點(diǎn):因?yàn)槭桥c中間企業(yè)進(jìn)行資金結(jié)算,目前所有中間企業(yè)都是私企,資金安全是個(gè)大問(wèn)題。
3. 對(duì)支付數(shù)據(jù)進(jìn)行Md5加密
4. 支付流程:
通過(guò)http請(qǐng)求方式向易寶支付網(wǎng)關(guān)發(fā)起一個(gè)支付請(qǐng)求,請(qǐng)求可以是get或post方式提交。
易寶支付網(wǎng)關(guān)對(duì)企業(yè)發(fā)來(lái)的數(shù)據(jù)使用用戶(hù)的密鑰生成MD5-hmac碼,然后跟企業(yè)發(fā)來(lái)的MD5-hmac碼(即上面表單由hmac字段提供的值)比較是否相同,如果相同即把請(qǐng)求轉(zhuǎn)發(fā)到銀行網(wǎng)關(guān),當(dāng)用戶(hù)支付完成后,銀行網(wǎng)關(guān)會(huì)引導(dǎo)用戶(hù)的瀏覽器重定向到易寶支付網(wǎng)關(guān),然后易寶支付網(wǎng)關(guān)再引導(dǎo)用戶(hù)的瀏覽器重定向到企業(yè)提供的url(即上面表單由p8_Url提供的地址)
接下來(lái)我們只需處理結(jié)果了
下午是面試技巧:
薪水:一定要寫(xiě) ,不要寫(xiě)區(qū)間 4000
心得體會(huì):具體點(diǎn)
責(zé)任描述:多寫(xiě),詳細(xì),寫(xiě)開(kāi)發(fā)難點(diǎn),描述清楚,介紹清楚
對(duì)某一模塊詳細(xì)描述,對(duì)難點(diǎn)的解決過(guò)程
描述自己負(fù)責(zé)的模塊,抓住一點(diǎn),詳細(xì)說(shuō),千千不要泛泛而談
不能寫(xiě)培訓(xùn)經(jīng)驗(yàn)
三好學(xué)生,寫(xiě)一等獎(jiǎng)學(xué)金是應(yīng)屆的
愛(ài)好還是要寫(xiě)的
身份證不能造假,教育經(jīng)歷,通常企業(yè)篩選簡(jiǎn)歷過(guò)程:
從1-2千封中選,讓前臺(tái)做/人力去篩選簡(jiǎn)歷,要求:
A.只提取兩年工作年限以上(一般企業(yè)都是這樣干的)
B.連人力都能判斷出造假的簡(jiǎn)歷,排除
C.經(jīng)過(guò)人力,剩下100封
D.面試官
88年可以寫(xiě)兩年,教育經(jīng)歷:把畢業(yè)信息提前,證書(shū)造假
簡(jiǎn)歷上可適當(dāng)造假
薪水:
寫(xiě)2年,月薪(北京,上海,廣州):
初級(jí):3000 – 4000 4500 -- 8-12
中級(jí):4500 – 6000 7K 其中5K-6K比較多 --
高級(jí):7000 – 1.2W (3-5)
從事Android,薪水如下:
Android 2年 最長(zhǎng)就2年
原來(lái)做過(guò)j2se開(kāi)發(fā)3-4年 8K-1.2W
android 3個(gè)月(j2ee 1-2)6K
Android 干半年 4.5K
如果我們老老實(shí)實(shí)干半年,編碼能力就會(huì)沒(méi)問(wèn)題
工作經(jīng)驗(yàn):
1.為什么離職?
我在深圳那邊4K,也不知道北京這邊的行情。
2.當(dāng)公司準(zhǔn)備要你的時(shí)候,會(huì)讓你填以前公司的地址信息,聯(lián)系人信息
造假唄,找個(gè)外地的同學(xué)
3.入職后,離職證明,隨便蓋個(gè)章,離職證明模版網(wǎng)上有一大堆
新公司不想惹麻煩,已經(jīng)和原來(lái)公司解除了勞動(dòng)合同
4.關(guān)于android面試
基礎(chǔ):
多線程(并發(fā)控制),Socket通信,http通信
android:
android的什么項(xiàng)目
項(xiàng)目針對(duì)那些手機(jī)型號(hào)的手機(jī)HTC
如何適應(yīng)各個(gè)分辨率的問(wèn)題,大分辨率靠前
ContentProvider(難度),共享數(shù)據(jù)
聯(lián)系人(如何獲取聯(lián)系人)
Activity的生命周期:運(yùn)行 暫停 停止
前臺(tái)生命周期
完整生命周期
意圖:隱式,顯式
組件:廣播,內(nèi)容提供者,Service 四大組件
MMI:多媒體接口
SQLite:數(shù)據(jù)庫(kù)訪問(wèn)
項(xiàng)目開(kāi)發(fā)
3人 2-3月
公司部門(mén) 人員
研發(fā)部/技術(shù)部 50-60人
測(cè)試部 8-10人
客服部/售后服務(wù)
市場(chǎng)部
行政部
今天學(xué)習(xí)從網(wǎng)上獲得數(shù)據(jù),以xml文件輸出。流程:android客戶(hù)端 -----已經(jīng)開(kāi)發(fā)好的CRM(220.113.15.23) -----[客戶(hù)資料]--à屏幕
用的是struts1.3的環(huán)境
1.搭建環(huán)境
1.web.xml配置struts servlet
2.添加jar
3.復(fù)制struts-config.xml
環(huán)境搞定后,新建jsp文件,寫(xiě)好文件頭:<?xml version="1.0" encoding="UTF-8"?> 注意
接著新建一個(gè)ContactAction
最后配置struts-config.xml文件
新建contact.jsp文件,得到數(shù)據(jù)
訪問(wèn)路徑,測(cè)試得到的數(shù)據(jù),以驗(yàn)證是否正確,若正確的話,第一步完成
下面是Android應(yīng)用
2 .①.設(shè)計(jì)要顯示的界面
②.新建service,可以調(diào)用
關(guān)鍵代碼:
String path = “http://192.168.1.100:8080/crm/contacts.do”;
URL url = new URL(path);
HttpURLConnection conn = (HttpURLConnection)url.openConnection();
conn.setConnectionTimeout(5*1000);
conn.setRequestMethod(“POST”);
return conn.getInputStream();
在該類(lèi)中還應(yīng)該新建sax解析方法,解析文檔,保存數(shù)據(jù)
③.新建android測(cè)試類(lèi),以日志形式打印出xml文件中的數(shù)據(jù)
3.應(yīng)用HttpURLConnection對(duì)象,我們可以向網(wǎng)絡(luò)發(fā)送請(qǐng)求參數(shù).下面以POST發(fā)送為例,寫(xiě)一些關(guān)鍵代碼點(diǎn)
Map<String, String> params =
new
HashMap<String, String>();
params.put("age", "22");
params.put("name", "浪淘沙");
StringBuilder
params = new StringBuilder();
for(Map.Entry<String, String>
entry : params.entrySet()){
params.append(entry.getKey());
params.append("=").append(URLEncoder.encode(entry.getValue(),
"UTF-8"));
params.append("&");
}
if (params.length() > 0)
params.deleteCharAt(params.length() - 1);
byte[] data =
params.toString().getBytes();
4. 為應(yīng)用添加新的Activity
①:新建一個(gè)繼承Activity的類(lèi)
②:需要在功能清單AndroidManifest.xml文件中添加進(jìn)上面Activity配置代碼
打開(kāi)新的Activity,不傳遞參數(shù)
通過(guò)意圖打開(kāi)Activity,Intent,用于激活Activity的,在組件之間傳遞數(shù)據(jù)
在新的Activity中接收前面Activity傳遞過(guò)來(lái)的參數(shù):
添加參數(shù)的另一種方法:Bundle
Bundle類(lèi)用作攜帶數(shù)據(jù),它類(lèi)似于Map,用于存放key-value名值對(duì)形式的值。相對(duì)于Map,它提供了各種常用類(lèi)型的putXxx()/getXxx()方法, putXxx()用于往Bundle對(duì)象放入數(shù)據(jù),getXxx()方法用于從Bundle對(duì)象里獲取數(shù)據(jù)。Bundle的內(nèi)部實(shí)際上是使用了HashMap<String, Object>類(lèi)型的變量來(lái)存放putXxx()方法放入的值:
5. Intent過(guò)濾器
Android鼓勵(lì)減少組件間的耦合,因此Android提供了Intent (意圖) ,Intent提供了一種通用的消息系統(tǒng),它允許在你的應(yīng)用程序與其它的應(yīng)用程序間傳遞Intent來(lái)執(zhí)行動(dòng)作和產(chǎn)生事件。使用Intent可以激活Android應(yīng)用的三個(gè)核心組件:活動(dòng)、 服務(wù)和廣播接收器。
Intent可以劃分成顯式意圖和隱式意圖。
使用SharedPreferences進(jìn)行數(shù)據(jù)存儲(chǔ),是專(zhuān)門(mén)用來(lái)向用戶(hù)提供軟件參數(shù)設(shè)置功能,
1. SharedPreferences類(lèi),它是適合用于保存軟件配置參數(shù)。使用SharedPreferences保存數(shù)據(jù),其背后是用xml文件存放數(shù)據(jù)。
2. SharedPreferences使 用xml文件保存 數(shù)據(jù),getSharedPreferences(name,mode)方法的第一個(gè)參數(shù)用于指定該文件的名稱(chēng),不用帶后綴,后綴由Android自動(dòng)加上,方法的第二個(gè)參數(shù)指 定文件的操作模式,共有四種操作模式。
3.設(shè)置軟件參數(shù)過(guò)程:
①.當(dāng)用戶(hù)點(diǎn)擊保存按鈕時(shí),就激發(fā)保存事件
在Activity中的匿名內(nèi)部類(lèi)中,得到用戶(hù)輸入值
需要注意的是:android.content.SharedPreferences.Editor用于保存參數(shù),該editor最后要commit一下。
最后要Toast.makeText(PreferencesActivity.this, "保存參數(shù)成功", 1).show();用于提示保存參數(shù)成功
②.如果訪問(wèn)其他應(yīng)用中的Preference,前提條件是:該preference創(chuàng)建時(shí)指定了Context.MODE_WORLD_READABLE或者Context.MODE_WORLD_WRITEABLE權(quán)限。如:有個(gè)<package name>為cn.itcast的應(yīng)用使用下面語(yǔ)句創(chuàng)建了preference。
getSharedPreferences("itcast", Context.MODE_WORLD_READABLE);
其他應(yīng)用要訪問(wèn)上面應(yīng)用的preference,首先需要?jiǎng)?chuàng)建上面應(yīng)用的Context,然后通過(guò)Context 訪問(wèn)preference ,訪問(wèn)preference時(shí)會(huì)在應(yīng)用所在包下的shared_prefs目錄找到preference :
Context otherAppsContext = createPackageContext("cn.itcast",
Context.CONTEXT_IGNORE_SECURITY);
4. 使 用SQLite數(shù) 據(jù)庫(kù)存儲(chǔ)數(shù)據(jù)
在Android平臺(tái)上,集成了一個(gè)嵌入式關(guān)系型數(shù)據(jù)庫(kù)—SQLite,SQLite3支持 NULL、INTEGER、REAL(浮點(diǎn)數(shù)字)、TEXT(字符串文本)和BLOB(二進(jìn)制對(duì)象)數(shù)據(jù)類(lèi)型,雖然它支持的類(lèi)型只有五種, SQLite最大的特點(diǎn)是你可以保存任何類(lèi)型的數(shù)據(jù)到任何字段中,無(wú)論這 列聲明的數(shù)據(jù)類(lèi)型是什么。SQLite可以解析大部分標(biāo)準(zhǔn)SQL語(yǔ)句。
5.開(kāi)發(fā)3g數(shù)據(jù)庫(kù) 軟件需求:
①.用戶(hù)初次使用軟件,初始化數(shù)據(jù)庫(kù)
②.用戶(hù)升級(jí)軟件,自動(dòng)更新數(shù)據(jù)庫(kù)
為此,類(lèi)對(duì)應(yīng)提供了兩個(gè)重要的方 法,分別是onCreate(SQLiteDatabase db)和onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion),
6.利用繼承自SQLiteOpenHelper的DatabaseHelper類(lèi)實(shí)現(xiàn)增刪改查,和我們以前的用JDBC實(shí)現(xiàn)的增刪改查語(yǔ)法基本一樣,舉例:
SQLiteDatabase db = ....;
db.execSQL("insert into person(name, age) values(?,?)", new Object[]{"傳智播客", 4});
db.close();
需要注意的是SQLiteDatabase的rawQuery() 用于 執(zhí)行select語(yǔ)句
7.將數(shù)據(jù)動(dòng)態(tài)顯示在手機(jī)屏幕上,用SimpleAparter實(shí)現(xiàn)
今天到此結(jié)束!
1.單元測(cè)試步驟:
第一步:首先在AndroidManifest.xml中加入下面紅色代碼:
①.在<application>中加入:
<uses-library android:name="android.test.runner" />
②.在最后的標(biāo)簽前加上:
<instrumentation android:name="android.test.InstrumentationTestRunner"
android:targetPackage="cn.itcast.action" android:label="Tests for My App" />
注意:上面targetPackage指定的包要和應(yīng)用的package相同。
第二步:編寫(xiě)單元測(cè)試代碼(選擇要測(cè)試的方法,右鍵點(diǎn)擊“Run As”--“Android Junit Test” ):
2.數(shù)據(jù)存儲(chǔ)和訪問(wèn)
軟件需要對(duì)處理后的數(shù)據(jù)存儲(chǔ),Android為數(shù)據(jù)存儲(chǔ)提供了5種方式:
文件,SharedPreferences,SQLite數(shù)據(jù)庫(kù),內(nèi)容提供者(Content provider),網(wǎng)絡(luò)
使用文件對(duì)數(shù)據(jù)進(jìn)行存儲(chǔ),Activity提供了openFileOutput()方法可以用于把數(shù)據(jù)輸出到文件中。openFileOutput()方法的第二參數(shù)用于指定操作模式,有四種模式,分別為:
Context.MODE_PRIVATE
Context.MODE_APPEND
Context.MODE_WORLD_READABLE
Context.MODE_WORLD_WRITEABLE
3.SAX解析XML
SAX是一個(gè)解析速度快并且占用內(nèi)存少的xml解析器,解析采用的是事件驅(qū)動(dòng),這些方法定義在ContentHandler接口中,下面是一些ContentHandler接口常用的方法:
startDocument()
當(dāng)遇到文檔的開(kāi)頭的時(shí)候,調(diào)用這個(gè)方法,可以在其中做一些預(yù)處理的工作。
endDocument()
和上面的方法相對(duì)應(yīng),當(dāng)文檔結(jié)束的時(shí)候,調(diào)用這個(gè)方法,可以在其中做一些善后的工作。
startElement(String
namespaceURI, String localName, String qName, Attributes atts)
當(dāng)讀到一個(gè)開(kāi)始標(biāo)簽的時(shí)候,會(huì)觸發(fā)這個(gè)方法。
endElement(String
uri, String localName, String name)
這個(gè)方法和上面的方法相對(duì)應(yīng),在遇到結(jié)束標(biāo)簽的時(shí)候,調(diào)用這個(gè)方法。
characters(char[]
ch, int start, int length)
這個(gè)方法用來(lái)處理在XML文件中讀到的內(nèi)容,第一個(gè)參數(shù)為文件的字符串內(nèi)容,后面兩個(gè)參數(shù)是讀到的字符串在這個(gè)數(shù)組中的起始位置和長(zhǎng)度,使用new String(ch,start,length)就可以獲取內(nèi)容。
4.使用Pull解析器讀取XML文件
如果需要生成一個(gè)XML文件,生成XML文件的方法有很多,如:可以只使用一個(gè)StringBuilder組拼XML內(nèi)容,然后把內(nèi)容寫(xiě)入到文件中;
或者使用DOM API生成XML文件,或者也可以使用pull解析器生成XML文件,推薦使用Pull解析器。
最后,
巴巴運(yùn)動(dòng)網(wǎng),好好學(xué)習(xí)權(quán)限和優(yōu)化等技術(shù),面試特別有幫助
今天是黎老師的3G應(yīng)用開(kāi)發(fā)Android項(xiàng)目的第一天,Android相當(dāng)火,從事Android開(kāi)發(fā)的人員不太多,接下來(lái)開(kāi)始Android之旅。
1.3G簡(jiǎn)介:
3G,即3rd Generation,目前中國(guó)聯(lián)通使用的是WCDMA,中國(guó)電信使用的是CDMA2000 中國(guó),移動(dòng)使用的是具有自主知識(shí)產(chǎn)權(quán)的TD-SCDMA,3G的最大優(yōu)點(diǎn):速度上的提升
2.wml標(biāo)簽,比Html標(biāo)簽簡(jiǎn)單,1-2天就可以搞定,工作中用到再學(xué),因?yàn)樗?/span>2.5G中用到的技術(shù),如果3G普及的話,這門(mén)技術(shù)就Over了。
3.智能手機(jī)操作平臺(tái)
我們學(xué)Android操作系統(tǒng),RIM BlackBerry,黑莓我比較喜歡,但在國(guó)內(nèi)還不怎么流行, Symbian手機(jī)硬件比較好,所以占用很大市場(chǎng),在3G時(shí)代,手機(jī)基本上可以當(dāng)做電腦,用戶(hù)更看重手機(jī)是否能滿(mǎn)足日常生活和工作的需要。這就好像大多電腦 用戶(hù)都安裝了Windows操作系統(tǒng),很少安裝Linux系統(tǒng)。開(kāi)發(fā)Android的人員的增多,必然會(huì)帶來(lái)手機(jī)軟件的增多,軟件的多少會(huì)決定以后操作系統(tǒng)的市場(chǎng)份額,windows mobile比Android,iPhone的界面差遠(yuǎn)了。我們關(guān)注:Android,iPhone,Symbian智能手機(jī)平臺(tái),因?yàn)槲覀兏?/span>Java開(kāi)發(fā),只能學(xué)Android了
4.Android資料
買(mǎi)Android手機(jī)就買(mǎi)多普達(dá)和Moto的,質(zhì)量好。Android最好的資料是android.pdf。Google Android SDK開(kāi)發(fā)范例大全提供了Android的全部功能,在學(xué)完課程之后可以看
5. 開(kāi)發(fā)環(huán)境的搭建:
JDK 5 或 JDK 6 (僅有JRE不夠)
Eclipse 3.5 (galileo)
①.下載ADT 的Eclipse 插件
http://dl.google.com/android/ADT-0.9.5.zip
②.安裝 Eclipse 插件 (ADT)
啟動(dòng) Eclipse,選擇 Help > Install New Software,在出現(xiàn)的對(duì)話框里,點(diǎn)擊Add按鈕,在對(duì)話框的name一欄輸入“ADT”, 然后點(diǎn)擊Archive...,瀏覽和選擇已經(jīng)下載的ADT插件壓縮文件。
點(diǎn)擊 OK.。返回可用軟件的視圖,你會(huì)看到這個(gè)插件,然后選擇Developer Tools (會(huì)選中下 面的“Android Developer Tools”和 “Android Editors“),點(diǎn)擊 Next,最后重啟 Eclipse。
③.下載Android SDK:
http://dl.google.com/android/android-sdk_r04-windows.zip
下載完SDK后,把.zip文件解壓到你電腦上合適位置。啟動(dòng) Eclipse,選擇window->preferences, 在打開(kāi)的視圖左邊點(diǎn)擊android,在右邊的SDK Location中選擇Android SDK所在位置。
6.開(kāi)發(fā)Android的第一個(gè)應(yīng)用:
1.點(diǎn)擊工具欄上手機(jī)形狀的虛擬設(shè)備管理器(簡(jiǎn)稱(chēng)“AVD“)
2.在打開(kāi)的虛擬設(shè)備管理器中創(chuàng)建一個(gè)虛擬手機(jī)
3.在項(xiàng)目上右鍵點(diǎn)擊run as ?Android application
OK,第一個(gè)應(yīng)用就OK了
7.端口號(hào):127.0.0.1:5554
8.Activity
就像struts中的Action,處理用戶(hù)請(qǐng)求,除此之外,Activity還代表一個(gè)用戶(hù)界面
9. Android應(yīng)用程序架構(gòu)
src/ java原代碼存放目錄
gen/ 自動(dòng)生成目錄
gen 目錄中存放所有由Android開(kāi)發(fā)工具自動(dòng)生成的文件。目錄中最重要的就是R.java文件。 這個(gè)文件 由Android開(kāi) 發(fā)工具自動(dòng)產(chǎn)生的。Android開(kāi)發(fā)工具會(huì)自動(dòng)根據(jù)你放入res目錄的xml界面文件、圖標(biāo)與常量,同步更新修改R.java文件。
res/ 資源(Resource)目錄
在這個(gè)目錄中我們可以存放應(yīng)用使用到的各種資源,如xml界面文件,圖片或數(shù)據(jù)。具體請(qǐng)看ppt下方備注欄。
AndroidManifest.xml 功能清單文件
這個(gè)文件列出了應(yīng)用程序所提供的功 能,相當(dāng)于struts的config文件,只有配置好后,才能調(diào)用此Activity。
default.properties 項(xiàng)目環(huán)境信息,一般是不需要修改此文件中
10.短信發(fā)送器
注意:因?yàn)閼?yīng)用要使用手機(jī)的短信服務(wù),所以要在清單文件AndroidManifest.xml中添 加短信服務(wù)權(quán)限:
11.通知
關(guān)于這些東西,還是看看文檔,拷過(guò)來(lái)運(yùn)行一下,測(cè)試測(cè)試看看效果就差不多了。
一.使用poi
1.參見(jiàn)poi的文檔,添加jar包
2.workbook表示一個(gè)Excel文檔
3.下載Excel模版,必須按格式
1.創(chuàng)建workbook對(duì)象
2.創(chuàng)建下載Excel文件的第一行
3.從數(shù)據(jù)庫(kù)中讀取到需要的Employee列表
5.利用Servlet Api 對(duì)準(zhǔn)備好的Excel下載
4.上傳excel
①.配置Action
②.導(dǎo)入兩個(gè)jar包commons-io,commons-fileupload.jar
③.上傳
1.根據(jù)ActionForm的FormFile屬性讀取上傳數(shù)據(jù),獲得Workbook對(duì)象
2.讀取Workbook對(duì)象中的內(nèi)容:遍歷Workbook對(duì)象除標(biāo)題行以外的行
3.把每一行都轉(zhuǎn)換為一個(gè)Employee對(duì)象
4.調(diào)用方法,把Employee對(duì)象的集合保存到數(shù)據(jù)庫(kù)中,注意:有可能不能保存,其原因可能違反格式或者違反數(shù)據(jù)庫(kù)的唯一性約束
二.PDF文檔輸出
1.iText介紹:iText是著名的開(kāi)放源碼的站點(diǎn)sourceforge一個(gè)項(xiàng)目, 是用于生成 PDF 文檔的一個(gè)java類(lèi)庫(kù).
2.Pdf 文件輸出的 5 個(gè)步驟
1. 創(chuàng)建一個(gè) Document 對(duì)象.
public Document()
public Document(Rectangle pageSize): 定義頁(yè)面的大小
public Document(Rectangle pageSize, int marginLeft, int marginRight, int marginTop, int marginBottom): 定義頁(yè)面的大小, 后邊的四個(gè)參數(shù)分別指定左, 右, 上, 下頁(yè)邊距
2.建立一個(gè)書(shū)寫(xiě)器 (Writer) 與document對(duì)象關(guān)聯(lián), 通過(guò)書(shū)寫(xiě)器(Writer)可以將文檔寫(xiě)入到磁盤(pán)中
3. 打開(kāi)文檔
4. 在文檔中添加文字
5. 關(guān)閉文檔
其中:
①。設(shè)定文檔屬性
當(dāng)新的頁(yè)面產(chǎn)生之前, 可以設(shè)定頁(yè)面的大小、書(shū)簽、腳注(HeaderFooter)等信息,調(diào)用的方法是:
②。添加文檔內(nèi)容
所有向文檔添加的內(nèi)容都是以對(duì)象為單位的, 如Phrase、Paragraph、Table等. 比較常用的是段落(Paragraph)對(duì)象, 用于向文檔中添加一段文字
③。文本處理
iText中用文本塊(Chunk)、短語(yǔ)(Phrase)和段落(paragraph)處理文本。
文本塊(Chunk)是處理文本的最小單位, 由一串帶格式(包括字體、顏色、大小)的字符串組成:
注意:在 iText 中沒(méi)有行的概念, 一個(gè)表格里直接放單元格, 如果一個(gè) 3 列的表格中放進(jìn) 6 個(gè)單元格, 那就是兩行的表格. 如果放入 5 個(gè)基本的沒(méi)有任何跨列設(shè)置的單元格, 表格就會(huì)出錯(cuò). 此時(shí)表格不會(huì)添加到文檔中, 并且沒(méi)有任何提示
三.面試
老佟給我們找了一個(gè)簡(jiǎn)歷,介紹了一些面試的注意點(diǎn),要點(diǎn):
1.符合自身?xiàng)l件,各種技術(shù)。
2.最好寫(xiě)點(diǎn)權(quán)限設(shè)計(jì),Compass+Lucene實(shí)現(xiàn)全文搜索,流程采用JBPM管理。
3.項(xiàng)目三個(gè):小湯的OA和老佟的權(quán)限整合為一個(gè)項(xiàng)目,網(wǎng)上商城(巴巴運(yùn)功網(wǎng)),3g,數(shù)據(jù)采集
OA用到的技術(shù):SSH
jQuery +
jbpm 完成審批流程
spring-security
lucence :全文檢索
今天主要實(shí)現(xiàn)的是員工信息的修改和權(quán)限管理基礎(chǔ),修改用AJAX實(shí)現(xiàn)的,權(quán)限看了不少的源代碼,感覺(jué)蠻難的,不過(guò)今天只是初步介紹,還有時(shí)間再學(xué)習(xí)一下!
1.員工信息的修改
1.struts對(duì)表單信息的回顯
2.對(duì)可以進(jìn)行修改的字段
1.當(dāng)該字段值發(fā)生改變時(shí),confirm”確定修改該信息嗎?”
點(diǎn)擊”取消”:使該字段恢復(fù)為以前的默認(rèn)值,不做改變,需要使用隱藏域
點(diǎn)擊“確定”:用AJAX改變字段,在配置文件中不需返回任何信息
<script type=”text/javascript”>
$(function(){
$(“:text,select”).change(function(){
var flag = confirm(“確定要修改” + $(this).prev(“label”).text()+”信息嗎?”);
...});
}):
</script>
信息
2.集成spring-security 框架
1. Spring Security 能用 于保護(hù)各種 Java 應(yīng) 用程序(權(quán)限管理框架).
2.spring-security入門(mén)
需 求:1. Spring-security 應(yīng)用的根目錄下有兩個(gè) Jsp 頁(yè)面: index.jsp 和 admin.jsp. admin 用戶(hù)有權(quán)限訪問(wèn)這兩個(gè)頁(yè)面, 而 user 用戶(hù)只能訪問(wèn) index.jsp
2.提供”登出”功能
搭建環(huán)境:
首先添加spring環(huán)境
1.加入spring-security 的jar 包:
spring-security-2.0.5"dist"spring-security-core-2.0.5.RELEASE.jar
2.在web.xml 文件中加入加入spring-security 框架的過(guò)濾器
3.新建applicationContext-security.xml 配置文件,并且把security 作為默認(rèn)的命名
空間, 并將其導(dǎo)入到applicationContext.xml 中
applicationContext-security.xml中,有幾種重要配置:
1. 配置 spring-security 的 http 安全屬性
<http auto-config="true">
2. 配置需要保護(hù)那些 資源, 以及訪問(wèn)這些資源 所需要的權(quán)限, 若有多個(gè) 權(quán)限使用 ',' 分隔
<intercept-url pattern="/admin.jsp" access="ROLE_ADMIN"/>
<intercept-url pattern="/index-1.jsp" access="ROLE_USER"/>
3.配置登出服務(wù)
<logout logout-url="/logout"
logout-success-url="/loguot-success.jsp"
invalidate-session="false" />
4.配置登錄頁(yè)面,
default-target-url: 若直接請(qǐng)求登錄頁(yè)面, 那么該屬性配置登錄成功之后的相應(yīng)頁(yè)面
always-use-default-target: 若請(qǐng)求的目標(biāo)頁(yè)面受保護(hù), 則 spring-security 會(huì)相應(yīng) login-page 屬性對(duì)應(yīng)的頁(yè)面, 默認(rèn)情況下, 若登錄成功將相應(yīng)剛才請(qǐng)求的目標(biāo)頁(yè)面,
但這相當(dāng)麻煩,每次都要配置不少信息。下面 有更好的實(shí)現(xiàn),即
把需要攔截的url,權(quán)限,用戶(hù)信息放到放數(shù)據(jù)庫(kù)中,實(shí)現(xiàn)如下:
1.實(shí)體類(lèi):
Authority -- 權(quán)限
Resource -- 資源
Role -- 角色
Employee -- 添加Set<Role> roleSet 屬性
2.關(guān)系
Resource 和Authority 為多對(duì)多的對(duì)應(yīng)關(guān)系
Authority 和Role 為多對(duì)多的對(duì)應(yīng)關(guān)系
Role 和Employee 為多對(duì)多的對(duì)應(yīng)關(guān)系
所以還需要3 個(gè)額外的關(guān)聯(lián)表
3.實(shí)現(xiàn)把用戶(hù)信息,權(quán)限信息存放到數(shù)據(jù)庫(kù)中
1. 實(shí)現(xiàn)把用戶(hù)信息, 權(quán)限信息存放到數(shù)據(jù)庫(kù)中
1). 自定義 UserDetailsService 接口的實(shí)現(xiàn)類(lèi), 將該類(lèi)配置到 Spring 的 IOC 容器中, 并在
<authentication-provider user-service-ref=""> 節(jié)點(diǎn)的 user-service-ref 屬性中引用該 Bean.
2). 通過(guò) debug 查看 UserDetailsService 接口的實(shí)現(xiàn)類(lèi)返回的 UserDetails 對(duì)象
4. 實(shí)現(xiàn)資源信息存放到數(shù)據(jù)庫(kù)中: 訪問(wèn)資源時(shí), spring-security 能區(qū)分出訪問(wèn)該資源需要哪些權(quán)限
1). 自定義 ObjectDefinitionSource 接口的實(shí)現(xiàn)類(lèi), 將該類(lèi)的實(shí)例裝配給 FilterSecurityInterceptor 的 objectDefinitionSource 的 屬性.即可實(shí)現(xiàn)自定義的資 源獲取.
2). 通過(guò)繼承 DefaultFilterInvocationDefinitionSource 類(lèi)的方法定義 ObjectDefinitionSource 接口的實(shí)現(xiàn)類(lèi)有困難, 因?yàn)?/span> DefaultFilterInvocationDefinitionSource
中沒(méi)有無(wú)參的構(gòu) 造器, 該構(gòu)造器有兩個(gè)參 數(shù): UrlMatcher urlMatcher, LinkedHashMap requestMap.
urlMatcher 參數(shù)可 以通過(guò) bean 的形式 事先配置, 但 requestMap 參數(shù)類(lèi)似于: {[/admin.jsp]=[ROLE_ADMIN], [/index.jsp]=[ROLE_USER]}, 需要訪問(wèn)數(shù)據(jù)庫(kù)才能對(duì)其初始化, 但這不可能.
3). 通過(guò)查看 spring-security 核心 jar 包的 META-IN 下的 spring.handlers 找到 SecurityNamespaceHandler, 在該類(lèi)中查看 registerBeanDefinitionParser(Elements.HTTP, new HttpSecurityBeanDefinitionParser()); 方法
在 HttpSecurityBeanDefinitionParser 類(lèi) 中可以看到如何創(chuàng)建 DefaultFilterInvocationDefinitionSource 實(shí)例.
4). 通過(guò) FactoryBean 在 IOC 容器中注冊(cè) DefaultFilterInvocationDefinitionSource 實(shí)例
今天主要實(shí)現(xiàn)的是員工信息的翻頁(yè)設(shè)計(jì),用AJAX實(shí)現(xiàn)的,接著實(shí)現(xiàn)了員工信息的刪除實(shí)現(xiàn),總結(jié) 一天的知識(shí),感覺(jué)jQuery確實(shí)是十分有用的一門(mén)技術(shù)。
1.帶復(fù)雜條件的分頁(yè):(非AJAX分頁(yè))
直接把deptid屬性過(guò)濾加上會(huì)導(dǎo)致出現(xiàn):org.hibernate.QueryException:
這時(shí)因?yàn)樵?/span> Employee 實(shí)體類(lèi)中根本就沒(méi)有 deptid 屬性(并非指在 Employee 類(lèi)中有該屬性,而是要在映射文件中映射該屬性).
解決方法:
在 EmployeeDao 中重寫(xiě) Page<T> findPage(final Page<T> page, final List<PropertyFilter> filters) 方法, 以解決表單頁(yè) 面的 deptid和實(shí)體類(lèi)的
dept屬性的對(duì)應(yīng)問(wèn)題
注 意:1.增強(qiáng) for 循環(huán)時(shí), 不能 remove 其元素
2.在 循環(huán)時(shí)刪除集合的元素, 會(huì)改變集合的 size 屬性
2.AJAX分頁(yè)設(shè)計(jì)
1.需要在EmployeeAction的對(duì)應(yīng)方法中,返回JSON數(shù)據(jù),在頁(yè)面上進(jìn)行解析即可
2.實(shí)現(xiàn)過(guò)程:
1.點(diǎn)擊上一頁(yè)連接時(shí),需要使用AJAX分頁(yè):因?yàn)?/span>ajax分頁(yè)時(shí),頁(yè)面沒(méi)有刷新,
下一頁(yè)連接添加AJAX支持
<script type=”text/javascript”>
$(function(){
$(“#nextpage”).click(function(){
Var url=”${cp}/employee-list-2.do?pageNo=” + (parseInt($(“#pageNo”).val()) + 1);
var args = $(“:hidden:not(#pageNo)”).serialize();
$.getJSON(url,args,function(data){
$(“.pagebanner”).html(“共”+data.totalCount+”條記錄 ”);
$(“#pageNo”).val(data.pageNo);
});
return false;
});
});
</script>
服務(wù)器端實(shí)現(xiàn)(employeeList2)
1.獲取請(qǐng)求參數(shù)
String pageNoStr = request.getParameter(“pageNo”);
2.從頁(yè)面獲取PropertyFilter集合
3.調(diào)用service的findPage方法,得到分頁(yè)數(shù)據(jù)Page對(duì)象
4.將page對(duì)象轉(zhuǎn)化為對(duì)應(yīng)的JSON數(shù)據(jù)格式。那么需要轉(zhuǎn)化為什么樣的JSON數(shù)據(jù)
{totalCount:,totalPages:,pageNo:,employees:[{employeid,:loginName:,gender:,...}] }
5.返回JSON數(shù)據(jù)
response.setContentType(“text/javascript”);
response.getWritter().print(jsonResult);
3.員工信息 刪除功能
1.AjAX刪除功能的實(shí)現(xiàn):
1.若當(dāng)前頁(yè)已經(jīng)是最后一頁(yè),且當(dāng)前記錄是當(dāng)前頁(yè)的最后一條記錄,則不能再請(qǐng)求當(dāng)前頁(yè)的信息, totalPages不能代表服務(wù)器端的總頁(yè)數(shù)
2.Ajax 刪除要實(shí)現(xiàn)的功能:
1. 彈出confirm(): 確 定要?jiǎng)h除嗎?
2. 若點(diǎn)擊"否", 則文本框或下拉框的值恢復(fù)為剛才的默認(rèn) 值: 使用隱藏域.
3. 若點(diǎn)擊"是", 進(jìn)行ajax 刪除
4. 若 員工信息有外鍵關(guān)聯(lián)時(shí),注 意:通過(guò) ajaxError 函數(shù)進(jìn)行提示,彈出“不能刪除該記錄”
關(guān)鍵代碼:
4.查看員工的詳細(xì)信息
這樣的功能實(shí)現(xiàn)在現(xiàn)在來(lái)說(shuō),已不難實(shí)現(xiàn),我實(shí)現(xiàn)了一下,不難!還用了下插件!顯示Employee 的頭像!
員工的錄入和查詢(xún)(帶 條件查詢(xún))
今天做的是員工信息錄入和服務(wù)器端的驗(yàn)證,目標(biāo)是使用jQuery更熟悉,掌握分頁(yè)設(shè)計(jì),更好理解Hibernate的一些以前未用過(guò)的類(lèi)中的一些方法。
一. 員工的錄入,并進(jìn)行驗(yàn)證
1.顯示員工的錄入頁(yè)面
1.用jQuery 的validator 為表單做前臺(tái)驗(yàn)證
2.對(duì)登錄名的Ajax 校驗(yàn)
3.使用jQuery 的blockUI 插件提示Ajax 操作
4.錄入員工信息
2.服務(wù)器端的簡(jiǎn)單驗(yàn)證
1.使用struts的validator框架
2.以email為例,email非空,且符合email格式
3.員工錄入服務(wù)器端的復(fù)雜驗(yàn)證
1.數(shù)據(jù)庫(kù),EmployeeAction中,得到登錄名
2.對(duì)登錄名的可用性進(jìn)行驗(yàn)證,驗(yàn)證登錄名在數(shù)據(jù)庫(kù)中是否存在
3.這時(shí)可以采用struts的聲明式異常
4.使用py4j 解決把漢字轉(zhuǎn)為對(duì)應(yīng)的拼音: 佟剛--> tg, 張孝祥--> zxx, 黎活明--> lhm
二.員工的查詢(xún)
1.顯示員工信息:AJAX分頁(yè)
使用displaytag 分頁(yè)顯示員工信息,記 錄不超過(guò)百萬(wàn)條。簡(jiǎn)單,使用。比如OA。
1.在tomcat的webapps目錄下展示其實(shí)例。
2. OpenSessionInView:
1使用OpenSessionInView
若Hibernate中某一個(gè)類(lèi)的引用屬性(也 包括集合屬性)采取懶加載策略,則可能出現(xiàn)懶加載異常,但沒(méi)有對(duì)其懶加載屬性進(jìn)行初始化,此時(shí)關(guān)閉Session,然后再來(lái)獲取屬性,就會(huì)異常
聲明使用spring的聲明式事務(wù):
<aop:config>
<aop:pointcut expression="execution(* cn.itcast.ems.service.*.*(..))" id="emsTxPointcut"/>
<aop:advisor advice-ref="emsTxAdvice" pointcut-ref="emsTxPointcut"/>
</aop:config>
OpenSessionInView可以解決這個(gè)問(wèn)題,因?yàn)?/span>OpenSessionInView的使用流程是:
request à open session 并開(kāi)始transaction –>controller à view(jsp)à
2.如何使用:
在web.xml配置:
3.缺點(diǎn):
如果流程中的某一步被阻塞, 而這期間的 connection 卻一直被占用不被釋放. 例如輸出頁(yè)面時(shí), 一方面可能是頁(yè)面內(nèi)容大, response.write的時(shí)間長(zhǎng); 另一方面可能是網(wǎng)速慢, 服務(wù)器與用戶(hù)間傳輸時(shí)間久. 當(dāng)大量這樣的情況出現(xiàn)時(shí),就有連接池連接不足, 造成頁(yè)面假死現(xiàn) 象. 所以在內(nèi)容多流量大的網(wǎng)站需慎用.
3.翻頁(yè)相關(guān)的類(lèi):
1.Page: 與具體 ORM 實(shí)現(xiàn)無(wú)關(guān)的分頁(yè)參數(shù)及查詢(xún)結(jié)果封裝
2. PropertyFilter: 與具體 ORM 實(shí)現(xiàn)無(wú)關(guān)的屬性過(guò)濾條件封裝類(lèi), 主要記錄頁(yè)面中簡(jiǎn)單的搜索過(guò)濾條件
3. HibernateDao: 擴(kuò)展 SimpleHibernateDao, 功能包括分頁(yè)查詢(xún), 按屬性過(guò)濾條件列表:
1.不帶任何查詢(xún)條件時(shí), 需要使用的方法:
--countCriteriaResult
--setPageParameter
--findPage(Page<T> page, Criterion...criterions)
HibernateWebUtils
分頁(yè):
不帶查詢(xún)的分頁(yè)
employee-list-1.do --> Action --> Service --> DAO
2.查詢(xún)條件的翻頁(yè):使用jQuery 的一個(gè)thickbox 插件完成查詢(xún)頁(yè)面的彈出
1.jQuery的分頁(yè)插件
2.在獲取第一頁(yè)的內(nèi)容以后,如何 把查詢(xún)條件帶到第二頁(yè)
--把封裝了查詢(xún)條件的List放到session域中,下一次從session中取。
--把查詢(xún)條件放在隱藏域中
3.攜帶查詢(xún)條件
使用jQuery提供的serialize()方法攜帶查詢(xún)條件(行不通)
var url = this.href + “&” + $(“:hidden”).serialize();
window.location.href=url;
注意:上述方法在第一次不能起作用: 即不能再第一次把隱藏域中的參數(shù)帶過(guò)去, 因?yàn)樵诘谝淮吸c(diǎn)擊該鏈接時(shí), href 的屬性值已經(jīng)固定了, 不能再發(fā)生變化,
而第二次點(diǎn)擊時(shí), 因?yàn)榈谝淮我呀?jīng)改變了該屬性的值, 所以好用
所以必須在第一次點(diǎn)擊該鏈接之前讓 this.href = this.href + "&" + $(":hidden").serialize(); 起作用
解決方案:
$("#criteria").attr("href", $("#criteria").attr("href") + "&" + $(":hidden").serialize());
今天就到這兒,明天continue!
今天接著昨天的整合,由佟老師總指揮,基于xml配置的Action,這涉及struts整合.今天先把登陸實(shí)現(xiàn)了,最后使用兩個(gè)插件把員工信息錄入功能
實(shí)現(xiàn),頁(yè)面效果在當(dāng)今還是主流的。
2.服務(wù)器端驗(yàn)證
1.查詢(xún)數(shù)據(jù)庫(kù),得到信息
2.若用戶(hù)名不存在,則提示用戶(hù)名不存在
errors.add("",new ActionMessage(" "));
若用戶(hù)名和密碼不匹配,則提示用戶(hù)名和密碼不匹配
若errors.isEmpty()為true,則登陸,并將其保存在session中,
方法:
使用 struts 的聲明式異常來(lái)轉(zhuǎn)發(fā)頁(yè)面和顯示提示信息.
詳細(xì)解決:
由 EmployeeService 的方法拋出異常, Action 不進(jìn)行處理, 而由 struts 框架根據(jù)當(dāng)前的
action 節(jié)點(diǎn)配置來(lái)進(jìn)行相應(yīng)的處理:
如果出現(xiàn)對(duì)應(yīng)的異常, 會(huì)利用當(dāng)前 excpeption 配置節(jié)點(diǎn)的 key 生成對(duì)應(yīng)的 ActionMessage
對(duì)象, 再放入 ActionMessages 中,
把頁(yè)面派發(fā)到 input 對(duì)應(yīng)的頁(yè)面中, 在前臺(tái)頁(yè)面利用 <html:errors
property="key"> 進(jìn)行顯示
4.ReflectUtils類(lèi)的作用:
1.convertValue:beanUtils1.8提供了DateConverter
2. PropertyUtils: 提供了讀寫(xiě) Bean 的屬性的方法
3. fetchElementPropertyToString: StringUtils.join 方法可以把指定集合的元素用分隔符鏈接起來(lái)
4. getSuperClassGenricType: ParameterizedType
5.SimpleHibernateDao 類(lèi)介紹:SimpleHibernateDao<T,PK extends
Serializable> 說(shuō)明:該類(lèi)在service層中使用,
T:Dao操作的對(duì)象類(lèi)型
PK:主鍵類(lèi)型
1.getIdName():
2.distinct(List list):通過(guò) Set 將不唯一的對(duì)象列表唯一化,主 要用于 HQL/Criteria
預(yù)加載關(guān)聯(lián)集合形成重復(fù)記 錄, 又不方便使用 distinct 查詢(xún)語(yǔ)句時(shí)
6.CreateCriteria:
createQuery(String queryString, Object... values)
7. ReflectionUtils
1 convertValue: beanUtils 1.8 提供了 DateConverter
2. PropertyUtils: 提供了讀寫(xiě) Bean 的屬性的方法
3. fetchElementPropertyToString: StringUtils.join
方法可以把指定集合的元素用分隔符鏈接起來(lái)
4. getSuperClassGenricType: ParameterizedType
8. SimpleHibernateDao:
1. getIdName: ClassMetadata 該類(lèi)可以獲取到對(duì)應(yīng)的 class 的 hbm 配置文件的幾乎所有信息
2. 標(biāo)準(zhǔn)查詢(xún):
-->創(chuàng)建 Criteria 對(duì)象: session.createCriteria(clazz);
-->為 Criteria 對(duì)象添加查詢(xún)條件: criteria.add(criterion);
-->獲取 Criterion 對(duì)象: 通過(guò) Restrictions 來(lái)獲取
9.struts的導(dǎo)航組件:struts-menu的使用方法:
1. 把 struts-menu.war 文件復(fù)制到服務(wù)器下, 運(yùn)行
2. 在 struts-config.xml 文件中加入 struts-menu 插件
3. 復(fù)制 struts-menu\WEB-INF\menu-config.xml 到 conf 目錄下.
4. 復(fù)制 struts-menu-2.4.3\struts-menu-2.4.3.jar 到 classpath 下
5. struts-menu 的去除默認(rèn)背景色問(wèn)題:
①. 通過(guò) jQuery: 把 left.jsp 頁(yè)面的第三個(gè) table 的
style="background-color:lightgrey" 屬性清除
②. 通過(guò)修改默認(rèn)的配置文件: 修改 struts-menu=2.4.3.jar
net.sf.navigator.displayer 包的的 DisplayerStrings.properties 文件,
把 dd.menu.top=<table width\="150"
style\="background-color\:lightgrey" cellpadding\=1
cellspacing\=1><tr align\=left><td nowrap
class\=normal><b>
的 style\="background-color\:lightgrey" 去除
10.員工錄入前臺(tái)驗(yàn)證,用的是jQuery的插件jquery-validate
5.對(duì)輸入的登陸名進(jìn)行ajax驗(yàn)證:驗(yàn)證該登錄名在數(shù)據(jù)庫(kù)中是否存在。
11.在loginname字段已經(jīng)給出對(duì)應(yīng)的“該登錄名已經(jīng)被占用”的基礎(chǔ)上,再一次點(diǎn)擊“提交”按鈕,則需要進(jìn)行服務(wù)器端驗(yàn)證,再返回錄入頁(yè)面
12.若驗(yàn)證都通過(guò),則需要進(jìn)行服務(wù)器端的驗(yàn)證。
13.員工的錄入操作:
1). 顯示員工的錄入頁(yè)面
①. 查詢(xún)數(shù)據(jù)庫(kù), 獲取所有的部門(mén)信息和職位信息, 并在頁(yè)面上加以顯示
②. 頁(yè)面使用 jQuery 的 validator 插件作為表單的前臺(tái)驗(yàn)證
1. 在當(dāng)前 jsp 頁(yè)面中導(dǎo)入 jquery.validate.js
2. 為需要驗(yàn)證的字段添加 class 屬性, 在其中指定驗(yàn)證規(guī)則, 獲取添加 minlength 等屬性
今天就到此了!
SVN版本控制
今天有毛偉老 師講版本控制,版本控制(Revision control)是維護(hù)工程藍(lán)圖的標(biāo)準(zhǔn)做法,能追蹤工程藍(lán)圖從誕生一直到定案的過(guò)程,確保由不同人員所編輯的同一文 件檔案都能得以同步。最新的Spring3.0已經(jīng)提供了更高級(jí)的版本控制,但是國(guó)內(nèi)沒(méi)幾個(gè)用,先掌握SVN,以后有機(jī)會(huì)再用高級(jí)的。下面詳細(xì)總結(jié) 一下:
1.Subversion介紹:是一種開(kāi)放源碼的全新版本控制系統(tǒng)。是新一代的版本控 制工具,他不但提供了常見(jiàn)的比較、修補(bǔ)、標(biāo)記、提交、回復(fù)和分支等功能,適于 Web 開(kāi)發(fā)和其他 在傳統(tǒng)方式下未采納版本控制功能的領(lǐng)域
2.svn安裝
1.運(yùn)行svn的server端,運(yùn)行setup.exe,就OK
檢驗(yàn)安裝好了:
運(yùn)行dos窗口 ,輸入svn ,回車(chē),出現(xiàn)svn help 提示,安裝成功
2.svn服務(wù)器啟動(dòng)(我安裝目錄:D:"Program Files"Subversion"bin)
cmd:
svn根目錄 svnserve -d 即D:"Program Files"Subversion"bin>svnserve –d
是否啟動(dòng)成功
.當(dāng)前是否啟動(dòng)3690端口號(hào)
3.版本庫(kù)目錄介紹:
dav目錄:是提供給Apache與mod_dav_svn使用的目錄,讓它們存儲(chǔ)內(nèi)部數(shù)據(jù),當(dāng)前我們使用的版本沒(méi)有這個(gè)目錄(與你下載的Subversion版 本有關(guān)系)。
db目錄:就是所有版本控制的數(shù)據(jù)存放文件。
hooks目錄:放置hook腳本文件的目錄。
locks目錄:用來(lái)放置Subversion文件庫(kù)鎖定數(shù)據(jù)的目錄,用來(lái)追蹤存取文件庫(kù)的客戶(hù)端。
format文件是一個(gè)文本文 件,里面只放了一個(gè)整數(shù),表示當(dāng)前文件庫(kù)配置的版本號(hào)。
conf目錄:是這個(gè)倉(cāng)庫(kù)的配置文件(倉(cāng)庫(kù)的用戶(hù)訪問(wèn)帳號(hào)、權(quán)限等)。
4.創(chuàng)建版本庫(kù)、導(dǎo)入、檢出
1、創(chuàng)建版本庫(kù)
右鍵--->TortoiseSVN--->Create repository here
2.導(dǎo)入
右鍵--->TortoiseSVN--->導(dǎo)入(一般在項(xiàng)目創(chuàng)建初始化數(shù)據(jù)時(shí)使用,當(dāng)然也可用于把任意文件或目錄從外部導(dǎo)入到指定倉(cāng)庫(kù)中)
3.檢出(提醒:檢出項(xiàng)目后客戶(hù)端文件夾 的變化.svn)
右鍵--->SVN Checkout...
5.SVN基本功能:
清理、更新到指定版本
日志記錄、提交日志限定必填。
鎖定、解鎖:基本權(quán)限控制(可以限制被鎖定的文件只能由被鎖定用戶(hù)修改提交)
誤刪除恢復(fù)操作:直接重更新或通過(guò)日志列表
單個(gè)文件過(guò)濾:選中文件-->TortoiseSVN---->增加到忽略列表
導(dǎo)出:使項(xiàng)目脫離版本控制。
6.總結(jié)SVN的使用:
在其文件夾上右鍵 "SVN Checkout..."寫(xiě)上對(duì)應(yīng)SVN地址
在其文件夾上右鍵 "SVN Update" 來(lái)更新我們的本地版本
在其文件夾上右鍵 "SVN Commit" 來(lái)提交我們的本地版本
在其文件夾上右鍵 "TortoiseSVN" --> "Export..." 來(lái) 發(fā)布、導(dǎo)出
在其文件上右鍵 "TortoiseSVN" --> 增加(A)" 來(lái)向版本庫(kù)中增加一 個(gè)受版本控制的文件
7.關(guān)于SVN的各種顏色提示說(shuō)明:
CVS客戶(hù)端的使用基本上同SVN客戶(hù)端一樣,更簡(jiǎn)單些,就不多說(shuō)了
spring對(duì)事務(wù)的管理
今天講了Spring的事務(wù),及對(duì)hibernate的整合,對(duì)struts的整合。以后還得學(xué)習(xí),記不住,用到再整理。
1.事務(wù)的四大特點(diǎn):
atomic:要么都發(fā)生,要么都不發(fā)生。
consistent:數(shù)據(jù)應(yīng)該不被破壞。
Isolated:用戶(hù)間操作不相混淆
Durable:永久保存
2.介紹spring的事務(wù)管理器
spring沒(méi)有直接管理事務(wù),而是將管理事務(wù)的責(zé)任委
托給某個(gè)特定平臺(tái)的事務(wù)實(shí)現(xiàn)。
3.Hibernate事務(wù):
<bean id="transactionManager"
class="…HibernateTransactionManager">
<property name="sessionFactory" ref="sf" />
</bean>
其中sessionFactory屬性必須和一個(gè)Hibernate的SessionFactory綁定
HibernateTransactionManager把事務(wù)管理委托給一個(gè)從Hibernate
session 中取得的net….Transaction對(duì)象。當(dāng)一個(gè)事務(wù)成功完成時(shí),
HibernateTransactionManager將調(diào)用Transaction對(duì)象的commit()
方法。類(lèi)似的,當(dāng)一個(gè)事務(wù)失敗時(shí),Transaction對(duì)象的rollback()方
法將被調(diào)用。
4.事務(wù)屬性
1.隔離級(jí)別:設(shè)定事務(wù)的并發(fā)程度
臟讀:一個(gè)事務(wù)讀取了另一個(gè)事務(wù)改寫(xiě)但還未
提交的數(shù)據(jù),如果這些數(shù)據(jù)被回滾,則
讀到的數(shù)據(jù)是無(wú)效的。
不可重復(fù)讀:一個(gè)事務(wù)執(zhí)行相同的查詢(xún)兩次或兩次以
上,但每次查詢(xún)結(jié)果都不同。
幻讀:一個(gè)事務(wù)讀取了幾行記錄后,另一個(gè)事務(wù)插入一
些記錄,幻讀就發(fā)生了。再后來(lái)的查詢(xún)中,第一
個(gè)事務(wù)就會(huì)發(fā)現(xiàn)有些原來(lái)沒(méi)有的記錄。
2.只讀 若對(duì)數(shù)據(jù)庫(kù)只進(jìn)行讀操作,可設(shè)置事務(wù)只讀的屬性,使用某些優(yōu)化措施。數(shù)據(jù)庫(kù)會(huì)進(jìn)行優(yōu)化處理。若使用hibernate作為持久化機(jī)制,聲明一個(gè)只讀事務(wù)會(huì)使hibernate的flush模式設(shè)置為FLUSH_NEVER。避免不必要的數(shù)據(jù)同步,將所有更新延遲到事務(wù)的結(jié)束。
3.事務(wù)超時(shí) 若事務(wù)在長(zhǎng)時(shí)間的運(yùn)行,會(huì)不必要的占用數(shù)據(jù)庫(kù)資源。設(shè)置超時(shí)后,會(huì)在指定的時(shí)間片回滾。將那些具有可能啟動(dòng)新事務(wù)的傳播行為的方法的事務(wù)設(shè)置超時(shí)才有意義
5.CMT:容器管理事務(wù)
BMT:bean 管理事務(wù)
<tx:annocation-driven transaction-manager="hibernateTransactionManager"/>
類(lèi)上加@Transactional
6.總結(jié):
事務(wù)策略
在業(yè)務(wù)中不能加try catch ,因?yàn)?/span>Spring的環(huán)繞通知在出現(xiàn)異常時(shí)會(huì)回滾事務(wù),你已捕獲,就會(huì)提交事務(wù)(任何情況下)
7.Spring整合Struts
1.web服務(wù)器啟動(dòng)時(shí),完成Spring容器的實(shí)例化。plugin|listener
2.struts中的action交給Spring容器管理。
3.基本操作
注意:在spring上下文中,作為普通bean配置action,但action的不能用id,只能用name,
因?yàn)樾枰?/span>struts-config.xml文件中action的path一致.
bean.xml
<bean name="/loginAction" class="..LoginAction">
<property name="xxxService" ref="xxxService" />
</bean>
今天主要是AOP編程,徐老師先講了原理,由淺入深,最 后讓開(kāi)發(fā)由aspectJ來(lái)完成,使開(kāi)發(fā)更簡(jiǎn)單,收獲蠻大
1.Aspect術(shù)語(yǔ)
通知:切面的實(shí)際實(shí)現(xiàn),他通知系統(tǒng)新的行為。如在日志通知包含了實(shí)
現(xiàn)日志功能的代碼,如向日志文件寫(xiě)日志。通知在連接點(diǎn)插入 到應(yīng)用系統(tǒng)中。
連接點(diǎn)::應(yīng)用程序執(zhí)行過(guò)程中插入切面的地點(diǎn),可以是 方法調(diào)用,異常拋出,或者 要修改的字段。
切入點(diǎn):定義了通知應(yīng)該應(yīng)用在哪些連接點(diǎn), 通知可以應(yīng)用到AOP框架支持的任何 連接點(diǎn)。
引入:不變?cè)创a的情況下,為類(lèi)添加新方法 和屬性。
目標(biāo)對(duì)象::被通知的對(duì)象。既可以是你編寫(xiě)的類(lèi)也可以是 第三方類(lèi)。
代理對(duì)象:嶄新的對(duì)象,將通知應(yīng)用到目標(biāo)對(duì) 象后創(chuàng)建的對(duì)象,應(yīng)用系統(tǒng)的其他部 分不用為了支持代理對(duì)象而 改變。
織入:將切面應(yīng)用到目標(biāo)對(duì)象從而創(chuàng)建一個(gè)新代理對(duì) 象的過(guò)程。織入發(fā)生在目標(biāo)
對(duì)象生命周期的多個(gè)點(diǎn)上:
編譯期:切面在目標(biāo)對(duì)象編譯時(shí)織入.這需要一個(gè)特殊的編譯器.
類(lèi)裝載期:切面在目標(biāo)對(duì)象被載入JVM時(shí)織入.這需要一個(gè)特殊的類(lèi)載入器.
運(yùn)行期:切面在應(yīng)用系統(tǒng)運(yùn)行時(shí)織入.
4.切入點(diǎn):定義了通知應(yīng)該應(yīng)用在哪些連接點(diǎn),通知可以應(yīng)用到AOP框架支持的任何連接點(diǎn)。
兩種:jdk動(dòng)態(tài)代理(接口,松耦合),cglib(對(duì)類(lèi)代理)
2.方法介紹
一.通知類(lèi)型
1.前置通知
public interface MethodBeforeAdvice{
void before(Method m,Object[]
os ,Object target){
}
}
該接口提供了獲得目標(biāo)方法、參數(shù)和目標(biāo)對(duì)象的機(jī)會(huì)。不能夠改變運(yùn)行時(shí)參數(shù),即不能替換參數(shù)對(duì)象和目 標(biāo)對(duì)象。
注意在方法結(jié)束后不返回任何值東西。原因是該接口返回后,目標(biāo)方法將會(huì)被調(diào)用,應(yīng)該返回目標(biāo)對(duì)象的 返回值。該接口唯一能
阻止目標(biāo)方法被調(diào)用的途徑是拋出異常或(System.exit())。
2.動(dòng)態(tài)代理對(duì)象ProxyFactoryBean是一個(gè)在BeanFactory中顯式創(chuàng)建代理對(duì)象的中心類(lèi),可以給它一個(gè)
要實(shí)現(xiàn)的接口、一個(gè)要代理的目標(biāo)對(duì)象、一個(gè)
要織入的通知,并且他將創(chuàng)建一個(gè)嶄新的代理
對(duì)象。
3.后置通知
同前置通知類(lèi)似。
public interface AfterReturningAdvice{
public void afterReturning(Object returnValue,Method
m,Object[] os,Object target);
}
多了一個(gè)返回值。
4.環(huán)繞通知
public interface MethodInterceptor extends Interceptor{
Object invoke(MethodInvocation invocation);
}
該接口同前兩種通知有兩個(gè)重要區(qū)別:1.該通知能夠控制目標(biāo)方法
是否真的被調(diào)用。通過(guò)invocation.proceed()方法來(lái)調(diào)用。
2.該通知可以控制返回的對(duì)象。可以返回一個(gè)與proceed()方法返回對(duì)象完全不同的對(duì)象。但要謹(jǐn)慎使用。
5.異常通知
public interface ThrowsAdvice{
}
該接口為標(biāo)識(shí)性接口,沒(méi)有任何方法,但實(shí)現(xiàn)該接口的類(lèi)必須要有如下形
式的方法:
void afterThrowing(Throwable throwable);
void afterThrowing(Method m,Object[] os,Object
target,Throwable throwable);
第一個(gè)方法只接受一個(gè)參數(shù):需要拋出的異常。
第二個(gè)方法接受異常、被調(diào)用的方法、參數(shù)以及目標(biāo)對(duì)象。
二.創(chuàng)建切入點(diǎn)方法
1. 切入點(diǎn)根據(jù)方法和類(lèi)決定何處 織入通知。ClassFilter接口決定了一個(gè)類(lèi)
是否符合通知的要求:
public interface ClassFilter{
boolean matches(Class clazz);
}
實(shí)現(xiàn)該接口的類(lèi)決定了以參數(shù)傳遞 進(jìn)來(lái)的類(lèi)是否應(yīng)該被通知。實(shí)現(xiàn)該接
口的類(lèi)一般根據(jù)類(lèi)名決定,但不一 定必須如此。
注意: 為減少系統(tǒng)負(fù)擔(dān),盡量使用靜態(tài)切入點(diǎn)
2.定義切入點(diǎn) spring提供了Advisor類(lèi)。他把通知和切入點(diǎn)組合到一個(gè)對(duì)象中。更確切地說(shuō)PointcutAdvisor提供了這些功 能
3.使用aspectJ開(kāi)發(fā)
1.添加類(lèi)庫(kù):aspectjrt.jar和aspectjweaver.jar
2.添加aop schema.
3.定義xml元素:<aop:aspectj-autoproxy>
4.編寫(xiě)java類(lèi),并用@Aspect注解成通知
AspectJ 支持 5 種類(lèi)型的通知注解:
@Before: 前置通知, 在方法執(zhí)行之前執(zhí)行
@After: 后置通知, 在方法執(zhí)行之后執(zhí)行
@AfterRunning: 返 回通知, 在方法 返回結(jié)果之后執(zhí)行
@AfterThrowing: 異 常通知, 在方法 拋出異常之后
@Around: 環(huán)繞通知, 圍繞著方法執(zhí)行
配置成普通bean元素即可.
注意:
JoinPoint參數(shù)可訪問(wèn)連接點(diǎn)細(xì)節(jié),入方法名和參數(shù)等.
今天知識(shí)點(diǎn)蠻多的,對(duì)面試挺有用的,好好掌 握!
Spring
對(duì)這個(gè)框架并不陌生,spring是一個(gè)開(kāi)源的控制反轉(zhuǎn)(Inversion of Control ,IoC)和面向切面(AOP)的容器框架.它的主要目得是簡(jiǎn)化企業(yè)開(kāi)發(fā)...
1.為Spring添加jar支持2.Spring:1.xml + 反射
2.不需要實(shí)例化
3.不需要set方法
以前 至上而下, 按部就班
之下而上,反的
3. bean的生命周期
bean被載入到容器中時(shí),他的生命周期就開(kāi)始
了。bean工廠在一個(gè)bean可以使用前完成很多
工作:
1.容器尋找bean的定義信息并實(shí)例化。
2.使用依賴(lài)注入,spring按bean定義信息配置bean的所有屬性。
3.若bean實(shí)現(xiàn)了BeanNameAware接口,工廠調(diào)用Bean的setBeanName
()方法傳遞bean的ID。
4.若bean實(shí)現(xiàn)了BeanFactoryAware接口,工廠調(diào)用setBeanFactory()
方法傳入工廠自身。
5.若BeanPostProcessor和bean關(guān)聯(lián),則它們的
postProcessBeforeInitialization()方法被調(diào)用。
6.若bean指定了ini-method方法、,它將被調(diào)用。
7.最后,若有BeanPostProcessor和bean關(guān)聯(lián),則它們的
postProcessAfterInitialization()方法被調(diào)用、。
4.set注入的缺點(diǎn):
無(wú)法清晰表達(dá)哪些屬性是必須的,哪些是可選
的,構(gòu)造注入的優(yōu)勢(shì)是通過(guò)構(gòu)造強(qiáng)制依賴(lài)關(guān)系,不可能實(shí)例化不
完全的或無(wú)法使用的bean。
5.自動(dòng)裝配
<bean id=" " class="" autowire="autowire 類(lèi)型">
有四種自動(dòng)裝配類(lèi)型:
1.byName:尋找和屬性名相同的bean,若找不到,則裝不上。
2.byType:尋找和屬性類(lèi)型相同的bean,找不到,裝不上,找到多個(gè)拋異常。
3.constructor:查找和bean的構(gòu)造參數(shù)一致的一個(gè)或
多個(gè)bean,若找不到或找到多個(gè),拋異常。按照參數(shù)的類(lèi)型裝配
4.autodetect: (3) 或者(2)方式選一個(gè)。不確定
性的處理與(3)和(2)一致。
注意:
spring2.5提供了<context:annotation-config />配置.
該配置可激活在類(lèi)中探測(cè)到的各種注解,@Required @Autowire @PostConstrct @PreDestroy @Resource @EJB @PersistenceContext @WebServiceRef等等,
也可以選擇為這些注解激活單獨(dú)的后處理器.
6.屬性的外部化
分散配置
將配置文件分成幾個(gè)分散的配置文件。如數(shù)據(jù)源。
<bean class="...PropertyPlaceholderConfigurer">
<property name="locations">
<list>
<value>jdbc.properties</value>
<value>securtiy.properties</value>
</list>
</property>
</bean>
當(dāng)然在Spring2.5可以簡(jiǎn)化為
<context:property-placehoder location>
7.AOP
有一些模塊是每個(gè)系統(tǒng)都需要的,切面是系統(tǒng) 模塊化的一個(gè)切面或領(lǐng)域。如日志記錄。不改變?cè)创a,還給類(lèi)增加新的功能
2.連接點(diǎn):應(yīng)用程序執(zhí)行過(guò)程中,可以應(yīng)用切面的地點(diǎn),可以是方法調(diào)用,異常拋出,或者要修改的
字段。
3.通知:切面的實(shí)際實(shí)現(xiàn),他通知系統(tǒng)新的行為。
4.切入點(diǎn):定義了通知應(yīng)該應(yīng)用在哪些連接點(diǎn),通知可以應(yīng)用到AOP框架支持的任何連接點(diǎn)。
5.引入:為類(lèi)添加新方法和屬性。
6.目標(biāo)對(duì)象:被通知的對(duì)象。既可以是你編寫(xiě)的類(lèi)也可以是第三方類(lèi)。
7.代理:將通知應(yīng)用到目標(biāo)對(duì)象后創(chuàng)建的對(duì)象,應(yīng)用系統(tǒng)的其他部分不用為了支持代理對(duì)象而
改變。
8.織入:將切面應(yīng)用到目標(biāo)對(duì)象從而創(chuàng)建一個(gè)新代理對(duì)象的過(guò)程。織入發(fā)生在目標(biāo)
對(duì)象生命周期的多個(gè)點(diǎn)上:
編譯期:切面在目標(biāo)對(duì)象編譯時(shí)織入.這需要一個(gè)特殊的編譯器.
類(lèi)裝載期:切面在目標(biāo)對(duì)象被載入JVM時(shí)織入.這需要一個(gè)特殊的類(lèi)載入器.
運(yùn)行期:切面在應(yīng)用系統(tǒng)運(yùn)行時(shí)織入.
今天到此結(jié)束,明天繼續(xù)!
UML
今天學(xué)習(xí)UML,uml是unified modeling language,是一種基于面向?qū)ο蟮目梢暬UZ(yǔ)言. 老徐講了很多與開(kāi)發(fā)有關(guān)的東西,很不錯(cuò),還介紹了軟件的發(fā)展等,開(kāi)始整理下
1. UML 采用了一組形象化的圖形(如類(lèi)圖)符號(hào)作為建模語(yǔ)言, 使用這些符號(hào)可以形象地描述系統(tǒng)的各個(gè)方面。oop:ooa(分析) + ood(設(shè)計(jì))
2.軟件的生命周期
瀑布模型:
需求分析(可行性分析:)
1.時(shí)間可行性
2.技術(shù)可行性
3.經(jīng)濟(jì)可行性
系統(tǒng)分析和設(shè)計(jì)(系分)
實(shí)現(xiàn)
測(cè)試
維護(hù)
角色分配:項(xiàng)目經(jīng)理技術(shù)總監(jiān)代碼人員測(cè)試人員 db管理人員系統(tǒng)分析人員
project leader 系統(tǒng)架構(gòu)師
3. 統(tǒng)一軟件開(kāi)發(fā)過(guò)程(Rational Unified Process,RUP): 一個(gè)通用的軟件流程框架, 以架構(gòu)為中心, 用例驅(qū)動(dòng)的迭代化開(kāi)發(fā)流程.
4.uml:圖(圖元)
UML 中一共有 10 種圖:
類(lèi)圖**** 對(duì)象圖 包圖 組件圖 部署圖 用例圖** 時(shí)序圖*** 協(xié)作圖 狀態(tài)圖 活動(dòng)圖*
5.用例圖
是從軟件需求分析到最終實(shí)現(xiàn)的第一步, 它是從客戶(hù)的角度來(lái)描述系統(tǒng)功能.
用例圖包含 3 個(gè)基本組件: 參與者(Actor), 用例(Use Case),關(guān)系
6.類(lèi)圖
類(lèi)圖是面向?qū)ο笙到y(tǒng)建模中最常用的圖. 是定義其他圖的基礎(chǔ).
類(lèi)圖主要是用來(lái)顯示系統(tǒng)中的類(lèi), 接口以及它們之間的關(guān)系.
類(lèi)圖包含的主要元素有類(lèi), 接口和關(guān)系. 其中關(guān)系有關(guān)聯(lián)關(guān)系, 泛化關(guān)系, 依賴(lài)關(guān)系和實(shí)現(xiàn)關(guān)系. 在類(lèi)圖中也可以包含注釋和約束.
7.類(lèi)之間的幾種關(guān)系:實(shí)現(xiàn)依賴(lài)關(guān)聯(lián)聚合組成
實(shí)現(xiàn)關(guān)系:在 UML 中, 實(shí)現(xiàn)關(guān)系用來(lái)表示類(lèi)與接口之間的實(shí)現(xiàn)關(guān)系.
依賴(lài)關(guān)系:對(duì)于兩個(gè)相對(duì)獨(dú)立的系統(tǒng),當(dāng)一個(gè)系統(tǒng)負(fù)責(zé)構(gòu)造另一個(gè)系統(tǒng)的實(shí)例,或者依賴(lài)另一個(gè)系統(tǒng)的服務(wù)時(shí),這兩個(gè)系統(tǒng)之間體現(xiàn)為依賴(lài)關(guān)系.
關(guān)聯(lián):對(duì)于兩個(gè)相對(duì)獨(dú)立的系統(tǒng),當(dāng)一個(gè)系統(tǒng)的實(shí)例與另一個(gè)系統(tǒng)的一些特定實(shí)例存在固定的對(duì)應(yīng)關(guān)系時(shí),這兩個(gè)系統(tǒng)之間為關(guān)聯(lián)關(guān)系。
聚合:聚合關(guān)聯(lián)是一種特殊的關(guān)聯(lián). 它表示類(lèi)間的關(guān)系是整體與部分的關(guān)系.
組合關(guān)系: 整件擁有部件的生命周期, 所以整件刪除時(shí), 部件一定會(huì)跟著刪除. 而且, 多個(gè)整件不可以同時(shí)共享同一個(gè)部件。
8. 時(shí)序圖
時(shí)序圖用于描述對(duì)象之間的傳遞消息的時(shí)間順序, 即用例中的行為順序.
當(dāng)執(zhí)行一個(gè)用例時(shí), 時(shí)序圖中的每條消息對(duì)應(yīng)了一個(gè)類(lèi)操作或者引起轉(zhuǎn)換的觸發(fā)事件.
對(duì)象: 時(shí)序圖中對(duì)象使用矩形表示, 并且對(duì)象名稱(chēng)下有下劃線. 將對(duì)象置于時(shí)序圖的頂部說(shuō)明在交互開(kāi)始時(shí)對(duì)象就已經(jīng)存在了. 如果對(duì)象的位置不在頂部, 表示對(duì)象是在交互的過(guò)程中被創(chuàng)建的.
生命線:生命線是一條垂直的虛線. 表示時(shí)序圖中的對(duì)象在一段生命周期內(nèi)的存在. 每個(gè)對(duì)象底部中心的位置都帶有生命線.
9. 活動(dòng)圖
在 UML 中, 活動(dòng)圖本質(zhì)上就是流程圖. 它用于描述系統(tǒng)的活動(dòng), 判定點(diǎn)和分支等.
10.臨時(shí) 持久化 游離 刪除
11.狀態(tài)圖
狀態(tài)圖: 通過(guò)建立對(duì)象的生存周期模型來(lái)描述對(duì)象隨時(shí)間變化的動(dòng)態(tài)行為.
狀態(tài): 用圓角矩形表示. 狀態(tài)名稱(chēng)表示狀態(tài)的名字, 通常用字符串表示. 一個(gè)狀態(tài)的名稱(chēng)在狀態(tài)圖所在的上下文中應(yīng)該是唯一的.
12.包圖:
由包和包之間的關(guān)系組成. 包的圖標(biāo)就如同一個(gè)帶標(biāo)簽的文件夾.
13.組件圖
用來(lái)建立系統(tǒng)中各組件之間的關(guān)系, 各組件通過(guò)功能組織在一起.
14.部署圖
用來(lái)幫助開(kāi)發(fā)者了解軟件中的各個(gè)組件駐留在什么硬件位置, 以及這些硬件之間的交互關(guān)系。
今天就講了這些知識(shí),挺瑣碎的,關(guān)鍵是看懂就OK了!