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系统的全部功能列表:

ItcastOA_整体说明_准备环境-LMLPHP

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

1.2. 项目实现说明

1.2.1. 软件开发的步骤说明

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

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

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

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

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

编码及简单测试等

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

模块

功能

说明

组织与用户管理

岗位管理

部门管理

用户管理

系统权限

初始化权限

分配权限

验证权限

网上交流--论坛

版块管理

看帖、发帖、回帖

文章管理

审批流转(工作流)

表单模板管理

审批流程管理

审批流转

表单查询

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

按静态页面做

1.3. ItcastOA的整体设计

1.3.1. 分层

一、JavaEE的三层架构

ItcastOA_整体说明_准备环境-LMLPHP

二、关于分层的说明

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. 所用框架、技术

编号

工具

版本

说明

1.

Struts 2

2.1.8.1

2.

Hibernate

3.6.0

实现持久化操作

3.

Spring

2.5

4.

jBPM

4.4

工作流支持

5.

Junit

4

单元测试

6.

jQuery

1.4

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

1.3.3. 开发环境

操作系统

Windows

开发工具

MyEclipse 8.6

Eclipse

数据库

MySql 5.0.22

Web容器

Tomcat 6.0

浏览器

IE 6

说明:

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

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

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

1.3.4. 代码规范

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

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

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

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

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

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

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

5, 要格式化代码、一个java文件中的代码不要过多、一个方法中的代码不要过多。

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

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

2, 清晰:在有效的前提下,让代码结构与思路清晰。

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

ItcastOA_整体说明_准备环境-LMLPHP

1.3.5. 约定

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

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

1.3.6. 项目计划

功能

知识点

预计时间

1. 搭建环境 + 基础功能

a) Dao设计

1. Struts基础

2. Hibernate基础

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. 在线编辑器FCKeditor

3天

5. jBPM + 审批流转

a) 工作流框架jBPM

b) 审批流转功能

1. 工作流框架jBPM

2. 工作流的一般应用

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.1.1. 配置快捷键

1, 把Content 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后再按Enter

Alt+Left

Alt+Right

Ctrl+Shift+X

变为大写

Ctrl+Shift+Y

变为小写

2.2.1.2. 配置文件的默认编码

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

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

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. 添加框架环境

    Junit

      ItcastOA_整体说明_准备环境-LMLPHPItcastOA_整体说明_准备环境-LMLPHPItcastOA_整体说明_准备环境-LMLPHP

    Struts2

      jar包

ItcastOA_整体说明_准备环境-LMLPHP

      struts.xml, web.xml

ItcastOA_整体说明_准备环境-LMLPHPItcastOA_整体说明_准备环境-LMLPHP

struts.xml

把扩展名配置为action

ItcastOA_整体说明_准备环境-LMLPHP

把主题设置为simple,自己来控制样式

ItcastOA_整体说明_准备环境-LMLPHP

约束文件提示,知道这写什么那写什么            

ItcastOA_整体说明_准备环境-LMLPHP

ItcastOA_整体说明_准备环境-LMLPHP

ItcastOA_整体说明_准备环境-LMLPHP

struts.xml

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
"http://struts.apache.org/dtds/struts-2.0.dtd"> <struts>
<!-- 配置为开发模式,不用重新发布 -->
<constant name="struts.devMode" value="true"/>
<!-- 把扩展名配置为action -->
<constant name="struts.action.extension" value="action"/>
<!-- 把主题设置为simple,自己来控制样式 -->
<constant name="struts.ui.theme" value="simple"/> <package name="default" namespace="/" extends="struts-default"> </package>
</struts>

web.xml

   <!-- 配置Struts2的核心过滤器 -->
   <filter>
<filter-name>struts2</filter-name>
<filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>
</filter> <filter-mapping>
<filter-name>struts2</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>

    Hibernate

      jar包:核心包, 必须包, jpa, c3p0, jdbc

      hibernate.cfg.xml, *.hbm.xml

ItcastOA_整体说明_准备环境-LMLPHP

或者在里面搜hibernate.cfg.xml找一个多点配置的粘过来就行了

*.hbm.xml映射文件也是在里面搜,随便拷个过来

hibernate.cfg.xml

<?xml version='1.0' encoding='utf-8'?>
<!DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd"> <hibernate-configuration> <session-factory> <!-- 1.数据库连接信息-->
<property name="dialect">org.hibernate.dialect.MySQL5InnoDBDialect</property>
<property name="connection.driver_class">com.jdbc.mysql.Driver</property>
<property name="connection.url">jdbc:mysql://localhost:3306/itcastoa</property>
<property name="connection.username">root</property>
<property name="connection.password">root</property> <!-- 2.其他配置 -->
<property name="show_sql">true</property>
<property name="hbm2ddl.auto">update</property> <!-- 3.导入映射文件 -->
<mapping resource="cn/User.hbm.xml"/> </session-factory> </hibernate-configuration>

   Spring

      jar包(核心包,依赖包[aop:aspectjrt.jar、aspectjweaver.jar、cglib-nodep-2.1_3.jar],日志commons-logging.jar)5个

ItcastOA_整体说明_准备环境-LMLPHP

      appicationContext.xml/beans.xml

      去示例代码中搜随便拷一个

applicationContext.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:aop="http://www.springframework.org/schema/context"
xmlns:tx="http://www.springframework.org/schema/tx"
xsi:schemaLocation="
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-2.5.xsd
http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.5.xsd"> <!-- 自动扫描与装配bean -->
<context:component-scan base-package="cn.itcast.oa" ></context:component-scan>
<bean></bean>
</beans>

测试struts

测试类

ItcastOA_整体说明_准备环境-LMLPHP

配置文件

ItcastOA_整体说明_准备环境-LMLPHP

Test.jsp

ItcastOA_整体说明_准备环境-LMLPHP

访问结果得知,Struts测试成功

ItcastOA_整体说明_准备环境-LMLPHP

测试spring

SpringTest.java

ItcastOA_整体说明_准备环境-LMLPHP

设置bean

ItcastOA_整体说明_准备环境-LMLPHP

扫描

ItcastOA_整体说明_准备环境-LMLPHP

测试成功控制台显示

ItcastOA_整体说明_准备环境-LMLPHP

声明一个bean,用下面哪一个都可以,括号里写bean的名字或不写都可以

  @Component("beanName")

  @Controller

  @Service

  @Repository

配置bean的scope

  @Scope("prototype")

注入bean

  @Resource

  整合SSH

    Struts2与Spring整合

  为什么要整合:让struts2的Action交给容器管理

  Spring与Struts2整合

    1,在web.xml中配置Spring的监听器

ItcastOA_整体说明_准备环境-LMLPHP

ItcastOA_整体说明_准备环境-LMLPHP

web.xml中添加

    <!-- 配置Spring的用于初始化容器对象的监听器 -->
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:applicationContext*.xml</param-value>
</context-param>

     2,加一个jar包

在struts-2.1.8.1\lib下找到struts2-spring-plugin-2.1.8.1.jar

测试是否整合成功

ItcastOA_整体说明_准备环境-LMLPHP

访问结果看出整合成功了

ItcastOA_整体说明_准备环境-LMLPHP

    Hibernate与Spring整合

       1,管理SessionFactory实例(只需要一个)

    <!-- 配置SessionFactory -->
<bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
<!-- 指定hibernate的配置文件位置 -->
<property name="configLocation" value="classpath:hibernate.cfg.xml"></property>
<!-- 配置c3p0数据库连接池 -->
<property name="dataSource">
<bean class="com.mchange.v2.c3p0.ComboPooledDataSource">
<property name="jdbcUrl" value="${jdbcUrl}"></property>
<property name="driverClass" value="${driverClass}"></property>
<property name="user" value="${user}"></property>
<property name="password" value="${password}"></property> <!-- 其他配置 -->
<!--初始化时获取三个连接,取值应在minPoolSize与maxPoolSize之间。Default: 3 -->
<property name="initialPoolSize" value="3"></property>
<!--连接池中保留的最小连接数。Default: 3 -->
<property name="minPoolSize" value="3"></property>
<!--连接池中保留的最大连接数。Default: 15 -->
<property name="maxPoolSize" value="5"></property>
<!--当连接池中的连接耗尽的时候c3p0一次同时获取的连接数。Default: 3 -->
<property name="acquireIncrement" value="3"></property>
<!-- 控制数据源内加载的PreparedStatements数量。如果maxStatements与maxStatementsPerConnection均为0,则缓存被关闭。Default: 0 -->
<property name="maxStatements" value="8"></property>
<!--maxStatementsPerConnection定义了连接池内单个连接所拥有的最大缓存statements数。Default: 0 -->
<property name="maxStatementsPerConnection" value="5"></property>
<!--最大空闲时间,1800秒内未使用则连接被丢弃。若为0则永不丢弃。Default: 0 -->
<property name="maxIdleTime" value="1800"></property>
</bean>
</property>
</bean>

Jdbc.properties

jdbcUrl     = jdbc:mysql:///itcastoa
driverClass = com.mysql.jdbc.Driver
user = root
password =root

测试

    //测试SessionFactory
@Test
public void testSessionFactory() throws Exception {
SessionFactory sessionFactory = (SessionFactory)ac.getBean("sessionFactory");
System.out.println(sessionFactory);
}

从结果看成功了

ItcastOA_整体说明_准备环境-LMLPHP

    2,声明式事务管理

    <!-- 配置声明式事务管理(采用注解方式) -->
<bean id="txManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager">
<property name="sessionFactory" ref="sessionFactory"></property>
</bean>
<tx:annotation-driven transaction-manager="txManager"/>

测试

ItcastOA_整体说明_准备环境-LMLPHP

ItcastOA_整体说明_准备环境-LMLPHP

ItcastOA_整体说明_准备环境-LMLPHP

ItcastOA_整体说明_准备环境-LMLPHP

控制台

ItcastOA_整体说明_准备环境-LMLPHP

创建了一个表,但里面没有数据

ItcastOA_整体说明_准备环境-LMLPHP

再把这行注释://int e = 1 / 0; //这行会抛异常

再运行测试类

控制台

ItcastOA_整体说明_准备环境-LMLPHP

表中成功插入两行数据,说明声明式事务管理配置成功

ItcastOA_整体说明_准备环境-LMLPHP

完整测试

ItcastOA_整体说明_准备环境-LMLPHP

这就是Action里面调用Service,Service里面还保存了用户操作数据库,三大框架都用了,spring管理事务,Action处理请求,Hibernate处理对象的存储

ItcastOA_整体说明_准备环境-LMLPHP

说明:

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

  配置日志

加入jar包

ItcastOA_整体说明_准备环境-LMLPHP

log4j.properties文件中默认:

ItcastOA_整体说明_准备环境-LMLPHP

如果把warn改为error,启动的时候如果没有任何错误则没打印出任何警告信息

日志有5种级别

  debug 调试信息

  info 一般信息

  warn 警告

  error 错误

  fatal 严重错误

2.2.3. 配置数据库

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

<!-- 显示sql语句 -->
<property name="show_sql">true</property>
<!-- 自动更新表结构 -->
<property name="hbm2ddl.auto">update</property>

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

2.3.1. 目录结构

源码文件夹

   src项目源代码

conf配置文件

test单元测试

WebRoot文件夹下

scriptJavaScript脚本文件

styleCSS样式文件

WEB-INF/jspjsp页面文件(再创建子文件夹分类存放)

ItcastOA_整体说明_准备环境-LMLPHP

2.3.2. 包结构

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

(部分)

包名

说明

cn.itcast.oa.domain

实体(Domain)

cn.itcast.oa.dao

Dao接口

cn.itcast.oa.dao.impl

Dao的实现类

cn.itcast.oa.service

Service接口

cn.itcast.oa.service.impl

Service的实现类

cn.itcast.oa.struts2.action

Struts的Action

cn.itcast.oa.util

一些工具类

cn.itcast.oa.cfg

cn.itcast.oa.filter

View显示Jsp + JSTL + Struts + jQuery

Service业务逻辑JBPM

Dao数据访问Hibernate

05-22 10:50