(完整版)ItcastOA-文档1-整体说明-准备环境-基础功能

(完整版)ItcastOA-文档1-整体说明-准备环境-基础功能
(完整版)ItcastOA-文档1-整体说明-准备环境-基础功能

1.整体说明

1.1. 项目说明

1.1.1.OA概述

OA是Office Automation的缩写,本意为利用技术的手段提高办公的效率,进而实现办公的自动化处理。实现信息化、无纸化办公,可方便的生成统计报表等。

OA是OFFICE AUTOMATION的缩写,本意为利用技术的手段提高办公的效率,进而实现办公的自动化处理。采用Internet/Intranet技术,基于工作流的概念,使企业内部人员方便快捷地共享信息,高效地协同工作;改变过去复杂、低效的手工办公方式,实现迅速、全方位的信息采集、信息处理,为企业的管理和决策提供科学的依据。

OA软件解决企业的日常管理规范化、增加企业的可控性、提高企业运转的效率的基本问题。范围涉及日常行政管理、各种事项的审批、办公资源的管理、多人多部门的协同办公、以及各种信息的沟通与传递。可以概括的说,OA软件跨越了生产、销售、财务等具体的业务范畴,更集中关注于企业日常办公的效率和可控性,是企业提高整体运转能力不可缺少的软件工具。

1.1.

2.本系统作用

组织的核心竞争力源自单位对内外部资源的有效利用。对它们之间的关系进行协调,最大限度的发挥所有资源的作用,并用系统的观点,在整个系统价值最大化的基础上来发挥各个资源的作用,使资源的运作产生协同效用。因此可通过协同办公系统打造单位的核心竞争力。本协同办公系统的主要作用为:

1、建立内部的通信平台。

2、建立信息发布的平台。

3、文档管理的自动化。

4、工作流程的自动化。

5、行政日常事务处理。

6、安全机制的可靠性。

本系统旨在加速单位信息化进程,充分利用计算机和现代通讯手段面向单位服务。建立

单位内部信息交流的快速通道,以共享信息资源。强化部门业务管理,加强各业务部门之间的交流。实现单位信息的快速上传下达,促进协同办公。提高办公效率,为各级领导及业务人员提供辅助办公和决策服务。

1、本系统将最大限度地提高办公效率和办公质量,降低管理和办公成本,改善办公环

境和条件,提高办公管理和决策的自动化和科学化水平。

2、以人为中心,致力于帮助用户实现共享资源、规范流程、推动执行的目的。帮助用

户节省办公费用,减少中间环节,优化业务流程,提高整体效率,促进管理进步。

简单的说,有以下两点:

1,利用技术的手段提高办公的效率

2,信息化,可方便的生成统计报表等。

1.1.3.设计原则

以应用为核心,要突出“实用、易用、简洁、稳定”。既注重实效,满足用户的现实需要,又为系统的后续升级和扩展留有余地。在技术实现上,要突出“结构清晰、实现合理、通俗易懂(简单)”。

1.实用:满足用户现实需要,解决实际问题,做细核心功能。

2.易用:使用方便,各项功能一目了然。满足用户的使用习惯,易使用、易维护、易升

级。实现“傻瓜”式的操作,将实施、培训成本和周期降到最低。

3.简洁:页面简洁,功能简洁,每一个元素都有存在的意义。

4.稳定:从底层数据库到功能层经过严格测试,能在不同的硬件环境中长期平稳运行。

1.1.4.功能说明

OA是辅助办公的软件,使用OA与不使用OA相对比的好处是:可以用计算机管理所有的数据,并可以方便的实现统计与报表的功能。提高办公效率。(实现信息化)。

以下是一个OA系统的全部功能列表:

说明:不是所有的OA都有全部的功能,而是根据需要确定的。

1.2. 项目实现说明

1.2.1.软件开发的步骤说明

需求确认—概要设计—详细设计—编码—单元测试—集成测试—系统测试—维护。

单元测试是由程序员自己来完成,最终受益的也是程序员自己。可以这么说,程序员有责任编写功能代码,同时也就有责任为自己的代码编写单元测试。执行单元测试,就是为了证明这段代码的行为和我们期望的一致。

集成测试,也叫组装测试或联合测试。在单元测试的基础上,将所有模块按照设计要求(如根据结构图〕组装成为子系统或系统,进行集成测试。实践表明,一些模块虽然能够单独地工作,但并不能保证连接起来也能正常的工作。程序在某些局部反映不出来的问题,在全局上很可能暴露出来,影响功能的实现。

系统测试是将已经确认的软件、计算机硬件、外设、网络等其他元素结合在一起,进行信息系统的各种组装测试和确认测试,其目的是通过与系统的需求相比较,发现所开发的系统与用户需求不符或矛盾的地方,从而提出更加完善的方案。

1.2.2.在项目开发中,我们处于什么位置,要做哪些事

情?

1.2.3.在课堂上,我们要完成哪些功能,具体需求是什

么?

说明:按列出的顺序实现功能。效果以静态页面为准(需求)。

按静态页面做

1.3. ItcastOA的整体设计

1.3.1.分层

一、JavaEE的三层架构

二、关于分层的说明

1,上面调用下面,即View调用Service,Service调用Dao。

2,层与层之间用接口。除定义的接口外,不能使用其它层的特有类或接口。3,使用实体作为DTO(Data Transfer Object,数据传输对象)

要做到任一层换掉后,其他层不受影响。我们在此项目中使用两层:View+Service 即在Service中直接操作Hibernate.Session。因为如果使用三层,在Service中就会有一部分方法只是直接调用DAO中的方法。一般情况下只有在多个数据源的场合下适合引入DAO层。

三、有关分层的几个问题

1,一定要分层吗?

不一定。假如公司要求你写一个可以给指定员工发送短信的小程序,用于开会通知与自动发送生成祝福短信。这个程序很小,没有多少行代码,而且不变,这时不分层可以吗?完全可以呀。但我们在写程序时,还是要分层的,分层的程序结构清晰,可维护性高。

2,一定要3层吗?

不一定。分3层是推荐的,而不是必须的,应根据自己的具体情况进行安排。我们如果使用3层的结构,用起来就麻烦,因为在Service中会有一部分方法只是直接调用Dao 中的方法,而Dao中的方法只是调用Session完成某操作。此时分2层更好,即在Service 中可直接操作Session,以简化结构。其实Hibernate已经可以支持多种数据库。

3,一定要使用接口吗?

不一定。以前就有同学问我:“在设计程序时确定的技术在开发完成后一般不会更换的,实现类一般也不会更换,这种情况还用接口吗,一般的小项目是不是可以不使用接口?”。是的,如果不会变(一般也不会变),这是完全可以的。

我们所学习的框架、技术都是解决问题的推荐方案,而不是必须要用的。遇到问题后优先使用成熟的技术与方案,以避免很多潜在的或后发的问题,避免走不必要的弯路。

1.3.

2.所用框架、技术

说明:还有jQuery.validate与jQuery.treeview等小插件

1.3.3.开发环境

说明:

1,推荐使用MyEclipse,这样出现工具问题可以一起解决。当然也可以使用自已熟悉的工具,如Eclipse、NetBeans、IntelliJ。现在的重点是代码实现,不是工具。应使用有效的工具。

2,要注意使用的MySql与JDBC驱动的版本要兼容。

3,显示的技术有兼容的问题,写出的代码可能在某些浏览器中不能正常运行,这就需要在写代码时多使用JS框架,让框架帮我们解决兼容的问题。

1.3.4.代码规范

1,命名:使用驼峰命名法。

a)类、接口:每个单词的首字母大写。例:MyDateConverter

b)变量、方法:第一个单词的首字母小写,其他单词的首字母都大写。例:

myDateConverter

c)常量:全字字母都大写,单词之间使用’_’隔开。例,DEFAULT_PAGE_SIZE

d)使用有意义的名称,慎用缩写。

2,注释:在代码中加入适当的注释:说明步骤,与说明非简单逻辑。

3,空行:在代码中加入适当的空行,就像写文章时要分段一样(增强可读性)。

总之,要保证代码的有效、清晰、简洁( 可读)。

1,有效:这是第一目标,代码要是可以解决问题的。

2,清晰:在有效的前提下,让代码清晰。

3,简洁:代码与逻辑应尽量的简单,不要是给别人讲别人都听不明白。

1.3.5.约定

1,工程中所有的文件都采用utf-8编码。所有的页面都是使用utf-8编码,这样方便解决表单内容的乱码问题。乱码一般情况下是乱用编码产生的。

2,实体的主键属性的类型使用Long型。

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)论坛管理1.分页

2.在线编辑器FCKeditor

3天

2.准备环境

2.1. 创建数据库,要注意编码

1,使用MySql数据库。

2,创建数据库时,要注意编码要支持中文。

3,建表语句如下:

说明:需要先运行Mysql的配置向导,把编码配为GBK或UTF8。如果配成UTF8,在mysql 命令行客户端中就有乱码,所以最好用GBK。

2.2. 新建Web工程并进行配置

2.2.1.配置工具

2.2.1.1. 配置快捷键

1,把Context Assist设为Alt+/

2,把Word Completion 设为Alt+.

3,其他常用快捷键说明:

2.2.1.2. 配置文件的默认编码

1,设置工程的默认编码为UTF-8。

2,配置JSP的默认编码为utf-8

3,配置JavaScript的默认编码为utf-8

说明:在MyEclipse7.x或MyEclipse8.x中不用修改,使用的是工程的编码。

2.2.1.

3. 配置格式化的代码样式

1,使用Ctrl+Shift+F可以格式化代码。

2,在Window→Preferences→Java→Code Style→Formatter中可以设置代码样式。要把Java代码与注释的行宽设为130。(其他使用默认样式)

3,搜索XML Sources,修改xml的行宽为130。(不考虑打印的情况)

2.2.1.4. MyEclipse工具使用说明

1,导入工程时可以直接选择一个zip文档:File→Import→Existing 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。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.cfg.xml)。

5,添加jBPM环境(Jbpm的jar包中已包含Hibernate的jar包)。

说明:

1,不要引用外面的Jar包,应全部拷贝到工程中。

2.2.

3.配置数据库

修改Hibernate.cfg.xml中的数据库连接信息。并在hibernate.cfg.xml中做如下配置:

2.3. 工程中的资源分类(目录与包结构)

2.3.1.目录结构

2.3.2.包结构

使用三层:显示层(View),业务层(Service),数据访问层(Dao)(部分)

View 显示Jsp + JSTL + Struts + jQuery

Service 业务逻辑JBPM

Dao 数据访问Hibernate

3.基础功能

有的环境,就可以写具体功能了吗?不可以。因为在写具体功能时会用到一些公共的功能(基础功能。如事务管理,在每个模块中都会用到,我们就需要先把这此公共的功能完成,再专心的写每个模块的具体功能。

这些基础功能要求都要理解,并独立写一遍。

3.1.设计BaseDao接口与BaseDaoImpl类

每个实体都应有一个对应的Dao,他封装了对这个实体的数据库操作。例

实体Dao接口实现类

========================================================

User --> UserDao --> UserDaoImpl

Role --> RoleDao --> RoleDaoImpl

Department --> DepartmentDao --> DepartmentDaoImpl

Article --> ArticleDao --> ArticleDaoImpl

...

说明:

4,实体的Dao接口要继承BaseDao接口。

5,Dao的实现类要继承DaoImplBase类。

6,也可以不继承指定的接口或类,这样就要自己写相应的方法。

7,T getById(Long id)与List getByIdList(Long[] idList)不要合并为List getById(Long... ids),因为获取一个对象时也是返回List,不方便。

获取 BaseDao的类型参数T的Class

问题:

1,有了DaoBase与DaoImplBase,还要用UserDao、RoleDao吗?

答:要用。因为UserDao或RoleDao中的方法可以分为有公有的方法与特有的方法两部分。公有的方法是通过继承BaseDao得到的,特有的方法要写在自己里面(BaseDao 中是没有的)。

2,UserDaoImpl已经继承了BaseDaoImpl,就不实现UserDao可以吗?

答:不可以。否则UserDao userDao = new UserDaoImpl(); 就不成立。

使用反射获取类型参数的真实类型的代码如下:

说明:

1,使用Session时,不要自己创建,也不要管理事务,直接调用getSession()即可。2,暂时不实现getSession()方法,在后面的事务管理中实现:

protected Session getSession(){

throw new UnsupportedOperationException();

}

3.2.事务管理(Session管理)

// 返回与当前线程绑定的Session,如果没有,就创建一个,与当前线程绑定后返回。// 需要先配置hibernate.current_session_context_class=thread,才能使用SessionFactory.getCurrentSession();

事务管理

1,在同一个Service中调用的Dao中应使用同一个Session?

2,怎么不重复的写Session与Transaction的管理代码?

1,同时执行的多个请求使用的不同的多个线程。

2,先后执行的两个请求有可能是使用的同一个线程。(线程池)

ThreadLocal

Filter.doFilter(){

打开Session

chain.doFilter(); // 放行 --> ActionServlet --> Action --> Service 关闭Session

}

事务边界。

1,一个事务的范围是一个业务操作。

转帐(){

A - 100; // update

// throw exception

B + 100; // update

}

2,在Dao中只是使用Session,而不管理Session与事务

3,一次请求的执行过程

1,在Action中要做什么?

1,获取用户输入

2,进行业务处理(调用业务方法)

3,给用户反馈(转到一个显示页面)

1,事务说明:事务的范围是一个业务方法,而不是一个数据库操作。可以用银行转账的例子来说明。

2,事务管理就是要解决两个问题:

a)在同一个请求中怎么使用同一个Session?

b)怎么才能不重复写业务方法中的开关Session与管理事务的模板代码?

3,解决思路:

a)第一个问题:使用SessionFactory.getCurrentSession()

b)第二个问题:使用过滤器,拦截的地址为“*.do”。

4,说明:

a)每个请求使用一个线程来执行。

b)同时执行的多个请求是多个不同的线程。

c)先后的两次请求,有可能使用的是同一个线程(Web容器有线程池)。

要使用SessionFactory.getCurrentSession()方法,需要先在hibernate配置文件中做如下配置,否则不能使用(会报错):“

name="hibernate.current_session_context_class">thread”

SessionFactory.getCurrentSession() 获取当前线程对应的Session,如果没有

(一个线程中的第一次调用),就会创建一

个Session并关联到当前线程后返回。https://www.360docs.net/doc/c517851959.html,mit() 提交事务,在提交后会自动关闭Session

Transaction.rollback() 回滚事务,在回滚后会自动关闭Session

Session。使用时就不要再调用关闭的代码了。

注意:SessionFactory.openSession()后,本次打开的Session不会与当前线程绑定,也就是说用SessionFactory.getCurrentSession()是拿不到的!

采用前面的方式时,每一次请求到达Filter时都将开启一个事务,而不论Service 层是否会真正的与数据库进行交互,为了避免在许多不会与数据库进行交互但又开启事务在性能上的损失,可以将事务的开启延迟到具体的Service层中,这样,仅仅在Service 层需要进行交互的时候才开启事务。

不在使用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 doFilter(ServletRequest request, ServletResponse response, FilterChain chain) {

request.setCharacterEncoding("utf-8");

对于GET方式乱码不做处理。如做处理,可使用包装或代理的方式。

3.4.对象管理(BeanFactory)

使用工厂模式完解决对实现类依赖的问题,并使用配置文件配置要使用的实现类。需要一个工具类,名为BeanFactory,其中有一个获取实现类的方法,可以定义为:

Object BeanFactory.getBean( clazz ); 或

T BeanFactory.getBean(Class clazz)

在实现时,所使用的实现类应是在配置文件(BeanFactory.properties)中配置的。

RegUserAction.execute(){

// UserService service = new UserServiceImpl();

UserService service = (UserService)Factory.getImpl("UserService");

RoleService roleService = Factory.getImpl("RoleService");

service.regUser(user);

}

class Factory{

public static Object getImpl(String key){

// return new UserServiceImpl();

String className = props.getProperty(key);

return Class.forName(className).newInstance();

}

}

============= Factory.properties ===============

// # key = value

// UserService = https://www.360docs.net/doc/c517851959.html,erServiceImpl

// RoleService = cn.itcast.oa.serive.impl.RoleServiceImpl

1、面向接口编程实现解耦:

上层代码中永远不会出现实现类的名字,在构造实现类的实例的时候不是自己new出来的,而是通过一个BeanFactory统一生产出来的。

BeanFactory中通过读取配置文件知道了实现类的名称,然后通过反射生产出了上层需要的接口实现类的实例对象。

2、通过继承最大化代码的复用:

接口是为了实现多层应用程序的解耦,它向当于上层与下层之间的一种协议!

抽象出来一个父类,表示各个子类之间存在相同的性质。

B接口和C接口同时都继承与A接口,表明B与C同时具有和A相同的性质。

横向看时,B和C不光有相同的性质,还因为他们有不同的性质,所以才需要继承;

纵向看时,B和A、C和A,两个继承关系实际上是组成了一个更大的接口。这个大接口需要他们的子类去遵循或实现。

一句话:多个类或接口有共同的方法或属性,就将这些方法或属性提取出来形成一个单独的父类(父接口)。(注意,接口之间也可以抽象)

3. 方法级别的泛型:

public static T getImpl(Class clazz){

return (T)object;

}

相关主题
相关文档
最新文档