我是怎样搭建一个SSM框架的

使用SSM框架已经接近半年,回顾总结一下

NONGFAH 写于 2018-12-25

回顾总结一下,搭建SSM框架的过程。黄同学使用的编译器是Intellij IDEA 2018 ,并使用了MAVEN管理工具。

搭建骨架

新建maven-archetype-webapp项目

新建一个maven-archetype-webapp(一个简单的Java Web应用程序)
有的同学可能会问,为什么要我选择这个东西,它是干嘛的?我把相关资料放在了下边,有兴趣的可以了解下。maven骨架原型

Image

填写GroupID和ArtifactID。这里GROUPID填写自己的域名.公司名,ArtifactID填写项目名。
为什么这么填,参考 maven中的groupId和artifactId到底指的是什么
Image 其余配置,不需要任何修改。选择next直到完成

创建目录结构

等待maven工具的搭建,直到进度条加载完,或者看到Maven execution finished。
搭建完的目录结构是这样的。
Image 其中.idea文件夹是编译器对项目配置信息,自动生成,不需要修改。
src是我们代码存放的路径

*.iml全称是infomation of module. 存储idea 对module 配置信息 ,自动生成,不需要修改。

pom.xml是maven管理项目依赖的文件,我们通过在其中添加依赖信息,来告诉maven项目需要用到什么依赖,然后maven就会自动下载、管理这些依赖。

External libraries是项目的外部图书馆。不需要修改。它是什么意思呢?
你通过maven下载引进的外部依赖以及JDK类库都会在这里,当你的代码需要用到类库的时候,编译器就会去这里边找一找:有没有这个类呢?找到了,就会给你使用。

现在我们在存放代码的src文件夹下新建我们自己的文件夹(包),这样做的好处是,我们把有关联的代码统一放到一个文件夹中,文件结构更清晰,不会因为以后项目规模变大,花时间去找自己的代码。
在src/main下新建文件夹java然后设置成sources Root属性.在java目录下新建base用于存放一些基础设施,在base新建annotation和utils留待备用。然后在java目录下新建包xyz.nongfah。英文符号“.”代表子包目录。然后在xya.nongfah新建包User代表代码的模块,在User下新建Controller、dao、mapper、model、service五个包。 在src/main下新建包resources代表配置文件目录。并将resources设置成Resources Root属性。在src/main/webapp/WEB-INF下新建views文件夹,用于存放前端代码。

现在我们的目录是这样的。
Image 到此我们需要的目录结构就准备好了。

对于那些文件夹属性是干什么的,看这里Idea Mark Directory as 下的文件夹分别代表的含义

填充文件

搭建好目录结构后,我们来进行框架的配置。

配置pom.xml

导入项目所需的jar依赖,这些配置大部分都有注释,你可以尝试去了解究竟是干嘛呢。

有同学可能不知道jar依赖是干嘛的,我解释一下。jar是java可执行文件,全拼Java ARchive,这是什么意思呢?对于别人编写的框架代码, 我们要使用,不可能直接使用源码(容易出错、传输麻烦),源码意味着许许多多的类,在使用过程中,很可能因为你不小心就把源码改动了,导致程序出错。这个时候java怎么做的呢?他把这些源码编译、归档,然后压缩成jar文件(类似你压缩的zip)。当我们需要使用 这些框架代码的时候,解压、寻找类的工作交给编译器去做,我们只关心怎么去写我们的业务代码。
在这个过程中,我们要做的是什么呢?找到jar,然后导入到我们的项目中。后来人们发现,这样做也很麻烦,我还得一个一个去下载这些jar。
有没有办法更省力一点呢?聪明的程序员开发出maven这个工具来统一管理jar,我们不需要去各个官网上下载这些jar了,我们只需要告诉maven,我要用这个框架了,你去给我下载,maven就会乖乖下载。有一个这么乖的人事,是很幸福的,你可以很方便的拿到你想要的人才(jar)。 pom.xml(Project Object Model项目对象模型)就是我们和maven人事交流的中介,我们把想要的写在这里,maven就会去下载。

现在,让我们继续,将下边这些复制到你的pom.xml文件中,然后等待你的maven去下载这些框架。

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>
  <groupId>xyz.nongfah</groupId>
  <artifactId>nongfahSSM</artifactId>
  <version>0.0.1-SNAPSHOT</version>
  <packaging>war</packaging>
  
  <properties>
  
      <!--Spring-->
      <spring.version>4.1.3.RELEASE</spring.version>
      <!--Spring AOP-->
      <aopalliance.version>1.0</aopalliance.version>
      <!--Start 数据库-->
      <mybatis.version>3.1.1</mybatis.version>                        <!--mybatis-->
      <pagehelper.version>5.1.2-beta</pagehelper.version>             <!--MyBatis 分页插件-->
      <mybatis.spring.version>1.2.3</mybatis.spring.version>          <!--mybatis与spring整合-->
      <mysql.version>5.1.6</mysql.version>                            <!--mysql数据库驱动-->
      <druid.version>1.0.18</druid.version>                           <!--阿里巴巴数据库连接池-->
      <mybatis-generator.version>1.3.5</mybatis-generator.version>    <!--mybatis逆向工程工具-->
      <jsqlparser.version>1.0</jsqlparser.version>                    <!--sql语句解释器-->
      <!--End 数据库-->
  
      <!--单元测试-->
      <junit.version>4.12</junit.version>
      <!--JSP标准标签库-->
      <jstl.version>1.2</jstl.version>
      <!--servlet API-->
      <servlet-api.version>3.1.0</servlet-api.version>
      <!--日志-->
      <log4j.version>1.2.16</log4j.version>
      <!--json处理工具-->
      <jackson.version>1.2.7</jackson.version>
      <!--commons  Java组件库 工具类库-->
      <commons-logging.version>1.2</commons-logging.version>
      <commons-fileupload.version>1.2.1</commons-fileupload.version>
      <commons-io.version>1.3.2</commons-io.version>
      <commons-lang.version>2.6</commons-lang.version>
      <!--lombok工具-->
      <lombok.version>1.16.20</lombok.version>
  
  </properties>
  
  <dependencies>
      <!-- Spring -->
      <dependency>
          <groupId>org.springframework</groupId>
          <artifactId>spring-web</artifactId>
          <version>${spring.version}</version>
      </dependency>
      <dependency>
          <groupId>org.springframework</groupId>
          <artifactId>spring-webmvc</artifactId>
          <version>${spring.version}</version>
      </dependency>
      <dependency>
          <groupId>org.springframework</groupId>
          <artifactId>spring-beans</artifactId>
          <version>${spring.version}</version>
      </dependency>
      <dependency>
          <groupId>org.springframework</groupId>
          <artifactId>spring-context</artifactId>
          <version>${spring.version}</version>
      </dependency>
      <dependency>
          <groupId>org.springframework</groupId>
          <artifactId>spring-test</artifactId>
          <version>${spring.version}</version>
      </dependency>
  
      <dependency>
          <groupId>com.alibaba</groupId>
          <artifactId>fastjson</artifactId>
          <version>1.2.28</version>
      </dependency>
      <!-- JSONObject对象依赖的jar包 -->
      <dependency>
          <groupId>commons-beanutils</groupId>
          <artifactId>commons-beanutils</artifactId>
          <version>1.9.3</version>
      </dependency>
      <dependency>
          <groupId>commons-collections</groupId>
          <artifactId>commons-collections</artifactId>
          <version>3.2.1</version>
      </dependency>
      <dependency>
          <groupId>commons-lang</groupId>
          <artifactId>commons-lang</artifactId>
          <version>2.6</version>
      </dependency>
      <dependency>
          <groupId>commons-logging</groupId>
          <artifactId>commons-logging</artifactId>
          <version>1.1.1</version>
      </dependency>
      <dependency>
          <groupId>net.sf.ezmorph</groupId>
          <artifactId>ezmorph</artifactId>
          <version>1.0.6</version>
      </dependency>
      <dependency>
          <groupId>net.sf.json-lib</groupId>
          <artifactId>json-lib</artifactId>
          <version>2.2.3</version>
          <classifier>jdk15</classifier><!-- 指定jdk版本 -->
      </dependency>
      <!-- Json依赖架包下载 -->
  
  
      <dependency>
          <groupId>junit</groupId>
          <artifactId>junit</artifactId>
          <version>${junit.version}</version>
      </dependency>
      <dependency>
          <groupId>org.apache.commons</groupId>
          <artifactId>commons-lang3</artifactId>
          <version>3.3.2</version>
      </dependency>
  
  
      <dependency>
          <groupId>org.mybatis</groupId>
          <artifactId>mybatis</artifactId>
          <version>${mybatis.version}</version>
      </dependency>
  
      <dependency>
          <groupId>org.mybatis</groupId>
          <artifactId>mybatis-spring</artifactId>
          <version>${mybatis.spring.version}</version>
      </dependency>
  
      <dependency>
          <groupId>mysql</groupId>
          <artifactId>mysql-connector-java</artifactId>
          <version>${mysql.version}</version>
      </dependency>
  
      <!-- aspectJ AOP 织入器 -->
      <dependency>
          <groupId>org.aspectj</groupId>
          <artifactId>aspectjweaver</artifactId>
          <version>1.8.9</version>
      </dependency>
  
      <!--Spring java数据库访问包,在本例中主要用于提供数据源 -->
      <dependency>
          <groupId>org.springframework</groupId>
          <artifactId>spring-jdbc</artifactId>
          <version>${spring.version}</version>
      </dependency>
      <!--slf4j日志包 -->
      <dependency>
          <groupId>org.slf4j</groupId>
          <artifactId>slf4j-api</artifactId>
          <version>1.7.21</version>
      </dependency>
      <dependency>
          <groupId>org.slf4j</groupId>
          <artifactId>slf4j-log4j12</artifactId>
          <version>1.7.21</version>
      </dependency>
      <!--c3p0 连接池 -->
      <dependency>
          <groupId>c3p0</groupId>
          <artifactId>c3p0</artifactId>
          <version>0.9.1.2</version>
      </dependency>
      <!-- jstl -->
      <dependency>
          <groupId>javax.servlet</groupId>
          <artifactId>jstl</artifactId>
          <version>1.2</version>
      </dependency>
      <dependency>
          <groupId>com.alibaba</groupId>
          <artifactId>druid</artifactId>
          <version>${druid.version}</version>
      </dependency>
  
      <dependency>
          <groupId>org.springframework</groupId>
          <artifactId>spring-aspects</artifactId>
          <version>${spring.version}</version>
      </dependency>
      <!-- JSP相关 -->
      <dependency>
          <groupId>jstl</groupId>
          <artifactId>jstl</artifactId>
          <version>${jstl.version}</version>
      </dependency>
  
      <dependency>
          <groupId>javax.servlet</groupId>
          <artifactId>javax.servlet-api</artifactId>
          <version>${servlet-api.version}</version>
          <scope>provided</scope>
      </dependency>
  
      <!-- pageHelper -->
      <dependency>
          <groupId>com.github.pagehelper</groupId>
          <artifactId>pagehelper</artifactId>
          <version>${pagehelper.version}</version>
      </dependency>
  
      <!--jsqlparser-->
      <dependency>
          <groupId>com.github.jsqlparser</groupId>
          <artifactId>jsqlparser</artifactId>
          <version>${jsqlparser.version}</version>
      </dependency>
      <dependency>
          <groupId>log4j</groupId>
          <artifactId>log4j</artifactId>
          <version>${log4j.version}</version>
      </dependency>
  
      <dependency>
          <groupId>commons-logging</groupId>
          <artifactId>commons-logging</artifactId>
          <version>${commons-logging.version}</version>
      </dependency>
  
      <dependency>
          <groupId>commons-fileupload</groupId>
          <artifactId>commons-fileupload</artifactId>
          <version>${commons-fileupload.version}</version>
      </dependency>
  
      <dependency>
          <groupId>commons-io</groupId>
          <artifactId>commons-io</artifactId>
          <version>${commons-io.version}</version>
      </dependency>
  
      <dependency>
          <groupId>commons-lang</groupId>
          <artifactId>commons-lang</artifactId>
          <version>${commons-lang.version}</version>
      </dependency>
  
      <dependency>
          <groupId>aopalliance</groupId>
          <artifactId>aopalliance</artifactId>
          <version>${aopalliance.version}</version>
      </dependency>
      <dependency>
          <groupId>org.mybatis.generator</groupId>
          <artifactId>mybatis-generator-core</artifactId>
          <version>${mybatis-generator.version}</version>
      </dependency>
      <dependency>
          <groupId>org.projectlombok</groupId>
          <artifactId>lombok</artifactId>
          <version>1.16.2</version>
      </dependency>
  
  
  </dependencies>
  
  <build>
      <finalName>${project.artifactId}</finalName>
      <plugins>
          <!--逆向工程插件-->
          <plugin>
              <groupId>org.mybatis.generator</groupId>
              <artifactId>mybatis-generator-maven-plugin</artifactId>
              <version>1.3.2</version>
              <configuration>
                  <verbose>true</verbose>
                  <overwrite>true</overwrite>
              </configuration>
          </plugin>
          <!-- 资源文件拷贝插件 -->
          <plugin>
              <groupId>org.apache.maven.plugins</groupId>
              <artifactId>maven-resources-plugin</artifactId>
              <version>2.7</version>
              <configuration>
                  <encoding>UTF-8</encoding>
              </configuration>
          </plugin>
          <!-- java编译插件 -->
          <plugin>
              <groupId>org.apache.maven.plugins</groupId>
              <artifactId>maven-compiler-plugin</artifactId>
              <version>3.2</version>
              <configuration>
                  <source>1.8</source>
                  <target>1.8</target>
                  <encoding>UTF-8</encoding>
              </configuration>
          </plugin>
      </plugins>
      <pluginManagement>
          <plugins>
              <!-- 配置Tomcat插件 -->
              <plugin>
                  <groupId>org.apache.tomcat.maven</groupId>
                  <artifactId>tomcat7-maven-plugin</artifactId>
                  <version>2.2</version>
                  <configuration>
                      <path>/</path>
                      <!--配置端口号-->
                      <port>9999</port>
                      <uriEncoding>UTF-8</uriEncoding>
                      <url>http://localhost:9999</url>
                      <server>tomcat7</server>
                  </configuration>
              </plugin>
          </plugins>
      </pluginManagement>
  
      <resources>
          <resource>
              <directory>src/main/resources</directory>
              <includes>
                  <include>**/*.properties</include>
                  <include>**/*.xml</include>
                  <include>**/*.tld</include>
              </includes>
              <filtering>false</filtering>
          </resource>
          <resource>
              <directory>src/main/java</directory>
              <includes>
                  <include>**/*.properties</include>
                  <include>**/*.xml</include>
              </includes>
              <filtering>false</filtering>
          </resource>
      </resources>
  
  </build>  
</project> ##### 配置ContextApplication.xml **在recourse文件夹下新建一个ContextApplication.xml文件**,这个文件是Spring的配置文件。将以下内容复制到该文件中。  

<?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:p="http://www.springframework.org/schema/p"
       xmlns:aop="http://www.springframework.org/schema/aop"
       xmlns:context="http://www.springframework.org/schema/context"
       xmlns:tx="http://www.springframework.org/schema/tx"
       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-4.3.xsd
        http://www.springframework.org/schema/aop
        http://www.springframework.org/schema/aop/spring-aop-4.3.xsd
        http://www.springframework.org/schema/tx
        http://www.springframework.org/schema/tx/spring-tx-4.3.xsd">

    <!--配置数据源,整合其他框架,事务等-->
    <!--1 引入属性文件,在配置中占位使用 -->
    <context:property-placeholder location="classpath*:/db.properties" />

    <!--2 配置C3P0数据源 -->
    <bean id="datasource" class="com.mchange.v2.c3p0.ComboPooledDataSource" destroy-method="close">
        <!--驱动类名 -->
        <property name="driverClass" value="${jdbc.driver}" />
        <!-- url -->
        <property name="jdbcUrl" value="${jdbc.url}" />
        <!-- 用户名 -->
        <property name="user" value="${jdbc.uid}" />
        <!-- 密码 -->
        <property name="password" value="${jdbc.pwd}" />
        <!-- 当连接池中的连接耗尽的时候c3p0一次同时获取的连接数  -->
        <property name="acquireIncrement" value="5"></property>
        <!-- 初始连接池大小 -->
        <property name="initialPoolSize" value="10"></property>
        <!-- 连接池中连接最小个数 -->
        <property name="minPoolSize" value="5"></property>
        <!-- 连接池中连接最大个数 -->
        <property name="maxPoolSize" value="20"></property>
    </bean>

    <!--3 会话工厂bean sqlSessionFactoryBean -->
    <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
        <!-- 数据源 -->
        <property name="dataSource" ref="datasource"></property>
        <!-- 配置mybatis全局配置文件:mybatis-config.xml -->
        <property name="configLocation" value="classpath:/mybatis-config.xml"></property>
        <!-- 配置数据库表对应的java实体类 -->
        <property name="typeAliasesPackage" value="xyz.nongfah.**.model"></property>
        <!-- sql映射文件路径 -->
        <property name="mapperLocations" value="classpath*:xyz/nongfah/**/mapper/*Mapper.xml"></property>
    </bean>

    <!--4 自动扫描对象关系映射 -->
    <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
        <!--指定会话工厂,如果当前上下文中只定义了一个则该属性可省去 -->
        <property name="sqlSessionFactoryBeanName" value="sqlSessionFactory" />
        <!-- 指定要自动扫描接口的基础包,实现接口 -->
        <property name="basePackage" value="xyz.nongfah"/>
        <property name="annotationClass" value="base.annotation.MybatisDao"/>
    </bean>

    <!--5 声明式事务管理 -->
    <!--定义事物管理器,由spring管理事务 -->
    <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
        <property name="dataSource" ref="datasource"></property>
    </bean>
    <!--支持注解驱动的事务管理,指定事务管理器 -->
    <tx:annotation-driven transaction-manager="transactionManager"/>

    <!--6 容器自动扫描IOC组件  -->
    <context:annotation-config />
    <context:component-scan base-package="xyz.nongfah" >
        <context:exclude-filter  type="annotation" expression="org.springframework.stereotype.Controller"/>
        <context:exclude-filter type="annotation" expression="org.springframework.web.bind.annotation.ControllerAdvice"/>
    </context:component-scan>

    <!--7 aspectj支持自动代理实现AOP功能 -->
    <aop:aspectj-autoproxy proxy-target-class="true"></aop:aspectj-autoproxy>

</beans>

现在,你会发现很多地方都会报错,为什么呢?是我给的代码有问题吗?不是。框架的搭建是一个系统性的工程,它并不是单一的、分散的,任何东西的运行或者异常都跟你的配置有关系。首先,我们拿数据库配置文件说明一下

<!--1 引入属性文件,在配置中占位使用 -->           <context:property-placeholder location="classpath*:/db.properties" />

通过注释,我们可以看到,这段配置是在干嘛呢?引入文件。前边的context:property-placeholder指的是节点的名字,location是这个节点的属性。什么意思呢?当你的项目启动的时候,Spring框架会去读这个文件,将xml文件实例化成一棵XML树, 将你写的这些节点的对应属性加载到程序中,这样Spring就通过你的ContextApplication.xml配置文件来进行了个性化配置,这也是我刚才说的“任何东西的运行或者异常都跟你的配置有关系”的原因。

关于什么是节点,可以参看这里xml节点 ,xml中能使用那些节点并不是由xml 决定的,它由框架决定,框架是使用配置文件的用户。即使你xml会800种语言,但我框架只取读取我要的东西,你说雅蔑蝶我可能真听不懂。xml文件只是一个载体,可能你会好奇框架是如何读取这个文件的, 我可以告诉你,就是简单的文件读取,和你new 一个file的过程差不多,它真正有价值的是通过反射来把这些属性,实例成有用的对象。要了解具体过程,你可以尝试去读Spring的源码,你会发现,框架的底层并不是你想的这么神秘。世界从未如此简单深刻。甚至包括你的tomcat,为什么我改了 配置文件他就能绑定8080端口?tomcat通过你的配置文件获得你的配置,然后在框架中new一个sorcket来监听该端口、占用该资源,就是这么简单!关于端口,你可以看一下这个端口

我们来说一下location这个属性是在干嘛。classpath:/是什么东西?路径,db.properties呢?文件。通过这个节点,框架就会把classpath:/db.properties也加载进来,为什么现在是红色的报错的?因为程序找不到这个文件。你可以观察一下,剩余的所有报错位置,全是路径下找不到文件。 现在,把报错位置的路径换成你自己的路径,然后我们继续添加配置文件(参看注释,仔细观察,然后去改路径,我知道你可以做到,这太简单了)。剩下的所有配置文件,我都不在说明有什么作用,你只需要知道,任何文件都有相应的组件在使用它。
嘿,小伙子,带着这个,你会需要的。java项目里classpath具体指哪儿个路径

db.properties
#mysql jdbc
jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/nongfah?useUnicode=true&characterEncoding=UTF-8
jdbc.uid=root
jdbc.pwd=admin
log4j.properties
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 = %5p %d %C: %m%n


log4j.appender.File = org.apache.log4j.DailyRollingFileAppender
log4j.appender.File.File=C:/logs/SSMDemo.html
log4j.appender.File.Encoding=UTF-8

log4j.appender.File.Threshold = INFO
log4j.appender.File.layout = org.apache.log4j.HTMLLayout
log4j.appender.File.layout.ConversionPattern =%d{ABSOLUTE} %5p %c{1}\:%L - %m%n

log4j.logger.com.opensymphony=ERROR
log4j.logger.org.springframework=ERROR

log4j.logger.org.apache=INFO
log4j.logger.java.sql.Connection=INFO
log4j.logger.java.sql.PreparedStatement=INFO
log4j.logger.java.sql.ResultSet=INFO
log4j.logger.java.sql.Statement=INFO
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>
        <!--使用jdbc的getGeneratedKeys获取数据库自增主键值  -->
        <setting name="useGeneratedKeys" value="true"/>
        <!-- 使用列别名替换列名   默认:true
            select name as title from table
         -->
        <setting name="useColumnLabel" value="true"/>
        <!-- 开启驼峰命名转换:Table(create_time) -> Entity(createTime) -->
        <setting name="mapUnderscoreToCamelCase" value="true"/>
    </settings>

</configuration>
spring-mvc.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-3.0.xsd
       http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd">

    <!--配置自动扫描的包-->
    <context:component-scan base-package="xyz.nongfah" use-default-filters="false">
        <!--规定扫描的注解-->
        <context:include-filter type="annotation" expression="org.springframework.stereotype.Controller"/>
        <context:include-filter type="annotation" expression="org.springframework.web.bind.annotation.ControllerAdvice"/>
    </context:component-scan>




    <!--静态页面,如html,css,js,images可以访问-->
    <mvc:default-servlet-handler />
    <!--注解驱动,以使得访问路径与方法的匹配可以通过注解配置-->
    <mvc:annotation-driven>
        <mvc:message-converters >
            <!-- 配置Fastjson支持 -->
            <bean class="org.springframework.http.converter.StringHttpMessageConverter">
                <property name="supportedMediaTypes">
                    <list><value>text/html;charset=UTF-8</value></list>
                </property>
            </bean>
        </mvc:message-converters>
    </mvc:annotation-driven>


    <!--配置json返回处理-->
    <bean id="jsonView" class="org.springframework.web.servlet.view.json.MappingJackson2JsonView"></bean>
    <!--配置视图解析器:如何把contorller方法返回值解析为实际的物理视图-->
    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <property name="prefix" value="/WEB-INF/views/"></property>
        <property name="suffix" value=".jsp"></property>
    </bean>

    <!--自定义拦截器实现权限控制-->
    <!--<mvc:interceptors>
        <mvc:interceptor>
            <mvc:mapping path="/home"/>
            <bean class="xyz.nongfah.admin.SecurityInterceptor"/>
        </mvc:interceptor>
        <mvc:interceptor>
            <mvc:mapping path="/home/**"/>
            <bean class="xyz.nongfah.admin.SecurityInterceptor"/>
        </mvc:interceptor>
        <mvc:interceptor>
            <mvc:mapping path="/rank"/>
            <bean class="xyz.nongfah.admin.SecurityInterceptor"/>
        </mvc:interceptor>
        <mvc:interceptor>
            <mvc:mapping path="/admin"/>
            <bean class="xyz.nongfah.admin.SecurityInterceptor"/>
        </mvc:interceptor>
        <mvc:interceptor>
            <mvc:mapping path="/index"/>
            <bean class="xyz.nongfah.admin.SecurityInterceptor"/>
        </mvc:interceptor>
    </mvc:interceptors>-->
</beans>
webapp/WEB-INF 下的web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xmlns="http://java.sun.com/xml/ns/javaee"
         xmlns:web="http://java.sun.com/xml/ns/javaee"
         xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
         version="2.5">


  <!--配置启动springIOC容器-->
  <context-param>
    <param-name>contextConfigLocation</param-name>
    <param-value>
      classpath:ContextApplication.xml
      <!-- 定时任务
                  classpath:Spring-Task.xml
      -->
    </param-value>
  </context-param>


  <listener>
    <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
  </listener>
  <!--防止spring内存溢出监听器-->
  <listener>
    <listener-class>org.springframework.web.util.IntrospectorCleanupListener</listener-class>
  </listener>

  <!-- 日志记录 -->
  <context-param>
    <!-- 日志配置文件路径 -->
    <param-name>log4jConfigLocation</param-name>
    <param-value>classpath:log4j.properties</param-value>
  </context-param>
  <context-param>
    <param-name>log4jRefreshInterval</param-name>
    <param-value>60000</param-value>
  </context-param>
  <listener>
    <listener-class>org.springframework.web.util.Log4jConfigListener</listener-class>
  </listener>


  <servlet-mapping>
    <servlet-name>default</servlet-name>
    <url-pattern>*.html</url-pattern>
    <!-- <url-pattern>*.jsp</url-pattern>-->
    <url-pattern>*.js</url-pattern>
    <url-pattern>*.jpg</url-pattern>
    <url-pattern>*.css</url-pattern>
    <url-pattern>*.jpg</url-pattern>
    <url-pattern>*.jpeg</url-pattern>
    <url-pattern>*.txt</url-pattern>
  </servlet-mapping>

  <!--配置spring mvc    DispatcherServlet-->
  <servlet>
    <servlet-name>dispatcherServlet</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <!--配置DispatcherServlet初始化参数::配置springmvc的配置文件名称和位置-->
    <init-param>
      <param-name>contextConfigLocation</param-name>
      <param-value>classpath:spring-mvc.xml</param-value>
    </init-param>
    <load-on-startup>1</load-on-startup>
  </servlet>
  <servlet-mapping>
    <servlet-name>dispatcherServlet</servlet-name>
    <url-pattern>/</url-pattern>
  </servlet-mapping>

  <!-- Spring字符集过滤器 -->
  <filter>
    <filter-name>characterEncoding</filter-name>
    <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
    <init-param>
      <param-name>encoding</param-name>
      <param-value>UTF-8</param-value>
    </init-param>
    <init-param>
      <param-name>forceEncoding</param-name>
      <param-value>true</param-value>
    </init-param>
  </filter>
  <filter-mapping>
    <filter-name>characterEncoding</filter-name>
    <url-pattern>/*</url-pattern>
  </filter-mapping>

  <!-- 2.替换404页面 start -->
  <!--    <error-page>
          <error-code>404</error-code>
          <location>/WEB-INF/views/error/404.jsp</location>
      </error-page>
      &lt;!&ndash; end &ndash;&gt;
      <error-page>
          <error-code>500</error-code>
          <location>/WEB-INF/views/error/500.jsp</location>
      </error-page>-->

</web-app>
总结配置文件

通过以上这些配置文件,一个SSM的骨架就搭建好了,但是作为一个项目,它必须有自己的业务代码才能运行起来。在接下来,我会把之前的一部分代码贴出来供你参考。

在骨架中填充业务代码

写到这里,我回顾了一下整个搭建的过程,在我写这篇文章之前,我仍然觉得SSM是极其简单的。但现在,我改变了主意。整个框架的搭建过程及其繁琐,对于一个初学者来说,很难真正明白究竟在做什么东西。 我建议你如果没有任何基础,一定要回头去补补Spring、SpringMVC、Mybatis的基础知识。很多东西需要系统的学习,不单单是靠一篇教程就能解决的。 现在,这里。我把我目前所做的所有代码放在这里,你可以把它下载下来,然后导入你的IDEA,去参考,去查资料,去学习。

关于代码的运行,在这个页面填入以下代码
Image Image

Name: [MAVEN-tomcat]
Command Line: tomcat7:run

项目下载地址