这是一篇关于ssm框架整合的文章,希望你看了之后会有所收获
注意版本引入依赖的版本问题,
1.项目中的pom文件,引入需要的jar包的依赖,
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.11</version>
<scope>test</scope>
</dependency>
<!-- spring核心包-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>4.3.18.RELEASE</version>
</dependency>
<!-- springbean包 -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-beans</artifactId>
<version>4.3.18.RELEASE</version>
</dependency>
<!-- springcontext包 -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>4.3.18.RELEASE</version>
</dependency>
<!-- spring表达式包 -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-expression</artifactId>
<version>4.3.18.RELEASE</version>
</dependency>
<!-- springAOP包 -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-aop</artifactId>
<version>4.3.18.RELEASE</version>
</dependency>
<!-- springAspects包 -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-aspects</artifactId>
<version>4.3.18.RELEASE</version>
</dependency>
<!-- springJDBC包 -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>4.3.18.RELEASE</version>
</dependency>
<!-- spring事务包 -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-tx</artifactId>
<version>4.3.18.RELEASE</version>
</dependency>
<!-- spring对web的支持 -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-web</artifactId>
<version>4.3.18.RELEASE</version>
</dependency>
<!-- springwebMVC -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>4.3.18.RELEASE</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.springframework/spring-context-support -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context-support</artifactId>
<version>4.3.18.RELEASE</version>
</dependency>
**<!-- velocity模板语言支持包 -->**
<dependency>
<groupId>org.apache.velocity</groupId>
<artifactId>velocity</artifactId>
<version>1.7</version>
</dependency>
<!-- velocity-tools -->
<dependency>
<groupId>org.apache.velocity</groupId>
<artifactId>velocity-tools</artifactId>
<version>2.0</version>
</dependency>
<!-- mybatis -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.4.6</version>
</dependency>
<!-- mybatis的分页助手-->
<dependency>
<groupId>com.github.pagehelper</groupId>
<artifactId>pagehelper</artifactId>
<version>5.1.2</version>
</dependency>
<!--Mybatis与spring整合包-->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis-spring</artifactId>
<version>1.3.2</version>
</dependency>
<!-- mysql驱动 -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.38</version>
</dependency>
<!--连接池:druid数据源-->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.1.10</version>
</dependency>
<!-- servlet-api -->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>3.1.0</version>
<scope>provided</scope>
</dependency>
<!-- jsp-api -->
<dependency>
<groupId>javax.servlet.jsp</groupId>
<artifactId>jsp-api</artifactId>
<version>2.1</version>
<scope>provided</scope>
</dependency>
<!-- jstl -->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>jstl</artifactId>
<version>1.2</version>
</dependency>
<!-- 上传组件包 -->
<dependency>
<groupId>commons-fileupload</groupId>
<artifactId>commons-fileupload</artifactId>
<version>1.3.1</version>
</dependency>
<!-- jackson -->
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-core</artifactId>
<version>2.9.5</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.9.5</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-annotations</artifactId>
<version>2.9.5</version>
</dependency>
<!-- hibernate的验证框架-->
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-validator</artifactId>
<version>5.4.1.Final</version>
</dependency>
<!-- log4j -->
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.17</version>
</dependency>
</dependencies>
2.spring的配置文件
注解扫描:
配置:将其扫描到ioc容器内,基础包为公共包,并且过滤掉@controller注解,
思路:spring和springmvc分开扫描各自的内容,springmvc扫表现层的类(controller),而spring扫描其他的类
<context:component-scan base-package="com.ssm">
<context:exclude-filter type="annotation" expression="org.springframework.stereotype.Controller"/>
</context:component-scan>
配置数据源:
读取db.properties文件,数据源对象采用阿里的德鲁伊连接池,并且配置连接数据库的基础信息和连接池的关键信息
<!-- **读取**配置文件-->
<context:property-placeholder location="classpath:db.properties"/>
<!-- 数据源的配置:德鲁伊连接池-->
<bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource">
<!-- 基础配置 -->
<property name="driverClassName" value="${mysql.driver}"/>
<property name="url" value="${mysql.url}"/>
<property name="username" value="${mysql.username}"/>
<property name="password" value="${mysql.password}"/>
<!-- 连接池的关键配置 -->
<!-- 初始化时建立物理连接的个数。初始化发生在显示调用init方法,或者第一次getConnection时 -->
<property name="initialSize" value="${druid.initialSize}" />
<!-- 最小连接池数量 -->
<property name="minIdle" value="${druid.minIdle}" />
<!-- 最大连接池数量 -->
<property name="maxActive" value="${druid.maxActive}" />
<!-- 配置获取连接等待超时的时间 -->
<property name="maxWait" value="${druid.maxWait}" />
</bean>
db.properties的配置详情如下
mysql.driverClassName=com.mysql.jdbc.Driver
mysql.url=jdbc:mysql://192.168.90.79:3306/escpys?useUnicode=true&characterEncoding=utf8
mysql.username=root
mysql.password=123456
druid.filters=stat
druid.maxActive=20
druid.initialSize=1
druid.maxWait=60000
druid.minIdle=1
druid.timeBetweenEvictionRunsMillis=60000
druid.minEvictableIdleTimeMillis=300000
druid.testWhileIdle=true
druid.testOnBorrow=false
druid.testOnReturn=false
druid.poolPreparedStatements=true
druid.maxOpenPreparedStatements=20
asyncInit=true
在spring中配置文件配置mybatis
sqlsessionFactory对象和bean和mapper接口的代理对象bean
1.SqlSessionFactory的最佳使用范围是整个应用运行期间,创建之后可以进行重复使用,在这里使用单例模式进行管理,通过mybatis-spring整合包中的SqlSessionFactoryBean来创建一个单例的SqlSessionFactory
2.SqlSessionFactoryBean的属性必须配置数据源,可选配加载mybatis的全局配置文件,如果还有mybatis的配置文件的话(mybatis-config.xml),加载mapper映射文件(建议在此配置,可使用通配符批量加载)
3.Mybatis中 的mapper代理对象可针对每个接口通过MapperFactoryBean来进行单独配置,只需要通知dao接口的全限定名即可,唯一的缺点就是当项目中的dao接口过多时,配置量大,容易出错,不建议使用
4.通过MapperScannerConfigurer配置mapper代理扫描器可以批量配置mapper代理对象,只需要告知接口的存放包名和SqlSessionFactory即可
<!-- 配置mybatis的SqlSessionFactory对象 单例模式将 sqlsessionFactory放到ioc容器中-->
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<!-- 数据源 -->
<property name="dataSource" ref="dataSource"/>
<property name="typeAliasesPackage" value="com.newcapec.ordos.entity"/>
<!-- 加载mapper映射文件,可以使用通配符 -->
<property name="mapperLocations" value="classpath:mapper/*.xml"/>
<!--配置mybatis的分页插件-->
<property name="plugins">
<array>
<bean class="com.github.pagehelper.PageInterceptor">
<property name="properties">
<props>
<!--配置需要的数据库的方言-->
<prop key="helperDialect">mysql</prop>
</props>
</property>
</bean>
</array>
</property>
</bean>
配置mapper代理对象的扫描器,注意一定要将sqlSessionFactory注入
<!-- mapper代理对象的扫描器 -->
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<!--1. 扫描基础包 -->
<!-- 如果有多个基础包,可以使用逗号分隔 -->
<property name="basePackage" value="com.newcapec.ordos.dao"/>
<!--2. 注入SqlSessionFactory -->
<property name="sqlSessionFactoryBeanName" value="sqlSessionFactory"/>
</bean>
接下来配置spring配置文件中另一个重要的模块AOP
首先要开启aop注解,注意一定不要忽略
<aop:aspectj-autoproxy/>
然后配置和日志相关的切面类如果有的话配置,但是一般都需要加一个日志
<!-- 配置切面类 -->
<!--将日志类 注入ioc容器-->
<bean id="loggerAspect" class="com.newcapec.ordos.aspect.LoggerAspect"/>
<!--配置aop注解表达式 -->
<aop:config>
<aop:pointcut id="expression01" expression="execution(* com.newcapec.ordos.controller.NoticeController.*(..))"/>
<aop:aspect ref="loggerAspect">
<aop:before method="before" pointcut-ref="expression01"/>
</aop:aspect>
</aop:config>
配置事务管理器
<!-- 事务管理器-->
<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="insert*" propagation="REQUIRED" isolation="READ_COMMITTED"/>
<tx:method name="save*" propagation="REQUIRED" isolation="READ_COMMITTED"/>
<tx:method name="add*" propagation="REQUIRED" isolation="READ_COMMITTED"/>
<tx:method name="update*" propagation="REQUIRED" isolation="READ_COMMITTED"/>
<tx:method name="edit*" propagation="REQUIRED" isolation="READ_COMMITTED"/>
<tx:method name="del*" propagation="REQUIRED" isolation="READ_COMMITTED"/>
<tx:method name="delete*" propagation="REQUIRED" isolation="READ_COMMITTED"/>
<tx:method name="find*" propagation="SUPPORTS" read-only="true"/>
<tx:method name="query*" propagation="SUPPORTS" read-only="true"/>
<tx:method name="get*" propagation="SUPPORTS" read-only="true"/>
<tx:method name="select*" propagation="SUPPORTS" read-only="true"/>
<tx:method name="list*" propagation="SUPPORTS" read-only="true"/>
<!-- 事务属性应用于方法的名称,*表示所有方法-->
<tx:method name="*"/>
</tx:attributes>
</tx:advice>
配置事务的切入点
一般的切入点都是切的service层
<aop:config>
<aop:pointcut id="exp" expression="execution(* com.newcapec.ordos.service.impl.*Impl.*(..))"/>
<!-- 将切点表达式与事务建立联系-->
<aop:advisor advice-ref="txAdvice" pointcut-ref="exp" />
</aop:config>
3.springmvc的配置文件
视图层扫描的包是controller层
<!-- 开启组件扫描,SpringMVC只负责管理Controller层对象 -->
<context:component-scan base-package="com.newcapec.ordos.controller"/>
添加mvc注解驱动和格式化与转化服务
<!-- mvc的注解驱动 -->
<!-- 配置格式化与转化服务 -->
<mvc:annotation-driven conversion-service="formattingConversionService"/>
<bean id="formattingConversionService" class="org.springframework.format.support.FormattingConversionServiceFactoryBean">
<!-- 注册自定义的全局日期格式转换工具 -->
<property name="converters">
<set>
<bean class="com.newcapec.ordos.utils.DateConverter">
<!--<property name="pattern" value="yyyy-MM-dd HH:mm:ss"/>-->
</bean>
</set>
</property>
</bean>
关于这个DateConverter日期格式化的工具类
public class DateConverter implements Converter<String, Date> {
// 满足yyyy-MM-dd模板格式的日期字符串,可以被转换
private String pattern = "yyyy-MM-dd";
// 可以设置模板
public void setPattern(String pattern) {
this.pattern = pattern;
}
@Override
public Date convert(String source) {
SimpleDateFormat simpleDateFormat = new SimpleDateFormat(pattern);
Date date = null;
try {
date = simpleDateFormat.parse(source);
} catch (ParseException e) {
e.printStackTrace();
}
return date;
}
}
下面就是模板引擎的配置
<!--velocity配置-->
<bean id="velocityConfigurer" class="org.springframework.web.servlet.view.velocity.VelocityConfigurer">
<property name="resourceLoaderPath" value="/WEB-INF/views"/>
<property name="velocityProperties">
<props>
<prop key="input.encoding">utf-8</prop>
<prop key="output.encoding">utf-8</prop>
<prop key="file.resource.loader.cache">false</prop>
<prop key="file.resource.loader.modificationCheckInterval">1</prop>
<prop key="velocimacro.library.autoreload">false</prop>
</props>
</property>
</bean>
<!-- velocity模板语言 -->
<bean class="org.springframework.web.servlet.view.velocity.VelocityViewResolver">
<property name="suffix" value=".vm"/>
<property name="requestContextAttribute" value="rc"/>
<property name="exposeSessionAttributes" value="true" />
<property name="contentType" value="text/html;charset=utf-8"/>
<property name="dateToolAttribute" value="date"/><!--日期函数名称-->
</bean>
配置一定要不拦截静态资源
要释放静态资源一般都是放在webapp下的static文件夹,然后将自己的页面放在web-Info下,webinfo下的页面是受保护的,如果不释放静态资源的话就会出现页面中 的样式和动态效果等全部丢失
<mvc:default-servlet-handler/>
配置文件上传解析器
<!-- 配置文件上传解析器 -->
<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
<!-- 文件上传的属性设置 -->
<!-- 设置文件上传大小,单位是字节byte -->
<property name="maxUploadSize" value="104857600"/><!-- 1024*1024*100 -->
<!-- 设置上传的字符编码 -->
<property name="defaultEncoding" value="utf-8"/>
<!-- 设置缓存大小,单位是字节byte,默认10240 -->
<property name="maxInMemorySize" value="10240"/>
</bean>
配置国际化拦截器进行登录拦截
默认拦截所有的路径只释放带有login路径的页面,如果不进行登录的话无法访问其他的页面,当然根据需求,如果不同的用户登录有不同的权限的话就需要在写一个权限的拦截器,使得不同的用户访问自己拥有的权限的页面其他的页面是受保护的
<mvc:interceptors>
<mvc:interceptor>
<!--配置扫描所有路径-->
<mvc:mapping path="/**"/>
<!--只释放和登录有关的页面不拦截-->
<mvc:exclude-mapping path="/login.vm"/>
<bean class="com.newcapec.ordos.interceptor.LoginInterceptor"/>
</mvc:interceptor>
</mvc:interceptors>
关于拦截器的类
package com.newcapec.ordos.interceptor;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
* @program: ordos
* @description: 登录验证的拦截器
* @author: 亢超超
* @create: 2020-11-20 10:10:21
**/
public class LoginInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object o) throws Exception {
//获取当前页面的url
String url=request.getRequestURI();
/**
进行判断如果当前页面包含login的就放行不包含的话再判断session对象中保存的用户是否为空,不为空的话放行
如果session对象中的用户对象为空就转发到登录页面放行
*/
if (url.contains("Login")||url.contains("login")){
return true;
}else{
if (request.getSession().getAttribute("user")!=null){
return true;
}else{
request.getRequestDispatcher("login/loginV").forward(request,response);
return true;
}
}
}
注意:我在写的时候出现了栈溢出错误,此时就要思考的是写的代码一定是使得程序陷入的死循环,进一步思考就是需要考虑的是判断条件出现了问题,此时就要简单的对自己思路进行捋一下,相信你一定会解决的!