
2010年4月1日
巴巴運動網的權限模塊總結
因為巴巴運動網的權限設計模塊對我來說,可以實現,打算好好整理一下思路,面試時說不定還能起點作用,看了兩遍,自己總結下:
權限定義/權限組(角色)模塊
1.對系統的所有功能定義相應的權限
2.由網管針對不同部門不同員工分配權限組(角色),在分配角色時,
可以選擇該角色具有的權限
3.權限攔截模塊
具體步驟:
1.設計權限實體
聯合主鍵(SystemPrivilegePK),該類有module和privilage兩個屬性
2.初始化權限
3.設計權限組(角色)PrivilegeGroup實體,如果我們希望通過修改權限組添加或刪除權限,那么權限和角色之間的多對多關系的維護端由角色來維護
private String groupid;
private String name;
private Set<SystemPrivilege> privileges = new HashSet<SystemPrivilege>();
同時加上到數據庫表的映射
當然由于權限和角色之間的多對多關系是雙向關聯,所以要在SystemPrivilege實體bean中加上和PrivilegeGroup實體Bean之間的映射
4.實現權限組的添刪改
路徑:/control/
新建接口PrivilegeGroupService,繼承Dao<PrivilegeGroupService>,
新建PrivilegeGroupService,繼承DaoSupport
當然這些Bean都需要交給Spring管理,加上相應的注解即可
5.實現權限組的分頁,這個簡單
6.實現添加權限,分頁列表上的Action,新建Action,名稱為PrivilegeGroupManageAction,
①.第一個方法是AddUI,主要是顯示頁面
接下來就是增刪該操作了(...)
7.權限做完后要新建一個Action用于完成SystemPrivilege,權限組,超級管理員的初始化,初始化完成后點擊“確定”,進入登陸頁面
權限模塊的核心: 權限攔截模塊
1.員工要訪問control開頭的路徑,必須登陸,即粗粒度的權限攔截,這是通過Fileter實現的,這里我們定義為PrivilegeFilter,先從session范圍中得到employee對象,如果對象為空,就瀏覽器重定向到登陸界面,,如果登陸了,就chain.doFilter(request,response);之后在web.xml配置,這樣就實現粗粒度的權限控制了3
2.對于界面上的某些功能,不是每一個登陸到系統的員工對頁面的功能都有操作權限,這就是細粒度的權限攔截
關鍵是怎樣細粒度的權限控制
怎樣實現細粒度的權限控制?
每點擊頁面上的按鈕,都會提交給相應的Action處理,細粒度的權限攔截就是對Action攔截,在不修改原代碼情況下,增加攔截代碼,使用的是AOP技術
每一個功能Action都有相應的方法處理,我們用JDK5中的注解為Action中的方法注解相應的權限,因為我們有時會修改方法名稱,用注解維護起來比較方便比如:
@Permission(module="order",privilege="modify")
public ActionForward OrderModify(){}
實現過程:
①.新建注解Permission,
@Retention(PetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface Permission{
String module();
String privilege();
}
為Action中的方法,加上注解
只有攔截到Action中的這個方法,才能實現權限攔截,現在我們的Action已經交給Spring管理,所以我們可以使用Spring的AOP技術進行權限攔截,有必要復習一下AOP的知識:
在Action類上加一個注解如下:@Aspect,當然要使這個注解起作用,我們必須在Spring的配置文件里配置:
<aop:aspectj-autoproxy> <!--注解解析器-->
要實現切面編程,抽象過程體現在代碼上, 就是一個采用類來描述,要是這個類起作用,我們必須要把它交給Spring管理,很郁悶
@Aspect@Component
public class Interceptor{
@Pointcut("exception(org.apache.struts.action.ActionForward cn.itcast.web.action.. * *(org.apache.struts.actionMapping,...))")
private void actionMethod(){}
@Around("actionMethod")
public Object interceptor(ProceedingJoinPoint pjp) throw Throwable{
System.out.println("攔截到了"+pjp.getSignature().getName()+"方法");
return pjp.proceed();
}
}
注意:
通知:
前置通知,在攔截的方法前加通知,這個通知執行后,被攔截的方法仍然會執行。
所以使用環繞通知,但是這樣的攔截只能是攔截Action實現的,他不能攔截繼承自DispatchAction
原因:Spring的動態代理技術的問題
Spring不能對通過反射調用的方法應用上通知(Advice)
當Spring發現我們的繼承的DispatchAction的那個類符合他攔截的要求,就會生成一個代理對象,因為無接口,默認使用cglib為這個Action生成代理對象,根據cglib生成代理對象的特點,繼承目標類,并且重寫所有非final的方法來實現
注:spring只會為本類定義的方法應用通知
posted @
2010-04-01 07:10 d66380022|
編輯 收藏

2010年3月25日
今天初步學習了一下Struts2,對于Struts2,企業中已應用十分廣泛,由于他是在Struts基礎上發展而來,技術上比struts高,比如
struts2對同一個路徑的每個請求分別使用一個獨立Action實例對象,所有使用struts2不用考慮線程安全問題,還有就是修改下配置文件,不用重啟服務器
1.struts2的建立過程:
配置過程:
1.新建web項目
2.導入struts2類庫. [blank項目中含有最少的jar文件]
3.配置web.xml
<filter>[...SrutsPrepareAndExecuteFilter]
4.寫Action類
public class HelloWorldAction {
public String execute(){
System.out.println("hello world!");
try {
ServletActionContext.getResponse().getWriter().printf("hello!");
} catch (Exception e) {
e.printStackTrace();
}
return null ;
}
}
5.創建struts.xml
①.struts2默認在類路徑下查找struts.xml文件
關于struts.xml配置,可以參看struts2-blank-2.1.8.1.war解壓后的配置
設置環境為開發模式.設置為開發模式,有利于編程和調試,
<constant name="struts.devMode" value="true" />
3.讓struts.xml中的Package繼承struts-default.xml中的默認包.
所有的默認包中的元素配置就引入進來.
4.配置默認值.
<action name="HelloWorldAction" class="cn.itcast.struts2.helloworld.HelloWorldAction">
<result name="success">
<param name="location">/index.jsp</param>
</result>
</action>
5.strtus2中的action不是單例的,它會為每個請求單獨分配一個action實例,所以可以在action類中聲明實體屬性.
Struts2的Action是模型層,不是控制層,原因它是需要攜帶業務數據的.
6.struts2中的攔截器是負責每個獨立的一項任務.例如,參數傳遞,國際化,異常處理,StrutsPrepareAndExecuteFilter是Struts 2框架的核心控制器,它負責攔截由<url-pattern>/*</url-pattern>指定的所有用戶請求,當用戶請求到達時,該Filter會過濾用戶的請求。
7.在struts2的jsp中輸出數據,借助于struts-tag.tld標簽庫.該庫在[struts-core.jar/META-INF/struts-tag.tld,但是其重要作用還是用于回顯數據
8.Struts2可以數據的范圍:ActionContext request session application
ActionContext是數據中心,ValueStack不過是該數據中心中的一個特殊對象.
在jsp中訪問ActionContext中的數據的話,可以使用OGNL語言.
9.struts2中包的名字空間搜索原則:
1.<package name="xxPkg">
2.<package name="xxPkg" namespace="">
3.<package name="xxPkg" namespace="/">
4.<package name="xxPkg" namespace="/HelloWorld">
1.和2.效果一樣,都是默認的包.
2.都會自后向前搜索,直到找到為止,"/" 和 "/HelloWorld"唯一不同就是也可以作為搜索目錄.
3.空包是默認包,如果每個包都沒有找到相應的action的話,就去默認包下去找.
10.struts2中進行動態方法調用.
http://localhost:8085/struts2/Hell/HelloWorldAction!toRewView.do
11.struts2中使用標簽庫
<s:form action="HelloWorldAction_doReg" [namespace=""]>
<s:textfield name="name" label="UserName" />
<s:submit />
</s:form>
namespace:如果不寫,會使用當期的名字空間.
struts給的所有控件標簽,主要目的用于回顯數據.
12.struts2中進行基本的校驗,需要Validateable和ValidationAware兩個接口的支持,同時還需要
workflow攔截器的支持.
13.在struts2中,默認的表達式語言是OGNL,Object Graphic Navigation Language(對象圖導航語言)的縮寫,它是一個開源項目。 Struts 2框架使用OGNL作為默認的表達式語言。相對EL表達式,它提供了平時我們需要的一些功能,如:支持對象方法調用,支持類靜態方法調用和值訪問,操作集合對象。例如():
訪問值棧中的action的普通屬性: username = <s:property value="username"/>
由于下午有公司來面試,耽誤了一些時間,老徐說明天再多補一個小時,太敬業了啊,佩服!
posted @
2010-03-25 16:39 d66380022|
編輯 收藏

2010年3月24日
在線支付時針對易寶支付的網關而開設的,眾所周知,易寶已是三大網上支付平臺之一,正好明天易寶來招聘,正好練練,呵呵,下午是面試技巧
好好學習,畢業倒計時:15天
1.支付寶是不能立即拿到現錢的,這也是商家喜歡在線支付的一個原因吧,在線支付是直接和銀行對接的,這樣商家可以立即拿到現錢,避免了和買家產生矛盾后,錢被封的風險。
下面就來實現在線支付吧,首先提出請求,如果通過,會得到賬號和密鑰
我們要做的事有兩項
1.向支付網關發起請求,就是向http發起請求,所謂請求就是我們平常使用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位,不可逆
支付網關:其實就是一個http路徑
2.接收支付網關返回的支付結果信息
第一次使用瀏覽器重定向技術,
把支付信息發送給:http://www.itcast.cn/re.do?id=21432&result=1
2.相關知識點:
一.接入方式:兩種接入方案
①.直接與銀行對接
優點:因為直接與銀行進行財務結算,交易資金結算比較安全
缺點:開發工作量比較大,而且銀行會不定期升級交易系統,隨著銀行系統的升級,企業也需要作相應改動,所以維護工作量也是比較大的,而且企業每年還需要向銀行交納一定數量的接口使用費。
②.通過中間公司間接與銀行對接
優點:開發工作量較少,因為使用的是中間企業提供的接入規范,所以銀行升級系統,不需要企業作相應修改,除非中間企業的接入規范發生了改變,企業才作相應修改。
缺點:因為是與中間企業進行資金結算,目前所有中間企業都是私企,資金安全是個大問題。
3. 對支付數據進行Md5加密
4. 支付流程:
通過http請求方式向易寶支付網關發起一個支付請求,請求可以是get或post方式提交。
易寶支付網關對企業發來的數據使用用戶的密鑰生成MD5-hmac碼,然后跟企業發來的MD5-hmac碼(即上面表單由hmac字段提供的值)比較是否相同,如果相同即把請求轉發到銀行網關,當用戶支付完成后,銀行網關會引導用戶的瀏覽器重定向到易寶支付網關,然后易寶支付網關再引導用戶的瀏覽器重定向到企業提供的url(即上面表單由p8_Url提供的地址)
接下來我們只需處理結果了
下午是面試技巧:
薪水:一定要寫 ,不要寫區間 4000
心得體會:具體點
責任描述:多寫,詳細,寫開發難點,描述清楚,介紹清楚
對某一模塊詳細描述,對難點的解決過程
描述自己負責的模塊,抓住一點,詳細說,千千不要泛泛而談
不能寫培訓經驗
三好學生,寫一等獎學金是應屆的
愛好還是要寫的
身份證不能造假,教育經歷,通常企業篩選簡歷過程:
從1-2千封中選,讓前臺做/人力去篩選簡歷,要求:
A.只提取兩年工作年限以上(一般企業都是這樣干的)
B.連人力都能判斷出造假的簡歷,排除
C.經過人力,剩下100封
D.面試官
88年可以寫兩年,教育經歷:把畢業信息提前,證書造假
簡歷上可適當造假
薪水:
寫2年,月薪(北京,上海,廣州):
初級:3000 – 4000
4500 -- 8-12
中級:4500 – 6000
7K 其中5K-6K比較多 --
高級:7000 –
1.2W (3-5)
從事Android,薪水如下:
Android 2年 最長就2年
原來做過j2se開發3-4年 8K-1.2W
android 3個月(j2ee 1-2)6K
Android 干半年 4.5K
如果我們老老實實干半年,編碼能力就會沒問題
工作經驗:
1.為什么離職?
我在深圳那邊4K,也不知道北京這邊的行情。
2.當公司準備要你的時候,會讓你填以前公司的地址信息,聯系人信息
造假唄,找個外地的同學
3.入職后,離職證明,隨便蓋個章,離職證明模版網上有一大堆
新公司不想惹麻煩,已經和原來公司解除了勞動合同
4.關于android面試
基礎:
多線程(并發控制),Socket通信,http通信
android:
android的什么項目
項目針對那些手機型號的手機HTC
如何適應各個分辨率的問題,大分辨率靠前
ContentProvider(難度),共享數據
聯系人(如何獲取聯系人)
Activity的生命周期:運行
暫停 停止
前臺生命周期
完整生命周期
意圖:隱式,顯式
組件:廣播,內容提供者,Service
四大組件
MMI:多媒體接口
SQLite:數據庫訪問
項目開發
3人
2-3月
公司部門 人員
研發部/技術部 50-60人
測試部 8-10人
客服部/售后服務
市場部
行政部
posted @
2010-03-24 00:49 d66380022|
編輯 收藏

2010年3月20日
今天學習從網上獲得數據,以xml文件輸出。流程:android客戶端 -----已經開發好的CRM(220.113.15.23)
-----[客戶資料]--à屏幕
用的是struts1.3的環境
1.搭建環境
1.web.xml配置struts servlet
2.添加jar
3.復制struts-config.xml
環境搞定后,新建jsp文件,寫好文件頭:<?xml
version="1.0"
encoding="UTF-8"?> 注意
接著新建一個ContactAction
最后配置struts-config.xml文件
新建contact.jsp文件,得到數據
訪問路徑,測試得到的數據,以驗證是否正確,若正確的話,第一步完成
下面是Android應用
2 .①.設計要顯示的界面
②.新建service,可以調用
關鍵代碼:
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();
在該類中還應該新建sax解析方法,解析文檔,保存數據
③.新建android測試類,以日志形式打印出xml文件中的數據
3.應用HttpURLConnection對象,我們可以向網絡發送請求參數.下面以POST發送為例,寫一些關鍵代碼點
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. 為應用添加新的Activity
①:新建一個繼承Activity的類
②:需要在功能清單AndroidManifest.xml文件中添加進上面Activity配置代碼
打開新的Activity,不傳遞參數
通過意圖打開Activity,Intent,用于激活Activity的,在組件之間傳遞數據
在新的Activity中接收前面Activity傳遞過來的參數:
添加參數的另一種方法:Bundle
Bundle類用作攜帶數據,它類似于Map,用于存放key-value名值對形式的值。相對于Map,它提供了各種常用類型的putXxx()/getXxx()方法, putXxx()用于往Bundle對象放入數據,getXxx()方法用于從Bundle對象里獲取數據。Bundle的內部實際上是使用了HashMap<String,
Object>類型的變量來存放putXxx()方法放入的值:
5. Intent過濾器
Android鼓勵減少組件間的耦合,因此Android提供了Intent (意圖) ,Intent提供了一種通用的消息系統,它允許在你的應用程序與其它的應用程序間傳遞Intent來執行動作和產生事件。使用Intent可以激活Android應用的三個核心組件:活動、
服務和廣播接收器。
Intent可以劃分成顯式意圖和隱式意圖。
posted @
2010-03-20 23:30 d66380022|
編輯 收藏

2010年3月17日
使用SharedPreferences進行數據存儲,是專門用來向用戶提供軟件參數設置功能,
1.
SharedPreferences類,它是適合用于保存軟件配置參數。使用SharedPreferences保存數據,其背后是用xml文件存放數據。
2. SharedPreferences使
用xml文件保存
數據,getSharedPreferences(name,mode)方法的第一個參數用于指定該文件的名稱,不用帶后綴,后綴由Android自動加上,方法的第二個參數指
定文件的操作模式,共有四種操作模式。
3.設置軟件參數過程:
①.當用戶點擊保存按鈕時,就激發保存事件
在Activity中的匿名內部類中,得到用戶輸入值
需要注意的是:android.content.SharedPreferences.Editor用于保存參數,該editor最后要commit一下。
最后要Toast.makeText(PreferencesActivity.this,
"保存參數成功",
1).show();用于提示保存參數成功
②.如果訪問其他應用中的Preference,前提條件是:該preference創建時指定了Context.MODE_WORLD_READABLE或者Context.MODE_WORLD_WRITEABLE權限。如:有個<package
name>為cn.itcast的應用使用下面語句創建了preference。
getSharedPreferences("itcast",
Context.MODE_WORLD_READABLE);
其他應用要訪問上面應用的preference,首先需要創建上面應用的Context,然后通過Context 訪問preference ,訪問preference時會在應用所在包下的shared_prefs目錄找到preference :
Context
otherAppsContext = createPackageContext("cn.itcast",
Context.CONTEXT_IGNORE_SECURITY);
4. 使
用SQLite數
據庫存儲數據
在Android平臺上,集成了一個嵌入式關系型數據庫—SQLite,SQLite3支持 NULL、INTEGER、REAL(浮點數字)、TEXT(字符串文本)和BLOB(二進制對象)數據類型,雖然它支持的類型只有五種,
SQLite最大的特點是你可以保存任何類型的數據到任何字段中,無論這
列聲明的數據類型是什么。SQLite可以解析大部分標準SQL語句。
5.開發3g數據庫
軟件需求:
①.用戶初次使用軟件,初始化數據庫
②.用戶升級軟件,自動更新數據庫
為此,類對應提供了兩個重要的方
法,分別是onCreate(SQLiteDatabase db)和onUpgrade(SQLiteDatabase
db, int oldVersion, int newVersion),
6.利用繼承自SQLiteOpenHelper的DatabaseHelper類實現增刪改查,和我們以前的用JDBC實現的增刪改查語法基本一樣,舉例:
SQLiteDatabase
db
= ....;
db.execSQL("insert
into person(name,
age) values(?,?)", new Object[]{"傳智播客",
4});
db.close();
需要注意的是SQLiteDatabase的rawQuery()
用于
執行select語句
7.將數據動態顯示在手機屏幕上,用SimpleAparter實現
今天到此結束!
posted @
2010-03-17 23:53 d66380022|
編輯 收藏

2010年3月16日
3G的第二天,單元測試,老黎講的東西當天基本可以掌握,很喜歡
1.單元測試步驟:
第一步:首先在AndroidManifest.xml中加入下面紅色代碼:
①.在<application>中加入:
<uses-library android:name="android.test.runner" />
②.在最后的標簽前加上:
<instrumentation
android:name="android.test.InstrumentationTestRunner"
android:targetPackage="cn.itcast.action"
android:label="Tests for My App" />
注意:上面targetPackage指定的包要和應用的package相同。
第二步:編寫單元測試代碼(選擇要測試的方法,右鍵點擊“Run As”--“Android Junit Test” ):
2.數據存儲和訪問
軟件需要對處理后的數據存儲,Android為數據存儲提供了5種方式:
文件,SharedPreferences,SQLite數據庫,內容提供者(Content provider),網絡
使用文件對數據進行存儲,Activity提供了openFileOutput()方法可以用于把數據輸出到文件中。openFileOutput()方法的第二參數用于指定操作模式,有四種模式,分別為:
Context.MODE_PRIVATE
Context.MODE_APPEND
Context.MODE_WORLD_READABLE
Context.MODE_WORLD_WRITEABLE
3.SAX解析XML
SAX是一個解析速度快并且占用內存少的xml解析器,解析采用的是事件驅動,這些方法定義在ContentHandler接口中,下面是一些ContentHandler接口常用的方法:
startDocument()
當遇到文檔的開頭的時候,調用這個方法,可以在其中做一些預處理的工作。
endDocument()
和上面的方法相對應,當文檔結束的時候,調用這個方法,可以在其中做一些善后的工作。
startElement(String
namespaceURI, String localName, String qName, Attributes atts)
當讀到一個開始標簽的時候,會觸發這個方法。
endElement(String
uri, String localName, String name)
這個方法和上面的方法相對應,在遇到結束標簽的時候,調用這個方法。
characters(char[]
ch, int start, int length)
這個方法用來處理在XML文件中讀到的內容,第一個參數為文件的字符串內容,后面兩個參數是讀到的字符串在這個數組中的起始位置和長度,使用new String(ch,start,length)就可以獲取內容。
4.使用Pull解析器讀取XML文件
如果需要生成一個XML文件,生成XML文件的方法有很多,如:可以只使用一個StringBuilder組拼XML內容,然后把內容寫入到文件中;
或者使用DOM API生成XML文件,或者也可以使用pull解析器生成XML文件,推薦使用Pull解析器。
最后,
巴巴運動網,好好學習權限和優化等技術,面試特別有幫助
posted @
2010-03-16 00:29 d66380022|
編輯 收藏
今天是黎老師的3G應用開發Android項目的第一天,Android相當火,從事Android開發的人員不太多,接下來開始Android之旅。
1.3G簡介:
3G,即3rd Generation,目前中國聯通使用的是WCDMA,中國電信使用的是CDMA2000
中國,移動使用的是具有自主知識產權的TD-SCDMA,3G的最大優點:速度上的提升
2.wml標簽,比Html標簽簡單,1-2天就可以搞定,工作中用到再學,因為他是2.5G中用到的技術,如果3G普及的話,這門技術就Over了。
3.智能手機操作平臺
我們學Android操作系統,RIM BlackBerry,黑莓我比較喜歡,但在國內還不怎么流行,
Symbian手機硬件比較好,所以占用很大市場,在3G時代,手機基本上可以當做電腦,用戶更看重手機是否能滿足日常生活和工作的需要。這就好像大多電腦
用戶都安裝了Windows操作系統,很少安裝Linux系統。開發Android的人員的增多,必然會帶來手機軟件的增多,軟件的多少會決定以后操作系統的市場份額,windows mobile比Android,iPhone的界面差遠了。我們關注:Android,iPhone,Symbian智能手機平臺,因為我們搞Java開發,只能學Android了
4.Android資料
買Android手機就買多普達和Moto的,質量好。Android最好的資料是android.pdf。Google Android SDK開發范例大全提供了Android的全部功能,在學完課程之后可以看
5. 開發環境的搭建:
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,在出現的對話框里,點擊Add按鈕,在對話框的name一欄輸入“ADT”, 然后點擊Archive...,瀏覽和選擇已經下載的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.開發Android的第一個應用:
1.點擊工具欄上手機形狀的虛擬設備管理器(簡稱“AVD“)
2.在打開的虛擬設備管理器中創建一個虛擬手機
3.在項目上右鍵點擊run as
?Android application
OK,第一個應用就OK了
7.端口號:127.0.0.1:5554
8.Activity
就像struts中的Action,處理用戶請求,除此之外,Activity還代表一個用戶界面
9. Android應用程序架構
src/ java原代碼存放目錄
gen/
自動生成目錄
gen
目錄中存放所有由Android開發工具自動生成的文件。目錄中最重要的就是R.java文件。 這個文件
由Android開
發工具自動產生的。Android開發工具會自動根據你放入res目錄的xml界面文件、圖標與常量,同步更新修改R.java文件。
res/
資源(Resource)目錄
在這個目錄中我們可以存放應用使用到的各種資源,如xml界面文件,圖片或數據。具體請看ppt下方備注欄。
AndroidManifest.xml
功能清單文件
這個文件列出了應用程序所提供的功
能,相當于struts的config文件,只有配置好后,才能調用此Activity。
default.properties
項目環境信息,一般是不需要修改此文件中
10.短信發送器
注意:因為應用要使用手機的短信服務,所以要在清單文件AndroidManifest.xml中添
加短信服務權限:
11.通知
關于這些東西,還是看看文檔,拷過來運行一下,測試測試看看效果就差不多了。
posted @
2010-03-16 00:20 d66380022|
編輯 收藏

2010年3月13日
一.使用poi
1.參見poi的文檔,添加jar包
2.workbook表示一個Excel文檔
3.下載Excel模版,必須按格式
1.創建workbook對象
2.創建下載Excel文件的第一行
3.從數據庫中讀取到需要的Employee列表
5.利用Servlet Api 對準備好的Excel下載
4.上傳excel
①.配置Action
②.導入兩個jar包commons-io,commons-fileupload.jar
③.上傳
1.根據ActionForm的FormFile屬性讀取上傳數據,獲得Workbook對象
2.讀取Workbook對象中的內容:遍歷Workbook對象除標題行以外的行
3.把每一行都轉換為一個Employee對象
4.調用方法,把Employee對象的集合保存到數據庫中,注意:有可能不能保存,其原因可能違反格式或者違反數據庫的唯一性約束
二.PDF文檔輸出
1.iText介紹:iText是著名的開放源碼的站點sourceforge一個項目, 是用于生成 PDF 文檔的一個java類庫.
2.Pdf 文件輸出的 5 個步驟
1. 創建一個 Document 對象.
public Document()
public Document(Rectangle pageSize): 定義頁面的大小
public Document(Rectangle pageSize, int marginLeft, int marginRight,
int marginTop, int marginBottom): 定義頁面的大小, 后邊的四個參數分別指定左, 右, 上, 下頁邊距
2.建立一個書寫器
(Writer) 與document對象關聯, 通過書寫器(Writer)可以將文檔寫入到磁盤中
3. 打開文檔
4. 在文檔中添加文字
5. 關閉文檔
其中:
①。設定文檔屬性
當新的頁面產生之前, 可以設定頁面的大小、書簽、腳注(HeaderFooter)等信息,調用的方法是:
②。添加文檔內容
所有向文檔添加的內容都是以對象為單位的, 如Phrase、Paragraph、Table等. 比較常用的是段落(Paragraph)對象, 用于向文檔中添加一段文字
③。文本處理
iText中用文本塊(Chunk)、短語(Phrase)和段落(paragraph)處理文本。
文本塊(Chunk)是處理文本的最小單位, 由一串帶格式(包括字體、顏色、大?。┑淖址M成:
注意:在 iText 中沒有行的概念, 一個表格里直接放單元格, 如果一個 3 列的表格中放進 6 個單元格, 那就是兩行的表格. 如果放入 5 個基本的沒有任何跨列設置的單元格, 表格就會出錯. 此時表格不會添加到文檔中, 并且沒有任何提示
三.面試
老佟給我們找了一個簡歷,介紹了一些面試的注意點,要點:
1.符合自身條件,各種技術。
2.最好寫點權限設計,Compass+Lucene實現全文搜索,流程采用JBPM管理。
3.項目三個:小湯的OA和老佟的權限整合為一個項目,網上商城(巴巴運功網),3g,數據采集
OA用到的技術:SSH
jQuery + Ajax
jbpm 完成審批流程
spring-security
lucence :全文檢索
posted @
2010-03-13 23:40 d66380022|
編輯 收藏
接著昨天的實現將攔截的url,權限信息,用戶信息放到數據庫中,并將spring-security集成到項目中
1. 實現資源信息存放到數據庫中:
訪問資源時, spring-security 能區分出訪問該資源需要哪些權限
1. 自定義ObjectDefinitionSource 接口的實現類, 將該類的實例裝配給
FilterSecurityInterceptor 的 objectDefinitionSource 的屬性. 即可實現自定義的資源獲取.
2. 通過繼承 DefaultFilterInvocationDefinitionSource
類的方法定義ObjectDefinitionSource 接口的實現類有困難, 因為
DefaultFilterInvocationDefinitionSource中沒有無參的構造器
3.通過查看 spring-security 核心 jar 包的 META-IN 下 的 spring.handlers 找到
SecurityNamespaceHandler, 在該類中查看
registerBeanDefinitionParser(Elements.HTTP, new
HttpSecurityBeanDefinitionParser()); 方法在
HttpSecurityBeanDefinitionParser 類中可以看到如何創建
DefaultFilterInvocationDefinitionSource 實例.
4. 通過 FactoryBean 在 IOC 容器中注冊
DefaultFilterInvocationDefinitionSource 實例
5. 實現ResourceDetailsService 接口
2.關于MD5加密:
1.網上的關于MD5已經很多了,MD5算法對密碼進行摘要加密,這是一種單項加密手段,無法通過加密后的結果反推回原來的密碼明文。
為了使用MD5對密碼加密,我們需要修改一下配置文件
<authentication-provider>
<password-encoder hash="md5" >
<jdbc-user-service data-source-ref="dataSource" >
< authentication-provider>
上述代碼中新增的黃色部分,將啟用md5算法。
3.管理會話(HttpSession)
多個用戶不能使用同一個賬號同時登陸系統。
添加監聽器
在web.xml中添加一個監聽器,這個監聽器會在session創建和銷毀的時候通知Spring Security。
這種監聽session生命周期的監聽器主要用來收集在線用戶的信息,比如統計在線用戶數之類的事。后登陸的將先登錄的踢出系統默認情況下,后登陸的用戶
會把先登錄的用戶踢出系統。
============================================================================================
集成spring-security框架
1. 集成 spring-security 框架
1. 加入 spring-security 的兩個 jar 包
2. 在 web.xml 文件中加入加入 spring-security 框架的過濾器
3. 新建 applicationContext-security.xml 配置文件,并且把 security 作為默認的命名空間,
并將其導入到 applicationContext.xml 中
4. 設計領域模型:
Authority -- 權限
Resource -- 資源
Role -- 角色
Employee -- 添加 Set<Role> roleSet 屬性
Resource 和 Authority 為多對多的對應關系
Authority 和 Role 為多對多的對應關系
Role 和 Employee 為多對多的對應關系
需要 3 個關聯表
5.
1. 修改當前系統的 login.jsp 頁面, 改為 spring-security 的登錄頁面, 并且在
<http> 節點中進行配置.
注意: spring-security 在登錄成功后, 利用
"重定向" 轉到 form-login 節點對應的 default-target-url 屬性對應的頁面. 所以不能直接將其配置為
WEB-INF 目錄下的任何頁面
2. 新建 UserDetailsService 接口的實現類, 以實現從數據庫中獲取用戶信息(需要查詢 Employee,
Role, Authority, 參見 spring-security-2 的UserDetailsServiceImpl, 基于
Hibernate 實現),并把該類的 Bean 引用裝配給 <authentication-provider> 節點的
user-service-ref 屬性
6. 向 ems_resource_table, ems_authority_table,
ems_resource_authority_table 數據表中添加數據
7. 新建 ResourceDetailsService 接口的實現類,
實現從數據庫中讀取需要被保護的資源信息及其可以訪問這些資源的權限信息
8. 利用 FactoryBean 新建 DefaultFilterInvocationDefinitionSource 接口的
Bean, 并把 ResourceDetailsService 的 Bean 注入進來, 再把該 Bean 配置為
filterSecurityInterceptor 過濾器的 objectDefinitionSource 屬性
2. 實現權限模塊:
1. 實現 Role 的增, 刪, 改, 查
角色的添加:
頁面 UI:
a. 對字段的 jQuery validation 驗證
b. struts validator 驗證 **
c. Action的復雜驗證: 角色名不能重復 **.
d. 角色名的 ajax 驗證, 角色名不能重復 **.
e. 勾選權限時的級聯選擇. 例如: 勾選 "員工刪除" 的同時必須勾選 "員工查詢", 即不能讓用戶只有
"員工刪除" 權限, 而沒有 "員工查詢" 權限.
f. 使用到 Authority 的如下兩個字段: relatedAuthorites(與當前權限關聯的權限信息,
多個權限使用 "," 分隔), parentAuthority(當前權限的父權限)
subAuthorities(當前權限的子權限)
若驗證都通過, 在 Action 中受理請求, 錄入角色
注意:
不能通過以下代碼獲取 parentAuthority 為 null 的 Authority 集合
List list = authorityDao.findBy("parentAuthority", null);
System.out.println(list.size());
而應該使用:
List list = authorityDao.find("FROM Authority auth WHERE
auth.parentAuthority IS null");
為 #select 添加 change 相應事件, 當選取某個父權限時, 子權限顯示
今天就此為止,明天繼續!
posted @
2010-03-13 23:21 d66380022|
編輯 收藏

2010年3月10日
今天主要實現的是員工信息的修改和權限管理基礎,修改用AJAX實現的,權限看了不少的源代碼,感覺蠻難的,不過今天只是初步介紹,還有時間再學習一下!
1.員工信息的修改
1.struts對表單信息的回顯
2.對可以進行修改的字段
1.當該字段值發生改變時,confirm”確定修改該信息嗎?”
點擊”取消”:使該字段恢復為以前的默認值,不做改變,需要使用隱藏域
點擊“確定”:用AJAX改變字段,在配置文件中不需返回任何信息
<script type=”text/javascript”>
$(function(){
$(“:text,select”).change(function(){
var flag = confirm(“確定要修改” +
$(this).prev(“label”).text()+”信息嗎?”);
...
});
}):
</script>
信息
2.集成spring-security 框架
1.
Spring Security 能用
于保護各種 Java 應
用程序(權限管理框架).
2.spring-security入門
需
求:1. Spring-security 應用的根目錄下有兩個 Jsp 頁面: index.jsp 和 admin.jsp. admin 用戶有權限訪問這兩個頁面, 而 user 用戶只能訪問 index.jsp
2.提供”登出”功能
搭建環境:
首先添加spring環境
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 作為默認的命名
空間, 并將其導入到applicationContext.xml 中
applicationContext-security.xml中,有幾種重要配置:
1. 配置 spring-security 的 http 安全屬性
<http
auto-config="true">
2. 配置需要保護那些
資源, 以及訪問這些資源
所需要的權限, 若有多個
權限使用 ',' 分隔
<intercept-url
pattern="/admin.jsp" access="ROLE_ADMIN"/>
<intercept-url
pattern="/index-1.jsp" access="ROLE_USER"/>
3.配置登出服務
<logout
logout-url="/logout"
logout-success-url="/loguot-success.jsp"
invalidate-session="false"
/>
4.配置登錄頁面,
default-target-url:
若直接請求登錄頁面, 那么該屬性配置登錄成功之后的相應頁面
always-use-default-target:
若請求的目標頁面受保護,
則
spring-security 會相應 login-page 屬性對應的頁面, 默認情況下, 若登錄成功將相應剛才請求的目標頁面,
但這相當麻煩,每次都要配置不少信息。下面
有更好的實現,即
把需要攔截的url,權限,用戶信息放到放數據庫中,實現如下:
1.實體類:
Authority
-- 權限
Resource
-- 資源
Role
-- 角色
Employee
-- 添加Set<Role>
roleSet 屬性
2.關系
Resource
和Authority
為多對多的對應關系
Authority
和Role
為多對多的對應關系
Role
和Employee 為多對多的對應關系
所以還需要3 個額外的關聯表
3.實現把用戶信息,權限信息存放到數據庫中
1.
實現把用戶信息, 權限信息存放到數據庫中
1). 自定義 UserDetailsService 接口的實現類, 將該類配置到 Spring 的 IOC 容器中, 并在
<authentication-provider
user-service-ref=""> 節點的 user-service-ref 屬性中引用該 Bean.
2). 通過 debug 查看 UserDetailsService 接口的實現類返回的 UserDetails 對象
4. 實現資源信息存放到數據庫中: 訪問資源時, spring-security 能區分出訪問該資源需要哪些權限
1). 自定義
ObjectDefinitionSource 接口的實現類, 將該類的實例裝配給
FilterSecurityInterceptor 的 objectDefinitionSource 的
屬性.即可實現自定義的資
源獲取.
2). 通過繼承
DefaultFilterInvocationDefinitionSource 類的方法定義 ObjectDefinitionSource
接口的實現類有困難, 因為
DefaultFilterInvocationDefinitionSource
中沒有無參的構
造器, 該構造器有兩個參
數: UrlMatcher
urlMatcher, LinkedHashMap requestMap.
urlMatcher 參數可
以通過 bean 的形式
事先配置, 但 requestMap 參數類似于:
{[/admin.jsp]=[ROLE_ADMIN], [/index.jsp]=[ROLE_USER]}, 需要訪問數據庫才能對其初始化, 但這不可能.
3). 通過查看 spring-security 核心 jar 包的 META-IN 下的 spring.handlers 找到
SecurityNamespaceHandler, 在該類中查看 registerBeanDefinitionParser(Elements.HTTP,
new HttpSecurityBeanDefinitionParser()); 方法
在
HttpSecurityBeanDefinitionParser 類
中可以看到如何創建 DefaultFilterInvocationDefinitionSource 實例.
4). 通過 FactoryBean 在 IOC 容器中注冊 DefaultFilterInvocationDefinitionSource
實例
posted @
2010-03-10 01:00 d66380022|
編輯 收藏