在线办公系统之二 整合SSM框架

项目整理,在线办公系统(整合SSM+Activiti+Shiro)

在线办公系统之一 整合SSM

SSM整合

首先整个项目下来,感觉自己对框架的认识又在加深,其实在整合SSM的时候,不妨想一下对应模块的作用,就知道配置文件需要什么东西了,而不应该死记硬背,整合SSM的时候注意对应的要素,搭建环境的步骤:

JAR包–>web.xml—>Spring相关的XML–>SpringMVC相关XML—>MyBatis相关的XML

  1. JAR包的导入,这次采用的是手动导包,当然,对应的包应该注意是否有冲突,之前用MAVEN来完成,无论是Eclipse还是IDEA,MAVEN关键是在POM文件的文件进行导包处理,记住镜像配置选择国内的镜像源,注意处理依赖冲突。Shiro对应的Jar包注意需要有对应的web组件。activiti5对应的JAR包,SSM包都比较经典,这些包对应在网上都有资源。

在这里插入图片描述
需要注意的是,这次是用Eclipse进行项目开发,所以导入包之后,对应的操作要注意。例如JAR包部署到TOMCAT中,右键项目–>属性,然后对应的包ADD进去之后,就可以进行,这边的项目如何添加到TOMCAT中,就不多赘述了。
在这里插入图片描述

  1. 对应的框架文件,这里先进行SSM框架文件的整理:

Spring

Spring的配置文件当然可以写到一个文件上,但是,当你熬夜完成项目,意志力薄弱,而且不喝枸杞上火的时候,查错不要发火就行了。
接下来我们将Spring的配置文件分成几个模块解释:

  • applicationContext-dao.xml

这个文件主要配置的是关于数据层的配置,那想一下DAO需要啥?我们在JDBC阶段,就知道,DAO之所以能是DAO,就是得存在一个连接,并且获取对应的数据层的封装业务,所以,首先就是要配置数据库连接、SQLfactory、mapper的扫描器等

<beans xmlns="http://www.springframework.org/schema/beans"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:mvc="http://www.springframework.org/schema/mvc"
	xmlns:context="http://www.springframework.org/schema/context"
	xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx"
	xsi:schemaLocation="http://www.springframework.org/schema/beans 
		http://www.springframework.org/schema/beans/spring-beans-3.2.xsd 
		http://www.springframework.org/schema/mvc 
		http://www.springframework.org/schema/mvc/spring-mvc-3.2.xsd 
		http://www.springframework.org/schema/context 
		http://www.springframework.org/schema/context/spring-context-3.2.xsd 
		http://www.springframework.org/schema/aop 
		http://www.springframework.org/schema/aop/spring-aop-3.2.xsd 
		http://www.springframework.org/schema/tx 
		http://www.springframework.org/schema/tx/spring-tx-3.2.xsd ">

	<!-- 加载配置文件 -->
	<context:property-placeholder location="classpath:db.properties" />
	<!-- 数据库连接池 -->
	<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource"
		destroy-method="close">
		<property name="driverClassName" value="${jdbc.driverClassName}" />
		<property name="url" value="${jdbc.url}" />
		<property name="username" value="${jdbc.username}" />
		<property name="password" value="${jdbc.password}" />
		<property name="maxActive" value="10" />
		<property name="maxIdle" value="5" />
	</bean>


	<!-- SqlsessionFactory -->
	<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
		<!-- 数据源 -->
		<property name="dataSource" ref="dataSource"/>
		<!-- mybatis配置文件 -->
		<property name="configLocation" value="classpath:mybatis/SqlMapConfig.xml"/>
	</bean>
	
	
	<!-- 
	MapperScannerConfigurer:mapper的扫描器,将包下边的mapper接口自动创建代理对象,
	自动创建到spring容器中,bean的id是mapper的类名(首字母小写)
	 -->
	<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
		<!-- 配置扫描包的路径
		如果要扫描多个包,中间使用半角逗号分隔
		要求mapper.xml和mapper.java同名且在同一个目录 
		 -->
		<property name="basePackage" value="com.activiti.ssm.mapper"/>
		<!-- 使用sqlSessionFactoryBeanName -->
		<property name="sqlSessionFactoryBeanName" value="sqlSessionFactory"/>
	</bean>
	
	<!-- 扫描service包,托管 业务类-->
	<context:component-scan base-package="com.activiti.ssm.service.impl"/>
	<!-- 
	配置事务
	 -->
	<!-- 1.配置事务管理器 -->
	<bean id="transManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
		<property name="dataSource" ref="dataSource"></property>
	</bean>
	
	<!-- 2.配置事务通知 -->
	<tx:advice id="txAdvice" transaction-manager="transManager">
		<tx:attributes>
			<tx:method name="add*" isolation="DEFAULT" propagation="REQUIRED" read-only="false"/>
			<tx:method name="save*" isolation="DEFAULT" propagation="REQUIRED" read-only="false"/>
			<tx:method name="update*" isolation="DEFAULT" propagation="REQUIRED" read-only="false"/>
			<tx:method name="delete*" isolation="DEFAULT" propagation="REQUIRED" read-only="false"/>
		
		</tx:attributes>
	</tx:advice>
	
	<!-- 3.配置切面 -->
	<aop:config>
		<aop:pointcut expression="execution(* com.activiti.ssm.service.impl.*.*(..))" id="aopPointcut"/>
		<aop:advisor advice-ref="txAdvice" pointcut-ref="aopPointcut" />
	</aop:config>
	
	<!-- 导入相关配置 -->
	<import resource="classpath:spring/activiti-context.xml"/>
	
	
</beans>
  • db.properties

当然,如果你手写链接也是可以,但是,其实我们在用文件进行一些变量存储的时候,体现的就是一种让规范集中在配置文件,变量抽取的一种思想,这刚好也是类的封装的思想,所以,建议还是用对应的数据库变量文件将常变的量进行存储。然后配置文件读取对应的文件属性为主。

jdbc.url=jdbc:mysql://localhost:3306/activitidb?createDatabaseIfNotExist=true&useUnicode=true&characterEncoding=utf8
jdbc.driverClassName=com.mysql.jdbc.Driver
jdbc.username=root
jdbc.password=root
  • applicationContext-service
    在这里主要是配置对应的业务层扫描,负责导入业务层的对应BEAN,但目前项目对于这个文件的分层较少,所以一句话弄好。
<beans xmlns="http://www.springframework.org/schema/beans"
   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:mvc="http://www.springframework.org/schema/mvc"
   xmlns:context="http://www.springframework.org/schema/context"
   xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx"
   xsi:schemaLocation="http://www.springframework.org/schema/beans 
   	http://www.springframework.org/schema/beans/spring-beans-3.2.xsd 
   	http://www.springframework.org/schema/mvc 
   	http://www.springframework.org/schema/mvc/spring-mvc-3.2.xsd 
   	http://www.springframework.org/schema/context 
   	http://www.springframework.org/schema/context/spring-context-3.2.xsd 
   	http://www.springframework.org/schema/aop 
   	http://www.springframework.org/schema/aop/spring-aop-3.2.xsd 
   	http://www.springframework.org/schema/tx 
   	http://www.springframework.org/schema/tx/spring-tx-3.2.xsd ">
   	
   	<context:component-scan base-package="com.activiti.ssm.service.impl"></context:component-scan>
   	
</beans>
  • applicationContext-transation
    这里面当然就是为了配置对应Spring对应的事务管理器以及AOP切面。对于切面,主要记住,任何关于切面或者代理,其实他们都关联一个词,就是拦截,每个组件都可以看做是一个拦截器,他们拦截对应的请求,并且进行功能增强,让用户的体验或者功能更具完整性。
<beans xmlns="http://www.springframework.org/schema/beans"
   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:mvc="http://www.springframework.org/schema/mvc"
   xmlns:context="http://www.springframework.org/schema/context"
   xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx"
   xsi:schemaLocation="http://www.springframework.org/schema/beans 
   	http://www.springframework.org/schema/beans/spring-beans-3.2.xsd 
   	http://www.springframework.org/schema/mvc 
   	http://www.springframework.org/schema/mvc/spring-mvc-3.2.xsd 
   	http://www.springframework.org/schema/context 
   	http://www.springframework.org/schema/context/spring-context-3.2.xsd 
   	http://www.springframework.org/schema/aop 
   	http://www.springframework.org/schema/aop/spring-aop-3.2.xsd 
   	http://www.springframework.org/schema/tx 
   	http://www.springframework.org/schema/tx/spring-tx-3.2.xsd ">


    <!-- 使用声明式事务配置,可以有效规范代码 -->
    
    <!-- 事务管理器 -->
    <bean id="transactionManager" 
    		class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
    	<property name="dataSource" ref="dataSource"/>
    </bean>
    
    <!-- 通知 -->
    <tx:advice id="txAdvice" transaction-manager="transactionManager">
    	<tx:attributes>
    		<tx:method name="save*" propagation="REQUIRED"/>
    		<tx:method name="insert*" propagation="REQUIRED"/>
    		<tx:method name="update*" propagation="REQUIRED"/>
    		<tx:method name="delete*" propagation="REQUIRED"/>
    		<tx:method name="find*" propagation="SUPPORTS" read-only="true"/>
    		<tx:method name="select*" propagation="SUPPORTS" read-only="true"/>
    		<tx:method name="get*" propagation="SUPPORTS" read-only="true"/>
    	</tx:attributes>
    </tx:advice>
    
    <!-- aop -->
    <aop:config>
    	<aop:advisor advice-ref="txAdvice"
    				 pointcut="execution(* com.activiti.ssm.service.impl.*.*(..))"/>
    </aop:config>
    
    <!-- 3.配置切面 -->
   <aop:config>
   	<aop:pointcut expression="execution(* com.activiti.ssm.service.impl.*.*(..))" id="aopPointcut"/>
   	<aop:advisor advice-ref="txAdvice" pointcut-ref="aopPointcut" />
   </aop:config>
   
</beans>

SpringMvc

MVC其实反而是Spring其中的一个小块,在这里面,主要我们先要确认一些最基本的组件,例如视图解析器、spring组件扫描、文件上传组件、校验器、日期转换器、校验器等,有独特功能需要添加的组件都在MVC进行配置。

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
	xmlns:mvc="http://www.springframework.org/schema/mvc" 
	xmlns:p="http://www.springframework.org/schema/p"
	xmlns:context="http://www.springframework.org/schema/context"
	xmlns:util="http://www.springframework.org/schema/util" 
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://www.springframework.org/schema/beans  
            http://www.springframework.org/schema/beans/spring-beans-3.2.xsd  
            http://www.springframework.org/schema/context   
            http://www.springframework.org/schema/context/spring-context-3.2.xsd  
            http://www.springframework.org/schema/mvc  
            http://www.springframework.org/schema/mvc/spring-mvc-3.2.xsd 
            http://www.springframework.org/schema/util  
            http://www.springframework.org/schema/util/spring-util-3.2.xsd">    
   
    <!-- HandlerMapping  HandlerAdapter handler(controller)   -->
	<mvc:annotation-driven /> <!-- conversion-service="conversionService" validator="validator" -->
	<!-- 
		 加了类型转换器,静态资源 使用此种方法解析
    	 它的意思就是没有映射到的URL交给默认的web容器中的servlet进行处理:
     -->
	<mvc:default-servlet-handler/>
	
	<!-- 视图解析器 -->
	<bean
		class="org.springframework.web.servlet.view.InternalResourceViewResolver">
		<property name="prefix" value="/WEB-INF/jsp/"></property>
		<property name="suffix" value=".jsp"></property>
	</bean>
	
	<!-- 使用spring组件扫描 -->
	<context:component-scan base-package="com.activiti.ssm.controller"></context:component-scan>
	
	<!-- 支持文件上传 -->
	<bean id="multipartResolver"
		class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
		<property name="maxUploadSize" value="104857600" />
		<property name="maxInMemorySize" value="4096" />
		<property name="defaultEncoding" value="UTF-8"></property>
	</bean>
	
	<!-- 定义统一异常处理器 -->
	<bean class="com.activiti.ssm.exception.CustomExceptionResolver"></bean>
	
	<!-- 转换器 -->
	<bean id="conversionService"
		class="org.springframework.format.support.FormattingConversionServiceFactoryBean">
		<property name="converters">
			<list>
				<bean class="com.activiti.ssm.controller.converter.CustomDateConverter" />
			</list>
		</property>
	</bean>
	
	<!-- 校验器 -->
	<bean id="validator"
		class="org.springframework.validation.beanvalidation.LocalValidatorFactoryBean">
		<!-- 校验器 -->
		<property name="providerClass" value="org.hibernate.validator.HibernateValidator" />
		<!-- 指定校验使用的资源文件,如果不指定则默认使用classpath下的ValidationMessages.properties -->
		<property name="validationMessageSource" ref="messageSource" />
	</bean>
	<!-- 校验错误信息配置文件 -->
	<bean id="messageSource"
		class="org.springframework.context.support.ReloadableResourceBundleMessageSource">
		<!-- 资源文件名 -->
		<property name="basenames">
			<list>
				<value>classpath:CustomValidationMessages</value>
			</list>
		</property>
		<!-- 资源文件编码格式 -->
		<property name="fileEncodings" value="utf-8" />
		<!-- 对资源文件内容缓存时间,单位秒 -->
		<property name="cacheSeconds" value="120" />
	</bean>
	

	
</beans>

Web.xml

这里要说的是,我们上面的文件组件都配置好了,但是送货地址有了,如果没门口进入,整个项目也是不能打通的,所以我们需要这些组件开一扇门,我们在web.xml中注册对应的组件

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" id="WebApp_ID" version="2.5">
  <display-name>activiti_ssm_shiro_web</display-name>
  
	
  <!-- 配置spring容器监听器 -->
	<context-param>
		<param-name>contextConfigLocation</param-name>
		<param-value>classpath:spring/applicationContext-*.xml</param-value>
	</context-param>
	<listener>
		<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
	</listener>

	
	<!-- 前端控制器 -->
	<servlet>
		<servlet-name>springmvc</servlet-name>
		<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
		<!-- 加载springmvc配置 -->
		<init-param>
			<param-name>contextConfigLocation</param-name>
			<!-- 配置文件的地址 如果不配置contextConfigLocation, 默认查找的配置文件名称classpath下的:servlet名称+"-serlvet.xml"即:springmvc-serlvet.xml -->
			<param-value>classpath:spring/springmvc.xml</param-value>
		</init-param>

	</servlet>
	<servlet-mapping>
		<servlet-name>springmvc</servlet-name>
	<!-- 	可以配置/ ,此工程 所有请求全部由springmvc解析,此种方式可以实现 RESTful方式,
	需要特殊处理对静态文件的解析不能由springmvc解析可以配置*.do或*.action,所有请求的url扩
	展名为.do或.action由springmvc解析,此种方法常用 不可以/*,如果配置/*,返回jsp也由springmvc解析,
	这是不对的。-->		
 	<url-pattern>*.action</url-pattern>
	</servlet-mapping> 
	

	
	<!-- shiro的filter -->
	<!-- shiro过虑器,DelegatingFilterProxy通过代理模式将spring容器中的bean和filter关联起来 -->
	<filter>
		<filter-name>shiroFilter</filter-name>
		<filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>
		<!-- 设置true由servlet容器控制filter的生命周期 -->
		<init-param>
			<param-name>targetFilterLifecycle</param-name>
			<param-value>true</param-value>
		</init-param>
		<!-- 设置spring容器filter的bean id,如果不设置则找与filter-name一致的bean -->
		<init-param>
			<param-name>targetBeanName</param-name>
			<param-value>shiroFilter</param-value>
		</init-param>
	</filter>
	<filter-mapping>
		<filter-name>shiroFilter</filter-name>
		<url-pattern>/*</url-pattern>
	</filter-mapping>
	
	
	<!-- post乱码处理 -->
	<filter>
		<filter-name>CharacterEncodingFilter</filter-name>
		<filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
		<init-param>
			<param-name>encoding</param-name>
			<param-value>utf-8</param-value>
		</init-param>
	</filter>
	<filter-mapping>
		<filter-name>CharacterEncodingFilter</filter-name>
		<url-pattern>/*</url-pattern>
	</filter-mapping>


</web-app>

在这里,我们也不需要进行强硬的记忆,只需要回忆起SpringMVC如何进行请求的处理就好了;
为了告诉外界:“我的项目用了SpringMVC,你们到货了就拉进来吧~!”那我们就需要开始配置对应的配置spring容器监听器,并且注释好收货单,这样,就算打开第一扇门。
其次,SpringMVC接收请求之后,我们必须有个前端控制器DispatcherServlet对吧?所以接下来第二个就是配置它咯!
当然,我们也要告诉这些请求,你们的前后缀是什么,我才处理,或者说只要是请求,来者不拒(*.action或者/,但是/*就是真正意义上的来者不拒,包括静态资源)
那当然,一些有特殊功能的拦截器,我们也是要加进来的,例如乱码处理器。
当然,对于Shiro,我们也是要加进来的(后续会讲)

  • 关于WEB的目录结构

其实这个是常用的布局,但是不知道大家布局的时候会不会有特别的要求,这个项目目前比较好的布局就是对应的静态文件,我放在根目录下,而对应的动态文件我放在WEB-INF的JSP文件夹下,其余提示页之类的,我放在对应的WEB-INF文件下,当然,随着项目的分支结构越发增大,我感觉这种文件分类并不可靠,必须进行模块化的管理,例如加入MAVEN、SVN或者GIT这种项目辅助管理才算上上策
在这里插入图片描述

第一篇先总结对应的SSM最基础的配置,下一篇会讲到对应的Shiro、Activiti的对应配置以及Eclipse中使用组件需要注意的问题

OA办公系统的九大设计原则: 1.整体性 系统整体设计能有效的实现后台一体化管理,前端满足用户个性化需求,系统标准化程度高。 2.先进性 软件采用的技术,将在相当长的时间内保证技术的发展能力,应具有良好便捷的升级能力,选用的硬件设备及操作系统、数据库产品、应用软件均具有先进性及成熟的技术与产品。 3.规范性 遵循统一的国家规范公文格式和交换接口标准。 4.高效性 系统提供对各类事务处理的高效性。使对大容量数据的查询和更新等操作也在较短的时间内迅速完成。对于大数据量的处理,也能高效地完成。 5.安全可靠性 采用最成熟和应用最广泛的技术平台,支持身份认证技术、安全加密技术;数据在传输过程和数据库中采用高加密技术,保证数据的安全性。分不同的角色控制信息数据,采用横向和纵向结合的矩阵权限控制模式,保证企业的各种信息安全。 6.扩展性 由于计算机和网络等领域技术发展十分迅速,应用环境,系统硬件及系统软件都会不可避免将被更新,系统的可扩充性及版本的兼容性,直接影响着应用系统用户需求的发展和功能的提升。因此,OA系统十分重视扩展性,能很容易地适应调整,扩充和删减;另一方面,它还具有与其它系统的接口能力,利用各系统功能之长,进行优势互补。 7.适应性和灵活性 在日常工作中,不可避免地需要进行机构及人员的调整,OA系统能提供充分的变更与扩展能力,适用机构及人员的调整。OA系统还具有图形化工作流定义工具,系统管理员可在浏览器环境下任意调整或定义工作流程。系统具有灵活的信息发布系统用户可根据需要定制发布需要的新闻、通知。 8.易用性 系统的设计尤其重视用户界面的友好性。简洁大方、功能齐备、美观实用、提示准确。 9.健壮性 OA办公系统的开发设计应该支持应用和数据库等多重负载均衡能力,支持附件服务器和数据库服务器分离技术,从而支持数万用户同时在线和同时操作的能力,不会因为用户数的增长或者信息量的增长,而导致系统响应能力下降。 如何分辨OA办公系统的优劣?设计原则是一个重要的评判标准。优秀的设计原则能让OA办公系统脱颖而出,实现系统整体的高性能、高可用、可扩展,发挥出更强的协同办公能力。而OA办公系统设计的九大原则,基本上包括了OA办公系统的性能指标,给项目开发和用户选型提供了有益的借鉴,对于中国OA办公系统的整体水平也能起到提升作用。
**smart-web2** 是一套相对简单的OA系统;包含了流程设计器,表单设计器,权限管理,简单报表管理等功能; 系统后端基于SpringMVC+Spring+Hibernate框架,前端页面采用JQuery+Bootstrap等主流技术; 流程引擎基于Snaker工作流;表单设计器基于雷劈网WEB表单设计器。 系统主要功能有: >1.系统管理 >>系统管理包含有:基础信息管理、系统权限管理、版本管理、子系统管理。 > >2.流程管理 >>流程管理包含有:流程设计器、流程实例管理、流程页面模版管理等功能。 > >3.表单管理 >>表单管理包含有:表单设计器、表管理、表单帮助信息管理等。 > >4.我的办公 >>我的待办、我的已办; > >5.简单报表管理 >>简单报表管理包含:简单报表的设计、报表管理等。 使用说明 ======= ------- ---数据库MySQL5.6以上 ---下载后把data目录下的smart-web2.zip解压;然后解压出来的脚本文件(“smart-web2.sql”)导入到mysql数据库中;注:建库时,字符集编码为:utf8(utf8_general_ci) ---修改配置文件“jdbc.properties”,改成对应数据库的用户名和密码 ---“sysconfig.properties”系统配置文件;需要修改“root.dir”属性,设置为系统上传文件时用来存放的根目录 ----系统管理员用户名为:admin;密码为:123456 ----linux类系统需要修改mysql的配置文件,改为数据库表名不区分大小写(lower_case_table_names=1) 环境要求 ------------ 1.jdk要求1.7及以上; 2.tomcat6或tomcat7; 3.eclipse版本4.4以上; 4.浏览器要求:IE8及以上(最理想的是IE10及以上),火狐,chrome等。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值