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. 所用框架、技术
编号 | 工具 | 版本 | 说明 |
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, 简洁:代码与逻辑应尽量的简单,不要是给别人讲别人都听不明白。
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
Struts2
jar包
struts.xml, web.xml
struts.xml
把扩展名配置为action
把主题设置为simple,自己来控制样式
约束文件提示,知道这写什么那写什么
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
或者在里面搜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个
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
测试类
配置文件
Test.jsp
访问结果得知,Struts测试成功
测试spring
SpringTest.java
设置bean
扫描
测试成功控制台显示
声明一个bean,用下面哪一个都可以,括号里写bean的名字或不写都可以
@Component("beanName")
@Controller
@Service
@Repository
配置bean的scope
@Scope("prototype")
注入bean
@Resource
整合SSH
Struts2与Spring整合
为什么要整合:让struts2的Action交给容器管理
Spring与Struts2整合
1,在web.xml中配置Spring的监听器
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
测试是否整合成功
访问结果看出整合成功了
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);
}
从结果看成功了
2,声明式事务管理
<!-- 配置声明式事务管理(采用注解方式) -->
<bean id="txManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager">
<property name="sessionFactory" ref="sessionFactory"></property>
</bean>
<tx:annotation-driven transaction-manager="txManager"/>
测试
控制台
创建了一个表,但里面没有数据
再把这行注释://int e = 1 / 0; //这行会抛异常
再运行测试类
控制台
表中成功插入两行数据,说明声明式事务管理配置成功
完整测试
这就是Action里面调用Service,Service里面还保存了用户操作数据库,三大框架都用了,spring管理事务,Action处理请求,Hibernate处理对象的存储
说明:
1, 不要引用外面的Jar包,应全部拷贝到工程中。
配置日志
加入jar包
log4j.properties文件中默认:
如果把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页面文件(再创建子文件夹分类存放)
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