今天复习知识点:
一.工作流,审批流程。举例,比如请假流程:
提交申请-->部门经理 -->
后面是一层一层的审批...
审批流转就是把单位内部的审批电子化。经过的环节和人不一样
四点要求:
流程定义:
二.分页设计
<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|
编辑 收藏