IDEA + Maven + SSM 框架整合步骤

  因为前段时间自己想写个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,如下图
     
  2. 然后填写自己的GroupID和ArtifactID。前者是指项目组织的唯一标识名,一般是域名+公司名+项目名,我这里就随意填了,叫MyDemo。后者是指项目唯一标识符,一般就是项目名,我这里填demo-001。

     

  3. 然后到了选择maven版本,这里就选择自己安装的maven版本就好,然后Local repository是配置Maven时选择的本地jar包仓库文件夹。然后理论上就可以继续下一步了,但一般来说国内maven有时候下载一些东西会很慢,导致工程的搭建速度会很慢。这里可以点击右边绿色的加号,然后填写Name:archetypeCatalog,Value:internal。因为maven在构建时会下载一个配置文件,有几M大小,容易卡住所以用这个方式使用内置的archetype-catalog.xml文件。还有别的方式可以解决,这里就不表了,可以直接去搜索archetypeCatalog internal就可以找到其他的方法。接着继续点击next。
     
  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。建完的目录大致如下:
     
  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>

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

     
  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

posted @ 2018-07-29 23:58  水猿  阅读(426)  评论(0编辑  收藏  举报