
2010年2月25日
巴巴運動網的權限模塊總結
因為巴巴運動網的權限設計模塊對我來說,可以實現,打算好好整理一下思路,面試時說不定還能起點作用,看了兩遍,自己總結下:
權限定義/權限組(角色)模塊
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|
編輯 收藏
今天初步學習了一下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|
編輯 收藏
在線支付時針對易寶支付的網關而開設的,眾所周知,易寶已是三大網上支付平臺之一,正好明天易寶來招聘,正好練練,呵呵,下午是面試技巧
好好學習,畢業倒計時: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|
編輯 收藏
今天學習從網上獲得數據,以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|
編輯 收藏
使用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|
編輯 收藏
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|
編輯 收藏
一.使用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)是處理文本的最小單位, 由一串帶格式(包括字體、顏色、大小)的字符串組成:
注意:在 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|
編輯 收藏
今天主要實現的是員工信息的修改和權限管理基礎,修改用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|
編輯 收藏
今天主要實現的是員工信息的翻頁設計,用AJAX實現的,接著實現了員工信息的刪除實現,總結
一天的知識,感覺jQuery確實是十分有用的一門技術。
1.帶復雜條件的分頁:(非AJAX分頁)
直接把deptid屬性過濾加上會導致出現:org.hibernate.QueryException:
這時因為在
Employee 實體類中根本就沒有 deptid 屬性(并非指在 Employee 類中有該屬性,而是要在映射文件中映射該屬性).
解決方法:
在 EmployeeDao 中重寫 Page<T> findPage(final
Page<T> page, final List<PropertyFilter> filters) 方法, 以解決表單頁
面的 deptid和實體類的
dept屬性的對應問題
注
意:1.增強 for 循環時, 不能 remove 其元素
2.在
循環時刪除集合的元素, 會改變集合的 size 屬性
2.AJAX分頁設計
1.需要在EmployeeAction的對應方法中,返回JSON數據,在頁面上進行解析即可
2.實現過程:
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>
服務器端實現(employeeList2)
1.獲取請求參數
String
pageNoStr = request.getParameter(“pageNo”);
2.從頁面獲取PropertyFilter集合
3.調用service的findPage方法,得到分頁數據Page對象
4.將page對象轉化為對應的JSON數據格式。那么需要轉化為什么樣的JSON數據
{totalCount:,totalPages:,pageNo:,employees:[{employeid,:loginName:,gender:,...}] }
5.返回JSON數據
response.setContentType(“text/javascript”);
response.getWritter().print(jsonResult);
3.員工信息
刪除功能
1.AjAX刪除功能的實現:
1.若當前頁已經是最后一頁,且當前記錄是當前頁的最后一條記錄,則不能再請求當前頁的信息, totalPages不能代表服務器端的總頁數
2.Ajax 刪除要實現的功能:
1. 彈出confirm(): 確
定要刪除嗎?
2. 若點擊"否",
則文本框或下拉框的值恢復為剛才的默認
值: 使用隱藏域.
3. 若點擊"是",
進行ajax
刪除
4. 若
員工信息有外鍵關聯時,注
意:通過 ajaxError 函數進行提示,彈出“不能刪除該記錄”
關鍵代碼:
4.查看員工的詳細信息
這樣的功能實現在現在來說,已不難實現,我實現了一下,不難!還用了下插件!顯示Employee
的頭像!
posted @
2010-03-07 23:03 d66380022|
編輯 收藏
員工的錄入和查詢(帶
條件查詢)
今天做的是員工信息錄入和服務器端的驗證,目標是使用jQuery更熟悉,掌握分頁設計,更好理解Hibernate的一些以前未用過的類中的一些方法。
一. 員工的錄入,并進行驗證
1.顯示員工的錄入頁面
1.用jQuery 的validator
為表單做前臺驗證
2.對登錄名的Ajax 校驗
3.使用jQuery 的blockUI
插件提示Ajax 操作
4.錄入員工信息
2.服務器端的簡單驗證
1.使用struts的validator框架
2.以email為例,email非空,且符合email格式
3.員工錄入服務器端的復雜驗證
1.數據庫,EmployeeAction中,得到登錄名
2.對登錄名的可用性進行驗證,驗證登錄名在數據庫中是否存在
3.這時可以采用struts的聲明式異常
4.使用py4j 解決把漢字轉為對應的拼音: 佟剛--> tg, 張孝祥--> zxx, 黎活明--> lhm
二.員工的查詢
1.顯示員工信息:AJAX分頁
使用displaytag 分頁顯示員工信息,記
錄不超過百萬條。簡單,使用。比如OA。
1.在tomcat的webapps目錄下展示其實例。
2. OpenSessionInView:
1使用OpenSessionInView
若Hibernate中某一個類的引用屬性(也
包括集合屬性)采取懶加載策略,則可能出現懶加載異常,但沒有對其懶加載屬性進行初始化,此時關閉Session,然后再來獲取屬性,就會異常
聲明使用spring的聲明式事務:
<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 卻一直被占用不被釋放. 例如輸出頁面時, 一方面可能是頁面內容大, response.write的時間長; 另一方面可能是網速慢, 服務器與用戶間傳輸時間久. 當大量這樣的情況出現時,就有連接池連接不足, 造成頁面假死現
象.
所以在內容多流量大的網站需慎用.
3.翻頁相關的類:
1.Page:
與具體 ORM
實現無關的分頁參數及查詢結果封裝
2.
PropertyFilter: 與具體 ORM 實現無關的屬性過濾條件封裝類, 主要記錄頁面中簡單的搜索過濾條件
3.
HibernateDao: 擴展
SimpleHibernateDao, 功能包括分頁查詢, 按屬性過濾條件列表:
1.不帶任何查詢條件時, 需要使用的方法:
--countCriteriaResult
--setPageParameter
--findPage(Page<T>
page, Criterion...criterions)
HibernateWebUtils
分頁:
不帶查詢的分頁
employee-list-1.do --> Action
--> Service -->
DAO
2.查詢條件的翻頁:使用jQuery 的一個thickbox 插件完成查詢頁面的彈出
1.jQuery的分頁插件
2.在獲取第一頁的內容以后,如何
把查詢條件帶到第二頁
--把封裝了查詢條件的List放到session域中,下一次從session中取。
--把查詢條件放在隱藏域中
3.攜帶查詢條件
使用jQuery提供的serialize()方法攜帶查詢條件(行不通)
var url = this.href + “&” +
$(“:hidden”).serialize();
window.location.href=url;
注意:上述方法在第一次不能起作用: 即不能再第一次把隱藏域中的參數帶過去, 因為在第一次點擊該鏈接時, href 的屬性值已經固定了, 不能再發生變化,
而第二次點擊時, 因為第一次已經改變了該屬性的值, 所以好用
所以必須在第一次點擊該鏈接之前讓
this.href = this.href + "&" +
$(":hidden").serialize(); 起作用
解決方案:
$("#criteria").attr("href",
$("#criteria").attr("href")
+ "&" +
$(":hidden").serialize());
今天就到這兒,明天continue!
posted @
2010-03-06 23:50 d66380022|
編輯 收藏
今天接著昨天的整合,由佟老師總指揮,基于xml配置的Action,這涉及struts整合.今天先把登陸實現了,最后使用兩個插件把員工信息錄入功能
實現,頁面效果在當今還是主流的。
2.服務器端驗證
1.查詢數據庫,得到信息
2.若用戶名不存在,則提示用戶名不存在
errors.add("",new ActionMessage(" "));
若用戶名和密碼不匹配,則提示用戶名和密碼不匹配
若errors.isEmpty()為true,則登陸,并將其保存在session中,
方法:
使用 struts 的聲明式異常來轉發頁面和顯示提示信息.
詳細解決:
由 EmployeeService 的方法拋出異常, Action 不進行處理, 而由 struts 框架根據當前的
action 節點配置來進行相應的處理:
如果出現對應的異常, 會利用當前 excpeption 配置節點的 key 生成對應的 ActionMessage
對象, 再放入 ActionMessages 中,
把頁面派發到 input 對應的頁面中, 在前臺頁面利用 <html:errors
property="key"> 進行顯示
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
預加載關聯集合形成重復記 錄, 又不方便使用 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 該類可以獲取到對應的 class 的 hbm 配置文件的幾乎所有信息
2. 標準查詢:
-->創建 Criteria 對象: session.createCriteria(clazz);
-->為 Criteria 對象添加查詢條件: criteria.add(criterion);
-->獲取 Criterion 對象: 通過 Restrictions 來獲取
9.struts的導航組件:struts-menu的使用方法:
1. 把 struts-menu.war 文件復制到服務器下, 運行
2. 在 struts-config.xml 文件中加入 struts-menu 插件
3. 復制 struts-menu\WEB-INF\menu-config.xml 到 conf 目錄下.
4. 復制 struts-menu-2.4.3\struts-menu-2.4.3.jar 到 classpath 下
5. struts-menu 的去除默認背景色問題:
①. 通過 jQuery: 把 left.jsp 頁面的第三個 table 的
style="background-color:lightgrey" 屬性清除
②. 通過修改默認的配置文件: 修改 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.對輸入的登陸名進行ajax驗證:驗證該登錄名在數據庫中是否存在。
11.在loginname字段已經給出對應的“該登錄名已經被占用”的基礎上,再一次點擊“提交”按鈕,則需要進行服務器端驗證,再返回錄入頁面
12.若驗證都通過,則需要進行服務器端的驗證。
13.員工的錄入操作:
1). 顯示員工的錄入頁面
①. 查詢數據庫, 獲取所有的部門信息和職位信息, 并在頁面上加以顯示
②. 頁面使用 jQuery 的 validator 插件作為表單的前臺驗證
1. 在當前 jsp 頁面中導入 jquery.validate.js
2. 為需要驗證的字段添加 class 屬性, 在其中指定驗證規則, 獲取添加 minlength 等屬性
今天就到此了!
posted @
2010-03-05 23:16 d66380022|
編輯 收藏
SVN版本控制
今天有毛偉老
師講版本控制,版本控制(Revision control)是維護工程藍圖的標準做法,能追蹤工程藍圖從誕生一直到定案的過程,確保由不同人員所編輯的同一文
件檔案都能得以同步。最新的Spring3.0已經提供了更高級的版本控制,但是國內沒幾個用,先掌握SVN,以后有機會再用高級的。下面詳細總結
一下:
1.Subversion介紹:是一種開放源碼的全新版本控制系統。是新一代的版本控
制工具,他不但提供了常見的比較、修補、標記、提交、回復和分支等功能,適于 Web 開發和其他
在傳統方式下未采納版本控制功能的領域
2.svn安裝
1.運行svn的server端,運行setup.exe,就OK
檢驗安裝好了:
運行dos窗口
,輸入svn ,回車,出現svn help 提示,安裝成功
2.svn服務器啟動(我安裝目錄:D:"Program
Files"Subversion"bin)
cmd:
svn根目錄 svnserve -d 即D:"Program
Files"Subversion"bin>svnserve
–d
是否啟動成功
.當前是否啟動3690端口號
3.版本庫目錄介紹:
dav目錄:是提供給Apache與mod_dav_svn使用的目錄,讓它們存儲內部數據,當前我們使用的版本沒有這個目錄(與你下載的Subversion版
本有關系)。
db目錄:就是所有版本控制的數據存放文件。
hooks目錄:放置hook腳本文件的目錄。
locks目錄:用來放置Subversion文件庫鎖定數據的目錄,用來追蹤存取文件庫的客戶端。
format文件是一個文本文
件,里面只放了一個整數,表示當前文件庫配置的版本號。
conf目錄:是這個倉庫的配置文件(倉庫的用戶訪問帳號、權限等)。
4.創建版本庫、導入、檢出
1、創建版本庫
右鍵--->TortoiseSVN--->Create
repository
here
2.導入
右鍵--->TortoiseSVN--->導入(一般在項目創建初始化數據時使用,當然也可用于把任意文件或目錄從外部導入到指定倉庫中)
3.檢出(提醒:檢出項目后客戶端文件夾
的變化.svn)
右鍵--->SVN Checkout...
5.SVN基本功能:
清理、更新到指定版本
日志記錄、提交日志限定必填。
鎖定、解鎖:基本權限控制(可以限制被鎖定的文件只能由被鎖定用戶修改提交)
誤刪除恢復操作:直接重更新或通過日志列表
單個文件過濾:選中文件-->TortoiseSVN---->增加到忽略列表
導出:使項目脫離版本控制。
6.總結SVN的使用:
在其文件夾上右鍵
"SVN Checkout..."寫上對應SVN地址
在其文件夾上右鍵
"SVN Update" 來更新我們的本地版本
在其文件夾上右鍵
"SVN Commit"
來提交我們的本地版本
在其文件夾上右鍵
"TortoiseSVN" --> "Export..." 來
發布、導出
在其文件上右鍵
"TortoiseSVN" --> 增加(A)" 來向版本庫中增加一
個受版本控制的文件
7.關于SVN的各種顏色提示說明:
CVS客戶端的使用基本上同SVN客戶端一樣,更簡單些,就不多說了
posted @
2010-03-03 00:02 d66380022|
編輯 收藏
spring對事務的管理
今天講了Spring的事務,及對hibernate的整合,對struts的整合。以后還得學習,記不住,用到再整理。
1.事務的四大特點:
atomic:要么都發生,要么都不發生。
consistent:數據應該不被破壞。
Isolated:用戶間操作不相混淆
Durable:永久保存
2.介紹spring的事務管理器
spring沒有直接管理事務,而是將管理事務的責任委
托給某個特定平臺的事務實現。
3.Hibernate事務:
<bean
id="transactionManager"
class="…HibernateTransactionManager">
<property
name="sessionFactory" ref="sf" />
</bean>
其中sessionFactory屬性必須和一個Hibernate的SessionFactory綁定
HibernateTransactionManager把事務管理委托給一個從Hibernate
session
中取得的net….Transaction對象。當一個事務成功完成時,
HibernateTransactionManager將調用Transaction對象的commit()
方法。類似的,當一個事務失敗時,Transaction對象的rollback()方
法將被調用。
4.事務屬性
1.隔離級別:設定事務的并發程度
臟讀:一個事務讀取了另一個事務改寫但還未
提交的數據,如果這些數據被回滾,則
讀到的數據是無效的。
不可重復讀:一個事務執行相同的查詢兩次或兩次以
上,但每次查詢結果都不同。
幻讀:一個事務讀取了幾行記錄后,另一個事務插入一
些記錄,幻讀就發生了。再后來的查詢中,第一
個事務就會發現有些原來沒有的記錄。
2.只讀 若對數據庫只進行讀操作,可設置事務只讀的屬性,使用某些優化措施。數據庫會進行優化處理。若使用hibernate作為持久化機制,聲明一個只讀事務會使hibernate的flush模式設置為FLUSH_NEVER。避免不必要的數據同步,將所有更新延遲到事務的結束。
3.事務超時 若事務在長時間的運行,會不必要的占用數據庫資源。設置超時后,會在指定的時間片回滾。將那些具有可能啟動新事務的傳播行為的方法的事務設置超時才有意義
5.CMT:容器管理事務
BMT:bean 管理事務
<tx:annocation-driven
transaction-manager="hibernateTransactionManager"/>
類上加@Transactional
6.總結:
事務策略
在業務中不能加try
catch ,因為Spring的環繞通知在出現異常時會回滾事務,你已捕獲,就會提交事務(任何情況下)
7.Spring整合Struts
1.web服務器啟動時,完成Spring容器的實例化。plugin|listener
2.struts中的action交給Spring容器管理。
3.基本操作
注意:在spring上下文中,作為普通bean配置action,但action的不能用id,只能用name,
因為需要struts-config.xml文件中action的path一致.
bean.xml
<bean name="/loginAction" class="..LoginAction">
<property name="xxxService" ref="xxxService"
/>
</bean>
posted @
2010-03-01 01:04 d66380022|
編輯 收藏
今天主要是AOP編程,徐老師先講了原理,由淺入深,最
后讓開發由aspectJ來完成,使開發更簡單,收獲蠻大
1.Aspect術語
通知:切面的實際實現,他通知系統新的行為。如在日志通知包含了實
現日志功能的代碼,如向日志文件寫日志。通知在連接點插入
到應用系統中。
連接點::應用程序執行過程中插入切面的地點,可以是
方法調用,異常拋出,或者 要修改的字段。
切入點:定義了通知應該應用在哪些連接點,
通知可以應用到AOP框架支持的任何 連接點。
引入:不變源代碼的情況下,為類添加新方法
和屬性。
目標對象::被通知的對象。既可以是你編寫的類也可以是
第三方類。
代理對象:嶄新的對象,將通知應用到目標對
象后創建的對象,應用系統的其他部 分不用為了支持代理對象而 改變。
織入:將切面應用到目標對象從而創建一個新代理對
象的過程。織入發生在目標
對象生命周期的多個點上:
編譯期:切面在目標對象編譯時織入.這需要一個特殊的編譯器.
類裝載期:切面在目標對象被載入JVM時織入.這需要一個特殊的類載入器.
運行期:切面在應用系統運行時織入.
4.切入點:定義了通知應該應用在哪些連接點,通知可以應用到AOP框架支持的任何連接點。
兩種:jdk動態代理(接口,松耦合),cglib(對類代理)
2.方法介紹
一.通知類型
1.前置通知
public interface MethodBeforeAdvice{
void before(Method m,Object[]
os
,Object target){
}
}
該接口提供了獲得目標方法、參數和目標對象的機會。不能夠改變運行時參數,即不能替換參數對象和目
標對象。
注意在方法結束后不返回任何值東西。原因是該接口返回后,目標方法將會被調用,應該返回目標對象的
返回值。該接口唯一能
阻止目標方法被調用的途徑是拋出異常或(System.exit())。
2.動態代理對象ProxyFactoryBean是一個在BeanFactory中顯式創建代理對象的中心類,可以給它一個
要實現的接口、一個要代理的目標對象、一個
要織入的通知,并且他將創建一個嶄新的代理
對象。
3.后置通知
同前置通知類似。
public interface AfterReturningAdvice{
public void afterReturning(Object
returnValue,Method
m,Object[] os,Object target);
}
多了一個返回值。
4.環繞通知
public
interface
MethodInterceptor extends Interceptor{
Object invoke(MethodInvocation invocation);
}
該接口同前兩種通知有兩個重要區別:1.該通知能夠控制目標方法
是否真的被調用。通過invocation.proceed()方法來調用。
2.該通知可以控制返回的對象。可以返回一個與proceed()方法返回對象完全不同的對象。但要謹慎使用。
5.異常通知
public interface ThrowsAdvice{
}
該接口為標識性接口,沒有任何方法,但實現該接口的類必須要有如下形
式的方法:
void
afterThrowing(Throwable
throwable);
void
afterThrowing(Method
m,Object[] os,Object
target,Throwable
throwable);
第一個方法只接受一個參數:需要拋出的異常。
第二個方法接受異常、被調用的方法、參數以及目標對象。
二.創建切入點方法
1. 切入點根據方法和類決定何處
織入通知。ClassFilter接口決定了一個類
是否符合通知的要求:
public interface ClassFilter{
boolean matches(Class clazz);
}
實現該接口的類決定了以參數傳遞
進來的類是否應該被通知。實現該接
口的類一般根據類名決定,但不一
定必須如此。
注意: 為減少系統負擔,盡量使用靜態切入點
2.定義切入點 spring提供了Advisor類。他把通知和切入點組合到一個對象中。更確切地說PointcutAdvisor提供了這些功
能
3.使用aspectJ開發
1.添加類庫:aspectjrt.jar和aspectjweaver.jar
2.添加aop schema.
3.定義xml元素:<aop:aspectj-autoproxy>
4.編寫java類,并用@Aspect注解成通知
AspectJ 支持 5 種類型的通知注解:
@Before: 前置通知, 在方法執行之前執行
@After: 后置通知, 在方法執行之后執行
@AfterRunning: 返
回通知, 在方法
返回結果之后執行
@AfterThrowing: 異
常通知, 在方法
拋出異常之后
@Around: 環繞通知, 圍繞著方法執行
配置成普通bean元素即可.
注意:
JoinPoint參數可訪問連接點細節,入方法名和參數等.
今天知識點蠻多的,對面試挺有用的,好好掌
握!
posted @
2010-02-28 01:11 d66380022|
編輯 收藏
Spring
對這個框架并不陌生,spring是一個開源的控制反轉(Inversion
of Control
,IoC)和面向切面(AOP)的容器框架.它的主要目得是簡化企業開發...
1.為Spring添加jar
支持
2.Spring:1.xml + 反射
2.不需要實例化
3.不需要set方法
以前 至上而下,
按部就班
之下而上,反的
3. bean的生命周期
bean被載入到容器中時,他的生命周期就開始
了。bean工廠在一個bean可以使用前完成很多
工作:
1.容器尋找bean的定義信息并實例化。
2.使用依賴注入,spring按bean定義信息配置bean的所有屬性。
3.若bean實現了BeanNameAware接口,工廠調用Bean的setBeanName
()方法傳遞bean的ID。
4.若bean實現了BeanFactoryAware接口,工廠調用setBeanFactory()
方法傳入工廠自身。
5.若BeanPostProcessor和bean關聯,則它們的
postProcessBeforeInitialization()方法被調用。
6.若bean指定了ini-method方法、,它將被調用。
7.最后,若有BeanPostProcessor和bean關聯,則它們的
postProcessAfterInitialization()方法被調用、。
4.set注入的缺點:
無法清晰表達哪些屬性是必須的,哪些是可選
的,構造注入的優勢是通過構造強制依賴關系,不可能實例化不
完全的或無法使用的bean。
5.自動裝配
<bean id=" " class="" autowire="autowire 類型">
有四種自動裝配類型:
1.byName:尋找和屬性名相同的bean,若找不到,則裝不上。
2.byType:尋找和屬性類型相同的bean,找不到,裝不上,找到多個拋異常。
3.constructor:查找和bean的構造參數一致的一個或
多個bean,若找不到或找到多個,拋異常。按照參數的類型裝配
4.autodetect: (3) 或者(2)方式選一個。不確定
性的處理與(3)和(2)一致。
注意:
spring2.5提供了<context:annotation-config
/>配置.
該配置可激活在類中探測到的各種注解,@Required
@Autowire
@PostConstrct @PreDestroy @Resource @EJB @PersistenceContext
@WebServiceRef等等,
也可以選擇為這些注解激活單獨的后處理器.
6.屬性的外部化
分散配置
將配置文件分成幾個分散的配置文件。如數據源。
<bean class="...PropertyPlaceholderConfigurer">
<property name="locations">
<list>
<value>jdbc.properties</value>
<value>securtiy.properties</value>
</list>
</property>
</bean>
當然在Spring2.5可以簡化為
<context:property-placehoder location>
7.AOP
有一些模塊是每個系統都需要的,切面是系統
模塊化的一個切面或領域。如日志記錄。不改變源代碼,還給類增加新的功能
2.連接點:應用程序執行過程中,可以應用切面的地點,可以是方法調用,異常拋出,或者要修改的
字段。
3.通知:切面的實際實現,他通知系統新的行為。
4.切入點:定義了通知應該應用在哪些連接點,通知可以應用到AOP框架支持的任何連接點。
5.引入:為類添加新方法和屬性。
6.目標對象:被通知的對象。既可以是你編寫的類也可以是第三方類。
7.代理:將通知應用到目標對象后創建的對象,應用系統的其他部分不用為了支持代理對象而
改變。
8.織入:將切面應用到目標對象從而創建一個新代理對象的過程。織入發生在目標
對象生命周期的多個點上:
編譯期:切面在目標對象編譯時織入.這需要一個特殊的編譯器.
類裝載期:切面在目標對象被載入JVM時織入.這需要一個特殊的類載入器.
運行期:切面在應用系統運行時織入.
今天到此結束,明天繼續!
posted @
2010-02-26 23:02 d66380022|
編輯 收藏
UML
今天學習UML,uml是unified modeling language,是一種基于面向對象的可視化建模語言. 老徐講了很多與開發有關的東西,很不錯,還介紹了軟件的發展等,開始整理下
1. UML 采用了一組形象化的圖形(如類圖)符號作為建模語言, 使用這些符號可以形象地描述系統的各個方面。oop:ooa(分析) + ood(設計)
2.軟件的生命周期
瀑布模型:
需求分析(可行性分析:)
1.時間可行性
2.技術可行性
3.經濟可行性
系統分析和設計(系分)
實現
測試
維護
角色分配:項目經理技術總監代碼人員測試人員 db管理人員系統分析人員
project leader 系統架構師
3. 統一軟件開發過程(Rational Unified Process,RUP): 一個通用的軟件流程框架, 以架構為中心, 用例驅動的迭代化開發流程.
4.uml:圖(圖元)
UML 中一共有 10 種圖:
類圖**** 對象圖 包圖 組件圖 部署圖 用例圖** 時序圖*** 協作圖 狀態圖
活動圖*
5.用例圖
是從軟件需求分析到最終實現的第一步, 它是從客戶的角度來描述系統功能.
用例圖包含 3 個基本組件: 參與者(Actor), 用例(Use Case),關系
6.類圖
類圖是面向對象系統建模中最常用的圖. 是定義其他圖的基礎.
類圖主要是用來顯示系統中的類,
接口以及它們之間的關系.
類圖包含的主要元素有類, 接口和關系. 其中關系有關聯關系, 泛化關系, 依賴關系和實現關系. 在類圖中也可以包含注釋和約束.
7.類之間的幾種關系:實現依賴關聯聚合組成
實現關系:在 UML 中, 實現關系用來表示類與接口之間的實現關系.
依賴關系:對于兩個相對獨立的系統,當一個系統負責構造另一個系統的實例,或者依賴另一個系統的服務時,這兩個系統之間體現為依賴關系.
關聯:對于兩個相對獨立的系統,當一個系統的實例與另一個系統的一些特定實例存在固定的對應關系時,這兩個系統之間為關聯關系。
聚合:聚合關聯是一種特殊的關聯. 它表示類間的關系是整體與部分的關系.
組合關系: 整件擁有部件的生命周期, 所以整件刪除時, 部件一定會跟著刪除. 而且, 多個整件不可以同時共享同一個部件。
8. 時序圖
時序圖用于描述對象之間的傳遞消息的時間順序, 即用例中的行為順序.
當執行一個用例時, 時序圖中的每條消息對應了一個類操作或者引起轉換的觸發事件.
對象: 時序圖中對象使用矩形表示, 并且對象名稱下有下劃線. 將對象置于時序圖的頂部說明在交互開始時對象就已經存在了. 如果對象的位置不在頂部, 表示對象是在交互的過程中被創建的.
生命線:生命線是一條垂直的虛線. 表示時序圖中的對象在一段生命周期內的存在. 每個對象底部中心的位置都帶有生命線.
9. 活動圖
在 UML 中, 活動圖本質上就是流程圖. 它用于描述系統的活動, 判定點和分支等.
10.臨時
持久化 游離 刪除
11.狀態圖
狀態圖: 通過建立對象的生存周期模型來描述對象隨時間變化的動態行為.
狀態: 用圓角矩形表示. 狀態名稱表示狀態的名字, 通常用字符串表示. 一個狀態的名稱在狀態圖所在的上下文中應該是唯一的.
12.包圖:
由包和包之間的關系組成. 包的圖標就如同一個帶標簽的文件夾.
13.組件圖
用來建立系統中各組件之間的關系, 各組件通過功能組織在一起.
14.部署圖
用來幫助開發者了解軟件中的各個組件駐留在什么硬件位置, 以及這些硬件之間的交互關系。
今天就講了這些知識,挺瑣碎的,關鍵是看懂就OK了!
posted @
2010-02-25 23:29 d66380022|
編輯 收藏