今天復習知識點:
一.工作流,審批流程。舉例,比如請假流程:
提交申請-->部門經理 -->
后面是一層一層的審批...
審批流轉就是把單位內部的審批電子化。經過的環節和人不一樣
四點要求:
流程定義:
二.分頁設計
<a href="javascript:gotoPage(1)">[首頁]</a>
<c:if test="${pageView.currentPage gt 1}">
<a href="javascript:gotoPage(${pageView.currentPage-1})">[上一頁]</a>
</c:if>
<c:if test="javascript:gotoPage(${pageView.currentPage lt pageView.totalPage})">
<a href="javascript:gotoPage(${pageView.currentPage-1})">[下一頁]</a>
</c:if>
<a href="javascript:gotoPage(${totalPage})">[尾頁]</a>
<c:forEach begin="${startPageIndex}" end="endPageIndex" var="n">
${n}
</c:forEach>
轉到:<input type="text" id="txtPageNum"/>
<input type="button" value="Go" onclick="gotoPage(document.getElementById('txtPageNum').value"/>
<script type="text/javascript">
function gotoPage(pageNum){
if(isNaN(pageNum)){
alert("請輸入正確的頁碼");
document.getElementById('txtPageNum').focus();
return false;
}
window.location.href = getPageViewUrl(pageNum);
}
//提供分頁用的地址。由具體的引用頁面提供
function getPageViewUrl(pageNum){
return "/xxx.do?pageNum="+pageNum;
}
</script>
3.Hibernate的分頁
getSession().createQuery(//
"SELECT COUNT(pd) FROM org.jbpm.ProcessDefinition pd")//
.uniqueResult();
getSession().createQuery(//
"FROM ProcessDefinition")//
.setFirstResult(firstResult)//
.setMaxResults(pageSize)//
.list();
4.表單模板設計
表單定義(FormDefinition)
表單名稱
所用流程
表單代碼文件路徑
保存數據:不能用ActionForm,
表單中要填寫的數據量,數據類型未知。用原始方法
for(Enumeration<String> e= request.getParameterNames();e.hasMoreElements();){
String name = e.nextElement();
String value=request.getParameter(name);
}但是我們無法解決2個問題:
1.保存成什么類型
2.保存哪些參數值?
解決辦法:
Map<String,Class> fieldDefinitionList = new HashMap<String,Class>();
之后在Action中可以用
for(String name:formDefinition.getFieldDefinitionList().keySet()){
String stringValue = request.getParameter(name);
Class clazz=formDefinition.getFieldDefinitionList().get(name);
}
保存一次填寫的所有信息,就是表單實例,就是表單定義的具體實現
明天就是JPA了,要好好休息,繼續努力,春節已過去,踏上新的起點!
posted @
2010-02-20 00:20 d66380022|
編輯 收藏
今天是大年初一,趕快開學吧,每天很無聊,唯一感
覺還有點新年的味道就是昨天公司老師帶我們去海麗
軒吃年夜飯,兄弟還是挺多的,心情也很好的!今天
復習OA的映射,對這不熟悉啊,還得努力。。。
一.
多對多:對role.java文件,其中映射文件如下:
<set name="employees" table="itcast_employee_role">
<key column="roleId"></key>
<many-to-many class="Employee"
column="employeeId"></many-to-many>
</set>
對員工Employee.java來說,映射文件如下:
<set name="roles" table="itcast_employee_role">
<key column="employeeId"></key>
<many-to-many class="Role"
column="roleId"></many-to-many>
</set>
一對一:員工和帳號,對于附屬類帳號,映射文件如
下:
<id name="id">
<generator class="foreign">
<param name="property">employee</param>
</generator>
</id>
<one-to-one name="employee" constrained="true"></one-to-one>
主類(employee),映射文件:
<one-to-one name="user"></one-to-one>
二.方法:
/** 列表 */
public ActionForward list(ActionMapping mapping,
ActionForm form, HttpServletRequest request, HttpServletResponse
response)
throws Exception {
return mapping.findForward("list"); // list.jsp
}
/** 添加頁面 */
public ActionForward addUI(ActionMapping mapping,
ActionForm form, HttpServletRequest request, HttpServletResponse
response)
throws Exception {
return mapping.findForward("saveUI");
}
/** 添加 */
public ActionForward add(ActionMapping mapping,
ActionForm form, HttpServletRequest request, HttpServletResponse
response)
throws Exception {
return mapping.findForward("toList"); }
/** 修改頁面 */
public ActionForward editUI(ActionMapping mapping,
ActionForm form, HttpServletRequest request, HttpServletResponse
response)
throws Exception {
return mapping.findForward("saveUI");
}
/** 修改 */
public ActionForward edit(ActionMapping mapping,
ActionForm form, HttpServletRequest request, HttpServletResponse
response)
throws Exception {
return mapping.findForward("toList");
}
/** 刪除 */
public ActionForward del(ActionMapping mapping,
ActionForm form, HttpServletRequest request, HttpServletResponse
response)
throws Exception {
return mapping.findForward("toList");
}
三.
標簽復習:
<html:form>
<html:text>
<html:hidden>
<html:textarea>
javascript復習:
<html:link action="/role?method=del&id=${role.id}" onlick="return
window.confirm('您確定要刪除一條記錄嗎?');">刪除
</html:link>
在頁面中
<html:rewrite action="/role?method=addUi"/>
<script type="text/javascript">
funcion addUI(){
window.location.href="<html:rewrite action='/role?method=addUI'";
}
</script>
<srcipt type="text/java"
<script type="text/javascript">
funcion checkForm(form){
if($.trim(form.name.value) == "" ){}
alert("");
form.name.focus();
return false;
}
return true;
}
</script>
四.在Action中進行驗證
ActionErrors errors = form.validate(mapping,request);
if(errors!=null&&errors.size()>0){
saveErrors(request,errors);
return mapping.findForward("addUI");
}
五.HQL語句
getSession().createQuery("FROM Department d WHERE d.parent is
NULL")//
.list();
六.樹形展示菜單
List<Department> list = new ArrayList<Department>();
printInfo(topLevel,"",list);
return list;
注意空格是全角空格,全角空格是中文字符,不會合
并。
public static void printInfo(Collection<Department>
departmentList,String prefix,List<Department> list){
for(Department department : departmentList){
department.setName(prefix + "|-" + department.getName());
list.add(department);
printInfo(department.getChildren(),prefix+" ",list);
}
}
今天就做到這了!
posted @
2010-02-16 01:06 d66380022|
編輯 收藏
大學生創業網訊
關心蟻族就是關心我們國家的未來。青年時代的磨難和體驗直接決定10年、15年后他們的心態和價值觀。一個人青年時期總被人看不起、壓抑、仇富,等他40
歲突然成功了他幸福嗎?會回報社會嗎?他如何教育下一代?
■名詞解釋
蟻族:指“高校畢業生低收入聚居群體”。該群體高知、弱小、聚居。他們受過高等教育,平均月收入低于兩千元,絕大多數沒有“三險”和勞動合同;他們平
均年齡集中在22—29歲之間,九成屬于“80后”一代;他們主要聚居于城鄉結合部或近郊農村,形成獨特的“聚居村”。
調查,在北京的邊緣
■一篇報道的啟發
在這本叫做《蟻族》的“大學畢業生聚居村實錄”出版之前,“蟻族”這個名詞基本上屬于動物學的概念。一位29歲的年輕學者帶領他的團隊經過兩年的社會
調查后,第一次將這個昆蟲的名字冠于一個年輕群體的頭上。他們高知、低收入、聚居在一起生活,像螞蟻一樣不被關注,也像螞蟻一樣全力以赴、永不言棄、不可
輕視。
為“蟻族”著書立傳源自一場好奇的探訪。
2007年夏天,在北大做博士后研究的廉思讀到《中國新聞周刊》里的一篇紀實報道,名為《向下的青春——“高知”貧民村調查》。報道中的主人公李竟一
年前畢業于中國農業大學,因為考研和就業雙重失敗,不得不暫住于海淀區一個叫唐家嶺的村子繼續掙扎著追求夢想。而這個村子里,和他有著相同境遇的高校畢業
生不在少數。
“令人擔憂的現狀、年輕脆弱的心靈以及無處寄托的青春和夢想。”廉思這樣形容他解讀到的李竟。作為地地道道的北京人,也作為“80后”,他沒有想到自
己身邊還生活著這樣的同齡人。與此同時,博士后研究“社會穩定”的他又敏銳地感覺到這不僅是一個簡單的“貧民村”的問題。
■這也是北京
站在唐家嶺的街道上,廉思真有點不敢相信自己的眼睛——這也是北京?擁擠狹窄的小路充斥著垃圾塵土,各種名目的小店凌亂骯臟,電線桿、墻壁上到處貼滿
了租房的小廣告:180元起,有寬帶……歡迎入住。
“看不出任何首都的氣息,典型的城鄉結合部。可一般的城鄉結合部又不可能有這么多年輕人,而且都是學生打扮。你再看他們租住的房子,可以沒有浴室沒有
單獨的廁所,但一定有寬帶能上網。”
廉思了解到,這些走出校園不久的畢業生基本上都是拿著一千多元的工資,租著每月三百元左右的床位,到工作單位要坐兩個小時以上的公交車。唐家嶺本村居
民有三千人左右,其余近四五萬人都屬于這個聚居群體。
回到家廉思將“聚居村”輸入搜索引擎,結果顯示全是“少數民族聚居村”;查閱了國內外的一些相關資料也一無所獲,此時的廉思意識到,唐家嶺的年輕人們
已經形成了一個全新的生態群體。
“大家都關心成功的人,關心精英,從大學畢業兩三年到四五年的這群人到底是什么狀態,沒有人問過他們過得怎么樣。”
從唐家嶺回來后,這些同齡人生活的場景時常在廉思眼前閃現,讓他久久不能釋懷,他決心要深入研究這個群體。
■政府支持的調查
廉思開始著手組織社會調查。正當他埋頭設計問卷、確定調研地點的時候,北京市有關方面委托他就北京市大學畢業生“聚居村”問題進行專項調查。有了政府
的支持,研究工作順利開展起來。
2008年春節,廉思帶領他從人大招募來的研究生入村調查。恰逢全國遭遇50年不遇的雪災,北京天寒地凍。在唐家嶺的出租屋內,經常是問卷還沒做完,
調研員的筆已經被凍得寫不出字來。由于年齡相仿,村里的年輕人對廉思的調研小組沒有任何抵觸,有的不僅自己接受調查,還推薦身邊的老鄉和朋友。經過一個星
期的調研,這個群體的面貌逐漸在廉思眼前清晰起來。
在后來的調研報告里廉思這樣描述他們:他們人數眾多,大多聚居于城鄉結合部或近郊農村,已經形成了一個個自然村落。他們有的畢業于名牌高校,更多的來
自地方院校和民辦高校;有的完全處于失業狀態,更多的從事保險推銷、廣告營銷、電子器材銷售等低收入工作。他們生活條件差,缺乏社會保障,挫折感、焦慮感
等心理問題較為嚴重。他們與外界的交往主要依靠互聯網并以此宣泄情緒。
“熱情、開朗、迷茫、彷徨。”這就是“聚居村”村民留給廉思的初次印象。調研結束后,他寫成了四萬多字的研究報告提交市委且獲得了肯定,但廉思感到自
己的使命并沒有完成。“我更關心的是他們的夢破了以后怎么樣,他們會怎么看待這個社會。他們的怨恨可能給社會帶來災難。”
■“蟻族”一詞的誕生
經過進一步的資料查閱和實地考察,廉思發現國外沒有出現大學畢業生聚居現象,而國內除了北京之外,上海、廣州、武漢、西安等大城市都有“聚居村”存
在,若要深入了解他們必須組織全國范圍的社會調查,才能得出更有意義的結論。
由于第二次調查將在深度和廣度上遠遠超過第一次,廉思決定成立課題組,招募不同領域的研究人員參與。他對前來應征的人說的很直接:“跟我干肯定沒錢也
沒名,憑的就是社會責任感和研究興趣。”
2008年8月8日,借著這個舉國歡慶的日子,匯集了政治學、心理學、社會學、統計學、經濟學等學科的15人課題組正式成立了,廉思擔任組長,研究題
目是《潛在危機:中國“大學畢業生低收入聚居群體”與社會穩定問題研究》。
在人文社科領域,社會調查是最花錢的。偏偏這一年廉思申報的課題沒有獲得批準,調研純屬個人行為,經費成了大難題。人大社會學系的一位教授告訴他:你要
把這個項目做下來,僅僅北京地區的調研沒有15萬絕不可能!做一份問卷的成本最少要200元,包括人工費、禮品費、交通費、誤餐費等等;北京地區至少要
500份以上的樣本量才有意義,還不包括后期研究需要支付的錄音整理費、數據錄入費……
箭在弦上,不得不發。拿著恩師資助的3萬元啟動資金,廉思和課題組成員們立即投入到環環相銜的工作流程中。很快3萬元花光了,家人又支持了4萬元,最
終課題組僅花費7萬多元,完成了唐家嶺、小月河、馬連洼等七個“聚居村”的563份調查問卷的樣本量。
當時課題組一位成員看了一本名叫《蟻囈》的書,講螞蟻的生活狀態,很多話和他們調查的人群非常相像,比如“我很卑微但我不卑賤”、“弱小的強者”等
等,于是他們決定用“蟻族”這個名詞替代“大學畢業生低收入聚居群體”。
廉思沒料到,“蟻族”這個名詞在網絡上引起了極大的共鳴。網上很多人發帖“我是蟻族我報到”,還有網友寫下:“只要一個人青春過奮斗過就不會不為蟻族
的故事感動,因為我們每個人心中都有一個蟻族。”
◆采訪手記
蟻族熱
廉思說話很快,隨著“蟻族”熱度的上升,他已成為各類媒體競相拜訪的對象。他似乎想用最短的時間表述最多的記憶、感慨和思考,當然是關于“蟻族”的。
“我希望更多的人能關注蟻族,而不是我廉思。”
《蟻族》出版后,很多80后的父母給他發郵件、打電話、網上留言。家長們告訴廉思是《蟻族》讓他們知道了遠在外地的孩子到底過著什么樣的生活。“有個
家長說,怪不得兒子堅持不讓他去住處看一眼;有個媽媽給我留言,她看了兩天一直在哭,作為一個母親,她感覺自己是那樣的無力。外地一個父輩的朋友,看了當
地報紙對蟻族的報道,打電話來問我:你幫我判斷判斷,我的孩子到底是不是蟻族?”
聚焦難免帶來一些尷尬。廉思隨電視臺去唐家嶺拍攝,有蟻族接受采訪時說,不知道是該感謝廉思還是該責怪廉思,因為他們看見報紙報道,唐家嶺有興建白領
公寓的計劃。“如果‘白宮’(蟻族口中的白領公寓)建起來了,他們負擔不起房租的話,就不得不往更遠的地方搬。”這名蟻族不認識廉思,也不知道他就站在旁
邊。
課題組受邀去人大、北大講座,一些天之驕子反問廉思:蟻族跟我們有關系嗎?我們有必要了解他們嗎?那里面有多少北大、人大的畢業生?
“很多名牌大學畢業生自詡為‘社會精英’。什么是精英?精英應該負有關注社會、關懷弱勢群體的責任感。你享受的權利越多,你承擔的責任也就越大。真正
的精英應當是‘心為平民,行為精英’”。
其實有些蟻族聚居村離北大人大并不遠,然而它們之間卻豎立著一堵隱形、堅硬的墻。要打破這些墻,讓蟻族的青春奮斗不再默默無語,廉思的路還只是剛剛啟
程。不久,全國范圍的調研即將展開,上海團隊已經從同濟、復旦、上海交大招募了四五十人,廉思等核心成員馬上開赴當地。
“每個城市的聚居村形態都不盡相同。上海是群租房,在中低檔小區里,一套三室一廳的房子能打出20個隔間住20個人。廣州則是城中村,緊鄰高檔住宅的
旁邊。”
無論他們處于城市的哪一個角落,他們都在發出自己的輕吟與呼喊,你會不會去聆聽?
生活撲面而來,夢想流離失所
■蟻族展示了真實的80后:迷茫、彷徨,但有夢想,有責任,在堅持
蟻族是“80后”的群體,以22-29歲的大學畢業生為主。1999年大學第一批擴招生入學,2003年第一批擴招生畢業,融入滾滾紅塵。因為就業難
或就業差,他們向自己的師兄師姐詢問有沒有便宜的地方可以落腳。剛剛走出校園,他們渴望安全感,尋求群體認同。由于高校和大量的科技類公司集中在北京的北
部,為了節省生活成本、把握機會,他們在城市的邊緣慢慢積淀下來。
“2003年蟻族形成聚居,兩年后有了一定規模,等2007年我第一次去調查的時候規模已經很大了。這是高等教育擴招、勞動力市場轉型等因素伴隨的產
品,正好讓‘80后’趕上了。”
網上曾有一個流傳很廣的帖子,是“80后”描述自己的尷尬境遇:當我們上小學的時候讀大學不要錢,當我們讀大學的時候上小學又不要錢了。當我們不炒股
的時候傻子都能賺錢,當我們進股市的時候發現我們才是傻子。
“前不著村后不著店的,就是這狀態!”廉思說社會對“80后”的定義一直偏于貶義,“最自私的一代”、“最沒責任心的一代”、“垮掉的一代”,其實作
為改革開放后出生的第一代人,他們經歷著國家的巨大變革,身上表現出來的價值觀、行為方式與生活意識都折射出中國社會特定轉型時期的變化。“80后”究竟
是一代什么人?廉思覺得“蟻族”展示了“80后”的真實面貌,“他們迷茫、彷徨,但有夢想、在堅持,而且承載了很多責任。”
一個來自北京農村的女孩告訴調研員,她希望自己的辛苦奮斗能讓父母有富足的晚年,能讓自己的孩子將來過上更好的生活。承載著如此責任的蟻族絕非少數。
為廉思作“聚居村民序”的鄧錕在唐家嶺住了兩年,兩年里他做過銷售、干過技術、考過研、進過傳銷,也曾創過業。他對父母隱瞞真實情況,總是報喜不報憂。
“日子過得再苦他都沒有哭過。但是有天早上起來,同屋問他昨天晚上怎么哭那么大聲?鄧錕完全沒有印象,看看枕頭是濕的,才知道自己在夢里嚎啕。”廉思
感到心被揪得難受,蟻族是咬著牙苦撐啊!他們中的很多人都背負著整個家族的希望來到大城市打拼,中華民族的傳統在他們身上是有體現的。“他們是最真實的
‘80后’。”
■蟻族基本上屬于“窮二代”群體,只能靠自己,對成功的渴望特別強烈
2009年春節,很多蟻族因為沒錢或沒票回家,只能在聚居村里過年。大年三十的下午,廉思帶著年貨到了唐家嶺,他和十幾個“蟻族”買菜、買水果,熱鬧
地準備年夜飯。
“我們做了一大桌的菜,擠在一個小房間里,還挺有過年的樣子。”喝著酒、嗑著瓜子,當電視機里的春晚載歌載舞時,小屋的氣氛卻漸漸變了。“我就記得當
時有幾個男孩子先后到廁所去抹眼淚了。”
什么是真正的奮斗?從初始接觸的憐憫、同情到最終的佩服、尊重,廉思看到蟻族們確實在奮斗。“三年一輛車五年一套房”是很多蟻族的奮斗目標,夢想對于
他們來說尤其重要。
“你問小月河的人最崇拜誰,他們肯定說王寶強。其實王寶強不是蟻族,沒受過高等教育。但他在小月河住過,而且成功了,他寫的自傳小月河的人都看。他們
對成功的渴望特別強烈,這就是支撐他們堅持下去的動力。
調查顯示,蟻族50%以上來自農村,20%以上來自縣級市,來自省會和直轄市的僅占7%,大部分家庭的年收入不超過5萬,這說明蟻族基本上屬于“窮二
代”群體。這個群體只能靠自己。
不久前,廉思帶一家電視臺再度回訪唐家嶺,遇到一個就職于金融公司的北大畢業生。“他一個月掙5000還是不敢花。窮二代買房首付就交不起,要攢很多
年。城里房租1000塊,唐家嶺只要300塊。這就是現實。”
蟻族告訴廉思“沒有比生活更現實的生活”,“生活撲面而來,夢想流離失所。”這些高度凝練的詞語全來自他們的親身感受。
“其實‘三年一輛車五年一套房’這個夢對很多北京人來說也不敢想,但我們不去戳破這個夢,否則七八個人住一屋,七八十人用一個廁所,沒有夢怎么堅持?
他們的路是他們自己選的,我們沒有資格也沒有權力告訴他們應該怎么做。有人會勸他們為什么不回老家?面對城鄉巨大的差別,這種勸說太蒼白了。”
有人境況好轉搬離了聚居村,有人最終放棄夢想回到了自己的家鄉。這是擺在蟻族腳下的兩條路,通往任何一個方向都是要經過一番彷徨與掙扎的。
■蟻族在調查中強烈質疑了他們所受的高等教育,對這個群體,社會和政府應該有所作為
面對蟻族的調查,課題組成員時時刻刻都能感受到強烈的沖擊力,因為蟻族距離他們自己太近了。一個調研員在訪談中偶然遇到了學校的師兄——兩年前曾經是
學生會里非常活躍的人物——雙方尷尬得說不出話來。
走出“聚居村”時,每個調研員都禁不住在心里問自己:幾年后我會不會成為他們?還有一個調研員告訴廉思,當他錯過了最后一輛返城的公交車時,他感覺錯
過了這輛車仿佛錯過了整個世界。大多數蟻族的夢能否實現誰都不敢確定。
因為好奇,廉思走近了蟻族,在調研中跟蟻族一起吃飯、聊天、喝酒,但總感覺那里并不屬于自己。“我盡量地從蟻族的角度去看待問題,但很可能我盡全力都
做不到。蟻族是真實地生活在那里,而我們只是去體驗過后又回來過自己的生活,我們永遠是旁觀者。”
作為一個學者,廉思感到有時自己是無力的。他能為這些平凡而又堅韌的年輕人做些什么?同情、無謂的勸解都是沒有意義的。
“在我們的調查卷里有一個問題,問蟻族覺得高等教育給他們帶來了什么?選項有知識技能的提高、文化水平的提高,還有自身素質、道德修養、人際交往等
等,可他們只選了最后一項‘一張文憑’。當問到高等教育缺失什么的時候,他們把以上幾項全選上了。大學生們走上社會才知道自己真正需要什么,這些是高等教
育應該反思的東西。”蟻族的身上可能存在著欠缺,但未必是他們個人原因造成的。
雖然廉思認為蟻族內心的力量遠比自己要強得多,但他們真實的生活境遇的確令人擔憂,他們應該得到社會的傾聽與關注。
“對這個群體,社會和政府是可以有所作為的。比如短期內幫他們整治環境和治安,讓他們生活好一點,還可以安裝一些避孕套機等等。中期來說落實一些民主
權利,讓他們參與投票。設立一些文體設施,進行職業培訓。長遠的一些問題則需要逐步立法解決,比如廉租房制度,目前沒有北京戶口是享受不到的。還有高等教
育擴招問題,用不用擴招、擴招多少;民辦教育的規模問題,蟻族中37%來自民辦大學,好多是被騙來的,這些都需要經過慎重討論最后出臺措施。”
廉思并不掩飾他的憂慮,“關心蟻族就是關心我們國家的未來。青年時代的磨難和體驗直接決定10年15年后他們的心態和價值觀。一個人青年時期總被人看
不起、壓抑、仇富,等他40歲突然成功了他幸福嗎?會回報社會嗎?他如何教育下一代?這才是值得思考的。”
posted @
2010-02-13 00:30 d66380022|
編輯 收藏
昨天把表單定義的映射文件做完了,今天依然是相當重要的,做的是單向表單實例映射,首先表單實例映射文件。
難點1是map的配置:
<map
name="propertyMap"
table="itcast_formInstance_propertyMap">
<key
column="formInstanceId"></key>
<map-key
type="string"
column="name"></map-key>
<element
type="serializable"
column="value"></element>
</map>
為什么要實現serializable,所有的數據都是以二進制形式存在,所有的對象理論上都可以序列化,但是有些對象序列
化后會產生比如邏輯等等問題。在這里我們希望服務器重啟后,仍然保存有我想要的對象,也就是可以把原來的對象拿出來!就要實現序列化 ,同學的序列化解釋:
我們有時候將一個java對象變成字節流的形式傳出去或者從一個字節流中恢復成一個java對象,例如,要將java對象存儲到硬盤或者傳送給網絡上
的其他計算機,這個過程我們可以自己寫代碼去把一個java對象變成某個格式的字節流再傳
輸,但是,jre本身就提供了這種支持,我們可以調用OutputStream的writeObject方法來做,如果要讓java幫我們做,要傳輸的對象必須實現serializable接口,這樣,javac編譯時就會特殊處理。
2是定義FormDefinitionActionForm。由于表單字段可以增加,如圖:
我們用兩個數組存放
private String
propertyNameList = {};
private Class[] propertyValueTypeList
= {};
3.那我們就在FormDefinitionAction中
可以這樣處理:
//
actionForm
--> formDefinition
//
1,
copy properties
BeanUtils.copyProperties(formDefinition,
actionForm);
//
2,
fieldDefinitionList
for
(int
i = 0; i < actionForm.getPropertyNameList().length; i++) {
String
name = actionForm.getPropertyNameList()[i];
if
(name != null && name.trim().length() > 0) { // 有效的字段說明
Class
valueType = actionForm.getPropertyValueTypeList()[i];
formDefinition.getFieldDefinitionList().put(name,
valueType);
}
}
//
Save
formDefinitionService.save(formDefinition);
return
mapping.findForward("toList");)
小難點3.要把不同的表單定義名稱顯示到頁面
用Sql語句:select distinct
pd.name ProcessDefinition的全類名pd
小難點4.頁面設計
難點5.審批信息內容:誰 在 什么時間
對哪個表單 做了什么樣的審批
難點6.整個實體類圖及關聯
最重要的還是下圖的關系:要理解好
總之,今天下午聽的暈乎暈乎的,趁過年還得好好復習一下!
posted @
2010-02-09 00:12 d66380022|
編輯 收藏
OA項目之審批流轉
今天是OA項目的最后一個模塊,其業務流程是員工提交申請-à部門經理-à ,這期間要經過的人不一樣,有的要經過一個審批就OK了,而有的得經過3個以上的人審批才行。實現審批流轉有4個要求:
1.方便的定義/x修改 與 管理
流程定義
2. 方便的定義/x修改 與 管理
表單模版
3.執行審批流轉
4.方便的查詢所有的 表
單實例 (數據)記錄(查詢流轉過的表單)
業務流程如同前天已畫的圖:
員工提交申請,后面的環節就會按照我們定義
好的流程走了
所有的表單都要分頁
今天做審批管理,它包含審批流程管理和表單
模版管理
1.設計實體,
2.創建一個Action ,也和前面的一樣CRUD,只是在列表時加了個分頁,多添
加了個查看流程文件(processdefinition.xml)
中,查看流程圖片
3.分頁設計:因為所有頁面都要用,所以寫成公共的,但超鏈接不一樣
如圖:
分頁主要代碼:
// 用戶指定
private int pageSize;
private
int currentPage;
//
查詢數據庫
private
int recordCount;
private
List recordList;//當前頁的所有pd
//
計算
private
int totalPage;
private
int startPageIndex;
private
int endPageIndex;
/**
* 計算指定頁中第一條記錄的索引
*/
public static int
clacFirstResult(int pageNum, int pageSize) {
return
(pageNum
- 1) * pageSize;
}
public
PageView(int
pageSize, int currentPage, int recordCount, List recordList) {
this.pageSize
=
pageSize;
this.currentPage
=
currentPage;
this.recordCount = recordCount;
this.recordList
=
recordList;
//
計算
totalPage,
startPageIndex, endPageIndex;
totalPage
=
(recordCount + pageSize - 1) / pageSize;
startPageIndex
=
1;
endPageIndex
=
totalPage;
if
(totalPage
> 10) {
//
正常顯示當前頁附近的共10個頁碼,當前頁屬于前半部分
startPageIndex
= currentPage - 4;
endPageIndex
= currentPage + 5;
//
(前面不足4個)顯示前10個頁碼
if
(startPageIndex < 1) {
startPageIndex
= 1;
endPageIndex
= 10;
}
//
(后面不足5個)顯示后10個頁碼
else
if (endPageIndex > totalPage) {
endPageIndex
= totalPage;
startPageIndex
= totalPage - 10 + 1; // 顯示時包含開始與結
束的邊界
}
}
}
之后測試分頁
4.解決session問題:
由于在action中用到了session和jbpmContext,必須用一個session,才能保證是同一事務,在這里用jbpmContext得到session
5.Hibernate關于set list map的映射文件
以為例
class Person{
private
Set<String>
addressSet; // 收貨地址
private
List<String>
addressList;
private
Map<String,
String> phoneNumberMap; // 電話號
集合,如:家庭 -- 010-12345678
}
<set name="addressSet"
table="itcast_addressSet">
<key
column="personId"/>
<element
type="string"
column="address"/>
</set>
<list name="addressList"
table="itcast_addressList">
<key
column="peronId"/>
<list-index
column="idx">
<element
type="string"
column="address">
</list>
表單流轉
支持各種審批流程:JBPM
支持各種表單定義:表單中要填寫的字段的數
量不同,類型也不一樣,ActionForm當然不能用,按照上面的業務需求實現編碼。
明天繼續!
posted @
2010-02-07 23:46 d66380022|
編輯 收藏
趁今天休息,把昨天不會的知識總結一下,這幾天小湯給我們帶項目,給大家的感覺就是老師水平很高,我們還得苦修幾年才行啊,小湯經驗挺豐富的,以至于我們
遇到問題時,他一問這個對象可以有嗎?下面萬籟無聲時,小湯一般就說“這個可以有”,好了,還是總結知識點吧:
1.HIbernate創建查詢,首先拿到session,再
List list = session .createQuery(//
" FROM Department d WHERE d.parentId = ?")//
.setParameter(0,值)//
.list();
之后測試,一般對于CRUD操作,都要單元測試。
注意:
用//格式固定格式,Hibernate源碼就是這樣固定格式的
2.用到的標簽(不熟練的)舉例:
<html:link
action="/dept?method=editUI&id=${department.id}">修改<
/html:link>
<html:link
action="/dept?method=del&id=${department.id}&parentId=${parent.id}"
onclick="return window.confirm('您確定要刪除這條記錄嗎?')">刪除</html:link>
3.外鍵可以為空
4.游離:數據庫中有,但沒有和session關聯,Hibernate根據id判定是否是游離狀態,如果你id有值 ,則不是游離。
我在網上查了一下什么是游離對象?
游離對象的特征。游離對象具有以下特征:
(1) 不再位于Session的緩存中,也可以說,游離對象不被Session關聯。
(2) 游離對象是由持久化對象轉變過來的,因此在數據庫中可能還存在與它對應的記錄(前提條件是沒有其他程序刪除了這條記錄)。
游離對象與臨時對象的相同之處在于,兩者都不被Session關聯,因此Hibernate不會保證它們的屬性變化與數據庫保持同步。游離對象與臨時對象
的區別在于:前者是由持久化對象轉變過來的,因此可能在數據庫中還存在對應的記錄,而后者在數據庫中沒有對應的記錄。
Session的以下方法使持久化對象轉變為游離對象:
(1)
當調用Session的close()方法時,Session的緩存被清空,緩存中的所有持久化對象都變為游離對象。如果在應用程序中沒有引用變量引用這
些游離對象,它們就會結束生命周期。
(2)Session的evict()方法能夠從緩存中刪除一個持久化對象,使它變為游離狀態。當Session的緩存中保存了大量的持久化對象,會消耗
許多內存空間,為了提高性能,可以考慮調用evict()方法,從緩存中刪除一些持久化對象。但是多數情況下不推薦使用evict()方法,而應該通過查
詢語言,或者顯式的導航來控制對象圖的深度。
感覺這段話說的挺好的,就copy下來
5.注冊時間轉換器
轉換器為便于在項目中易于維護,放在一個Servlet中,然后將Servlet配置在web.xml中
時間轉換器:
Java代碼
package cn.itcast;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import org.apache.commons.beanutils.Converter;
public class UtilDateConverter implements Converter {
private static SimpleDateFormat format = new
SimpleDateFormat("yyyy-MM-dd");
public Object convert(Class type, Object value) {
if (value == null) {
return value;
}
if (value instanceof Date) {
return value;
}
if (value instanceof String) {
try {
return format.parse((String) value);
} catch (ParseException ignore) {
}
}
return null;
}
}
Servlet類:
Java代碼
package cn.itcast;
import java.util.Date;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import org.apache.commons.beanutils.ConvertUtils;
public class InitConvert extends HttpServlet {
@Override
public void init() throws ServletException {
//注冊轉換器
ConvertUtils.register(new UtilDateConverter(), Date.class);
}
}
web.xml配置:
<servlet>
<servlet-name>InitConvert </servlet-name>
<servlet-class>cn.itacst.InitConvert </servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
6. ActionForward 動態傳參問題:
ActionForward af = mapping.findForward(“toList”);
return new ActionForward(af.getPath+"&parentId="+af,af.getRedirect);
好了,今天就寫到此吧,明天還要上課,睡了!
posted @
2010-02-07 00:25 d66380022|
編輯 收藏
今天繼
續OA
工作流,今天完成部門添加工作,創建子
部門,員工管理等操作
1.部門管理
部門的CRUD操作和完善
列
表:
頂層部門或顯示指定部門的子部門
1. 添
加子門和添加同級部門是同一個添加
1.取出所有的最頂層部門,使用遞歸,遍歷所有部門,
名稱前面加上空格。
2.當前要處理的部門的名稱比上一級部門多一個空格。
效果:
A1
A2
B2
B1
B
B3
之后存到作用域中,這個遞歸要放到Action中進行。
posted @
2010-02-06 00:23 d66380022|
編輯 收藏
OA工作流第二天
再有幾天過年了,心情好。今年過節不回家,明年掙錢了再回,其實車票也很不好買的,以至于車票是近
幾天的焦點。。。今天是OA項目的第二天,湯兄帶我們做了崗位管理模塊,我們是從對象到表進行設計,這就是所謂的正向工程。
整體設計步驟:
一、當然是根據需求設計實體,實現功能:
1.了解需求
2.設計實體(設計數據庫表) 對象-->表
3.分析功能的流程
1.整體。2.具體(部分)
二、編碼實現,單元測試
1.準備編碼:創建Action,與Service接口、實現類(空)。
完成Action中的方法聲明與返回值。()
2.完成Action的方法,確定出所用的Service方法,在Service接口中聲明他,并寫好注釋。
1.獲取參數
2.調用業務方法
3.返回一個顯示
3.完成Service的方法實現,實現要求的功能。確定出Dao中的方法,在Dao接口中聲明他,并寫好注釋。
4.完成Dao的方法的實現。
(為某些Service與Dao寫單測試)
三、頁面顯示層顯示效果
1.寫頁面(Jsp,把靜態頁面改為動態頁面)。
2.寫配置
3.測試運行
具體設計
步驟:1.設計實體,有部門員工崗位賬號四個實體。
實體之間的關系,實體中的屬性。
如下圖:
一個關系,就是一個外鍵
2.接著就是設計映射文件:
多對一:<many-to-one
name class column=”外鍵”/>
一對多:<set
name=”bean中的set屬性名”>
<key column=”外鍵”/>
<one-to-many class/>
</set>
一對一:1.主鍵關聯
關鍵表:<one-to-one
name=” 與之關聯的在本類中的屬性名”/>
附屬表:
<one-to-one
name=” 與之關聯的在本類中的屬性名”
constrained=”true”/>
<id name="id">
<generator
class="foreign">
<param
name="property">與之關聯的在本類中的屬性</param>
</generator>
</id>
2.外鍵關聯
關鍵表:<many-to-one
name=” 與之關聯的在本類中的屬性名” column=”” class=”” unique=”true”/>
附屬表:
<one-to-one
name=” 與之關聯的在本類中的屬性名” class=”” property-ref=” 對方類中關于本類的屬性名”/>
多對多:<set
name table="關系表">
<key
column="本表的id(比如roleId)"></key>
<many-to-many
class="與之關聯的類名"
column="與之形成關系的id(比如employeeId)"></many-to-many>
</set>
以Employee.hbm.xml為例,只寫
關聯關系的
<!--
跟department的多對一 -->
<many-to-one
name="department"
class="Department"
column="departmentId"></many-to-one>
<!--
跟roles的多對多 -->
<set
name="roles"
table="itcast_employee_role">
<key
column="employeeId"></key>
<many-to-many
class="Role" column="roleId"></many-to-many>
</set>
<!--
跟user的一對一 -->
<one-to-one
name="user"></one-to-one>
其他的也是如此寫。
如果還不明白,請與我聯系,我給你源碼。本
人qq:510570367
3.業務流
程
用struts控制流轉,jsp顯示,完成CRUD操作。剩下的就是代碼的編寫了。。。
注意:
1.在開發中一定要使用自定義標簽,可以很
好的處理回顯問題:回顯對應的formBean中對應的字段
2.在
寫關鍵的代碼時,一定要測試。
今天就Ok了,明天繼續!
posted @
2010-02-04 20:12 d66380022|
編輯 收藏
今天在班上上自習,有幾點得備份一下,老忘記:1.是讀取Properties文件的方法;2.是Eclipse快捷鍵的單詞補全;3.是一點生活感觸
1.讀取Properties文件的方法
Properties props = new Properties();
InputStream is =
當前類.getClass().getResourceAsStream("/文件所在路徑");//注:"/"表示根路徑(classes)
props.load(is);
在需要使用屬性文件的時候,直接 props.getProperty("
屬性文件中的name");再強轉一下就搞定了。。.
2.這是轉老師的,盡管我以前也常用單詞補全的快捷鍵,我是“Alt+c”,但我從未總結過,這次拿老師的曬曬
Eclipse的快捷鍵設置或修改方法:
1,打開快捷鍵設置窗口。有兩種方法:
a) Window -> Preferences, General -> Keys.
b) 連按兩次'Ctrl+Shift+L'。
2,找到要修改快捷鍵的功能。在右側窗口的"type filter text"文本框里輸入查
詢的字符串,匹配結果會在下方列出。有兩種查詢方式:
a) 輸入功能名,如"Content Assist"(不含引號).
b) 輸入綁定的快捷鍵名,如"alt+/"(不含引號).
提示:如果沒有查到相應的功能,選中列表下方
的"Include unbound commands"試試,這個表示把未綁定快捷鍵的功能也列出來。
3,綁定新的快捷鍵。選中要設置快捷鍵的功能,在下
方的"Binding"中就會顯示當前綁定的快捷鍵。點擊"Binding"后的文本框,讓其得到焦點,用"Backspace"
(退格鍵)刪除現在正在綁定的快捷鍵,然后直接按快
捷鍵即可(如要修改為
"alt+/",是在按住"alt"鍵的同時按"/"鍵,而不是輸入字符串
"alt+/")。
--------------------------------------------------
需要修改的快捷鍵:
我們習慣使用自動補全的功能叫做"Content
Assist",他的默認快捷鍵是"Ctrl+space",和輸入法有沖突,所以不能使用。一般習慣把他改為'Alt+/',但"Alt+/"和功
能"word completion"(單詞自動補全)的快捷鍵重復,所以還要把"word completion"的快捷鍵改掉,一般改為'Alt+C
3.一些生活感觸
我們今天上午到附近轉了一會兒,我看到了這有一胡同里的房子頂全是石棉瓦蓋的,真讓我對北京失望極了,走出胡同,確切說是走過公路,發現公路兩邊是截然不
同的兩片天空,那邊全是很豪華的小區。。。差距也忒大了...
努力,向前看!
posted @
2010-02-03 22:12 d66380022|
編輯 收藏
OA
工作流(
一)
筆記
今天開始項目之旅,做的第一個項目是OA,OA是OFFICE AUTOMATION的縮寫,是利用技術提高辦公的效率,從而實現辦公自動化。湯兄給我們對OA整體做了介紹,還介紹了需求,OA在整體上實現起來是一樣的,只是根據企業的需求,業務不同,實現不同而已。當然OA項目分了很多模塊,沒時間做太多模塊,我們只做核心的模塊。第一天主要是搭建環境和基礎功能的實
現。
下
面總結一下一天所學知識
該系統的使用者是員工(使用者)和管理員(管理系統)
1.組織機構管理(部門、崗位、員工)
2.審批流轉
1審批管理
2執行審批流轉
3表單查詢
3.根據實際,使用兩層:
1表示層(view)
2業務邏輯層(Service
+ DAO)
4.所使用的框架和技術
Struts 1.3.8, Jstl
1.1, Hibernate 3.2.3, Jbpm
3.2.2(工作流),
Junit4 ,jQuery
5. 搭建環境
1.
添加Struts 1.3.8的jar包與配置文件
2.
添加Jbpm的jar包,同時也會添加Hibernate的jar包。再添加相應的配置文件(jbpm.cfg.xml、log4j.properties與hibernate.cfg.xml)。
3.
添加JDBC驅動的jar包
4.
創建的數據庫。修改Hibernate.cfg.xml中的數據庫連接信息,并創建數據庫表。
5.
添加Junit4的jar包
6.
解決Struts中的commons-BeanUtils.jar與Hibernate中的commons-Collections.jar的沖突問題。
DAO層設計
對一些dao,有公共的
方法,可以寫一個BaseDao
,讓UserDao,RoleDao繼承BaseDao

Service層
設計
在Service層 直接操作數據庫
解決提交的表單內容的中文亂碼
所有的頁面都將使用utf-8編碼,所以提交的表單內容也是utf-8編碼。
在過濾器中設置request的編碼為utf-8:
最后解決:統一業務操作中的Dao操作要使用統一session
統一的管理session的打開關閉與事務的開始提交
總之,今天學到的東西挺多的,受益匪淺啊!也有些感覺以前的知識已有些淡忘,還是得復習復習了。。。
posted @
2010-02-02 21:23 d66380022|
編輯 收藏