IDEA + Maven + SSM 框架整合步骤

时间:2024-10-29 18:05:44

  因为前段时间自己想写个SSM的demo,然而不知怎么回事,配置完之后出现错误,怎么都调不好。最后从朋友那里拷了一个SSM的demo过来搭建成功,写这篇东西也是为了以后如果还有需要可以方便的查阅,并且也可能帮到一些别的和我一样的新程序员。

  首先说一下版本,我采用的是IDEA 2018,maven版本是3.5.3,需要额外说明的是,maven和jdk有版本对应k要求,可以去官网查看,http://maven.apache.org/docs/history.html。SSM的版本可以在之后的pom.xml里看到。好了,接下来开始搭建SSM工程。

  1. 第一步用IDEA创建工程。在左上角依次点击 New File -> new -> Project... 然后左侧列表中,选中Maven来新建一个Maven工程。然后勾上Create from archetype来创建默认的目录,一般web项目都是选择maven-archetype-webapp,不要选错成上面的cocoon-22-archetype-webapp。最后点击next,如下图IDEA + Maven + SSM 框架整合步骤
  2. 然后填写自己的GroupID和ArtifactID。前者是指项目组织的唯一标识名,一般是域名+公司名+项目名,我这里就随意填了,叫MyDemo。后者是指项目唯一标识符,一般就是项目名,我这里填demo-001。
    IDEA + Maven + SSM 框架整合步骤
  3. 然后到了选择maven版本,这里就选择自己安装的maven版本就好,然后Local repository是配置Maven时选择的本地jar包仓库文件夹。然后理论上就可以继续下一步了,但一般来说国内maven有时候下载一些东西会很慢,导致工程的搭建速度会很慢。这里可以点击右边绿色的加号,然后填写Name:archetypeCatalog,Value:internal。因为maven在构建时会下载一个配置文件,有几M大小,容易卡住所以用这个方式使用内置的archetype-catalog.xml文件。还有别的方式可以解决,这里就不表了,可以直接去搜索archetypeCatalog internal就可以找到其他的方法。接着继续点击next。IDEA + Maven + SSM 框架整合步骤
  4. 然后就是一些本地的设置,比如项目名以及项目本地的存放路径。设置完点击finish来打开工程即可。
  5. 然后我们能看到工程已经被搭建好了,然后我们要做的事还有引入依赖的jar包,完善默认的项目目录。先来引入工程依赖的jar包,可以看到有一个蓝色m图标的文件叫pom.xml,就是在这个文件中输入依赖的jar包信息就可以导入了。这里给出一个依赖的清单,把这段xml代码直接复制到dependencies标签中,然后再点击右小角IDEA弹出的Import changes,也可以点击Enable Auto-Import来使用自动引入。pom.xml的dependencies标签内的配置代码如下:
            <!-- 单元测试 -->
    <dependency>
    <groupId>junit</groupId>
    <artifactId>junit</artifactId>
    <version>4.11</version>
    </dependency> <!-- 1.日志 -->
    <dependency>
    <groupId>org.slf4j</groupId>
    <artifactId>slf4j-api</artifactId>
    <version>1.7.6</version>
    </dependency>
    <!-- 实现slf4j接口并整合 -->
    <dependency>
    <groupId>ch.qos.logback</groupId>
    <artifactId>logback-classic</artifactId>
    <version>1.1.1</version>
    </dependency> <!-- 2.数据库 -->
    <dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <version>5.1.37</version>
    <scope>runtime</scope>
    </dependency>
    <dependency>
    <groupId>c3p0</groupId>
    <artifactId>c3p0</artifactId>
    <version>0.9.1.2</version>
    </dependency> <!-- DAO: MyBatis -->
    <dependency>
    <groupId>org.mybatis</groupId>
    <artifactId>mybatis</artifactId>
    <version>3.3.0</version>
    </dependency>
    <dependency>
    <groupId>org.mybatis</groupId>
    <artifactId>mybatis-spring</artifactId>
    <version>1.2.3</version>
    </dependency> <!-- 3.Servlet web -->
    <dependency>
    <groupId>taglibs</groupId>
    <artifactId>standard</artifactId>
    <version>1.1.2</version>
    </dependency>
    <dependency>
    <groupId>jstl</groupId>
    <artifactId>jstl</artifactId>
    <version>1.2</version>
    </dependency>
    <dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-databind</artifactId>
    <version>2.5.4</version>
    </dependency>
    <dependency>
    <groupId>javax.servlet</groupId>
    <artifactId>javax.servlet-api</artifactId>
    <version>3.1.0</version>
    </dependency> <!-- 4.Spring -->
    <!-- 1)Spring核心 -->
    <dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-core</artifactId>
    <version>4.1.7.RELEASE</version>
    </dependency>
    <dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-beans</artifactId>
    <version>4.1.7.RELEASE</version>
    </dependency>
    <dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-context</artifactId>
    <version>4.1.7.RELEASE</version>
    </dependency>
    <!-- 2)Spring DAO层 -->
    <dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-jdbc</artifactId>
    <version>4.1.7.RELEASE</version>
    </dependency>
    <dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-tx</artifactId>
    <version>4.1.7.RELEASE</version>
    </dependency>
    <!-- 3)Spring web -->
    <dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-web</artifactId>
    <version>4.1.7.RELEASE</version>
    </dependency>
    <dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-webmvc</artifactId>
    <version>4.1.7.RELEASE</version>
    </dependency>
    <!-- 4)Spring test -->
    <dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-test</artifactId>
    <version>4.1.7.RELEASE</version>
    </dependency> <!-- wx-tools 依赖包 -->
    <!-- HttpClient -->
    <dependency>
    <groupId>org.apache.httpcomponents</groupId>
    <artifactId>httpclient</artifactId>
    <version>4.5.6</version>
    </dependency>
    <dependency>
    <groupId>commons-collections</groupId>
    <artifactId>commons-collections</artifactId>
    <version>3.2</version>
    </dependency>
    <!-- http -->
    <dependency>
    <groupId>org.apache.httpcomponents</groupId>
    <artifactId>httpmime</artifactId>
    <version>4.3.6</version>
    </dependency>
    <!-- XML -->
    <dependency>
    <groupId>com.thoughtworks.xstream</groupId>
    <artifactId>xstream</artifactId>
    <version>1.4.7</version>
    </dependency>
    <dependency>
    <groupId>org.dom4j</groupId>
    <artifactId>dom4j</artifactId>
    <version>2.0.0</version>
    </dependency>
    <!-- IO -->
    <dependency>
    <groupId>commons-io</groupId>
    <artifactId>commons-io</artifactId>
    <version>2.4</version>
    </dependency>
    <!-- https://mvnrepository.com/artifact/commons-fileupload/commons-fileupload -->
    <dependency>
    <groupId>commons-fileupload</groupId>
    <artifactId>commons-fileupload</artifactId>
    <version>1.3.1</version>
    </dependency>
    <!-- Json -->
    <dependency>
    <groupId>org.json</groupId>
    <artifactId>json</artifactId>
    <version>20180130</version>
    </dependency>
    <!-- 分页PageHelper -->
    <dependency>
    <groupId>com.github.pagehelper</groupId>
    <artifactId>pagehelper</artifactId>
    <version>4.1.6</version>
    </dependency>
  6. 如果没有问题的话,那么已经成功导入了一般项目需要用的jar包了。接下来把默认的目录补全。这一步可做也可不做,比如有时只是做一个很小的项目,可能不需要那么清晰的分层。首先在src下的main文件夹下新建一个java和resource文件夹,然后右键文件夹名,在菜单的下面找到Mark Directory as,将java文件夹设置为Sources Root,resource文件夹设置为Resources Root。然后在src下建立一个和main同级的test文件夹,然后在test下再建立一个java和resource文件夹,分别标记为Test Sources Root和Test Resources Root。然后我们在main下的java文件夹根据需要来新建几个包,dao、dto、controller、entity、enums、exception、service、util等。其中service下再建一个子目录叫impl。建完的目录大致如下:
    IDEA + Maven + SSM 框架整合步骤
  7. 首先需要在webapp/WEB-INF下新建一个jsp目录,用来存放jsp页面。之所以建在WEB-INF文件夹下,是因为WEB-INF下的资源无法通过浏览器直接获取,有较高安全性。然后接下来就是配置web.xml文件,代码如下(红名路径不用管,等配置结束后即可):
    <web-app xmlns="http://java.sun.com/xml/ns/javaee"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
    http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
    version="3.0"
    metadata-complete="true">
    <!-- 修改servlet版本为3.1 -->
    <!-- 配置DispatcherServlet -->
    <servlet>
    <servlet-name>demo-dispatcher</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <!-- 配置springMVC需要加载的配置文件
    spring-dao.xml,spring-service.xml,spring-web.xml
    Mybatis -> spring -> springMVC
    -->
    <init-param>
    <param-name>contextConfigLocation</param-name>
    <param-value>classpath:spring/spring-*.xml</param-value>
    </init-param>
    </servlet>
    <filter>
    <filter-name>encodingFilter</filter-name>
    <filter-class>org.springframework.web.filter.CharacterEncodingFilter </filter-class>
    <init-param>
    <param-name>encoding</param-name>
    <param-value>utf8</param-value>
    </init-param>
    </filter> <filter-mapping>
    <filter-name>encodingFilter</filter-name >
    <url-pattern>/*</url-pattern>
    </filter-mapping>
    <servlet-mapping>
    <servlet-name>demo-dispatcher</servlet-name>
    <!-- 默认匹配所有的请求 -->
    <url-pattern>/</url-pattern>
    </servlet-mapping> <!-- 这里配置默认进入的主页,根据需要填写 -->
    <welcome-file-list>
    <welcome-file>home.jsp</welcome-file>
    </welcome-file-list> </web-app>
  8. 接下来就是添加Spring的配置文件了,这里将Spring的配置文件分成三部分,dao、service和web。首先先在main/resource下建一个目录叫spring。然后分别新建三个文件:spring-dao.xml、spring-service.xml、spring-web.xml。spring-dao.xml代码如下(其中${ jdbc.xxx }是自己的数据库连接属性,也可以在main/resource下新建一个jdbc.properties来存放连接属性,在properties中使用的是键值对保存,举例:key是jdbc.url = 数据库URL)
    <?xml version="1.0" encoding="UTF-8"?>
    <beans xmlns = "http://www.springframework.org/schema/beans"
    xmlns:xsi = "http://www.w3.org/2001/XMLSchema-instance"
    xmlns:context="http://www.springframework.org/schema/context"
    xsi:schemaLocation="http://www.springframework.org/schema/beans
    http://www.springframework.org/schema/beans/spring-beans.xsd
    http://www.springframework.org/schema/context
    http://www.springframework.org/schema/context/spring-context.xsd" >
    <!-- 配置整合mybatis过程 -->
    <!-- 1.配置数据库相关参数properties的属性:${url} -->
    <context:property-placeholder location="classpath:jdbc.properties"/>
    <!-- 2.数据库连接池 -->
    <bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
    <!-- 3.配置连接池属性 -->
    <property name="driverClass" value="${jdbc.driver}"/>
    <property name="jdbcUrl" value="${jdbc.url}"/>
    <property name="user" value="${jdbc.username}"/>
    <property name="password" value="${jdbc.password}"/> <!-- c3p0连接池的私有属性 -->
    <property name="maxPoolSize" value="30"/>
    <property name="minPoolSize" value="10"/>
    <!-- 关闭链接后不自动commit -->
    <property name="autoCommitOnClose" value="false"/>
    <!-- 获取连接超时时间 -->
    <property name="checkoutTimeout" value="1000"/>
    <!-- 当前获取连接失败重试次数 -->
    <property name="acquireRetryAttempts" value="2"/>
    </bean> <!-- 3.配置SqlSessionFactory对象 -->
    <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
    <!-- 注入数据库连接池 -->
    <property name="dataSource" ref="dataSource"/>
    <!-- 配置MyBatis全局配置文件:mybatis-config.xml -->
    <property name="configLocation" value="classpath:mybatis-config.xml"/>
    <!-- 扫描entity包 使用别名 -->
    <property name="typeAliasesPackage" value="entity"/>
    <!-- 扫描sql配置文件:mapper需要的配置xml文件, -->
    <property name="mapperLocations" value="classpath:mapper/*/*.xml"/>
    </bean> <!-- 4.配置扫描Dao接口包,动态实现Dao接口,注入到spring容器中 -->
    <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
    <!-- 注入sqlSessionFactory -->
    <property name="sqlSessionFactoryBeanName" value="sqlSessionFactory"/>
    <!-- 给出需要扫描Dao接口包 -->
    <property name="basePackage" value="dao"/>
    </bean> </beans>

    spring-service.xml代码如下:

    <?xml version="1.0" encoding="UTF-8"?>
    <beans xmlns = "http://www.springframework.org/schema/beans"
    xmlns:xsi = "http://www.w3.org/2001/XMLSchema-instance"
    xmlns:tx="http://www.springframework.org/schema/tx"
    xmlns:context="http://www.springframework.org/schema/context"
    xsi:schemaLocation="http://www.springframework.org/schema/beans
    http://www.springframework.org/schema/beans/spring-beans.xsd
    http://www.springframework.org/schema/context
    http://www.springframework.org/schema/context/spring-context.xsd
    http://www.springframework.org/schema/tx
    http://www.springframework.org/schema/tx/spring-tx.xsd"
    default-autowire="byName"> <!-- 扫描service包下所有使用注解的类型 -->
    <context:component-scan base-package="service" /> <!-- 配置事务管理器 -->
    <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
    <!-- 注入数据库连接池 -->
    <property name="dataSource" ref="dataSource"/>
    </bean> <!-- 配置基于注解的声明式事务 默认使用注解来管理事务行为 -->
    <tx:annotation-driven transaction-manager="transactionManager"/>
    </beans>

    spring-web.xml代码如下:

    <?xml version="1.0" encoding="UTF-8"?>
    <beans xmlns = "http://www.springframework.org/schema/beans"
    xmlns:xsi = "http://www.w3.org/2001/XMLSchema-instance"
    xmlns:context="http://www.springframework.org/schema/context"
    xmlns:mvc="http://www.springframework.org/schema/mvc"
    xsi:schemaLocation="http://www.springframework.org/schema/beans
    http://www.springframework.org/schema/beans/spring-beans.xsd
    http://www.springframework.org/schema/context
    http://www.springframework.org/schema/context/spring-context.xsd
    http://www.springframework.org/schema/mvc
    http://www.springframework.org/schema/mvc/spring-mvc-4.0.xsd"> <!-- 配置SpringMVC -->
    <!-- 1:开启SpringMVC注解模式 -->
    <!-- 简化配置:
    (1)自动注册DefaultAnnotationHandlerMapping,AnnotationMethodHandlerAdapter
    (2)提供一系列:数据绑定,数字和日期的format @NumberFormat,@DataTimeFormat,
    xml,json默认读写支持.
    -->
    <mvc:annotation-driven/> <!--
    2:静态资源默认servlet配置
    1:加入对静态资源的处理:js,gif,png
    2:允许使用"/"做整体映射
    -->
    <mvc:default-servlet-handler/> <!--3:配置jsp 显示ViewResolver -->
    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
    <property name="viewClass" value="org.springframework.web.servlet.view.JstlView"/>
    <property name="prefix" value="/WEB-INF/jsp/"/>
    <property name="suffix" value=".jsp"/>
    </bean> <!--4:扫描web相关的bean -->
    <context:component-scan base-package="controller"/>
    </beans>

    这一步结束后,目录的样子应该像下图这样:

    IDEA + Maven + SSM 框架整合步骤

  9. 配置好spring的文件后,接下来配置Mybatis的配置文件。先在main/resource下新建一个mapper目录用于后续存放mybatis的映射文件。然后还是在main/resource下新建一个文件,叫做mybatis-config.xml。代码如下:
    <?xml version="1.0" encoding="UTF-8" ?>
    <!DOCTYPE configuration
    PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
    "http://mybatis.org/dtd/mybatis-3-config.dtd"> <configuration>
    <settings>
    <setting name="useGeneratedKeys" value="true"/>
    <setting name="useColumnLabel" value="true"/>
    <setting name="mapUnderscoreToCamelCase" value="true"/>
    </settings>
    </configuration>
  10. 接下来还不能运行,因为此时spring-dao下有红色报错代码,如果想检验框架是否搭建完成,可以将spring-dao.xml的红色代码注释掉,部署tomcat之后运行,就能看到默认生成的index.jsp里的hello world!了。当mybatis的映射文件补齐后,就可以取消掉之前的注释了。希望大家注意这个文件里的问题,曾经的我因为没察觉到这个地方的错误,在没有写代码的时候就运行工程,发现怎么都报sqlsession的错误,现在才明白原来是缺少映射文件。希望大家不要走这段弯路。

 Terence Xie

2018.8.1 周三 20:46