ItcastOA-文档1-整体说明-准备环境-基础功能_第1页
ItcastOA-文档1-整体说明-准备环境-基础功能_第2页
ItcastOA-文档1-整体说明-准备环境-基础功能_第3页
ItcastOA-文档1-整体说明-准备环境-基础功能_第4页
ItcastOA-文档1-整体说明-准备环境-基础功能_第5页
已阅读5页,还剩15页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、1. 整体说明1.1. 项目说明1.1.1. OA概述OA是Office Automation的缩写,本意为利用技术的手段提高办公的效率,进而实现办公的自动化处理。实现信息化、无纸化办公,可方便的生成统计报表等。OA是OFFICE AUTOMATION的缩写,本意为利用技术的手段提高办公的效率,进而实现办公的自动化处理。采用Internet/Intranet技术,基于工作流的概念,使企业内部人员方便快捷地共享信息,高效地协同工作;改变过去复杂、低效的手工办公方式,实现迅速、全方位的信息采集、信息处理,为企业的管理和决策提供科学的依据。OA软件解决企业的日常管理规范化、增加企业的可控性、提高企业

2、运转的效率的基本问题。范围涉及日常行政管理、各种事项的审批、办公资源的管理、多人多部门的协同办公、以及各种信息的沟通与传递。可以概括的说,OA软件跨越了生产、销售、财务等具体的业务范畴,更集中关注于企业日常办公的效率和可控性,是企业提高整体运转能力不可缺少的软件工具。1.1.2. 本系统作用组织的核心竞争力源自单位对内外部资源的有效利用。对它们之间的关系进行协调,最大限度的发挥所有资源的作用,并用系统的观点,在整个系统价值最大化的基础上来发挥各个资源的作用,使资源的运作产生协同效用。因此可通过协同办公系统打造单位的核心竞争力。本协同办公系统的主要作用为:1、 建立内部的通信平台。2、 建立信息

3、发布的平台。3、 文档管理的自动化。4、 工作流程的自动化。5、 行政日常事务处理。6、 安全机制的可靠性。本系统旨在加速单位信息化进程,充分利用计算机和现代通讯手段面向单位服务。建立单位内部信息交流的快速通道,以共享信息资源。强化部门业务管理,加强各业务部门之间的交流。实现单位信息的快速上传下达,促进协同办公。提高办公效率,为各级领导及业务人员提供辅助办公和决策服务。1、 本系统将最大限度地提高办公效率和办公质量,降低管理和办公成本,改善办公环境和条件,提高办公管理和决策的自动化和科学化水平。2、 以人为中心,致力于帮助用户实现共享资源、规范流程、推动执行的目的。帮助用户节省办公费用,减少中

4、间环节,优化业务流程,提高整体效率,促进管理进步。简单的说,有以下两点:1,利用技术的手段提高办公的效率2,信息化,可方便的生成统计报表等。1.1.3. 设计原则以应用为核心,要突出“实用、易用、简洁、稳定”。既注重实效,满足用户的现实需要,又为系统的后续升级和扩展留有余地。在技术实现上,要突出“结构清晰、实现合理、通俗易懂(简单)”。1. 实用:满足用户现实需要,解决实际问题,做细核心功能。2. 易用:使用方便,各项功能一目了然。满足用户的使用习惯,易使用、易维护、易升级。实现“傻瓜”式的操作,将实施、培训成本和周期降到最低。3. 简洁:页面简洁,功能简洁,每一个元素都有存在的意义。4. 稳

5、定:从底层数据库到功能层经过严格测试,能在不同的硬件环境中长期平稳运行。1.1.4. 功能说明OA是辅助办公的软件,使用OA与不使用OA相对比的好处是:可以用计算机管理所有的数据,并可以方便的实现统计与报表的功能。提高办公效率。(实现信息化)。以下是一个OA系统的全部功能列表:说明:不是所有的OA都有全部的功能,而是根据需要确定的。1.2. 项目实现说明1.2.1. 软件开发的步骤说明需求确认概要设计详细设计编码单元测试集成测试系统测试维护。单元测试是由程序员自己来完成,最终受益的也是程序员自己。可以这么说,程序员有责任编写功能代码,同时也就有责任为自己的代码编写单元测试。执行单元测试,就是为

6、了证明这段代码的行为和我们期望的一致。集成测试,也叫组装测试或联合测试。在单元测试的基础上,将所有模块按照设计要求(如根据结构图组装成为子系统或系统,进行集成测试。实践表明,一些模块虽然能够单独地工作,但并不能保证连接起来也能正常的工作。程序在某些局部反映不出来的问题,在全局上很可能暴露出来,影响功能的实现。系统测试是将已经确认的软件、计算机硬件、外设、网络等其他元素结合在一起,进行信息系统的各种组装测试和确认测试,其目的是通过与系统的需求相比较,发现所开发的系统与用户需求不符或矛盾的地方,从而提出更加完善的方案。1.2.2. 在项目开发中,我们处于什么位置,要做哪些事情?1.2.3. 在课堂

7、上,我们要完成哪些功能,具体需求是什么?模块功能说明组织与用户管理岗位管理部门管理用户管理系统权限初始化权限分配权限验证权限网上交流-论坛版块管理看帖、发帖、回帖文章管理审批流转(工作流)表单模板管理审批流程管理审批流转表单查询说明:按列出的顺序实现功能。效果以静态页面为准(需求)。按静态页面做1.3. ItcastOA的整体设计1.3.1. 分层一、JavaEE的三层架构二、关于分层的说明1,上面调用下面,即View调用Service,Service调用Dao。2,层与层之间用接口。除定义的接口外,不能使用其它层的特有类或接口。3,使用实体作为DTO(Data Transfer Object

8、,数据传输对象)要做到任一层换掉后,其他层不受影响。我们在此项目中使用两层:View+Service即在Service中直接操作Hibernate.Session。因为如果使用三层,在Service中就会有一部分方法只是直接调用DAO中的方法。一般情况下只有在多个数据源的场合下适合引入DAO层。三、有关分层的几个问题1,一定要分层吗?不一定。假如公司要求你写一个可以给指定员工发送短信的小程序,用于开会通知与自动发送生成祝福短信。这个程序很小,没有多少行代码,而且不变,这时不分层可以吗?完全可以呀。但我们在写程序时,还是要分层的,分层的程序结构清晰,可维护性高。2,一定要3层吗?不一定。分3层是

9、推荐的,而不是必须的,应根据自己的具体情况进行安排。我们如果使用3层的结构,用起来就麻烦,因为在Service中会有一部分方法只是直接调用Dao中的方法,而Dao中的方法只是调用Session完成某操作。此时分2层更好,即在Service中可直接操作Session,以简化结构。其实Hibernate已经可以支持多种数据库。3,一定要使用接口吗?不一定。以前就有同学问我:“在设计程序时确定的技术在开发完成后一般不会更换的,实现类一般也不会更换,这种情况还用接口吗,一般的小项目是不是可以不使用接口?”。是的,如果不会变(一般也不会变),这是完全可以的。我们所学习的框架、技术都是解决问题的推荐方案,

10、而不是必须要用的。遇到问题后优先使用成熟的技术与方案,以避免很多潜在的或后发的问题,避免走不必要的弯路。1.3.2. 所用框架、技术编号工具版本说明1.Struts 1.3.82.JSTL 1.13.Hibernate 3实现持久化操作4.jBPM工作流支持5.Junit4单元测试6.jQuery说明:还有jQuery.validate与jQuery.treeview等小插件1.3.3. 开发环境操作系统Windows XP开发工具MyEclipse6.0数据库MySql5.0.22Web容器Tomcat6.0浏览器IE6说明:1, 推荐使用MyEclipse,这样出现工具问题可以一起解决。当

11、然也可以使用自已熟悉的工具,如Eclipse、NetBeans、IntelliJ。现在的重点是代码实现,不是工具。应使用有效的工具。2, 要注意使用的MySql与JDBC驱动的版本要兼容。3, 显示的技术有兼容的问题,写出的代码可能在某些浏览器中不能正常运行,这就需要在写代码时多使用JS框架,让框架帮我们解决兼容的问题。1.3.4. 代码规范1, 命名:使用驼峰命名法。a) 类、接口:每个单词的首字母大写。例:MyDateConverterb) 变量、方法:第一个单词的首字母小写,其他单词的首字母都大写。例:myDateConverterc) 常量:全字字母都大写,单词之间使用_隔开。例,DE

12、FAULT_PAGE_SIZEd) 使用有意义的名称,慎用缩写。2, 注释:在代码中加入适当的注释:说明步骤,与说明非简单逻辑。3, 空行:在代码中加入适当的空行,就像写文章时要分段一样(增强可读性)。总之,要保证代码的有效、清晰、简洁(可读)。1, 有效:这是第一目标,代码要是可以解决问题的。2, 清晰:在有效的前提下,让代码清晰。3, 简洁:代码与逻辑应尽量的简单,不要是给别人讲别人都听不明白。1.3.5. 约定1, 工程中所有的文件都采用utf-8编码。所有的页面都是使用utf-8编码,这样方便解决表单内容的乱码问题。乱码一般情况下是乱用编码产生的。2, 实体的主键属性的类型使用Long

13、型。1.3.6. 项目计划功能知识点预计时间1. 基础功能a) Dao设计b) 事务管理c) 表单乱码d) 对象管理1. Struts基础2. Hibernate基础3. 过滤器1天2. 组织用户管理a) 岗位管理b) 部门管理c) 用户管理1. 一般的实体设计2. 实体映射(映射文件)3. 增删改查功能4. 树状显示5. 使用jQuery.validate进行表单验证2天3. 系统权限a) 创建权限b) 分配权限c) 使用权限1. jQuery的一般使用2. 权限控制方案2天4. 论坛a) 论坛管理b) 论坛基本功能c) 文章管理1. 分页2. 在线编辑器FCKeditor3天5. jBPM

14、 + 审批流转a) 工作流框架jBPMb) 审批流转功能1. 工作流框架jBPM2. 工作流的一般应用4天2. 准备环境2.1. 创建数据库,要注意编码1,使用MySql数据库。2,创建数据库时,要注意编码要支持中文。3,建表语句如下:create database itcastoa default character set utf8;show create database itcastoa;说明:需要先运行Mysql的配置向导,把编码配为GBK或UTF8。如果配成UTF8,在mysql命令行客户端中就有乱码,所以最好用GBK。2.2. 新建Web工程并进行配置2.2.1. 配置工具2.2

15、.1.1. 配置快捷键1, 把Context Assist设为Alt+/2, 把Word Completion 设为Alt+.3,其他常用快捷键说明:Alt+/Content Assist代码提示Ctrl+T显示类的继承结构Ctrl+O列出类中的成员(成员变量、方法等)Ctrl+/注释/取消注释Ctrl+Shift+O导入要使用的包、并去除不使用的包Ctrl+Shift+F格式化当前文件中的代码/格式化选中的代码Ctrl+Alt+Up复制当前行到下面Ctrl+Alt+Down复制当前行到上面Ctrl+D删除当前行/删除选中文本占的所有行Shift+Enter相当于按End后再按EnterAlt

16、+LeftAlt+RightCtrl+Shift+X变为大写Ctrl+Shift+Y变为小写. 配置文件的默认编码1, 设置工程的默认编码为UTF-8。2, 配置JSP的默认编码为utf-83, 配置JavaScript的默认编码为utf-8说明:在MyEclipse7.x或MyEclipse8.x中不用修改,使用的是工程的编码。. 配置格式化的代码样式1, 使用Ctrl+Shift+F可以格式化代码。2, 在WindowPreferencesJavaCode StyleFormatter中可以设置代码样式。 要把Java代码与注释的行宽设为130。(其他使用默认样

17、式)3, 搜索XML Sources,修改xml的行宽为130。(不考虑打印的情况). MyEclipse工具使用说明1, 导入工程时可以直接选择一个zip文档:FileImportExisting Projects into Workspace-Select archive file。2, 工程改名后,发果发布到Tomcat下,对应的应用的名称不一定改变。这个名称是在MyEclipse Web中的Web Context-root中配置的。新建一个Web Project,并设置工程的编码为UTF-8。2.2.2. 添加框架环境1, 添加Junit4的Jar包。2, JSTL1.1

18、。JavaEE5中已经带了JSTL,但是发布时不会把JavaEE发布到Tomcat中,有时会报错,说找不到JSTL。所以最好再加一下JSTL1.1的环境。3, 添加Struts1.3.8环境:(使用向导生成配置文件,然后再自己添加jar包)a) jar包(不要加antlr-2.7.2、jstl-1.0.2、standard-1.0.2,因为有冲突)b) 配置文件(struts-config.xml、修改web.xml)、国际化资源文件、自定义标签库的TLD文件。配为*.do拦截的请求。4, 添加Hibernate环境:a) jar包(含JDBC驱动的jar包)b) 配置文件(hibernate

19、.cfg.xml)。5, 添加jBPM环境(Jbpm的jar包中已包含Hibernate的jar包)。说明:1, 不要引用外面的Jar包,应全部拷贝到工程中。2.2.3. 配置数据库修改Hibernate.cfg.xml中的数据库连接信息。并在hibernate.cfg.xml中做如下配置:trueupdate2.3. 工程中的资源分类(目录与包结构)2.3.1. 目录结构源码文件夹src项目源代码 config配置文件 test单元测试WebRoot文件夹下 scriptJavaScript脚本文件 styleCSS样式文件 WEB-INF/jspjsp页面文件(再创建子文件夹分类存放)2.

20、3.2. 包结构使用三层:显示层(View),业务层(Service),数据访问层(Dao)(部分)包名说明cn.itcast.oa.domain实体(Domain)cn.itcast.oa.daoDao接口cn.itcast.oa.dao.implDao的实现类cn.itcast.oa.serviceService接口cn.itcast.oa.service.implService的实现类cn.itcast.oa.web.strutsStruts有关的类cn.itcast.oa.web.struts.actionStruts的Actioncn.itcast.oa.web.struts.for

21、mbeanStruts的FormBean(ActionForm)cn.itcast.oa.util一些工具类cn.itcast.oa.cfgcn.itcast.oa.web.filterView显示Jsp + JSTL + Struts + jQuery Service业务逻辑JBPMDao数据访问Hibernate3. 基础功能有的环境,就可以写具体功能了吗?不可以。因为在写具体功能时会用到一些公共的功能(基础功能。如事务管理,在每个模块中都会用到,我们就需要先把这此公共的功能完成,再专心的写每个模块的具体功能。这些基础功能要求都要理解,并独立写一遍。3.1. 设计BaseDao接口与Bas

22、eDaoImpl类每个实体都应有一个对应的Dao,他封装了对这个实体的数据库操作。例实体Dao接口实现类=User- UserDao- UserDaoImplRole- RoleDao- RoleDaoImplDepartment- DepartmentDao- DepartmentDaoImplArticle- ArticleDao- ArticleDaoImpl.说明:4, 实体的Dao接口要继承BaseDao接口。5, Dao的实现类要继承DaoImplBase类。6, 也可以不继承指定的接口或类,这样就要自己写相应的方法。7, T getById(Long id)与List getBy

23、IdList(Long idList)不要合并为List getById(Long. ids),因为获取一个对象时也是返回List,不方便。获取 BaseDao的类型参数T的Class问题:1, 有了DaoBase与DaoImplBase,还要用UserDao、RoleDao吗?答:要用。因为UserDao或RoleDao中的方法可以分为有公有的方法与特有的方法两部分。公有的方法是通过继承BaseDao得到的,特有的方法要写在自己里面(BaseDao中是没有的)。2, UserDaoImpl已经继承了BaseDaoImpl,就不实现UserDao可以吗?答:不可以。否则UserDao user

24、Dao = new UserDaoImpl(); 就不成立。使用反射获取类型参数的真实类型的代码如下:public DaoBaseImpl () Type type = this.getClass().getGenericSuperclass();ParameterizedType pt = (ParameterizedType) type;this.clazz = (Class) pt.getActualTypeArguments()0;说明:1, 使用Session时,不要自己创建,也不要管理事务,直接调用getSession()即可。2, 暂时不实现getSession()方法,在后面的

25、事务管理中实现:protected Session getSession() throw new UnsupportedOperationException();3.2. 事务管理(Session管理)/ 返回与当前线程绑定的Session,如果没有,就创建一个,与当前线程绑定后返回。/ 需要先配置hibernate.current_session_context_class=thread,才能使用SessionFactory.getCurrentSession();事务管理1,在同一个Service中调用的Dao中应使用同一个Session?2,怎么不重复的写Session与Transact

26、ion的管理代码?1,同时执行的多个请求使用的不同的多个线程。2,先后执行的两个请求有可能是使用的同一个线程。(线程池)ThreadLocalFilter.doFilter()打开Sessionchain.doFilter(); / 放行 - ActionServlet - Action - Service关闭Session事务边界。1,一个事务的范围是一个业务操作。转帐()A - 100; / update/ throw exceptionB + 100; / update2,在Dao中只是使用Session,而不管理Session与事务3,一次请求的执行过程1,在Action中要做什么?1

27、,获取用户输入2,进行业务处理(调用业务方法)3,给用户反馈(转到一个显示页面)1, 事务说明:事务的范围是一个业务方法,而不是一个数据库操作。可以用银行转账的例子来说明。2, 事务管理就是要解决两个问题:a) 在同一个请求中怎么使用同一个Session?b) 怎么才能不重复写业务方法中的开关Session与管理事务的模板代码?3, 解决思路:a) 第一个问题:使用SessionFactory.getCurrentSession()b) 第二个问题:使用过滤器,拦截的地址为“*.do”。4, 说明:a) 每个请求使用一个线程来执行。b) 同时执行的多个请求是多个不同的线程。c) 先后的两次请求

28、,有可能使用的是同一个线程(Web容器有线程池)。要使用SessionFactory.getCurrentSession()方法,需要先在hibernate配置文件中做如下配置,否则不能使用(会报错):“thread”配置后影响的行为如下:SessionFactory.getCurrentSession()获取当前线程对应的Session,如果没有(一个线程中的第一次调用),就会创建一个Session并关联到当前线程后返回。Tmit()提交事务,在提交后会自动关闭SessionTransaction.rollback()回滚事务,在回滚后会自动关闭Session说明

29、:如果配置了currentSessionContext,在提交或回滚事务后会自动关闭Session。使用时就不要再调用关闭的代码了。注意:SessionFactory.openSession()后,本次打开的Session不会与当前线程绑定,也就是说用SessionFactory.getCurrentSession()是拿不到的!采用前面的方式时,每一次请求到达Filter时都将开启一个事务,而不论Service层是否会真正的与数据库进行交互,为了避免在许多不会与数据库进行交互但又开启事务在性能上的损失,可以将事务的开启延迟到具体的Service层中,这样,仅仅在Service层需要进行交互的

30、时候才开启事务。不在使用Hibernate来获取当前线程关联的Session,就需要我们自己来实现这样的功能。ThreadLocal派上了用场:private static ThreadLocal sessionMap = new ThreadLocal();ThreadLocal可以存放以当前线程对象为key,以一个Session对象为value存的信息。3.3. 解决提交的表单内容的中文乱码因为所有的页面都将使用utf-8编码,所以提交的表单也是utf-8编码。在过滤器中设置request的编码为utf-8就可以解决POST方式提交表单的中文乱码问题: public void doFilt

31、er(ServletRequest request, ServletResponse response, FilterChain chain) request.setCharacterEncoding(utf-8);chain.doFilter(request, response);对于GET方式乱码不做处理。如做处理,可使用包装或代理的方式。3.4. 对象管理(BeanFactory)使用工厂模式完解决对实现类依赖的问题,并使用配置文件配置要使用的实现类。需要一个工具类,名为BeanFactory,其中有一个获取实现类的方法,可以定义为:Object BeanFactory.getBean( clazz ); 或 T BeanFactory.getBean(Class clazz)在实现时,所使

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论