IDEA整合SSM,有很多坑,这里记录一下,新建项目首先采用的普通Java Enterprise项目,后面使用Maven项目。
创建SSM项目前期搭建
(1)先创建一个Java Enterprise项目,一般是选择Spring来创建,并且会自动导包,这里使用另外一种方式来实现。
(2)创建完成后需要设置,进入Project Structure界面,跟其他IDE可以直接使用不同,IDEA的还需要设置source目录和resource目录,代表代码和资源文件存放的地方。如图所示在src目录下建立main目录,main目录下建立java和resource目录,分别存放量产代码和配置文件,test文件夹也可以设置,这里省略了。上面Mark as标签可以看出来,可以分别设置量产代码文件夹(Sources)、测试代码文件夹(Tests),量产资源文件夹(Resources)、测试资源文件夹(Test Resources)和排它文件夹(不被使用)。
(3)设置Tomcat部署路径,这里选择部署在Tomcat的Webapp下。
(4)设置Tomcat服务器,选择菜单Edit Configurations进入设置界面,可以将After lauch勾选掉,另外更新和鼠标离焦选项选择Update classes and resources,这样就支持热部署,即无需重启tomcat也可以支持更新。
另外切换到Deployment,将Application Context修改,这样访问资源是通过如下web虚拟路径名可以访问到部署到tomcat后的真正资源。
以上就完成前期的基本配置,后面需要配置SpringMVC、Spring和MyBatis的核心配置文件了。
SSM项目核心文件配置
SpringMVC配置
(1)web.xml中配置启动前端控制器,需要读取SpringMVC核心配置文件。注意spring-mvc.xml是放在前面的resource文件夹下。
1 <!--配置SpringMVC前端控制器--> 2 <servlet> 3 <servlet-name>springmvc</servlet-name> 4 <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> 5 <init-param> 6 <param-name>contextConfigLocation</param-name> 7 <param-value>classpath:spring-mvc.xml</param-value> 8 </init-param> 9 <!--设置启动tomcat就启动--> 10 <load-on-startup>1</load-on-startup> 11 </servlet> 12 <servlet-mapping> 13 <servlet-name>springmvc</servlet-name> 14 <url-pattern>*.action</url-pattern> 15 </servlet-mapping> 16 17 <!--配置全站式乱码解决,只针对post有效--> 18 <filter> 19 <filter-name>filtercoding</filter-name> 20 <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class> 21 <init-param> 22 <param-name>encoding</param-name> 23 <param-value>utf-8</param-value> 24 </init-param> 25 </filter> 26 <filter-mapping> 27 <filter-name>filtercoding</filter-name> 28 <url-pattern>*.action</url-pattern> 29 </filter-mapping>
(2)配置SpringMVC核心配置文件,这里需要配置前端控制器、需要配置包扫描、mvc注解驱动和视图解析器,通过采坑后发现,后面配置Spring也需要扫描包,如果都配置可能会导致事务失效,这里因为没有配置事务因此将不需要事务的包在这里扫描。
1 <?xml version="1.0" encoding="UTF-8"?> 2 <beans xmlns="http://www.springframework.org/schema/beans" 3 4 xmlns:context="http://www.springframework.org/schema/context" 5 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 6 xmlns:util="http://www.springframework.org/schema/util" 7 xmlns:aop="http://www.springframework.org/schema/aop" 8 xmlns:tx="http://www.springframework.org/schema/tx" 9 xmlns:mvc="http://www.springframework.org/schema/mvc" 10 xsi:schemaLocation= 11 "http://www.springframework.org/schema/beans 12 http://www.springframework.org/schema/beans/spring-beans-4.3.xsd 13 http://www.springframework.org/schema/context 14 http://www.springframework.org/schema/context/spring-context-4.3.xsd 15 http://www.springframework.org/schema/util 16 http://www.springframework.org/schema/util/spring-util-4.3.xsd 17 http://www.springframework.org/schema/aop 18 http://www.springframework.org/schema/aop/spring-aop-4.3.xsd 19 http://www.springframework.org/schema/tx 20 http://www.springframework.org/schema/tx/spring-tx-4.3.xsd 21 http://www.springframework.org/schema/mvc 22 http://www.springframework.org/schema/mvc/spring-mvc-4.3.xsd" 23 > 24 25 <!--开启包扫描--> 26 <context:component-scan base-package="com.boe.dao"></context:component-scan> 27 <!--注释掉,sevice层上的事务才能生效,将service层的扫描放到spring配置文件中扫描,赋予事务--> 28 <!--<context:component-scan base-package="com.boe.service"></context:component-scan>--> 29 <context:component-scan base-package="com.boe.web"></context:component-scan> 30 <!--开启mvc注解--> 31 <mvc:annotation-driven></mvc:annotation-driven> 32 <!--配置视图解析器--> 33 <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"> 34 <property name="suffix" value=".jsp"></property> 35 <property name="prefix" value="/WEB-INF/jsp/"></property> 36 </bean> 37 38 </beans>
Spring配置
(1)web.xml中配置,使用listener来读取applicationContext.xml配置文件,启动Spring容器。
1 <!--配置监听器,spring在web初始化时自动加载--> 2 <context-param> 3 <param-name>contextConfigLocation</param-name> 4 <param-value>classpath:applicationContext.xml</param-value> 5 </context-param> 6 <listener> 7 <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> 8 </listener>
(2)spring核心配置文件中,需要配置包扫描、DI注入、事务等。
1 <?xml version="1.0" encoding="UTF-8"?> 2 <beans xmlns="http://www.springframework.org/schema/beans" 3 xmlns:context="http://www.springframework.org/schema/context" 4 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 5 xmlns:util="http://www.springframework.org/schema/util" 6 xmlns:aop="http://www.springframework.org/schema/aop" 7 xmlns:tx="http://www.springframework.org/schema/tx" 8 xmlns:mvc="http://www.springframework.org/schema/cache" 9 xsi:schemaLocation= 10 "http://www.springframework.org/schema/beans 11 http://www.springframework.org/schema/beans/spring-beans-4.3.xsd 12 http://www.springframework.org/schema/context 13 http://www.springframework.org/schema/context/spring-context-4.3.xsd 14 http://www.springframework.org/schema/util 15 http://www.springframework.org/schema/util/spring-util-4.3.xsd 16 http://www.springframework.org/schema/aop 17 http://www.springframework.org/schema/aop/spring-aop-4.3.xsd 18 http://www.springframework.org/schema/tx 19 http://www.springframework.org/schema/tx/spring-tx-4.3.xsd 20 http://www.springframework.org/schema/mvc 21 http://www.springframework.org/schema/mvc/spring-mvc-4.3.xsd" 22 > 23 24 <!-- 开启包扫描 --> 25 <!--<context:component-scan base-package="com.boe.web"/>--> 26 <context:component-scan base-package="com.boe.service"/> 27 <!--<context:component-scan base-package="com.boe.dao"/>--> 28 <!--DI依赖注入--> 29 <context:annotation-config></context:annotation-config> 30 <!--引入外部数据库连接配置文件 --> 31 <context:property-placeholder location="classpath:connConf/db.properties"/> 32 <!--配置数据源 --> 33 <bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource"> 34 <property name="driverClass" value="${driverClass}"/> 35 <property name="jdbcUrl" value="${jdbcUrl}"/> 36 <property name="user" value="${user}"/> 37 <property name="password" value="${password}"/> 38 </bean> 39 40 <!--配置事务管理器--> 41 <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> 42 <property name="dataSource" ref="dataSource"></property> 43 </bean> 44 <!--开启事务注解--> 45 <tx:annotation-driven></tx:annotation-driven> 46 47 </beans>
Mybatis配置
(1)mybatis的配置需要准备核心配置文件sqlMapConfig和mapper映射文件(这里准备了一个UserMapper.xml)。
sqlMapConfig.xml
1 <?xml version="1.0" encoding="UTF-8" ?> 2 <!DOCTYPE configuration 3 PUBLIC "-//mybatis.org//DTD Config 3.0//EN" 4 "http://mybatis.org/dtd/mybatis-3-config.dtd"> 5 <configuration> 6 7 <!--配置mapper映射文件--> 8 <!--<mappers> 9 <mapper resource="UserMapper.xml"></mapper> 10 </mappers>--> 11 12 </configuration>
UserMapper.xml
1 <?xml version="1.0" encoding="UTF-8" ?> 2 <!DOCTYPE mapper 3 PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" 4 "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> 5 6 <mapper namespace="com.boe.dao.UserMapper"> 7 8 <!--查询user--> 9 <select id="findAll" resultType="com.boe.domain.User"> 10 SELECT * FROM user; 11 </select> 12 13 14 <!--插入一个user--> 15 <insert id="addUser" parameterType="com.boe.domain.User"> 16 INSERT INTO user 17 <trim prefix="(" suffix=")" suffixOverrides=","> 18 id, 19 <if test="name!=null">name,</if> 20 <if test="age!=0">age,</if> 21 </trim> 22 VALUES 23 <trim prefix="(" suffix=")" suffixOverrides=","> 24 null, 25 <if test="name!=null">#{name},</if> 26 <if test="age!=0">#{age},</if> 27 </trim> 28 </insert> 29 30 </mapper>
(2)在spring核心配置文件中添加跟Mybatis相关的配置,完成整合。需要配置Sqlsessionfactorybean,里面配置了数据源、mybatis核心配置文件和mapper映射文件(原来在mybatis核心配置文件中完成数据源和mapper映射文件的配置),最后配置MapperScannerConfigurer,实现对mapper映射器(接口)的扫描(原本需要使用SqlSession的getMapper方法获得)。
1 <!--整合mybatis,配置sqlsession--> 2 <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean"> 3 <!--引入数据源--> 4 <property name="dataSource" ref="dataSource"></property> 5 <!--引入mybatis核心配置文件--> 6 <property name="configLocation" value="classpath:sqlMapConfig.xml"></property> 7 <!--引入映射文件--> 8 <property name="mapperLocations" value="classpath:Mapper/UserMapper.xml"></property> 9 </bean> 10 11 <!--配置包mapper扫描,里面放置接口--> 12 <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer"> 13 <property name="basePackage" value="com.boe.dao"></property> 14 </bean>
以上就完成了SSM核心文件的配置,跟数据库连接相关的属性文件这里略去不展示,最后配置完成后的项目结构如下图。
启动SSM测试
配置完成后还没有完成,需要启动tomcat服务器查看是否正常启动,这里就可能开始踩坑了。
(1)java.lang.ClassNotFoundException:org.springframework.web.context.ContextLoaderListener
启动后发现部署提示OK,但是继续查看Tomcat Localhost Log发现执行报错,提示说找不到这个类,但是实际上配置web.xml中是可以找到这个类,所以说明包是有的(spring-web相关jar包),后面查看发现部署到tomcat后没有lib目录,因此报错。
解决办法最简单粗暴的方式是重新添加Artifacts,先将当前的删除。
然后重新从Module中添加,发现Output Layout里有lib目录,另外tomcat可能需要重新配置一下Deployment,将刚开新的artifacts重新导入一下,重新启动发现不再报错。
(2)无法读取到配置文件信息,如spring-mvc.xml等,这种情况一般就是没有配置sources和resources目录导致,按照上面的方法配置即可,刚开始也采坑多次,才发现IDEA需要配置这个。
最后没问题做测试,可以发送请求正常连接数据库,并返回json数据。
Maven整合
上面就是普通项目的SSM整合,接下来使用maven来整合,其实整体来说和普通整合区别不大,就是jar包不需要手动导入了,通过pom文件来实现,另外可以使用maven的tomcat插件,无需部署。其他springmvc、spring和mybatis的配置文件基本不用改动。
pom文件内容如下,其他均参考上面配置。
1 <?xml version="1.0" encoding="UTF-8"?> 2 3 <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 4 xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 5 <modelVersion>4.0.0</modelVersion> 6 7 <groupId>com.boe</groupId> 8 <artifactId>mavenssm</artifactId> 9 <version>0.0.1-SNAPSHOT</version> 10 <packaging>war</packaging> 11 12 <name>mavenssm Maven Webapp</name> 13 <url>http://www.example.com</url> 14 15 <properties> 16 <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> 17 <maven.compiler.source>1.7</maven.compiler.source> 18 <maven.compiler.target>1.7</maven.compiler.target> 19 </properties> 20 21 <dependencies> 22 <dependency> 23 <groupId>junit</groupId> 24 <artifactId>junit</artifactId> 25 <version>4.11</version> 26 <scope>test</scope> 27 </dependency> 28 29 <!-- springmvc包 --> 30 <dependency> 31 <groupId>org.springframework</groupId> 32 <artifactId>spring-webmvc</artifactId> 33 <version>4.3.7.RELEASE</version> 34 </dependency> 35 36 <!-- spring web包 --> 37 <dependency> 38 <groupId>org.springframework</groupId> 39 <artifactId>spring-web</artifactId> 40 <version>4.3.7.RELEASE</version> 41 </dependency> 42 43 <dependency> 44 <groupId>javax.servlet</groupId> 45 <artifactId>javax.servlet-api</artifactId> 46 <version>3.1.0</version> 47 <!-- 运行期不导入,只作用在编译期防止编译报错 --> 48 <scope>provided</scope> 49 </dependency> 50 51 <!-- 导入spring相关包 --> 52 <dependency> 53 <groupId>org.springframework</groupId> 54 <artifactId>spring-context</artifactId> 55 <version>4.3.7.RELEASE</version> 56 </dependency> 57 58 <!--mybatis相关--> 59 60 <!-- 引入mysql驱动 --> 61 <dependency> 62 <groupId>mysql</groupId> 63 <artifactId>mysql-connector-java</artifactId> 64 <version>5.0.8</version> 65 </dependency> 66 67 <!-- 引入数据源c3p0 --> 68 <dependency> 69 <groupId>com.mchange</groupId> 70 <artifactId>c3p0</artifactId> 71 <version>0.9.5.2</version> 72 </dependency> 73 74 <!-- 引入springJDBC --> 75 <dependency> 76 <groupId>org.springframework</groupId> 77 <artifactId>spring-jdbc</artifactId> 78 <version>4.3.7.RELEASE</version> 79 </dependency> 80 81 <!-- mybatis的包 --> 82 <dependency> 83 <groupId>org.mybatis</groupId> 84 <artifactId>mybatis</artifactId> 85 <version>3.4.5</version> 86 </dependency> 87 88 <!-- mybatis整合spring的包 --> 89 <dependency> 90 <groupId>org.mybatis</groupId> 91 <artifactId>mybatis-spring</artifactId> 92 <version>1.3.1</version> 93 </dependency> 94 95 <!-- json相关包 --> 96 <dependency> 97 <groupId>com.fasterxml.jackson.core</groupId> 98 <artifactId>jackson-core</artifactId> 99 <version>2.8.8</version> 100 </dependency> 101 102 <dependency> 103 <groupId>com.fasterxml.jackson.core</groupId> 104 <artifactId>jackson-databind</artifactId> 105 <version>2.8.8</version> 106 </dependency> 107 108 109 110 </dependencies> 111 112 <build> 113 <finalName>mavenssm</finalName> 114 <pluginManagement> 115 <plugins> 116 117 <!-- 配置插件,指定jdk版本 --> 118 <plugin> 119 <groupId>org.apache.maven.plugins</groupId> 120 <artifactId>maven-compiler-plugin</artifactId> 121 <version>3.8.0</version> 122 <configuration> 123 <source>1.8</source> 124 <target>1.8</target> 125 <encoding>UTF-8</encoding> 126 </configuration> 127 </plugin> 128 129 <!-- tomcat插件--> 130 <plugin> 131 <groupId>org.apache.tomcat.maven</groupId> 132 <artifactId>tomcat7-maven-plugin</artifactId> 133 <version>2.2</version> 134 <configuration> 135 <!-- 端口 --> 136 <port>8080</port> 137 <!-- contextPath --> 138 <path>/</path> 139 <!-- receive utf-8 --> 140 <uriEncoding>UTF-8</uriEncoding> 141 </configuration> 142 </plugin> 143 144 </plugins> 145 </pluginManagement> 146 </build> 147 </project>
启动tomcat可以使用maven的tomcat插件,配置如下,添加一个maven application,Command line写入命令即可,注意不要添加mvn,直接写命令参数。
启动后访问页面,发现能正常访问。
控制台可以正常获取db数据。
参考博文: