周一至周五 | 9:00—22:00

期刊论文网 > 文化历史论文 > 综合文化论文 > 企业文化类论文 基于ssm的企业内部文化宣传系统

企业文化类论文 基于ssm的企业内部文化宣传系统

2018-12-04 14:15:17来源:组稿人论文网作者:婷婷

  摘要

  随着企业的不断发展,企业文化对于一个企业来说越来越重要。企业文化在凝聚激励员工方面的作用也越来越明显,而且企业之间的竞争已经不仅仅是企业家与企业家的竞争,而是系统与系统的竞争,只有建立健全的企业信息系统,企业才能超越对手,赢得市场。

  目前开发基于Web的企业级应用,Java EE是理想的平台,框架是一个必不可少的技术,而且当前开源社区中涌现出的一大批优秀的开源框架也越来越受到开发者的青睐。本文介绍了Struts2,Spring,MyBatis三大框架的原理及特性,以及它们的整合方式,在此基础上采用MVC三层架构的模式设计了系统的架构,使用Eclipse作为开发工具,MySQL作为数据库开发,并且在系统的实现中使用了CSS,JavaScript,jQuery等富客户端技术来提高用户体验。

  本文根据企业文化发展的需求,设计并实现了一款适合企业需求的文化宣传系统,实现了系统的首页,公司概况,活动纪实,期刊海报,新人风采,招聘需求,后台管理等主要模块,重点研究了三大框架的原理,特性及使用方式。

  关键词企业文化,Java EE,Struts2,Spring,MyBatis

  第一章绪论

  1.1研究背景

  在互联网日益发展的今天,基于Web的企业级应用越来越受到各大企业的重视,但是由于系统需求越来越复杂,而开发的周期却越来越短,这两大矛盾导致了对于好的Web应用框架的需求[1]。一种稳定,重用性高,可扩展,易于维护的Web应用框架对于Web应用的成败起到了至关重要的作用。

  Java EE是目前用于企业级软件开发的最佳平台之一,在过去的Java EE引用中,EJB一直是开发的首选和规范,基本能满足企业级应用的所有要求。但是随着时间的推移,技术的进步,我们发现EJB过于庞杂的功能和要求有时不仅限制了应用的开发,还会带来高昂的开发和维护成本。

  面对EJB的不足,近年来,开源社区涌现出一大批的优秀轻量级框架,例如Struts,Spring,MyBatis,Hibernate,JSF,WebWork等等,这些框架将Web应用的开发变得更加简单,方便,对web应用的各个层次进行了很好的支撑。这些框架的高稳定性,易扩展,易维护,松耦合,开发周期短的特点深受企业的亲睐,于是这些框架便广泛地被应用在了中小型的企业级Web应用中,大大降低了Java EE开发的复杂性,使Java EE有了跨越式的发展[2]。

  在所有的开源框架中,Struts2,Spring和MyBatis绝对是其中数一数二的框架。Struts以其MVC的实现思想,通过一系列的框架类,工具类以及自身的JSP标签库为企业级应用提供了一个快速通用的Web应用框架,从整体上减轻了架构Web应用的负担。Spring则是基于IOC(控制反转)和AOP(面向切面编程)的一个框架,它是全面和模块化的。Spring的分层体系结构使得开发者可以有选择的使用它的一个或多个模块,使用Spring作为业务逻辑层的框架,可以轻松的管理Bean的装配,进行事务管理,而且,Spring对于不同的数据源提供了统一的访问接口。MyBatis则是一个数据持久层(ORM)框架,ORM(对象关系映射)机制实现了Java环境中对象与关系型数据库之间的映射,可以使SQL语句对于开发者来说也成为一种对象,MyBatis使用简单的XML或注解配置映射,将接口和普通的Java类映射成数据库中的记录,完成数据持久化。

  1.2研究内容

  本文以轻量级Java EE框架架构的思想,结合当前流行的SSM(Struts2,Spring,MyBatis)作为项目支撑,深入探究三大框架的架构思想及技术。

  本文以一个企业文化宣传系统为基础,系统的使用了三大框架,以Struts2为Web层框架,利用其MVC的思想,将项目各个模块都分为Model,View和Controller三层,再配合Spring的IoC功能实现对业务对象的解耦,通过MyBatis来实现把关系数据以对象的方式进行处理。由Struts2,Spring和MyBatis整合起来的Web项目架构,有效的解决了业务对象之间的耦合问题以及对数据库的访问,结果集映射的问题,并且通过对项目进行详细设计及开发,验证了轻量级框架的架构给企业级项目的开发带来的简易型,便捷性。

  1.3论文组织结构

  第一章介绍了研究的背景和意义,提出了基于Web的企业级应用的重要性以及使用框架的必要性,指出了EJB不足,介绍了几款优秀的开源框架及特性。

  第二章详细介绍了Java EE以及三大框架的特点,具体的原理,使用之后会给开发带来哪些便利。

  第三章介绍了一个好的架构的特性以及如何整合struts2,Spring,MyBatis三大框架搭建出一个良好的架构,还介绍了系统的设计,一些初步的功能,界面构想,初步构建出了系统的原型。

  第四章介绍了系统的具体实现,以三层模式的形式构建,介绍了Web表现层,业务逻辑层,数据持久层的实现,而且详细介绍了系统中两个重要功能的实现方式。

  第五章对本文的工作进行了总结,并提出不足和对未来工作的展望。

  第二章Java EE框架技术解析

  2.1 Java EE企业级开发平台现状

  2.1.1 Java EE简介

  Java EE是Java平台企业版(Java Platform,Enterprise Edition),Java EE核心是一组技术规范与指南,其中所包含的各类组件、服务架构及技术层次,均有共同的标准及规格,让各种依循Java EE架构的不同平台之间存在良好的兼容性,解决过去企业后端使用的信息产品彼此之间无法兼容,企业内部或外部难以互通的困境。

  Java EE是建立在Java SE所包含的各种技术的基础之上的,因此Java EE的产品不仅要符合Java EE的标准,也要满足Java SE的各项标准。Java SE具有“一次编写,到处运行”的有点,Java EE不但继承了Java SE的有点,同时还发展出了组件化服务,将业务逻辑封装成可复用的组件,在通过Java EE服务器以容器的形式为各种组件类型提供后台服务,使得开发人员可以集中精力关注与解决项目的业务问题,这种平台无关性的结构使得Java EE应用的开发变得非常简单。

  2.1.2 Java EE的优势

  利用Java EE搭建的企业级web应用具有可伸缩性,灵活性,易维护性等多个优势。

  保留现存的IT资产

  由于企业适应新的商业需求的需要,必须利用现有的信息系统方面的投资,而不是全盘推翻已有的,重新开始。基于这样的需求,一个以渐进式的方式建立在已有系统之上的服务器端平台机制是公司所需求的。Java EE平台可以对公司原有的资源进行很好的整合,大大降低企业后期系统升级维护方面的费用[5]。

  高效的开发

  Java EE允许使用中间供应商提供的一些通用的,繁琐的服务端服务,这样使得开发人员可以集中精力在创建自己的商业逻辑上,大大缩短了开发的时间,提高了效率。一些高级而复杂的中间件服务包括:状态管理服务(写更少的代码,不用关心如何管理状态,使开发能更快速的完成),持续性的服务(不用对数据访问逻辑进行编码就能完成与数据库无关且更易于维护的应用程序)等。

  支持异构环境

  Java EE应用程序不依赖于任何操作系统,中间件,以及硬件。而且由于Java EE继承了Java SE的优点,真正实现了“一次编写,到处运行”的理念,Java EE应用可以部署到各种异构的环境中。

  可伸缩性

  Java EE平台的应用程序可以被部署到主流的各种操作系统中[7]。

  2.2 Web层框架Struts2

  在Java EE应用中,Web层主要是依靠JSP或者Servlet来实现。但是由于JSP页面中嵌入大量的Java代码,使得页面的内容和业务逻辑混在一起,既不利于开发,也不利于维护。MVC模式的出现改变了这种局面,它使得页面内容和业务逻辑分开,让不同的开发人员可以专注于自己负责的模块,大大的提高了开发的效率。而Struts2几乎是完美地实现MVC模式的Web框架,再加上使用它封装的JSP页面标签以及OGNL表达式,几乎可以使得JSP页面中不出现任何Java代码,实现表现层和业务逻辑层的完全分离,struts2的工作流程如图2.1所示:

  图2.1 Struts2体系结构图[8]

  客户端初始化一个指向Servlet容器(例如Tomcat)的请求;

  这个请求经过一系列的过滤器;

  接着FilterDispatcher被调用,FilterDispatcher询问ActionMapper来决定这个请求是否需要调用某个Action;

  如果ActionMapper决定需要调用某个Action,FilterDispatcher把请求的处理交给ActionProxy;

  ActionProxy通过Configuration Manager询问框架的配置文件,找到需要调用的Action类;

  ActionProxy创建一个ActionInvocation的实例;

  ActionInvocation实例使用命名模式来调用,在调用Action的过程前后,涉及到相关拦截器(Intercepter)的调用;

  一旦Action执行完毕,ActionInvocation负责根据struts.xml中的配置找到对应的返回结果。返回结果通常是(但不总是,也可能是另外一个Action链)一个需要被表示的JSP或者FreeMarker的模板。在表示过程中可以使用Struts2框架中继承的标签。

  Struts2框架有很多优秀的技术,在此介绍几种在项目中用到的并且对于项目开发带来非常巨大作用的三种技术:拦截器,OGNL表达式以及Struts封装的JSP标签。

  2.2.1 Struts2的拦截器技术

  拦截器与AOP(Aspect Oriented Program,面向切面编程)是密切相关的,AOP从程序运行角度来考虑程序的流程,取得业务处理过程的切面,在特定切面通过系统自动插入特定的方法。拦截器技术是Struts2的一个非常重要的组成部分,它使得方法的调用可以无需用代码来完成,只要通过配置文件,在程序运行的时候,利用框架去调用目标方法,从而实现了更高层次的解耦。

  在Web层,某几个模块可能需要完成同样的功能,比如数据校验,文件上传,这时候使用拦截器策略,将这些功能定义成拦截器,然后进行动态的组合,在Struts配置文件中添加对这些拦截器的引用,就可以让定义的那些方法在目标代码之前或者之后执行。

  图2.2拦截器执行时序图

  拦截器的调用如图2.2所示,是通过代理的方式,当请求到达Struts2的ServletDispatcher是,Struts2会根据配置文件实例化相应的拦截器并以此调用。

  2.2.2 OGNL表达式

  Struts2为了简化View层的开发,采用了Struts2标签和OGNL(Object-Graph Navigation Language)两种技术,使得JSP页面几乎不含有Java代码。

  OGNL最重要的作用是解决了数据在View层和Controller层之间传递时的类型不匹配的问题,比如View层的数据都是一个一个的字符串,而在Controller层则是Java对象或者其他数据类型,经常会出现数据类型不匹配的问题,在用原始的Servlet技术时,必须手动用代码进行类型转换,但是在Struts2的框架中就不需要,Struts2利用Struts2标签和OGNL表达式自动完成了类型转换。

  Struts2在采用XWork的OGNL方案的基础上,引入了OGNL ValueStack机制,ValueStack是一个堆栈结构,对其中对象的操作按先入后出的顺序进行。Struts2还提供了一个特殊的OGNL PropertyAccessor,可实现对ValueStack从上往下的自动搜索,并返回第一个符合条件的对象。ValueStack是Struts2 OGNL的根对象,其中所包含的所有对象都属于根对象,action的实例也存储于其中。

  在Struts2中,对于每个请求都会对每个Action建立相应的ActionContext和ValueStack,ActionContext为OGNL的上下文环境,是一个Map结构。在这个结构中,除了ValueStack这一个根对象以外,还有被封装的Servlet对象:request,session,application,parameters和attr等。对于根对象的访问,可以直接使用属性名访问,非根对象的访问则必须指明命名空间,即ActionContext.getContext(),OGNL中用“#”来表示,例如#request.userName[12]。

  2.2.3 Struts2标签

  Struts2封装的JSP标签与OGNL结合,使前台从后台获取数据更方便,不再有多余的Java代码,并且通过Struts2的属性文件实现应用的页面国际化,非常方便。

  2.3业务逻辑层框架Spring

  Spring是一个轻量级的Java开源框架,它是为了降低企业应用开发的复杂性而创建的。Spring使用基本的JavaBean来完成之前只能使用EJB来完成的事情。Spring的核心是IOC容器以及AOP的实现,在核心上面有一个数据访问DAO框架,包括一个自身的JDBC数据访问封装和对众多ORM框架的支撑。Spring还内置了很多其他的功能,例如WebMVC框架等等。但是本系统中主要使用Spring的IOC容器和AOP功能以及它对数据持久层框架的支持。

  Spring在很多时候其实扮演的是一个黏合剂的功能,将很多优秀的开源框架完美的集成在一起,也可以认为Spring是通过组装的方式来构建一个个的系统[。

  2.3.1控制反转(IOC)

  IOC是Spring的核心,IOC就是将创建和管理组件的控制权转移给外部容器,不再让代码来控制,控制权的转移即是所谓的反转,这样就在很大程度上降低了组件对象的依赖程度,实现了对象之间的解耦。

  IOC通常使用依赖注入的原则来实现,而且依赖注入不需要使用特定的API和接口,使用非常方便。Spring支持两种依赖注入的方式:Setter注入和构造注入。

  =1\*GB3①Setter注入:IOC容器通过获得的控制权,利用组件的Setter方法将组件的间的依赖关系注入。

  =2\*GB3②构造注入:在组件的构造函数中提供依赖关系的注入,IOC容器会在实例化组件的时候传入依赖关系。但是当使用这种方式时,大量的构造器参数会显得混乱且难以管理。

  因此一般使用Setter注入的方式。

  2.3.2面向切面编程(AOP)

  使用AOP可以使开发人员在开发时减少重复代码的编写,提高开发效率,AOP可以将指定的方法插入到制定的代码之前或之后执行。比如,我们在两个类中的每个方法中加入日志的功能。如果按面向对象的设计方法,我们就必须在两个类中的方法中都加入日志的功能,哪怕功能是完全一样的。当然,也可以将实现日志功能的这段代码提取出来放到一个独立的类当中,但是这样的话,前面提到的两个类就跟这个日志类有了耦合。而AOP就能很好的解决这个问题,它能在运行时动态地将代码切入到类的指定方法、指定位置上,这样类之间既不会有大量的重复代码,而且类之间的耦合程度也大大的降低[14]。

  2.3.2 Spring优势

  Spring能有效的组织中间层对象,能很好的处理其他框架遗留下来的问题,是一个完美的框架黏合剂。

  Spring提倡针对接口编程,几乎没有业务对象依赖于Spring的API,使得使用Spring开发的应用具有很强的移植性。

  使用Spring构建的程序测试起来非常容易。

  Spring的IOC设计大大降低了业务对象之间的耦合关系,使得替换组件变得非常容易。

  Spring的ORM和DAO提供了与第三方持久层架构良好整合,并简化了底层数据库的访问[15]。

  2.4数据持久层框架MyBatis

  MyBatis是一款优秀的数据持久层框架,支持自定义SQL、存储过程和高级映射。MyBatis几乎消除了所有的JDBC代码,也基本不需要手工去设置参数和获取检索结果。MyBatis能够使用简单的XML格式或者注解来进行配置,能够映射基本数据元素、Map接口和POJO(普通Java对象)到数据库中的记录[16]。

  MyBatis是半自动化的,它需要开发人员自己写SQL语句,这一点与Hibernate的面向对象,自动化有点区别,但是由于SQL语句是自己写的,开发人员可以自行对SQL语句进行优化,实现比Hibernate更高的查询效率。

  MyBatis只是封装了数据访问层,做了部分的对象关系映射,但代价是必须写XML配置文件,相对Hibernate要写更多的SQL语句。MyBatis小巧灵活、可扩展、封装了数据访问层,并提供了DAO框架支持。

  利用MyBatis可以做到SQL语句与代码分离,只要SQL语句能解决的问题,MyBatis就能解决,同时使得项目对框架的依赖性变小,这将降低项目风险,减少解决复杂问题的时间,使得项目的维护变得简单。

  MyBatis对于应用的修改、调试、扩充、维护将会变得容易自然。修改时,主要修改代表模型的实体对象,XML配置文件中的SQL语句或配置文件ResultMap。同时SQL和代码分离,不用再在代码中寻找要修改的SQL语句[17]。

  MyBatis使用数据库连接池来与数据库进行连接,而不是使用淡出的JDBC进行连接。数据库连接是一种关键的有限的昂贵的资源,这一点在多用户的网页应用程序中体现得尤为突出。对数据库连接的管理能显著影响到整个应用程序的伸缩性和健壮性,影响到程序的性能指标。数据库连接池负责分配、管理和释放数据库连接,它允许应用程序重复使用一个现有的数据库连接,而再不是重新建立一个;释放空闲时间超过最大空闲时间的数据库连接来避免因为没有释放数据库连接而引起的数据库连接遗漏。MyBatis使用数据库连接池技术能明显提高对数据库操作的性能[18]。

  2.4.1 MyBatis的功能架构

  MyBatis的功能架构分为三层:

  API接口层:提供给外部使用的接口API,开发人员通过这些本地API来操纵数据库。接口层一接收到调用请求就会调用数据处理层来完成具体的数据处理。

  数据处理层:负责具体的SQL查找、SQL解析、SQL执行和执行结果映射处理等。它主要的目的是根据调用的请求完成一次数据库操作。

  基础支撑层:负责最基础的功能支撑,包括连接管理、事务管理、配置加载和缓存处理,这些都是共用的东西,将他们抽取出来作为最基础的组件。为上层的数据处理层提供最基础的支撑[19]。

  2.4.2 MyBatis的框架架构

  加载配置:配置来源于两个地方,一处是配置文件,一处是Java代码的注解,将SQL的配置信息加载成为一个个MappedStatement对象(包括传入参数映射配置、执行SQL语句、结果映射配置),存储在内存中。

  SQL解析:当API接口层接收到调用请求时,会接收到传入SQL的ID和传入对象(可以是Map、JavaBean或者基本数据类型),Mybatis会根据SQL的ID找到对应的MappedStatement,然后根据传入参数对象对MappedStatement进行解析,解析后可以得到最终要执行的SQL语句和参数。

  SQL执行:将最终得到的SQL和参数拿到数据库进行执行,得到操作数据库的结果。

  结果映射:将操作数据库的结果按照映射的配置进行转换,可以转换成HashMap、JavaBean或者基本数据类型,并将最终结果返回[20]。

  第三章企业内部文化宣传系统架构搭建及设计

  在前一章中介绍了Struts2,Spring,MyBatis三大框架的特性,优势,本章将在此基础上整合出一个架构模型,这个架构模型适用于企业级开发,可以使得开发变得更加高效。之后会介绍Struts2,Spring,MyBatis三大框架的集成方式以及其在web表现层、业务逻辑层、数据持久层中具体的设计以及实现。

  3.1框架搭建

  前一章中详细介绍了Struts2,Spring,MyBatis,本文将在此基础上整合这三个框架,并且加入JavaScript,jQuery,CSS等前端技术作为补充,使用户界面更为友好。

  框架版本:Struts 2.3.4.1,Spring 3.2.0.M2,MyBatis 3.2.0

  该架构采用三层结构:表现层,业务逻辑层和数据持久层。

  各个层次负责各自的功能,各层之间采用接口进行通信,屏蔽了内部实现细节。

  3.1.1 Struts2与Spring的整合

  Struts2是一个优秀的MVC框架,但它对于组件的创建及管理并没有做的很好,因此将它与Spring整合,利用Spring的IOC机制来管理应用中的组件,使得Java实例在被调用的时候才被创建,可以确保各组件之间的低耦合。Spring可以采用动态、灵活的方式来管理各种对象、对象与对象之间的具体实现互相透明。

  为了使用Struts2以及Spring框架,首先将这两个框架的jar包导入到项目中,然后需要在项目的web.xml文件中加入如图3.1的代码:

  web.xml中的配置代码

  struts2

  org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExec-uteFilter

  struts2

  /*

  org.springframework.web.context.ContextLoaderListener

  图3.1基于SSM的企业内部文化宣传系统web.xml中的配置代码

  配置org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter这个过滤器的作用是确保应用中的所有请求都经过它,然后决定请求如何往下执行。

  配置org.springframework.web.context.ContextLoaderListener这个监听器的作用是在web应用启动时自动查找WEB-INF/下的applicationContext.xml配置文件,并且根据该文件来创建Spring容器。

  Struts2框架整合Spring后,处理用户请求的Action不是由Struts创建,而是由Spring创建。创建实例时,利用配置的Action的class属性的值找到对应的bean的id属性,从Spring容器中获得相应的实例,并且Spring还将实例化完整的Dao装配给Service,再将Service装配给Action,这样使得各层组件之间的耦合度大大减少,使得后期维护以及测试变得非常方便。

  3.1.2 MyBatis与Spring的整合

  MyBatis整合Spring,就是想利用Spring的事务管理,Spring的IOC对Bean进行管理等。首先也是导入MyBatis的jar包,然后在src目录下创建MyBatis的配置文件,内容如图3.2:

  MyBatis配置文件代码

  "-//mybatis.org//DTD Config 3.0//EN"

  图3.2基于SSM的企业内部文化宣传系统MyBatis配置文件代码

  如图3.2,MyBatis的配置文件中主要就两个内容,一个是为实体类取别名,使得在映射文件中参数或者返回值类型不用写的很长,另外一个内容就是就是定义映射XML文件,这些文件中是具体的SQL语句,以及一些参数,返回值类型,供MyBatis框架使用,来操作数据库,保存数据。

  要使MyBatis与Spring整合,需要在Spring的配置文件applicationContext.xml中加入如图3.3的代码:

  applicationContext.xml配置文件代码

  图3.3基于SSM的企业内部文化宣传系统applicationContext.xml配置文件代码

  这段代码是用来配置数据源,以及定义MyBatis的配置文件的路径和声明一个必须使用的类org.mybatis.spring.SqlSessionTemplate,这个类是用来调用MyBatis框架中提供的对数据库的增删改查的方法。

  最后一个配置文件,或者说是一系列配置文件是每个功能模块的MyBatis映射文件,其中主要的内容就是SQL语句以及需要的参数类型或返回值类型,其中一个例子如图3.4:

  MyBatis资源映射文件例子

  "-//mybatis.org//DTD Mapper 3.0//EN"

  select fileHeader,filePath,releaseDatefrom culturalsite.culture order by releaseDate desc limit#{start},#{amount}]]>

  select count(*)from culturalsite.culture]]>

  insert into culturalsite.culture(fileHeader,filePath,releaseDate)

  values(#{fileHeader},#{filePath},#{releaseDate})

  ]]>

  delete from culturalsite.culture where filePath=#{filePath}

  ]]>

  图3.4基于SSM的企业内部文化宣传系统MyBatis资源映射文件例子

  至此,三大框架整合完成,也就是说项目的架构已经搭建完成,接下来在系统设计完成之后,就可以在此基础上进行项目的开发实现。

  3.2系统设计

  3.2.1系统流程

  通过时序图来分析系统的主要流程,如图3.6所示:

  图3.5基于SSM的企业内部文化宣传系统时序图

  由图3.5可知,使用本系统一共有九个步骤:

  用户需要点击页面上给出的链接进行访问,下载文档查看或者打开新的查看页面;

  点击之后,请求会发送给Action;

  Action会将传过来的数据交给Service进行处理;

  Service根据条件调用相应的Dao;

  Dao对数据库进行增删改查的操作;

  操作完成后数据库将操作的结果返回;

  Dao再将返回的结果封装成JavaBean传给Service;

  Service再将数据返回给Action;

  最后由Action将数据显示到JSP页面上。

  3.2.2系统用例

  用户可以根据自己的需要查看页面上的任意模块,查看自己感兴趣的内容。本系统一共分为九大模块:登录,首页,公司概况,企业文化,招贤纳士,心灵驿站,生日贺信,调查投票,后台管理,其中企业文化又分为活动纪实,评优奖励,期刊海报,新人风采四个模块,招贤纳士分为招聘需求,内部举荐,举荐奖励三个模块,并且,后台管理模块只有管理员有权限访问,系统用例图如图3.6所示:

  图3.6基于SSM的企业内部文化宣传系统用例图

  3.2.3系统功能结构

  图3.6中列出了系统的功能模块,下面简要介绍一下各模块的功能:

  登录:因为是内部系统,员工必须通过登录才能访问。

  首页:展示公司的办公场景,以及公司最近的一些活动,还有一些员工介绍,风采展示。

  公司概况:公司基本介绍展示。

  企业文化:包括活动纪实,评优奖励,期刊海报,新人风采四个小模块,四个模块分别具体展示企业发布的期刊,组织的各项活动的照片分享,对于部分优秀员工的奖励情况,以及新进员工的基本介绍。

  招贤纳士:包括招聘需求,内部举荐,举荐奖励三个模块,这三个模块分别的作用是,发布一些职位需求,发布一些内部举荐的活动信息,以及展示获得举荐奖励的人员名单。

  调查投票:企业可以定期发布一些调查问卷来获的员工的意见与建议。

  心灵驿站:定期发布一些温馨提示之类的文章,关心一下员工。

  生日贺信:系统每天对于当天过生日的员工自动发送祝福邮件。

  后台管理:管理员利用此功能对于前台页面显示的各项内容进行增删改查的维护管理。

  3.2.4系统初步设计展示

  首页

  图3.7基于SSM的企业内部文化宣传系统首页设计图

  如图3.7,首页最上部分从左到右分别是事业部Logo,天气预报以及日历,天气可以手动进行选择,之后是菜单栏,每个菜单栏都是相应的模块,其中“企业文化”以及“招贤纳士”两个菜单分别有各自的下拉菜单,其中的模块如上节所述,菜单栏之下是一块图片区域,其中会轮换播放公司办公场景的图片,图片区域之下是“心灵驿站”模块,其中滚动显示各个文章的标题,点击标题可以将文档下载到本地进行查看,再之后的三块区域分别展示了最新的期刊(点击也可下载到本地),最新的活动(点击可进入相应页面查看分享的照片),职位需求广告,以及员工的一些风采展示。页面最下面是版权说明。

  公司概况

  图3.8基于SSM的企业内部文化宣传系统公司概况功能设计图

  如图3.8,其中,header,menu,footer与首页中的顶部,菜单栏以及页脚版权对应,中间是公司概况模块的整体内容,也就是一个对公司整体情况的概述。

  企业文化

  活动纪实

  图3.9基于SSM的企业内部文化宣传系统活动纪实功能设计图

  如图3.9,header,menu,footer部分同首页,中间是举办活动的信息,包括主题,举办地点,举办时间,并且按照举办时间的先后进行排序,最近的排在最前面,活动主题的内容为链接,点击进入具体的页面,可以查看活动分享的照片,如图3.10所示:

  图3.10基于SSM的企业内部文化宣传系统活动纪实详细功能设计图

  页面中央显示照片以及对于照片的描述,点击上一张,下一张可以查看上一张或下一张照片。

  评优奖励

  图3.11基于SSM的企业内部文化宣传系统评优奖励功能设计图

  如图3.11,header,menu,footer部分同首页,中间为获奖列表,分为主题和获奖日期两列,按照获奖日期倒序排列,主题的内容为链接,点击可以进入获奖者介绍的详细页面进行查看,如图3.12:

  图3.12基于SSM的企业内部文化宣传系统评优奖励详细功能设计图

  期刊海报

  图3.13基于SSM的企业内部文化宣传系统期刊海报功能设计图

  如图3.13,header,menu,footer同首页,中间为期刊海报的展示列表,按发布日期倒叙排列,主题的内容同样是链接,点击将会将文档下载到本地供用户阅读。

  新人风采

  图3.14基于SSM的企业内部文化宣传系统新人风采功能设计图

  如图3.14,header,menu,footer同首页,中间为新进员工个人信息,按照入职时间倒序排列,以类似卡片的形式显示。

  招贤纳士

  招聘需求

  图3.15基于SSM的企业内部文化宣传系统招聘需求功能设计图

  如图3.15,header,menu,footer同首页,中间为职位信息介绍,同样也是按照发布时间倒序排列。职位信息那一列为链接,点击可进入详细页面查看职位信息,如图3.16所示:

  图3.16基于SSM的企业内部文化宣传系统招聘需求详细功能设计图

  内部举荐

  此模块的功能与期刊海报模块类似,在此不列出样式,此模块与期刊海报模块的不同点在于链接的文档为内部举荐的活动介绍,同样是供用户下载阅读。

  举荐奖励

  图3.17基于SSM的企业内部文化宣传系统举荐奖励功能设计图

  如图3.17,header,menu,footer同首页,中间是举荐活动列表,分为获奖人,举荐活动名,获奖日期,根据获奖日期倒序排列,其中举荐活动名是链接,点击查看举荐喜报的页面。

  调查投票

  此功能模块也与期刊海报模块相似,在此不列出样式,此模块中的文档为调查问卷,供用户下载后填写。

  后台管理

  此模块在此以期刊海报为例,列出管理界面:

  添加期刊海报功能

  图3.18基于SSM的企业内部文化宣传系统添加期刊海报功能设计图

  填写相应的信息之后点击上传进行文件的上传及记录的添加。

  删除期刊海报功能

  图3.19基于SSM的企业内部文化宣传系统删除期刊海报功能设计图

  通过勾选前面的多选框进行记录的删除。

  至此,基本完成了对于系统的外观及功能设计,在系统实现的过程中可能还将对于设计中不完善的地方进行改进。

  第四章企业内部文化宣传系统实现

  4.1开发环境

  基于SSM的企业内部文化宣传系统的开发环境包括程序开发语言、数据库系统和开发工具,具体描述如表4.1所示:

  表4.1系统开发环境

  工具名称版本操作系统Windows 7旗舰版开发语言JavaJDK 7数据库MySQL5.6服务器Apache Tomcat7.0系统开发环境Eclipse4.24.2编码与实践

  首先,在搭好的架构上使用标准化的结构建立项目,在划分包时,以每个业务模块为一个包,每个包按照标准化结构和分层原则建立Java类,如表4.2所示:

  表4.2系统层次及代码组织原则

  层次代码组织示例领域模型Java类后缀BeanCultureBean资源访问Java类后缀DaoCultureDao业务逻辑Java类后缀ServiceCultureServiceWeb MVCJava类后缀ActionCultureAction其次,将依赖的包全部放入项目的lib文件夹下,并配置引用路径。

  4.3分层设计的实现

  依据架构设计原则,该系统分为三层:Web表现层,业务逻辑层和数据持久层。

  4.3.1 Web表现层的实现

  Web层使用架构中的Struts2实现MVC模式。前端使用JavaScript以及jQuery来作为富客户端技术,提高用户体验。

  前端的文件包括JSP文件,JavaScript文件以及CSS文件。JSP中使用Struts2的标签以及ONGL表达式来展示数据,简化前端的开发,使JSP页面中尽量少的嵌入Java代码,是页面代码看上去更加简洁,便于维护,如图4.1所示:

  JSP页面代码例子

  图4.1基于SSM的企业内部文化宣传系统JSP页面代码例子

  而且使用Struts2进行国际化,不用直接在页面上写内容,将所有的页面静态内容全部写到属性文件中,可以根据浏览器的设置,调用不同的国际化文件,显示不同的语言,提高开发效率,方便进行维护,如图4.2所示:

  Struts2国际化文件举例代码#--culture--

  showCulture.title=期刊海报

  showCulture.tabletitle=期刊海报展示

  showCulture.theme=主题

  showCulture.releasedate=发布日期图4.2基于SSM的企业内部文化宣传系统Struts2国际化文件举例代码

  整个表现层使用传统的JSP页面,并且使用jQuery提高用户体验,而且由于菜单可以进行修改,因此加入了简单的ajax的技术,使得菜单能动态的生成,运行效果如图4.3所示:

  图4.3基于SSM的企业内部文化宣传系统期刊海报功能界面

  Action的实现代码举例public class CultureAction extends BaseAction{

  //业务逻辑处理类声明

  private CultureService cultureService;

  public CultureService getCultureService(){

  return cultureService;

  }

  public void setCultureService(CultureService cultureService){

  this.cultureService=cultureService;

  }

  public String showCulture()throws Exception{

  super.setUrl("showCulture");

  super.setBaseService(cultureService);

  super.showRecord();

  return SUCCESS;

  }

  //添加期刊海报

  public String addCulture()throws Exception{

  if(super.getUpload()!=null){

  String realFilePath=ServletActionContext.getServletContext()

  .getRealPath("/files/culture")

  +"\\"

  +super.getUploadFileName();

  cultureService.addCulture(super.getUpload(),

  super.getUploadFileName(),realFilePath);

  super.setUpload(null);

  }

  return SUCCESS;

  }

  //删除期刊海报

  public String deleteCulture()throws Exception{

  if(super.getPaths()!=null){

  cultureService.deleteCulture(super.getPaths());

  super.setPaths(null);

  }

  super.setUrl("deleteCulture");

  super.setBaseService(cultureService);

  super.showRecord();

  return SUCCESS;

  }

  }图4.4基于SSM的企业内部文化宣传系统Action实现代码举例

  4.3.2业务逻辑层的实现

  业务逻辑层是整个系统的核心,完成逻辑实现和业务处理。它接收表现层的用户请求,并通过持久层完成数据的存取操作。

  4.3.3数据持久层的实现

  数据持久层是系统与数据库进行交互的层次,它完成领域模型对象的持久化操作。在本架构中使用MyBatis框架来实现持久化操作。通过对日常开发中数据库的操作进行梳理而提炼出来的Dao基类可以适用于大部分的开发场景,各个Dao的实现只需以泛型的方式继承该类,如图4.5:

  public class CultureDao extends BaseDao{

  }图4.5基于SSM的企业内部文化宣传系统泛型实现举例

  如上所示,CultureDao通过泛型的方式继承了BaseDao,获得了常用的数据库操作方法。若BaseDao中的方法不能完全满足,CultureDao可以随时通过重写或增加方法进行扩展,如图4.6:

  public class CultureDao extends BaseDao{

   Override

  protected List getRecord(Map map){

  String sql="culture.getCulture";

  return super.getRecordWithMap(sql,map);

  }

  }图4.6基于SSM的企业内部文化宣传系统扩展方法举例

  如图4.6所示,CultureDao通过重写父类的方法的方式实现了自己的getRecord方法。

  4.4系统的重要功能的实现

  本系统主要的功能是用来展示和宣传企业的文化活动,几乎都是以页面展示为主,我认为其中有两个比较重要的功能:文件下载,图片的轮换播放。

  4.4.1文件下载功能实现

  Struts2中对文件下载做了直接的支持,比起自己设置各种HTTP头,无疑是方便了很多。对于文件下载,最直接也是最简单的方式莫过于直接写一个超链接,让地址等于要被下载的文件,例如:下载myfile.txt,然后用户在浏览器中点击这个链接就能进行下载了。但是这种下载方式有一些缺陷,例如如果一个地址是一个图片或者pdf文档,浏览器就会直接打开它,而不是直接进行下载。再比如如果文件名是中文,它会显示一堆URL编码过的文件名,类似于%2313…。

  目前似乎还没有直接对Struts2进行配置之后来正确下载中文名称附件的方法,但是我们可以通过编写一个DownloadFileAction来实现中文附件下载的功能。

  第一步,编写一个普通的Action,提供一个返回InputStream流的方法,该输入流代表了被下载文件的入口,这个方法用来给被下载的数据提供输入流,即从这个流中读出来,再写到浏览器端提供下载,方法如图4.7,其中filePath为DownloadFileAction的属性:

  public InputStream getInputStream()throws Exception{

  //通过ServletContext,也就是application来读取数据

  return ServletActionContext.getServletContext().getResourceAsStream(

  filePath);

  }图4.7基于SSM的企业内部文化宣传系统DownloadFile返回InputStream流的方法

  第二步,在struts.xml文件中对action进行配置,代码如图4.8:

  application/octet-stream;charset=ISO8859-1

  inputStream

  attachment;filename="${downloadFileName}"

  4096

  图4.8基于SSM的企业内部文化宣传系统配置DownloadFileAction

  这个action特殊的地方在于result的类型是一个流(stream),配置stream类型的结果时,因为无需指定实际显示额物理资源,所以无需指定location属性,只需要指定inputName属性,该属性指向被下载文件的来源,对应着DownloadFileAction类中的某个属性,类型为InputStream。下面列出了配置文件中出现的一些参数列表:

  contentType

  内容类型,和互联网MIME标准中规定类型一致,例如text/plain代表纯文本,text/xml表示XML,image/gif代表GIF图片,image/jpeg代表JPG图片,代码中使用的是二进制方式,其中的charset是必须要加入的,否则某些时候会导致下载的文件出错。

  inputName

  下载文件的来源流,对应着action类中某个类型为InputStream的属性名,例如取值为inputStream的属性需要编写getInputStream()方法。

  contentDisposition

  文件下载的处理方式,包括内联(inline)和附件(attachment)两种方式,而附件方式会弹出文件保存对话框,否则浏览器会尝试直接显示文件。取值为attachment;filename="${downloadFileName}"表示文件下载的时候保存的名字为DownloadFileAction类的downloadFileName属性的值。如果直接写filename="${downloadFileName}",那么默认情况是代表inline,浏览器会自动打开它,等价于这样的写法:inline;filename="${downloadFileName}"。

  bufferSize

  下载缓冲区的大小

  在这里面,contentType属性和contentDisposition分别对应着HTTP响应中的头Content-Type和Content-disposition头。

  第三步,为了能成功的下载中文名称的附件,我们还必须对文件名做一个转码操作。方法如图4.9其中fileName是DownLoadAction的一个属性值:

  public String getDownloadFileName(){

  String downFileName=fileName;

  try{

  downFileName=new String(downFileName.getBytes(),"ISO8859-1");

  }catch(UnsupportedEncodingException e){

  e.printStackTrace();

  }

  return downFileName;

  }图4.9基于SSM的企业内部文化宣传系统DownloadFileAction对文件名转码的方法

  其中fileName是DownloadAction的一个属性值,也就是说下载时我们需要给action的属性fileName一个值,而下载得到的附件的名称会随着fileName而动态变化,而且呗转换成了ISO8859方式的西欧字符集。

  至此,我们已经实现了中文附件下载的功能了,但是还有最重要的一个安全问题,因为我们的文件是保存在项目中的一个文件夹中的,如果访问者对Struts2比较熟悉的话,他可能会使用类似这样带有表单参数的地址来访问,这样的结果就是下载后文件内容是系统里面的web.xml的文件源码,甚至还可以用这种方式来下载任何其他的文件源码。这对系统安全是一个很大的威胁。有两种方法可以解决这个问题,一是从数据库中进行路径配置,然后把Action类中的设置filePath的方法去掉,然后使用这种方式来进行文件下载:downloadFile?fileId=1。二是在execute()方法中进行路径检查,如果发现有访问不属于下载文件夹中的内容的代码,就一律拒绝,不返回文件内容。改进后的方法如图4.10:

  public String execute()throws Exception{

  //文件下载目录

  String downloadDir=ServletActionContext.getServletContext()

  .getRealPath("/files");

  //文件下载路径

  String downloadFile=ServletActionContext.getServletContext().getRealPath(filePath);

  File file=new File(downloadFile);

  //真实文件路径,去掉里面的..等信息

  downloadFile=file.getCanonicalPath();

  //发现企图下载不在/files下的文件,就显示空内容

  if(!downloadFile.startsWith(downloadDir)){

  return null;

  }else{

  return SUCCESS;

  }

  }图4.10基于SSM的企业内部文化宣传系统DownloadFileAction改进后的execute方法

  此时,访问者在企图下载非下载文件夹中的内容时,只能得到一个空白页,至此,中文附件下载的功能完成。

  4.4.2图片轮换功能的实现

  系统中另一个重要功能就是图片的轮换播放,本系统中采用jQuery实现。

  jQuery是一个优秀的JavaScript框架,它是轻量级的js库,它兼容CSS3,还兼容各种浏览器。jQuery的核心理念是write less,do more,能是用户更方便地处理HTML documents、events、实现动画效果,并且方便地为网站提供AJAX交互。

  运行效果图如图4.11所示:

  图4.11基于SSM的企业内部文化宣传系统活动纪实详细功能界面

  原理流程:

  获得页面上的图片对象,然后将除第一张以外的所有图片全部隐藏

  获取第一张图片及其alt属性的值,显示在图片下方的信息栏

  为“上一张”,“下一张”两个按钮添加事件,使得点击时分别切换为上一张或下一张图片,使用fadeOut和fadeIn的方式切换图片。

  4.5项目展示

  在解决了项目的几个核心功能之后,整个项目基本慢慢的就成型了,以下是项目展示。

  首页

  图4.12基于SSM的企业内部文化宣传系统首页功能界面

  如图4.12,首页的最顶部左侧是事业部的logo,往右依次是天气以及日历时钟,下面是菜单栏,其中“企业文化”以及“招贤纳士”菜单有如图中所示的下拉菜单,之后是四张轮换播放的办公场景的图片,中间的心灵驿站是滚动播放的各种文章,点击可下载进行阅读。下面的三块内容是几个大的功能模块的简要展示,最左侧是期刊以及活动图片的展示,点击期刊标题可以下载期刊进行查看,点击最下面的活动名称,可以进入活动的详细页面查看分享的图片,中间是一张招聘广告的图片,将热门职位展示在页面上,最右边是最新的获奖人以及最近入职的新人的展示,点击图片可以进入相应详细页面查看相关内容。

  公司概况

  图4.13基于SSM的企业内部文化宣传系统公司概况功能界面

  如图4.13,展示的是本系统的公司概况的功能界面,此功能展示一些关于公司情况的介绍。

  活动纪实

  图4.14基于SSM的企业内部文化宣传系统活动纪实功能界面

  如图4.14,是活动的列表展示,其中活动主题是链接形式,点击可以进入详细的照片分享页面,例如点击第一条记录,会得到如图4.15的页面:

  图4.15基于SSM的企业内部文化宣传系统活动纪实详细功能界面

  如图4.15展示了第一条活动记录所发布的照片,点击“上一张”,“下一张”可进行照片的切换。

  评优奖励

  图4.16基于SSM的企业内部文化宣传系统评优奖励功能界面

  如图4.16,展示评优奖励模块的具体内容,也是以列表的形式展示各个获奖名单,按照获奖日期倒序排列,其中主题是链接形式,点击可以进入各条记录的详细页面,例如点击第二条记录,可进入如图4.17所示的功能界面:

  图4.17基于SSM的企业内部文化宣传系统评优奖励详细功能界面

  如图4.17所示,评优奖励的详细功能界面会展示关于获奖员工的基本信息以及对于他获奖事迹的阐述。

  期刊海报

  图4.18基于SSM的企业内部文化宣传系统期刊海报功能界面

  如图4.18所示,期刊海报功能模块以列表形式展示,按照发布日期倒叙排列,其中主题为链接形式,点击可以进行各个期刊的下载。

  招聘需求

  图4.19基于SSM的企业内部文化宣传系统招聘需求功能界面

  如图4.19所示,以列表的的形式展示了各个招聘职位,按照发布日期倒叙排列,其中职位名称是链接形式,点击可以进入详细页面浏览职位信息,如图4.20所示:

  图4.20基于SSM的企业内部文化宣传系统招聘需求详细功能界面

  后台管理—期刊海报管理

  添加期刊海报

  图4.21基于SSM的企业内部文化宣传系统添加期刊海报功能界面

  如图4.21所示,后台管理功能界面分为两部分,左侧为个功能模块管理的菜单,右侧为具体管理页面,图中显示的是添加期刊海报的功能界面,这个功能只需上传文档,上传之后系统会根据上传的文档路径得到文件名作为前台的显示,并把文档保存到系统文件夹下供用户下载。

  删除期刊海报

  图4.22基于SSM的企业内部文化宣传系统删除期刊海报功能界面

  如图4.22所示,删除期刊海报功能界面将记录以列表的形式列举出来,然后通过勾选需要删除的记录,点击删除按钮进行删除,系统会同时删除数据库中的记录以及保存在系统文件夹下的文件。

  后台管理—评优奖励管理

  由于添加和删除功能与期刊海报模块相似,在此不做过多展示,只展示修改功能模块。

  修改评优奖励

  图4.23基于SSM的企业内部文化宣传系统修改评优奖励功能界面

  如图4.23所示,评优奖励管理的修改界面,将所有记录列举出来,点击列表左侧的主题可以进入各条记录的修改界面,例如点击第一条记录,进入如图4.24所示的页面:

  图4.24基于SSM的企业内部文化宣传系统修改评优奖励详细功能界面

  如图4.24,所示,可以对每条评优奖励的记录根据需要进行修改。

  第五章总结展望

  本文在研究了Java EE以及Struts2,Spring,MyBatis三大框架的技术之后,开发了一个企业文化宣传系统,成功使用了三大框架的优势,开发出了一款易维护而且扩展性良好的系统。

  5.1总结

  本文研究的主要内容如下:

  Java EE方面的相关内容和技术,如JDBC,Java Servlet,JSP,XML等。Java EE是目前最稳定而且使用最广泛的Web应用的开发平台,在此基础上开发出来的Web应用具有可伸缩性、灵活性、易维护性,Java EE的组件化开发,使得开发出的应用具有良好的可移植性,实现“一次编写,到处运行”的目标。

  Struts2框架的研究,重点是它的MVC的架构方式,拦截器机制,OGNL表达式以及封装的JSP标签。这些技术使得表现层与业务逻辑层真正的实现分离,拦截器机制更是使得目标代码与调用代码分离,而且可以在执行时,通过框架来调用目标代码,实现了方法的重用以及更高层次的解耦。

  Spring框架的研究,重点是它的IOC容器以及AOP的实现,Spring框架利用依赖注入的方式对JavaBean进行创建和管理,使得开发者不用再在代码中进行Java类的创建,降低了类之间的耦合,通过配置文件来实现对Bean的调用,在需求发生变更时可以不用修改源码,只需通过修改配置文件就能满足需求,符合开闭原则。同时,Spring是完美的框架粘合剂,通过它可以将表现层的Struts2框架以及数据持久层的MyBatis框架完美的整合在一起。

  MyBatis框架研究,重点是对数据访问层的封装以及它的半自动化的实现,MyBatis通过对配置文件的解析,将其中的SQL语句的执行结果与Java类进行映射,使得开发人员可以像对待对象一样来对待对数据库的操作,简化的数据访问,并且由于是半自动化的,开发人员可以通过优化SQL语句来提高数据访问的效率。

  基于SSM的企业文化宣传系统的实现。通过对于三大框架技术的研究,创建了一款小型的Web应用,成功运用了三大框架,实现了表现层与业务逻辑层的分离,使得页面上尽量少的嵌入Java代码,利用Spring的IOC容器对Bean进行创建和管理,降低了类之间的耦合,利用Spring的事务管理机制对数据源进行管理,而MyBatis很好的解决了对数据库的访问问题,开发时不用关注系统如何对数据库进行访问,只需关注需要用的SQL语句以及相应的映射类。这三大框架为成功的开发出系统奠定了坚实的基础。

  5.2展望

  要完全了解掌握Java EE以及三大框架的原理和使用,本文所做的研究还远远不够,还需要付出更多的努力。目前还处于初始阶段,需要进一步解决的问题包括:

  系统中自动发信的功能未能实现,JavaMail方面的机制了解不够深入,需要投入更多的时间及精力研究并实现。

  AOP的实现理解不够深入,使用起来还有困难,需要更多更深入的使用来提高对此机制的理解。

  系统的界面优化不够,由于对CSS以及jQuery等技术仅作了部分了解,并未深入探究,因此系统还是一个很粗糙的原型,需要进行更多的界面优化工作。

栏目分类