訪問值棧中的action的普通屬性: username = <s:property value="username"/>
由于下午有公司來面試,耽誤了一些時間,老徐說明天再多補(bǔ)一個小時,太敬業(yè)了啊,佩服!
在線支付時針對易寶支付的網(wǎng)關(guān)而開設(shè)的,眾所周知,易寶已是三大網(wǎng)上支付平臺之一,正好明天易寶來招聘,正好練練,呵呵,下午是面試技巧
好好學(xué)習(xí),畢業(yè)倒計時:15天
1.支付寶是不能立即拿到現(xiàn)錢的,這也是商家喜歡在線支付的一個原因吧,在線支付是直接和銀行對接的,這樣商家可以立即拿到現(xiàn)錢,避免了和買家產(chǎn)生矛盾后,錢被封的風(fēng)險。
下面就來實現(xiàn)在線支付吧,首先提出請求,如果通過,會得到賬號和密鑰
我們要做的事有兩項
1.向支付網(wǎng)關(guān)發(fā)起請求,就是向http發(fā)起請求,所謂請求就是我們平常使用Http請求(http://www.xxx.cn/xxx.do),請求方式: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):其實就是一個http路徑
2.接收支付網(wǎng)關(guān)返回的支付結(jié)果信息
第一次使用瀏覽器重定向技術(shù),
把支付信息發(fā)送給:http://www.itcast.cn/re.do?id=21432&result=1
2.相關(guān)知識點:
一.接入方式:兩種接入方案
①.直接與銀行對接
優(yōu)點:因為直接與銀行進(jìn)行財務(wù)結(jié)算,交易資金結(jié)算比較安全
缺點:開發(fā)工作量比較大,而且銀行會不定期升級交易系統(tǒng),隨著銀行系統(tǒng)的升級,企業(yè)也需要作相應(yīng)改動,所以維護(hù)工作量也是比較大的,而且企業(yè)每年還需要向銀行交納一定數(shù)量的接口使用費。
②.通過中間公司間接與銀行對接
優(yōu)點:開發(fā)工作量較少,因為使用的是中間企業(yè)提供的接入規(guī)范,所以銀行升級系統(tǒng),不需要企業(yè)作相應(yīng)修改,除非中間企業(yè)的接入規(guī)范發(fā)生了改變,企業(yè)才作相應(yīng)修改。
缺點:因為是與中間企業(yè)進(jìn)行資金結(jié)算,目前所有中間企業(yè)都是私企,資金安全是個大問題。
3. 對支付數(shù)據(jù)進(jìn)行Md5加密
4. 支付流程:
通過http請求方式向易寶支付網(wǎng)關(guān)發(fā)起一個支付請求,請求可以是get或post方式提交。
易寶支付網(wǎng)關(guān)對企業(yè)發(fā)來的數(shù)據(jù)使用用戶的密鑰生成MD5-hmac碼,然后跟企業(yè)發(fā)來的MD5-hmac碼(即上面表單由hmac字段提供的值)比較是否相同,如果相同即把請求轉(zhuǎn)發(fā)到銀行網(wǎng)關(guān),當(dāng)用戶支付完成后,銀行網(wǎng)關(guān)會引導(dǎo)用戶的瀏覽器重定向到易寶支付網(wǎng)關(guān),然后易寶支付網(wǎng)關(guān)再引導(dǎo)用戶的瀏覽器重定向到企業(yè)提供的url(即上面表單由p8_Url提供的地址)
接下來我們只需處理結(jié)果了
下午是面試技巧:
薪水:一定要寫 ,不要寫區(qū)間 4000
心得體會:具體點
責(zé)任描述:多寫,詳細(xì),寫開發(fā)難點,描述清楚,介紹清楚
對某一模塊詳細(xì)描述,對難點的解決過程
描述自己負(fù)責(zé)的模塊,抓住一點,詳細(xì)說,千千不要泛泛而談
不能寫培訓(xùn)經(jīng)驗
三好學(xué)生,寫一等獎學(xué)金是應(yīng)屆的
愛好還是要寫的
身份證不能造假,教育經(jīng)歷,通常企業(yè)篩選簡歷過程:
從1-2千封中選,讓前臺做/人力去篩選簡歷,要求:
A.只提取兩年工作年限以上(一般企業(yè)都是這樣干的)
B.連人力都能判斷出造假的簡歷,排除
C.經(jīng)過人力,剩下100封
D.面試官
88年可以寫兩年,教育經(jīng)歷:把畢業(yè)信息提前,證書造假
簡歷上可適當(dāng)造假
薪水:
寫2年,月薪(北京,上海,廣州):
初級:3000 – 4000 4500 -- 8-12
中級:4500 – 6000 7K 其中5K-6K比較多 --
高級:7000 – 1.2W (3-5)
從事Android,薪水如下:
Android 2年 最長就2年
原來做過j2se開發(fā)3-4年 8K-1.2W
android 3個月(j2ee 1-2)6K
Android 干半年 4.5K
如果我們老老實實干半年,編碼能力就會沒問題
工作經(jīng)驗:
1.為什么離職?
我在深圳那邊4K,也不知道北京這邊的行情。
2.當(dāng)公司準(zhǔn)備要你的時候,會讓你填以前公司的地址信息,聯(lián)系人信息
造假唄,找個外地的同學(xué)
3.入職后,離職證明,隨便蓋個章,離職證明模版網(wǎng)上有一大堆
新公司不想惹麻煩,已經(jīng)和原來公司解除了勞動合同
4.關(guān)于android面試
基礎(chǔ):
多線程(并發(fā)控制),Socket通信,http通信
android:
android的什么項目
項目針對那些手機(jī)型號的手機(jī)HTC
如何適應(yīng)各個分辨率的問題,大分辨率靠前
ContentProvider(難度),共享數(shù)據(jù)
聯(lián)系人(如何獲取聯(lián)系人)
Activity的生命周期:運行 暫停 停止
前臺生命周期
完整生命周期
意圖:隱式,顯式
組件:廣播,內(nèi)容提供者,Service 四大組件
MMI:多媒體接口
SQLite:數(shù)據(jù)庫訪問
項目開發(fā)
3人 2-3月
公司部門 人員
研發(fā)部/技術(shù)部 50-60人
測試部 8-10人
客服部/售后服務(wù)
市場部
行政部
今天學(xué)習(xí)從網(wǎng)上獲得數(shù)據(jù),以xml文件輸出。流程:android客戶端 -----已經(jīng)開發(fā)好的CRM(220.113.15.23) -----[客戶資料]--à屏幕
用的是struts1.3的環(huán)境
1.搭建環(huán)境
1.web.xml配置struts servlet
2.添加jar
3.復(fù)制struts-config.xml
環(huán)境搞定后,新建jsp文件,寫好文件頭:<?xml version="1.0" encoding="UTF-8"?> 注意
接著新建一個ContactAction
最后配置struts-config.xml文件
新建contact.jsp文件,得到數(shù)據(jù)
訪問路徑,測試得到的數(shù)據(jù),以驗證是否正確,若正確的話,第一步完成
下面是Android應(yīng)用
2 .①.設(shè)計要顯示的界面
②.新建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();
在該類中還應(yīng)該新建sax解析方法,解析文檔,保存數(shù)據(jù)
③.新建android測試類,以日志形式打印出xml文件中的數(shù)據(jù)
3.應(yīng)用HttpURLConnection對象,我們可以向網(wǎng)絡(luò)發(fā)送請求參數(shù).下面以POST發(fā)送為例,寫一些關(guā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
①:新建一個繼承Activity的類
②:需要在功能清單AndroidManifest.xml文件中添加進(jìn)上面Activity配置代碼
打開新的Activity,不傳遞參數(shù)
通過意圖打開Activity,Intent,用于激活Activity的,在組件之間傳遞數(shù)據(jù)
在新的Activity中接收前面Activity傳遞過來的參數(shù):
添加參數(shù)的另一種方法:Bundle
Bundle類用作攜帶數(shù)據(jù),它類似于Map,用于存放key-value名值對形式的值。相對于Map,它提供了各種常用類型的putXxx()/getXxx()方法, putXxx()用于往Bundle對象放入數(shù)據(jù),getXxx()方法用于從Bundle對象里獲取數(shù)據(jù)。Bundle的內(nèi)部實際上是使用了HashMap<String, Object>類型的變量來存放putXxx()方法放入的值:
5. Intent過濾器
Android鼓勵減少組件間的耦合,因此Android提供了Intent (意圖) ,Intent提供了一種通用的消息系統(tǒng),它允許在你的應(yīng)用程序與其它的應(yīng)用程序間傳遞Intent來執(zhí)行動作和產(chǎn)生事件。使用Intent可以激活Android應(yīng)用的三個核心組件:活動、 服務(wù)和廣播接收器。
Intent可以劃分成顯式意圖和隱式意圖。
使用SharedPreferences進(jìn)行數(shù)據(jù)存儲,是專門用來向用戶提供軟件參數(shù)設(shè)置功能,
1. SharedPreferences類,它是適合用于保存軟件配置參數(shù)。使用SharedPreferences保存數(shù)據(jù),其背后是用xml文件存放數(shù)據(jù)。
2. SharedPreferences使 用xml文件保存 數(shù)據(jù),getSharedPreferences(name,mode)方法的第一個參數(shù)用于指定該文件的名稱,不用帶后綴,后綴由Android自動加上,方法的第二個參數(shù)指 定文件的操作模式,共有四種操作模式。
3.設(shè)置軟件參數(shù)過程:
①.當(dāng)用戶點擊保存按鈕時,就激發(fā)保存事件
在Activity中的匿名內(nèi)部類中,得到用戶輸入值
需要注意的是:android.content.SharedPreferences.Editor用于保存參數(shù),該editor最后要commit一下。
最后要Toast.makeText(PreferencesActivity.this, "保存參數(shù)成功", 1).show();用于提示保存參數(shù)成功
②.如果訪問其他應(yīng)用中的Preference,前提條件是:該preference創(chuàng)建時指定了Context.MODE_WORLD_READABLE或者Context.MODE_WORLD_WRITEABLE權(quán)限。如:有個<package name>為cn.itcast的應(yīng)用使用下面語句創(chuàng)建了preference。
getSharedPreferences("itcast", Context.MODE_WORLD_READABLE);
其他應(yīng)用要訪問上面應(yīng)用的preference,首先需要創(chuàng)建上面應(yīng)用的Context,然后通過Context 訪問preference ,訪問preference時會在應(yīng)用所在包下的shared_prefs目錄找到preference :
Context otherAppsContext = createPackageContext("cn.itcast",
Context.CONTEXT_IGNORE_SECURITY);
4. 使 用SQLite數(shù) 據(jù)庫存儲數(shù)據(jù)
在Android平臺上,集成了一個嵌入式關(guān)系型數(shù)據(jù)庫—SQLite,SQLite3支持 NULL、INTEGER、REAL(浮點數(shù)字)、TEXT(字符串文本)和BLOB(二進(jìn)制對象)數(shù)據(jù)類型,雖然它支持的類型只有五種, SQLite最大的特點是你可以保存任何類型的數(shù)據(jù)到任何字段中,無論這 列聲明的數(shù)據(jù)類型是什么。SQLite可以解析大部分標(biāo)準(zhǔn)SQL語句。
5.開發(fā)3g數(shù)據(jù)庫 軟件需求:
①.用戶初次使用軟件,初始化數(shù)據(jù)庫
②.用戶升級軟件,自動更新數(shù)據(jù)庫
為此,類對應(yīng)提供了兩個重要的方 法,分別是onCreate(SQLiteDatabase db)和onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion),
6.利用繼承自SQLiteOpenHelper的DatabaseHelper類實現(xiàn)增刪改查,和我們以前的用JDBC實現(xiàn)的增刪改查語法基本一樣,舉例:
SQLiteDatabase db = ....;
db.execSQL("insert into person(name, age) values(?,?)", new Object[]{"傳智播客", 4});
db.close();
需要注意的是SQLiteDatabase的rawQuery() 用于 執(zhí)行select語句
7.將數(shù)據(jù)動態(tài)顯示在手機(jī)屏幕上,用SimpleAparter實現(xiàn)
今天到此結(jié)束!
1.單元測試步驟:
第一步:首先在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相同。
第二步:編寫單元測試代碼(選擇要測試的方法,右鍵點擊“Run As”--“Android Junit Test” ):
2.數(shù)據(jù)存儲和訪問
軟件需要對處理后的數(shù)據(jù)存儲,Android為數(shù)據(jù)存儲提供了5種方式:
文件,SharedPreferences,SQLite數(shù)據(jù)庫,內(nèi)容提供者(Content provider),網(wǎng)絡(luò)
使用文件對數(shù)據(jù)進(jìn)行存儲,Activity提供了openFileOutput()方法可以用于把數(shù)據(jù)輸出到文件中。openFileOutput()方法的第二參數(shù)用于指定操作模式,有四種模式,分別為:
Context.MODE_PRIVATE
Context.MODE_APPEND
Context.MODE_WORLD_READABLE
Context.MODE_WORLD_WRITEABLE
3.SAX解析XML
SAX是一個解析速度快并且占用內(nèi)存少的xml解析器,解析采用的是事件驅(qū)動,這些方法定義在ContentHandler接口中,下面是一些ContentHandler接口常用的方法:
startDocument()
當(dāng)遇到文檔的開頭的時候,調(diào)用這個方法,可以在其中做一些預(yù)處理的工作。
endDocument()
和上面的方法相對應(yīng),當(dāng)文檔結(jié)束的時候,調(diào)用這個方法,可以在其中做一些善后的工作。
startElement(String
namespaceURI, String localName, String qName, Attributes atts)
當(dāng)讀到一個開始標(biāo)簽的時候,會觸發(fā)這個方法。
endElement(String
uri, String localName, String name)
這個方法和上面的方法相對應(yīng),在遇到結(jié)束標(biāo)簽的時候,調(diào)用這個方法。
characters(char[]
ch, int start, int length)
這個方法用來處理在XML文件中讀到的內(nèi)容,第一個參數(shù)為文件的字符串內(nèi)容,后面兩個參數(shù)是讀到的字符串在這個數(shù)組中的起始位置和長度,使用new String(ch,start,length)就可以獲取內(nèi)容。
4.使用Pull解析器讀取XML文件
如果需要生成一個XML文件,生成XML文件的方法有很多,如:可以只使用一個StringBuilder組拼XML內(nèi)容,然后把內(nèi)容寫入到文件中;
或者使用DOM API生成XML文件,或者也可以使用pull解析器生成XML文件,推薦使用Pull解析器。
最后,
巴巴運動網(wǎng),好好學(xué)習(xí)權(quán)限和優(yōu)化等技術(shù),面試特別有幫助
今天是黎老師的3G應(yīng)用開發(fā)Android項目的第一天,Android相當(dāng)火,從事Android開發(fā)的人員不太多,接下來開始Android之旅。
1.3G簡介:
3G,即3rd Generation,目前中國聯(lián)通使用的是WCDMA,中國電信使用的是CDMA2000 中國,移動使用的是具有自主知識產(chǎn)權(quán)的TD-SCDMA,3G的最大優(yōu)點:速度上的提升
2.wml標(biāo)簽,比Html標(biāo)簽簡單,1-2天就可以搞定,工作中用到再學(xué),因為他是2.5G中用到的技術(shù),如果3G普及的話,這門技術(shù)就Over了。
3.智能手機(jī)操作平臺
我們學(xué)Android操作系統(tǒng),RIM BlackBerry,黑莓我比較喜歡,但在國內(nèi)還不怎么流行, Symbian手機(jī)硬件比較好,所以占用很大市場,在3G時代,手機(jī)基本上可以當(dāng)做電腦,用戶更看重手機(jī)是否能滿足日常生活和工作的需要。這就好像大多電腦 用戶都安裝了Windows操作系統(tǒng),很少安裝Linux系統(tǒng)。開發(fā)Android的人員的增多,必然會帶來手機(jī)軟件的增多,軟件的多少會決定以后操作系統(tǒng)的市場份額,windows mobile比Android,iPhone的界面差遠(yuǎn)了。我們關(guān)注:Android,iPhone,Symbian智能手機(jī)平臺,因為我們搞Java開發(fā),只能學(xué)Android了
4.Android資料
買Android手機(jī)就買多普達(dá)和Moto的,質(zhì)量好。Android最好的資料是android.pdf。Google Android SDK開發(fā)范例大全提供了Android的全部功能,在學(xué)完課程之后可以看
5. 開發(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)
啟動 Eclipse,選擇 Help > Install New Software,在出現(xiàn)的對話框里,點擊Add按鈕,在對話框的name一欄輸入“ADT”, 然后點擊Archive...,瀏覽和選擇已經(jīng)下載的ADT插件壓縮文件。
點擊 OK.。返回可用軟件的視圖,你會看到這個插件,然后選擇Developer Tools (會選中下 面的“Android Developer Tools”和 “Android Editors“),點擊 Next,最后重啟 Eclipse。
③.下載Android SDK:
http://dl.google.com/android/android-sdk_r04-windows.zip
下載完SDK后,把.zip文件解壓到你電腦上合適位置。啟動 Eclipse,選擇window->preferences, 在打開的視圖左邊點擊android,在右邊的SDK Location中選擇Android SDK所在位置。
6.開發(fā)Android的第一個應(yīng)用:
1.點擊工具欄上手機(jī)形狀的虛擬設(shè)備管理器(簡稱“AVD“)
2.在打開的虛擬設(shè)備管理器中創(chuàng)建一個虛擬手機(jī)
3.在項目上右鍵點擊run as ?Android application
OK,第一個應(yīng)用就OK了
7.端口號:127.0.0.1:5554
8.Activity
就像struts中的Action,處理用戶請求,除此之外,Activity還代表一個用戶界面
9. Android應(yīng)用程序架構(gòu)
src/ java原代碼存放目錄
gen/ 自動生成目錄
gen 目錄中存放所有由Android開發(fā)工具自動生成的文件。目錄中最重要的就是R.java文件。 這個文件 由Android開 發(fā)工具自動產(chǎn)生的。Android開發(fā)工具會自動根據(jù)你放入res目錄的xml界面文件、圖標(biāo)與常量,同步更新修改R.java文件。
res/ 資源(Resource)目錄
在這個目錄中我們可以存放應(yīng)用使用到的各種資源,如xml界面文件,圖片或數(shù)據(jù)。具體請看ppt下方備注欄。
AndroidManifest.xml 功能清單文件
這個文件列出了應(yīng)用程序所提供的功 能,相當(dāng)于struts的config文件,只有配置好后,才能調(diào)用此Activity。
default.properties 項目環(huán)境信息,一般是不需要修改此文件中
10.短信發(fā)送器
注意:因為應(yīng)用要使用手機(jī)的短信服務(wù),所以要在清單文件AndroidManifest.xml中添 加短信服務(wù)權(quán)限:
11.通知
關(guān)于這些東西,還是看看文檔,拷過來運行一下,測試測試看看效果就差不多了。
一.使用poi
1.參見poi的文檔,添加jar包
2.workbook表示一個Excel文檔
3.下載Excel模版,必須按格式
1.創(chuàng)建workbook對象
2.創(chuàng)建下載Excel文件的第一行
3.從數(shù)據(jù)庫中讀取到需要的Employee列表
5.利用Servlet Api 對準(zhǔn)備好的Excel下載
4.上傳excel
①.配置Action
②.導(dǎo)入兩個jar包commons-io,commons-fileupload.jar
③.上傳
1.根據(jù)ActionForm的FormFile屬性讀取上傳數(shù)據(jù),獲得Workbook對象
2.讀取Workbook對象中的內(nèi)容:遍歷Workbook對象除標(biāo)題行以外的行
3.把每一行都轉(zhuǎn)換為一個Employee對象
4.調(diào)用方法,把Employee對象的集合保存到數(shù)據(jù)庫中,注意:有可能不能保存,其原因可能違反格式或者違反數(shù)據(jù)庫的唯一性約束
二.PDF文檔輸出
1.iText介紹:iText是著名的開放源碼的站點sourceforge一個項目, 是用于生成 PDF 文檔的一個java類庫.
2.Pdf 文件輸出的 5 個步驟
1. 創(chuàng)建一個 Document 對象.
public Document()
public Document(Rectangle pageSize): 定義頁面的大小
public Document(Rectangle pageSize, int marginLeft, int marginRight, int marginTop, int marginBottom): 定義頁面的大小, 后邊的四個參數(shù)分別指定左, 右, 上, 下頁邊距
2.建立一個書寫器 (Writer) 與document對象關(guān)聯(lián), 通過書寫器(Writer)可以將文檔寫入到磁盤中
3. 打開文檔
4. 在文檔中添加文字
5. 關(guān)閉文檔
其中:
①。設(shè)定文檔屬性
當(dāng)新的頁面產(chǎn)生之前, 可以設(shè)定頁面的大小、書簽、腳注(HeaderFooter)等信息,調(diào)用的方法是:
②。添加文檔內(nèi)容
所有向文檔添加的內(nèi)容都是以對象為單位的, 如Phrase、Paragraph、Table等. 比較常用的是段落(Paragraph)對象, 用于向文檔中添加一段文字
③。文本處理
iText中用文本塊(Chunk)、短語(Phrase)和段落(paragraph)處理文本。
文本塊(Chunk)是處理文本的最小單位, 由一串帶格式(包括字體、顏色、大小)的字符串組成:
注意:在 iText 中沒有行的概念, 一個表格里直接放單元格, 如果一個 3 列的表格中放進(jìn) 6 個單元格, 那就是兩行的表格. 如果放入 5 個基本的沒有任何跨列設(shè)置的單元格, 表格就會出錯. 此時表格不會添加到文檔中, 并且沒有任何提示
三.面試
老佟給我們找了一個簡歷,介紹了一些面試的注意點,要點:
1.符合自身條件,各種技術(shù)。
2.最好寫點權(quán)限設(shè)計,Compass+Lucene實現(xiàn)全文搜索,流程采用JBPM管理。
3.項目三個:小湯的OA和老佟的權(quán)限整合為一個項目,網(wǎng)上商城(巴巴運功網(wǎng)),3g,數(shù)據(jù)采集
OA用到的技術(shù):SSH
jQuery +
jbpm 完成審批流程
spring-security
lucence :全文檢索
今天主要實現(xiàn)的是員工信息的修改和權(quán)限管理基礎(chǔ),修改用AJAX實現(xiàn)的,權(quán)限看了不少的源代碼,感覺蠻難的,不過今天只是初步介紹,還有時間再學(xué)習(xí)一下!
1.員工信息的修改
1.struts對表單信息的回顯
2.對可以進(jìn)行修改的字段
1.當(dāng)該字段值發(fā)生改變時,confirm”確定修改該信息嗎?”
點擊”取消”:使該字段恢復(fù)為以前的默認(rè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入門
需 求:1. Spring-security 應(yīng)用的根目錄下有兩個 Jsp 頁面: index.jsp 和 admin.jsp. admin 用戶有權(quán)限訪問這兩個頁面, 而 user 用戶只能訪問 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 框架的過濾器
3.新建applicationContext-security.xml 配置文件,并且把security 作為默認(rèn)的命名
空間, 并將其導(dǎo)入到applicationContext.xml 中
applicationContext-security.xml中,有幾種重要配置:
1. 配置 spring-security 的 http 安全屬性
<http auto-config="true">
2. 配置需要保護(hù)那些 資源, 以及訪問這些資源 所需要的權(quán)限, 若有多個 權(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.配置登錄頁面,
default-target-url: 若直接請求登錄頁面, 那么該屬性配置登錄成功之后的相應(yīng)頁面
always-use-default-target: 若請求的目標(biāo)頁面受保護(hù), 則 spring-security 會相應(yīng) login-page 屬性對應(yīng)的頁面, 默認(rèn)情況下, 若登錄成功將相應(yīng)剛才請求的目標(biāo)頁面,
但這相當(dāng)麻煩,每次都要配置不少信息。下面 有更好的實現(xiàn),即
把需要攔截的url,權(quán)限,用戶信息放到放數(shù)據(jù)庫中,實現(xiàn)如下:
1.實體類:
Authority -- 權(quán)限
Resource -- 資源
Role -- 角色
Employee -- 添加Set<Role> roleSet 屬性
2.關(guān)系
Resource 和Authority 為多對多的對應(yīng)關(guān)系
Authority 和Role 為多對多的對應(yīng)關(guān)系
Role 和Employee 為多對多的對應(yīng)關(guān)系
所以還需要3 個額外的關(guān)聯(lián)表
3.實現(xiàn)把用戶信息,權(quán)限信息存放到數(shù)據(jù)庫中
1. 實現(xiàn)把用戶信息, 權(quán)限信息存放到數(shù)據(jù)庫中
1). 自定義 UserDetailsService 接口的實現(xiàn)類, 將該類配置到 Spring 的 IOC 容器中, 并在
<authentication-provider user-service-ref=""> 節(jié)點的 user-service-ref 屬性中引用該 Bean.
2). 通過 debug 查看 UserDetailsService 接口的實現(xiàn)類返回的 UserDetails 對象
4. 實現(xiàn)資源信息存放到數(shù)據(jù)庫中: 訪問資源時, spring-security 能區(qū)分出訪問該資源需要哪些權(quán)限
1). 自定義 ObjectDefinitionSource 接口的實現(xiàn)類, 將該類的實例裝配給 FilterSecurityInterceptor 的 objectDefinitionSource 的 屬性.即可實現(xiàn)自定義的資 源獲取.
2). 通過繼承 DefaultFilterInvocationDefinitionSource 類的方法定義 ObjectDefinitionSource 接口的實現(xiàn)類有困難, 因為 DefaultFilterInvocationDefinitionSource
中沒有無參的構(gòu) 造器, 該構(gòu)造器有兩個參 數(shù): UrlMatcher urlMatcher, LinkedHashMap requestMap.
urlMatcher 參數(shù)可 以通過 bean 的形式 事先配置, 但 requestMap 參數(shù)類似于: {[/admin.jsp]=[ROLE_ADMIN], [/index.jsp]=[ROLE_USER]}, 需要訪問數(shù)據(jù)庫才能對其初始化, 但這不可能.
3). 通過查看 spring-security 核心 jar 包的 META-IN 下的 spring.handlers 找到 SecurityNamespaceHandler, 在該類中查看 registerBeanDefinitionParser(Elements.HTTP, new HttpSecurityBeanDefinitionParser()); 方法
在 HttpSecurityBeanDefinitionParser 類 中可以看到如何創(chuàng)建 DefaultFilterInvocationDefinitionSource 實例.
4). 通過 FactoryBean 在 IOC 容器中注冊 DefaultFilterInvocationDefinitionSource 實例
今天主要實現(xiàn)的是員工信息的翻頁設(shè)計,用AJAX實現(xiàn)的,接著實現(xiàn)了員工信息的刪除實現(xiàn),總結(jié) 一天的知識,感覺jQuery確實是十分有用的一門技術(shù)。
1.帶復(fù)雜條件的分頁:(非AJAX分頁)
直接把deptid屬性過濾加上會導(dǎo)致出現(xiàn):org.hibernate.QueryException:
這時因為在 Employee 實體類中根本就沒有 deptid 屬性(并非指在 Employee 類中有該屬性,而是要在映射文件中映射該屬性).
解決方法:
在 EmployeeDao 中重寫 Page<T> findPage(final Page<T> page, final List<PropertyFilter> filters) 方法, 以解決表單頁 面的 deptid和實體類的
dept屬性的對應(yīng)問題
注 意:1.增強(qiáng) for 循環(huán)時, 不能 remove 其元素
2.在 循環(huán)時刪除集合的元素, 會改變集合的 size 屬性
2.AJAX分頁設(shè)計
1.需要在EmployeeAction的對應(yīng)方法中,返回JSON數(shù)據(jù),在頁面上進(jìn)行解析即可
2.實現(xiàn)過程:
1.點擊上一頁連接時,需要使用AJAX分頁:因為ajax分頁時,頁面沒有刷新,
下一頁連接添加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ù)器端實現(xiàn)(employeeList2)
1.獲取請求參數(shù)
String pageNoStr = request.getParameter(“pageNo”);
2.從頁面獲取PropertyFilter集合
3.調(diào)用service的findPage方法,得到分頁數(shù)據(jù)Page對象
4.將page對象轉(zhuǎn)化為對應(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刪除功能的實現(xiàn):
1.若當(dāng)前頁已經(jīng)是最后一頁,且當(dāng)前記錄是當(dāng)前頁的最后一條記錄,則不能再請求當(dāng)前頁的信息, totalPages不能代表服務(wù)器端的總頁數(shù)
2.Ajax 刪除要實現(xiàn)的功能:
1. 彈出confirm(): 確 定要刪除嗎?
2. 若點擊"否", 則文本框或下拉框的值恢復(fù)為剛才的默認(rèn) 值: 使用隱藏域.
3. 若點擊"是", 進(jìn)行ajax 刪除
4. 若 員工信息有外鍵關(guān)聯(lián)時,注 意:通過 ajaxError 函數(shù)進(jìn)行提示,彈出“不能刪除該記錄”
關(guān)鍵代碼:
4.查看員工的詳細(xì)信息
這樣的功能實現(xiàn)在現(xiàn)在來說,已不難實現(xiàn),我實現(xiàn)了一下,不難!還用了下插件!顯示Employee 的頭像!
員工的錄入和查詢(帶 條件查詢)
今天做的是員工信息錄入和服務(wù)器端的驗證,目標(biāo)是使用jQuery更熟悉,掌握分頁設(shè)計,更好理解Hibernate的一些以前未用過的類中的一些方法。
一. 員工的錄入,并進(jìn)行驗證
1.顯示員工的錄入頁面
1.用jQuery 的validator 為表單做前臺驗證
2.對登錄名的Ajax 校驗
3.使用jQuery 的blockUI 插件提示Ajax 操作
4.錄入員工信息
2.服務(wù)器端的簡單驗證
1.使用struts的validator框架
2.以email為例,email非空,且符合email格式
3.員工錄入服務(wù)器端的復(fù)雜驗證
1.數(shù)據(jù)庫,EmployeeAction中,得到登錄名
2.對登錄名的可用性進(jìn)行驗證,驗證登錄名在數(shù)據(jù)庫中是否存在
3.這時可以采用struts的聲明式異常
4.使用py4j 解決把漢字轉(zhuǎn)為對應(yīng)的拼音: 佟剛--> tg, 張孝祥--> zxx, 黎活明--> lhm
二.員工的查詢
1.顯示員工信息:AJAX分頁
使用displaytag 分頁顯示員工信息,記 錄不超過百萬條。簡單,使用。比如OA。
1.在tomcat的webapps目錄下展示其實例。
2. OpenSessionInView:
1使用OpenSessionInView
若Hibernate中某一個類的引用屬性(也 包括集合屬性)采取懶加載策略,則可能出現(xiàn)懶加載異常,但沒有對其懶加載屬性進(jìn)行初始化,此時關(guān)閉Session,然后再來獲取屬性,就會異常
聲明使用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可以解決這個問題,因為OpenSessionInView的使用流程是:
request à open session 并開始transaction –>controller à view(jsp)à
2.如何使用:
在web.xml配置:
3.缺點:
如果流程中的某一步被阻塞, 而這期間的 connection 卻一直被占用不被釋放. 例如輸出頁面時, 一方面可能是頁面內(nèi)容大, response.write的時間長; 另一方面可能是網(wǎng)速慢, 服務(wù)器與用戶間傳輸時間久. 當(dāng)大量這樣的情況出現(xiàn)時,就有連接池連接不足, 造成頁面假死現(xiàn) 象. 所以在內(nèi)容多流量大的網(wǎng)站需慎用.
3.翻頁相關(guān)的類:
1.Page: 與具體 ORM 實現(xiàn)無關(guān)的分頁參數(shù)及查詢結(jié)果封裝
2. PropertyFilter: 與具體 ORM 實現(xiàn)無關(guān)的屬性過濾條件封裝類, 主要記錄頁面中簡單的搜索過濾條件
3. HibernateDao: 擴(kuò)展 SimpleHibernateDao, 功能包括分頁查詢, 按屬性過濾條件列表:
1.不帶任何查詢條件時, 需要使用的方法:
--countCriteriaResult
--setPageParameter
--findPage(Page<T> page, Criterion...criterions)
HibernateWebUtils
分頁:
不帶查詢的分頁
employee-list-1.do --> Action --> Service --> DAO
2.查詢條件的翻頁:使用jQuery 的一個thickbox 插件完成查詢頁面的彈出
1.jQuery的分頁插件
2.在獲取第一頁的內(nèi)容以后,如何 把查詢條件帶到第二頁
--把封裝了查詢條件的List放到session域中,下一次從session中取。
--把查詢條件放在隱藏域中
3.攜帶查詢條件
使用jQuery提供的serialize()方法攜帶查詢條件(行不通)
var url = this.href + “&” + $(“:hidden”).serialize();
window.location.href=url;
注意:上述方法在第一次不能起作用: 即不能再第一次把隱藏域中的參數(shù)帶過去, 因為在第一次點擊該鏈接時, href 的屬性值已經(jīng)固定了, 不能再發(fā)生變化,
而第二次點擊時, 因為第一次已經(jīng)改變了該屬性的值, 所以好用
所以必須在第一次點擊該鏈接之前讓 this.href = this.href + "&" + $(":hidden").serialize(); 起作用
解決方案:
$("#criteria").attr("href", $("#criteria").attr("href") + "&" + $(":hidden").serialize());
今天就到這兒,明天continue!
今天接著昨天的整合,由佟老師總指揮,基于xml配置的Action,這涉及struts整合.今天先把登陸實現(xiàn)了,最后使用兩個插件把員工信息錄入功能
實現(xiàn),頁面效果在當(dāng)今還是主流的。
2.服務(wù)器端驗證
1.查詢數(shù)據(jù)庫,得到信息
2.若用戶名不存在,則提示用戶名不存在
errors.add("",new ActionMessage(" "));
若用戶名和密碼不匹配,則提示用戶名和密碼不匹配
若errors.isEmpty()為true,則登陸,并將其保存在session中,
方法:
使用 struts 的聲明式異常來轉(zhuǎn)發(fā)頁面和顯示提示信息.
詳細(xì)解決:
由 EmployeeService 的方法拋出異常, Action 不進(jìn)行處理, 而由 struts 框架根據(jù)當(dāng)前的
action 節(jié)點配置來進(jìn)行相應(yīng)的處理:
如果出現(xiàn)對應(yīng)的異常, 會利用當(dāng)前 excpeption 配置節(jié)點的 key 生成對應(yīng)的 ActionMessage
對象, 再放入 ActionMessages 中,
把頁面派發(fā)到 input 對應(yīng)的頁面中, 在前臺頁面利用 <html:errors
property="key"> 進(jìn)行顯示
4.ReflectUtils類的作用:
1.convertValue:beanUtils1.8提供了DateConverter
2. PropertyUtils: 提供了讀寫 Bean 的屬性的方法
3. fetchElementPropertyToString: StringUtils.join 方法可以把指定集合的元素用分隔符鏈接起來
4. getSuperClassGenricType: ParameterizedType
5.SimpleHibernateDao 類介紹:SimpleHibernateDao<T,PK extends
Serializable> 說明:該類在service層中使用,
T:Dao操作的對象類型
PK:主鍵類型
1.getIdName():
2.distinct(List list):通過 Set 將不唯一的對象列表唯一化,主 要用于 HQL/Criteria
預(yù)加載關(guān)聯(lián)集合形成重復(fù)記 錄, 又不方便使用 distinct 查詢語句時
6.CreateCriteria:
createQuery(String queryString, Object... values)
7. ReflectionUtils
1 convertValue: beanUtils 1.8 提供了 DateConverter
2. PropertyUtils: 提供了讀寫 Bean 的屬性的方法
3. fetchElementPropertyToString: StringUtils.join
方法可以把指定集合的元素用分隔符鏈接起來
4. getSuperClassGenricType: ParameterizedType
8. SimpleHibernateDao:
1. getIdName: ClassMetadata 該類可以獲取到對應(yīng)的 class 的 hbm 配置文件的幾乎所有信息
2. 標(biāo)準(zhǔn)查詢:
-->創(chuàng)建 Criteria 對象: session.createCriteria(clazz);
-->為 Criteria 對象添加查詢條件: criteria.add(criterion);
-->獲取 Criterion 對象: 通過 Restrictions 來獲取
9.struts的導(dǎo)航組件:struts-menu的使用方法:
1. 把 struts-menu.war 文件復(fù)制到服務(wù)器下, 運行
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)背景色問題:
①. 通過 jQuery: 把 left.jsp 頁面的第三個 table 的
style="background-color:lightgrey" 屬性清除
②. 通過修改默認(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.員工錄入前臺驗證,用的是jQuery的插件jquery-validate
5.對輸入的登陸名進(jìn)行ajax驗證:驗證該登錄名在數(shù)據(jù)庫中是否存在。
11.在loginname字段已經(jīng)給出對應(yīng)的“該登錄名已經(jīng)被占用”的基礎(chǔ)上,再一次點擊“提交”按鈕,則需要進(jìn)行服務(wù)器端驗證,再返回錄入頁面
12.若驗證都通過,則需要進(jìn)行服務(wù)器端的驗證。
13.員工的錄入操作:
1). 顯示員工的錄入頁面
①. 查詢數(shù)據(jù)庫, 獲取所有的部門信息和職位信息, 并在頁面上加以顯示
②. 頁面使用 jQuery 的 validator 插件作為表單的前臺驗證
1. 在當(dāng)前 jsp 頁面中導(dǎo)入 jquery.validate.js
2. 為需要驗證的字段添加 class 屬性, 在其中指定驗證規(guī)則, 獲取添加 minlength 等屬性
今天就到此了!
SVN版本控制
今天有毛偉老 師講版本控制,版本控制(Revision control)是維護(hù)工程藍(lán)圖的標(biāo)準(zhǔn)做法,能追蹤工程藍(lán)圖從誕生一直到定案的過程,確保由不同人員所編輯的同一文 件檔案都能得以同步。最新的Spring3.0已經(jīng)提供了更高級的版本控制,但是國內(nèi)沒幾個用,先掌握SVN,以后有機(jī)會再用高級的。下面詳細(xì)總結(jié) 一下:
1.Subversion介紹:是一種開放源碼的全新版本控制系統(tǒng)。是新一代的版本控 制工具,他不但提供了常見的比較、修補(bǔ)、標(biāo)記、提交、回復(fù)和分支等功能,適于 Web 開發(fā)和其他 在傳統(tǒng)方式下未采納版本控制功能的領(lǐng)域
2.svn安裝
1.運行svn的server端,運行setup.exe,就OK
檢驗安裝好了:
運行dos窗口 ,輸入svn ,回車,出現(xiàn)svn help 提示,安裝成功
2.svn服務(wù)器啟動(我安裝目錄:D:"Program Files"Subversion"bin)
cmd:
svn根目錄 svnserve -d 即D:"Program Files"Subversion"bin>svnserve –d
是否啟動成功
.當(dāng)前是否啟動3690端口號
3.版本庫目錄介紹:
dav目錄:是提供給Apache與mod_dav_svn使用的目錄,讓它們存儲內(nèi)部數(shù)據(jù),當(dāng)前我們使用的版本沒有這個目錄(與你下載的Subversion版 本有關(guān)系)。
db目錄:就是所有版本控制的數(shù)據(jù)存放文件。
hooks目錄:放置hook腳本文件的目錄。
locks目錄:用來放置Subversion文件庫鎖定數(shù)據(jù)的目錄,用來追蹤存取文件庫的客戶端。
format文件是一個文本文 件,里面只放了一個整數(shù),表示當(dāng)前文件庫配置的版本號。
conf目錄:是這個倉庫的配置文件(倉庫的用戶訪問帳號、權(quán)限等)。
4.創(chuàng)建版本庫、導(dǎo)入、檢出
1、創(chuàng)建版本庫
右鍵--->TortoiseSVN--->Create repository here
2.導(dǎo)入
右鍵--->TortoiseSVN--->導(dǎo)入(一般在項目創(chuàng)建初始化數(shù)據(jù)時使用,當(dāng)然也可用于把任意文件或目錄從外部導(dǎo)入到指定倉庫中)
3.檢出(提醒:檢出項目后客戶端文件夾 的變化.svn)
右鍵--->SVN Checkout...
5.SVN基本功能:
清理、更新到指定版本
日志記錄、提交日志限定必填。
鎖定、解鎖:基本權(quán)限控制(可以限制被鎖定的文件只能由被鎖定用戶修改提交)
誤刪除恢復(fù)操作:直接重更新或通過日志列表
單個文件過濾:選中文件-->TortoiseSVN---->增加到忽略列表
導(dǎo)出:使項目脫離版本控制。
6.總結(jié)SVN的使用:
在其文件夾上右鍵 "SVN Checkout..."寫上對應(yīng)SVN地址
在其文件夾上右鍵 "SVN Update" 來更新我們的本地版本
在其文件夾上右鍵 "SVN Commit" 來提交我們的本地版本
在其文件夾上右鍵 "TortoiseSVN" --> "Export..." 來 發(fā)布、導(dǎo)出
在其文件上右鍵 "TortoiseSVN" --> 增加(A)" 來向版本庫中增加一 個受版本控制的文件
7.關(guān)于SVN的各種顏色提示說明:
CVS客戶端的使用基本上同SVN客戶端一樣,更簡單些,就不多說了