訪問值棧中的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)險。
下面就來實(shí)現(xiàn)在線支付吧,首先提出請求,如果通過,會得到賬號和密鑰
我們要做的事有兩項(xiàng)
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):其實(shí)就是一個http路徑
2.接收支付網(wǎng)關(guān)返回的支付結(jié)果信息
第一次使用瀏覽器重定向技術(shù),
把支付信息發(fā)送給:http://www.itcast.cn/re.do?id=21432&result=1
2.相關(guān)知識點(diǎn):
一.接入方式:兩種接入方案
①.直接與銀行對接
優(yōu)點(diǎn):因?yàn)橹苯优c銀行進(jìn)行財務(wù)結(jié)算,交易資金結(jié)算比較安全
缺點(diǎn):開發(fā)工作量比較大,而且銀行會不定期升級交易系統(tǒng),隨著銀行系統(tǒng)的升級,企業(yè)也需要作相應(yīng)改動,所以維護(hù)工作量也是比較大的,而且企業(yè)每年還需要向銀行交納一定數(shù)量的接口使用費(fèi)。
②.通過中間公司間接與銀行對接
優(yōu)點(diǎn):開發(fā)工作量較少,因?yàn)槭褂玫氖侵虚g企業(yè)提供的接入規(guī)范,所以銀行升級系統(tǒng),不需要企業(yè)作相應(yīng)修改,除非中間企業(yè)的接入規(guī)范發(fā)生了改變,企業(yè)才作相應(yīng)修改。
缺點(diǎn):因?yàn)槭桥c中間企業(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
心得體會:具體點(diǎn)
責(zé)任描述:多寫,詳細(xì),寫開發(fā)難點(diǎn),描述清楚,介紹清楚
對某一模塊詳細(xì)描述,對難點(diǎn)的解決過程
描述自己負(fù)責(zé)的模塊,抓住一點(diǎn),詳細(xì)說,千千不要泛泛而談
不能寫培訓(xùn)經(jīng)驗(yàn)
三好學(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
如果我們老老實(shí)實(shí)干半年,編碼能力就會沒問題
工作經(jīng)驗(yàn):
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的什么項(xiàng)目
項(xiàng)目針對那些手機(jī)型號的手機(jī)HTC
如何適應(yīng)各個分辨率的問題,大分辨率靠前
ContentProvider(難度),共享數(shù)據(jù)
聯(lián)系人(如何獲取聯(lián)系人)
Activity的生命周期:運(yùn)行 暫停 停止
前臺生命周期
完整生命周期
意圖:隱式,顯式
組件:廣播,內(nèi)容提供者,Service 四大組件
MMI:多媒體接口
SQLite:數(shù)據(jù)庫訪問
項(xiàng)目開發(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ù),以驗(yàn)證是否正確,若正確的話,第一步完成
下面是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)鍵代碼點(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
①:新建一個繼承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)部實(shí)際上是使用了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)用戶點(diǎn)擊保存按鈕時,就激發(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(浮點(diǎn)數(shù)字)、TEXT(字符串文本)和BLOB(二進(jìn)制對象)數(shù)據(jù)類型,雖然它支持的類型只有五種, SQLite最大的特點(diǎn)是你可以保存任何類型的數(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類實(shí)現(xiàn)增刪改查,和我們以前的用JDBC實(shí)現(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實(shí)現(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相同。
第二步:編寫單元測試代碼(選擇要測試的方法,右鍵點(diǎn)擊“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解析器。
最后,
巴巴運(yùn)動網(wǎng),好好學(xué)習(xí)權(quán)限和優(yōu)化等技術(shù),面試特別有幫助
今天是黎老師的3G應(yīng)用開發(fā)Android項(xiàng)目的第一天,Android相當(dāng)火,從事Android開發(fā)的人員不太多,接下來開始Android之旅。
1.3G簡介:
3G,即3rd Generation,目前中國聯(lián)通使用的是WCDMA,中國電信使用的是CDMA2000 中國,移動使用的是具有自主知識產(chǎn)權(quán)的TD-SCDMA,3G的最大優(yōu)點(diǎn):速度上的提升
2.wml標(biāo)簽,比Html標(biāo)簽簡單,1-2天就可以搞定,工作中用到再學(xué),因?yàn)樗?/span>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ī)平臺,因?yàn)槲覀兏?/span>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)的對話框里,點(diǎn)擊Add按鈕,在對話框的name一欄輸入“ADT”, 然后點(diǎn)擊Archive...,瀏覽和選擇已經(jīng)下載的ADT插件壓縮文件。
點(diǎn)擊 OK.。返回可用軟件的視圖,你會看到這個插件,然后選擇Developer Tools (會選中下 面的“Android Developer Tools”和 “Android Editors“),點(diǎn)擊 Next,最后重啟 Eclipse。
③.下載Android SDK:
http://dl.google.com/android/android-sdk_r04-windows.zip
下載完SDK后,把.zip文件解壓到你電腦上合適位置。啟動 Eclipse,選擇window->preferences, 在打開的視圖左邊點(diǎn)擊android,在右邊的SDK Location中選擇Android SDK所在位置。
6.開發(fā)Android的第一個應(yīng)用:
1.點(diǎn)擊工具欄上手機(jī)形狀的虛擬設(shè)備管理器(簡稱“AVD“)
2.在打開的虛擬設(shè)備管理器中創(chuàng)建一個虛擬手機(jī)
3.在項(xiàng)目上右鍵點(diǎn)擊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 項(xiàng)目環(huán)境信息,一般是不需要修改此文件中
10.短信發(fā)送器
注意:因?yàn)閼?yīng)用要使用手機(jī)的短信服務(wù),所以要在清單文件AndroidManifest.xml中添 加短信服務(wù)權(quán)限:
11.通知
關(guān)于這些東西,還是看看文檔,拷過來運(yù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是著名的開放源碼的站點(diǎn)sourceforge一個項(xiàng)目, 是用于生成 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è)置的單元格, 表格就會出錯. 此時表格不會添加到文檔中, 并且沒有任何提示
三.面試
老佟給我們找了一個簡歷,介紹了一些面試的注意點(diǎn),要點(diǎn):
1.符合自身?xiàng)l件,各種技術(shù)。
2.最好寫點(diǎn)權(quán)限設(shè)計,Compass+Lucene實(shí)現(xiàn)全文搜索,流程采用JBPM管理。
3.項(xiàng)目三個:小湯的OA和老佟的權(quán)限整合為一個項(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)限看了不少的源代碼,感覺蠻難的,不過今天只是初步介紹,還有時間再學(xué)習(xí)一下!
1.員工信息的修改
1.struts對表單信息的回顯
2.對可以進(jìn)行修改的字段
1.當(dāng)該字段值發(fā)生改變時,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入門
需 求: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)麻煩,每次都要配置不少信息。下面 有更好的實(shí)現(xiàn),即
把需要攔截的url,權(quán)限,用戶信息放到放數(shù)據(jù)庫中,實(shí)現(xiàn)如下:
1.實(shí)體類:
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.實(shí)現(xiàn)把用戶信息,權(quán)限信息存放到數(shù)據(jù)庫中
1. 實(shí)現(xiàn)把用戶信息, 權(quán)限信息存放到數(shù)據(jù)庫中
1). 自定義 UserDetailsService 接口的實(shí)現(xiàn)類, 將該類配置到 Spring 的 IOC 容器中, 并在
<authentication-provider user-service-ref=""> 節(jié)點(diǎn)的 user-service-ref 屬性中引用該 Bean.
2). 通過 debug 查看 UserDetailsService 接口的實(shí)現(xiàn)類返回的 UserDetails 對象
4. 實(shí)現(xiàn)資源信息存放到數(shù)據(jù)庫中: 訪問資源時, spring-security 能區(qū)分出訪問該資源需要哪些權(quán)限
1). 自定義 ObjectDefinitionSource 接口的實(shí)現(xiàn)類, 將該類的實(shí)例裝配給 FilterSecurityInterceptor 的 objectDefinitionSource 的 屬性.即可實(shí)現(xiàn)自定義的資 源獲取.
2). 通過繼承 DefaultFilterInvocationDefinitionSource 類的方法定義 ObjectDefinitionSource 接口的實(shí)現(xiàn)類有困難, 因?yàn)?/span> 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 實(shí)例.
4). 通過 FactoryBean 在 IOC 容器中注冊 DefaultFilterInvocationDefinitionSource 實(shí)例