ssm框架对于大多数的java开发的小伙伴们并不陌生吧,已经成为各类java开发的首选框架,想当初,为了整合一个通用的ssm框架模板煞费苦心,一度陷入各种配置文件,各种xml的配置苦海里不能自拔,一旦使用熟练了,发现也就那么回事啊,为了方便自己和各位童鞋今后的整合使用,在此将全部的整合过程简单罗列出来,不足之处,请多多指教;
该项目为maven工程,工程命名和包的结构命名可根据个人习惯而定,大体不差,项目结构如图:
添加pom依赖jar文件:
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>4.0.0.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>4.0.0.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-orm</artifactId>
<version>4.0.0.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-web</artifactId>
<version>4.0.0.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>4.0.0.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>4.0.0.RELEASE</version>
</dependency>
<!-- spring aop -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-aspects</artifactId>
<version>4.0.0.RELEASE</version>
</dependency>
<dependency>
<groupId>com.mchange</groupId>
<artifactId>c3p0</artifactId>
<version>0.9.2</version>
</dependency>
<dependency>
<groupId>cglib</groupId>
<artifactId>cglib</artifactId>
<version>2.2</version>
</dependency>
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjweaver</artifactId>
<version>1.6.8</version>
</dependency>
<!-- Spring整合MyBatis -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.2.8</version>
</dependency>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis-spring</artifactId>
<version>1.2.2</version>
</dependency>
<!-- 控制日志输出:结合log4j -->
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.17</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>1.7.7</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.37</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context-support</artifactId>
<version>4.0.0.RELEASE</version>
</dependency>
<dependency>
<groupId>commons-collections</groupId>
<artifactId>commons-collections</artifactId>
<version>3.1</version>
</dependency>
<dependency>
<groupId>commons-codec</groupId>
<artifactId>commons-codec</artifactId>
<version>1.9</version>
</dependency>
<dependency>
<groupId>commons-io</groupId>
<artifactId>commons-io</artifactId>
<version>2.4</version>
</dependency>
<dependency>
<groupId>org.codehaus.jackson</groupId>
<artifactId>jackson-mapper-asl</artifactId>
<version>1.9.2</version>
</dependency>
<dependency>
<groupId>commons-fileupload</groupId>
<artifactId>commons-fileupload</artifactId>
<version>1.3.1</version>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>servlet-api</artifactId>
<version>2.5</version>
</dependency>
<dependency>
<groupId>javax.servlet.jsp</groupId>
<artifactId>jsp-api</artifactId>
<version>2.1.3-b06</version>
</dependency>
<dependency>
<groupId>jstl</groupId>
<artifactId>jstl</artifactId>
<version>1.2</version>
</dependency>
<!-- spring单元测试 -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-test</artifactId>
<version>4.3.7.RELEASE</version>
<scope>test</scope>
</dependency>
<!-- 格式化对象,方便输出日志 -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.1.41</version>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.0.9</version>
</dependency>
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjweaver</artifactId>
<version>1.8.8</version>
</dependency>
<!--rabbitmq依赖 -->
<!-- <dependency>
<groupId>com.rabbitmq</groupId>
<artifactId>amqp-client</artifactId>
<version>3.6.0</version>
</dependency>
<dependency>
<groupId>org.springframework.amqp</groupId>
<artifactId>spring-rabbit</artifactId>
<version>1.6.5.RELEASE</version>
</dependency> -->
<!--active mq start-->
<dependency>
<groupId>org.apache.activemq</groupId>
<artifactId>activemq-core</artifactId>
<version>5.7.0</version>
</dependency>
<dependency>
<groupId>org.apache.activemq</groupId>
<artifactId>activemq-pool</artifactId>
<version>5.13.3</version>
</dependency>
<!--active mq end-->
</dependencies>
实际开发中,会对项目中依赖的jar包做统一的版本控制,jar包会从部署在linux服务器包的私服仓库中获取,便于管理,此处为了做演示,没有做版本管理,不需要的jar包可以暂时不依赖,用到的时候再添加也可以;
接下来,进行spring的相关xml文件的配置
【1】applicationcontext.xml,这个配置文件中主要包括下面几项,把这几项主要的记住了,其他的问题不大,以后即便修改也不会改动太多,包括,引入外部数据源并配置数据源,整合mybatis扫描相应的接口包文件,配置事务,配置AOP,引入第三方的xml配置文件,如spring整合rabbitmq的xml文件等,具体如下:
<!-- 加载外部配置文件 -->
<context:property-placeholder location="classpath:jdbc.properties" />
<!-- 注解扫描包文件,此处有多种写法,主要的一点就是controller层作为控制器交由springmvc的配置文件进行扫描 -->
<!-- <context:component-scan base-package="com.sino" /> -->
<!-- <context:component-scan base-package="com.sino.*">
<context:exclude-filter type="annotation" expression="org.springframework.stereotype.Controller"/>
</context:component-scan> -->
<context:component-scan base-package="com.sino"/>
<!-- 配置数据源 ,可选择dbcp,c3p0,druid等-->
<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<property name="url" value="${jdbc_url}" />
<property name="driverClassName" value="${jdbc_driverClassName}" />
<property name="username" value="${jdbc_username}" />
<property name="password" value="${jdbc_password}" />
</bean>
<!-- 配置整合mybatis,注意,此处直接将实体类文件到数据库数据表做了映射匹配,便不再额外添加sqlConfig.xml的配置文件,简化了配置的写法 -->
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="dataSource"></property>
<property name="typeAliasesPackage" value="com.sino.entity"/>
<!-- 自动扫描mapping.xml文件 -->
<property name="mapperLocations" value="classpath:mybatis/*-mapper.xml"></property>
</bean>
<!-- mybatis扫描接口包文件,扫描接口所在的包文件 -->
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<property name="basePackage" value="com.sino.dao" />
<property name="SqlSessionFactoryBeanName" value="sqlSessionFactory" />
</bean>
<!-- 事务配置 -->
<bean id="txManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource" />
</bean>
<!-- 配置拦截service -->
<!-- <aop:config>
<aop:pointcut expression="execution(* com.ssm.service..*(..))" id="txPoint"/>
<aop:advisor advice-ref="txAdvice" pointcut-ref="txPoint"/>
</aop:config>
-->
<!-- 配置事物增强,事物如何切入-->
<tx:advice id="txAdvice" transaction-manager="txManager">
<tx:attributes>
<!-- 所有方法都是事物方法 -->
<tx:method name="*"/>
<!-- 以get开始的所有方法 -->
<tx:method name="get*" read-only="true"/>
<tx:method name="query*" read-only="true"/>
<tx:method name="find*" read-only="true"/>
<tx:method name="select*" read-only="true"/>
</tx:attributes>
</tx:advice>
<!-- 引入rabbitmq -->
<!-- <import resource="rabbitMq.xml"/> -->
该配置文件中,还可以对事务做更精细的配置,还有AOP的配置,由于时间关系,没有写出来,可自行补上;
【2】springmvc.xml,该配置文件属于控制器层面的配置,所有前端的请求传递到后端,都要经过该配置文件的控制和管理,其主要配置项包括,扫描controller所在的包,配置静态资源的访问,如html,jsp,css,img,配置拦截器,配置视图解析器,配置时间格式化日期,配置上传文件的组件控制等,具体配置如下:
<!-- 配置静态资源访问 -->
<mvc:default-servlet-handler />
<mvc:annotation-driven />
<!-- 扫描注解包 -->
<context:component-scan base-package="com.sino.controller" />
<!-- 自定义拦截器定义 -->
<mvc:interceptors>
<mvc:interceptor>
<mvc:mapping path="/**" />
<mvc:exclude-mapping path="/login"/>
<mvc:exclude-mapping path="/doLogin"/>
<mvc:exclude-mapping path="/bootstrap/**"/>
<mvc:exclude-mapping path="/css/**" />
<mvc:exclude-mapping path="/fonts/**" />
<mvc:exclude-mapping path="/img/**" />
<mvc:exclude-mapping path="/jquery/**" />
<mvc:exclude-mapping path="/layer/**" />
<mvc:exclude-mapping path="/script/**" />
<mvc:exclude-mapping path="/ztree/**" />
<bean class="com.sino.intercepter.LoginInterceptor"></bean>
</mvc:interceptor>
<mvc:interceptor>
<mvc:mapping path="/**" />
<mvc:exclude-mapping path="/login"/>
<mvc:exclude-mapping path="/doLogin"/>
<mvc:exclude-mapping path="/bootstrap/**"/>
<mvc:exclude-mapping path="/css/**" />
<mvc:exclude-mapping path="/fonts/**" />
<mvc:exclude-mapping path="/img/**" />
<mvc:exclude-mapping path="/jquery/**" />
<mvc:exclude-mapping path="/layer/**" />
<mvc:exclude-mapping path="/script/**" />
<mvc:exclude-mapping path="/ztree/**" />
<bean class="com.sino.intercepter.AuthInterceptor"></bean>
</mvc:interceptor>
</mvc:interceptors>
<!-- 配置视图解析器 -->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/jsp/" />
<property name="suffix" value=".jsp" />
</bean>
<bean
class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter">
<property name="messageConverters">
<list>
<bean
class="org.springframework.http.converter.json.MappingJacksonHttpMessageConverter">
<property name="supportedMediaTypes">
<list>
<value>application/json;charset=UTF-8</value>
</list>
</property>
</bean>
</list>
</property>
</bean>
<!-- 配置文件上传大小控制 -->
<bean id="multipartResolver"
class="org.springframework.web.multipart.commons.CommonsMultipartResolver" >
<property name="maxUploadSize" value="2097152" />
<property name="resolveLazily" value="true" />
</bean>
【3】访问数据库的配置文件 jdbc.properties
jdbc_driverClassName=com.mysql.jdbc.Driver
jdbc_url=jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=utf-8
jdbc_username=root
jdbc_password=root
【4】log4j.properties
#将Mybatis log4j运行级别调到DEBUG可以在控制台打印出Mybatis运行的sql语句
log4j.rootLogger=DEBUG,Console,File
把日志信息输出到控制台 ###
log4j.appender.Console=org.apache.log4j.ConsoleAppender
log4j.appender.Console.Target=System.out
log4j.appender.Console.layout = org.apache.log4j.PatternLayout
log4j.appender.Console.layout.ConversionPattern=%d{yyyy-MM-dd-HH:mm:ss,SSS} [%t] [%c] [%p] - %m%n
把日志信息输出到文件:/opt/uploads/maven_logs/maven_web.log ###
log4j.appender.File = org.apache.log4j.DailyRollingFileAppender
log4j.appender.File.File = /opt/uploads/maven_logs/maven_web.log
log4j.appender.File.Threshold = DEBUG
log4j.appender.File.layout = org.apache.log4j.PatternLayout
log4j.appender.File.layout.ConversionPattern =%d{yyyy-MM-dd-HH:mm:ss,SSS} [%t] [%c] [%p] - %m%n
显示SQL语句部分
log4j.logger.com.mybatis=DEBUG
log4j.logger.com.mybatis.common.jdbc.SimpleDataSource=DEBUG
log4j.logger.com.mybatis.common.jdbc.ScriptRunner=DEBUG
log4j.logger.com.mybatis.sqlmap.engine.impl.SqlMapClientDelegate=DEBUG
log4j.logger.java.sql.Connection=DEBUG
log4j.logger.java.sql.Statement=DEBUG
log4j.logger.java.sql.PreparedStatement=DEBUG
【5】web.xml,最容易忽视而且容易出问题的就在这个配置文件中,注意的问题就是搞明白这个配置文件的作用和加载的顺序就好了,其中配置的项包括,加载springmvc的xml文件,前端的请求首先经过web.xml文件,将其转发给springmvc的配置文件进行请求的统一处理;配置spring的xml文件,对spring的相关配置进行全局统一初始化工作;再就是字符集过滤,日志信息,其他错误页面的转发等,下面请看具体配置,注意,配置文件的路径不要写错了,否则启动报错,
配置文件到此基本搞定,配置文件配置好可以说框架整合完成了八成工作,否则各种报错会一直在配置文件中纠缠,接下来就是做测试,框架整合完毕,测试主要包括3种,一种是框架自身,例如项目启动没有报错的话,是否可以访问controller中的接口,其二是静态页面的定向,能否通过controller将请求路由到相应的页面,第三是数据库连接是否成功,下面将分别做这三种简单的测试, 首先在tomcat中启动工程,此处使用的是tomcat8.X版本,
1)通过浏览器直接访问controller接口,是否能够访问到,
在controller包下面创建IndexController,
@Controller
@RequestMapping(“/user”)
public class IndexController {
@RequestMapping("/index")
public String toIndex(){
return "index";
}
@ResponseBody
@RequestMapping("/getData")
public String getData(){
String result = "success";
return result;
}
}
浏览器输入地址,http://localhost:8080/ssm_project/user/getData,结果如下:
2)通过浏览器直接访问controller接口,通过controller转发到页面
在WEB-INF下的jsp文件中有一个index.jsp,
说明接口是通顺的;
浏览器输入:http://localhost:8080/ssm_project/user/index,页面展示内容如下:
说明可以通过接口正常转发页面;
3)通过浏览器直接访问controller接口,测试数据库配置是否成功连接
在user-mapper.xml文件中,有一个查询t_user的表,数据库中新建一个t_user的表并存入几条数据,
同时,创建测试的controller类,代码如下,
@ResponseBody
@RequestMapping("/testDbData")
public List<User> testDbData(){
return userService.getDbData();
}
再在mybatis包下新建一个user-mapper.xml文件,里面有一个查询t_user的sql语句,
select * from t_user
浏览器输入:http://localhost:8080/ssm_project/user/testDbData,页面展示内容如下:
说明整合mybatis访问mysql也是可以正常使用的,至此,ssm整合全部完毕,有关ssm更多的配置,比如自定义异常处理,访问拦截器配置,业务层的事务处理等,均可在此基础上做添加补充,还欢迎各位童鞋提出宝贵意见!!