美文网首页JavaWeb
SSM框架整合笔记(一)详细注释

SSM框架整合笔记(一)详细注释

作者: 不知名码农 | 来源:发表于2019-02-26 22:01 被阅读22次

    详细注释的SSM框架整合笔记(一)

    前言

      接触SSM框架到现在也有很长时间了,之前也搭建过几个简单的项目,但是没有进行过记录学习和搭建的过程。网上关于ssm框架整合的资料也不少,不过说句实话,单看某一篇文章能够不踩坑的配置并跑起来的也不太多,在学习过程中筛选甄别这些就浪费了相当一部分时间。

    本文内容

      本文理论+实践的方式,分享ssm的相关概念以及采用实践操作的方式搭建整套系统。把搭建过程中踩过的坑、笔记记录整理一下,用以和感兴趣的朋友分享下。

    demo下载地址

    该项目持续更新中,会在代码以及该文档里面详细注释和介绍。
    项目托管在<code>码云</code>开源平台上,链接:

    https://gitee.com/nelucifer/ssm-note,点击<code>克隆/下载</code>获取该项目。

    前置技能

    • Maven
    • IDEA
    • Tomcat

    环境

    • Spring:4.2.5.RELEASE
    • Spring MVC
    • Mybatis:3.3.1
    • MySQL:5.6
    • IntelliJ IDEA: 2018.2.3
    • cxf webservice: webservice接口
    • pagehelper: 分页
    • Interceptor:拦截器配置
    • 数据结构:powerdesigner16.5

    实践步骤

    一、创建项目

    1. 打开IDEA,选择New->Projects,按照下面的步骤选择:
      选择Maven,然后勾选Create from archetype,选择webapp这一个
    1. 完成之后填入相应的maven项目组信息,GroupId是项目组织的标识符,对应java的包结构;ArtifactId是项目的标识符,对应项目的名称,即项目根目录的名称。groupId和artifactId统称为“坐标”。
    1. 填写完成之后点击Next,选择setting.xml和repository路径,如下图:
    1. 点击Finish后,maven会根据原型自动创建需要的一些配置信息以及目录结构,等待配置完成,初始项目结构如下:
    1. 在main文件夹下创建文件夹java、resources,src文件夹下创建test,test文件夹下创建java文件夹;
      在java文件夹上右键 -> <code>Mark Directory as</code>,java文件夹选择<code>Sources Root</code>,resources文件夹上选择<code>Resources Root</code>,test文件夹下的java文件夹上选择<code>Test Resources Root</code>,
      操作如下:

    完成后的项目结构如下:

    二、配置pom.xml和spring

    详细的解释直接在代码里面注释了。开始贴代码:

    1. <code>pom.xml</code>

    <?xml version="1.0" encoding="UTF-8"?>
    
    <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">
      <!--maven模块版本:声明项目描述符遵循哪一个POM模型版本,默认是4.0.0-->
      <modelVersion>4.0.0</modelVersion>
      <!--项目组织的唯一标识符-->
      <groupId>com.weyoung</groupId>
      <!--项目的唯一标识符,和groupId共同唯一标识该项目或组件-->
      <artifactId>ssm-note</artifactId>
      <version>1.0-SNAPSHOT</version>
      <!--打包方式,可以选择war和jar-->
      <packaging>war</packaging>
      <!--项目的名称,Maven产生的文档用-->
      <name>ssm-note Maven Webapp</name>
      <!--项目主页的URL,Maven产生的文档用-->
      <url>http://www.example.com</url>
      <!--项目的详细描述,Maven产生的文档用-->
      <description>maven+ssm项目整合笔记</description>
    
      <!--项目的问题管理系统-->
      <issueManagement>
        <system>jira</system>
        <!--该项目使用的问题管理系统的URL-->
        <url></url>
      </issueManagement>
    
      <!--项目开发者列表-->
      <developers>
        <!--某个项目开发者的信息-->
        <developer>
          <!--项目开发者id-->
          <id>coder_lixia</id>
          <!--项目开发者的全名-->
          <name>lixia</name>
          <email>ne_lucifer@163.com</email>
          <!--项目开发者主页URL-->
          <url>http://www.wanglixia.top/</url>
          <!--项目开发者项目中的角色-->
          <roles>
            <role>Project Manager</role>
          </roles>
          <!--项目开发者所属组织-->
          <organization></organization>
          <!--项目开发者所属组织的URL-->
          <organizationUrl></organizationUrl>
        </developer>
      </developers>
    
      <!-- 以值替代名称,Properties可以在整个POM中使用,也可以作为触发条件(见settings.xml配置文件里
               activation元素的说明)。格式是<name>value</name>。 -->
      <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <maven.compiler.source>1.7</maven.compiler.source>
        <maven.compiler.target>1.7</maven.compiler.target>
    
        <plugin.maven-compiler>3.1</plugin.maven-compiler>
        <javac.target.version>1.8</javac.target.version>
        <!-- 此处spring.version即为下面${spring.version的值} -->
        <spring.version>4.2.5.RELEASE</spring.version>
        <jstl.version>1.2</jstl.version>
        <commons-logging.version>1.1.1</commons-logging.version>
        <mybatis.version>3.3.1</mybatis.version>
        <mybatis-spring.version>1.2.4</mybatis-spring.version>
        <mysql-connector-java.version>5.1.26</mysql-connector-java.version>
        <log4j.version>1.2.14</log4j.version>
        <slf4j.log4j12.version>1.7.12</slf4j.log4j12.version>
        <servlet-api.version>2.5</servlet-api.version>
        <commons-io.version>2.4</commons-io.version>
        <commons-fileupload.version>1.3</commons-fileupload.version>
        <gson.version>2.2.2</gson.version>
        <druid.version>1.0.25</druid.version>
        <cxf.version>3.1.6</cxf.version>
        <fastjson.version>1.2.32</fastjson.version>
        <pagehelper.version>5.1.2</pagehelper.version>
        <jackson.version>2.7.4</jackson.version>
      </properties>
    
    
      <!-- 发现依赖和扩展的远程仓库列表 -->
      <repositories>
        <!-- 包含需要连接到远程仓库的信息 -->
        <repository>
          <!-- 远程仓库id,可以用来匹配在settings.xml文件里配置的远程仓库 -->
          <id>public</id>
          <!-- 远程仓库名称 -->
          <name>aliyun nexus</name>
          <!-- 远程仓库URL -->
          <url>http://maven.aliyun.com/nexus/content/groups/public/</url>
          <!-- 处理远程仓库里发布版本的下载 -->
          <releases>
            <!-- true或false表示该仓库是否为下载某种类型构件(发布版,快照版)开启。 -->
            <enabled>true</enabled>
            <!-- 更新构件的频率。Maven会比较本地POM和远程POM的时间戳。选项:always(一直),daily(默认每日),inteval:X(X是以分钟为单位),never(从不)-->
            <updatePolicy>never</updatePolicy>
            <!-- 当Maven验证构件校验文件失败时怎么做:ignore(忽略),fail(失败),warn(警告) -->
            <checksumPolicy>ignore</checksumPolicy>
          </releases>
          <snapshots>
            <enabled>false</enabled>
            <updatePolicy>never</updatePolicy>
            <checksumPolicy>ignore</checksumPolicy>
          </snapshots>
          <!-- 用于定位和排序构件的仓库布局类型-可以使default(默认)或者legacy(遗留) -->
          <layout>default</layout>
        </repository>
      </repositories>
    
      <!-- 发现插件的远程仓库列表,这些插件用于构建和报表 -->
      <pluginRepositories>
        <!-- 包含需要连接到远程插件仓库的信息.参见repositories/repository元素 -->
        <pluginRepository>
          <id>public</id>
          <name>aliyun nexus</name>
          <url>http://maven.aliyun.com/nexus/content/groups/public/</url>
          <releases>
            <enabled>true</enabled>
          </releases>
          <snapshots>
            <enabled>false</enabled>
          </snapshots>
        </pluginRepository>
      </pluginRepositories>
    
      <!--项目相关的所有依赖-->
      <dependencies>
        <dependency>
          <!-- 依赖的groupID -->
          <groupId>junit</groupId>
          <!-- 依赖的artifactID-->
          <artifactId>junit</artifactId>
          <!-- 依赖的版本号 -->
          <version>4.12</version>
          <!-- 依赖类型,默认类型是jar,类型一般和使用的打包方式对应,如jar,war等,也有例外,如test-jar等 -->
          <type>jar</type>
          <!-- 依赖范围。
               - compile:默认范围,用于编译
               - provided:类似于编译
               - runtime:在运行时使用
               - test:用于test时使用
               - system: 需要外在提供相应的元素。通过systemPath来取得 -->
          <scope>test</scope>
          <!-- systemPath:仅用于范围为system。提供相应的路径,不鼓励使用该元素 -->
          <!--<systemPath></systemPath>-->
          <!-- 可选依赖,当项目自身被依赖时,标注依赖是否传递。用于连续依赖时使用 -->
          <optional>true</optional>
    
          <!-- 当计算传递依赖时,从依赖构件列表里,列出被排除的依赖构件集。即告诉maven你只依赖指定的项目,不依赖项目的
            依赖。此元素主要用于解决版本冲突问题 -->
          <!--<exclusions>
            <exclusion>
              <groupId>org.springframework</groupId>
              <artifactId>spring-core</artifactId>
            </exclusion>
          </exclusions>-->
        </dependency>
        <!-- spring配置-->
        <dependency>
          <groupId>org.springframework</groupId>
          <artifactId>spring-aop</artifactId>
          <version>${spring.version}</version>
          <type>jar</type>
          <scope>compile</scope>
        </dependency>
        <dependency>
          <groupId>org.springframework</groupId>
          <artifactId>spring-aspects</artifactId>
          <version>${spring.version}</version>
          <type>jar</type>
          <scope>compile</scope>
        </dependency>
        <!-- 1)Spring核心 -->
        <dependency>
          <groupId>org.springframework</groupId>
          <artifactId>spring-beans</artifactId>
          <version>${spring.version}</version>
          <type>jar</type>
          <scope>compile</scope>
        </dependency>
        <dependency>
          <groupId>org.springframework</groupId>
          <artifactId>spring-context</artifactId>
          <version>${spring.version}</version>
          <type>jar</type>
          <scope>compile</scope>
        </dependency>
        <dependency>
          <groupId>org.springframework</groupId>
          <artifactId>spring-context-support</artifactId>
          <version>${spring.version}</version>
          <type>jar</type>
          <scope>compile</scope>
        </dependency>
        <dependency>
          <groupId>org.springframework</groupId>
          <artifactId>spring-core</artifactId>
          <version>${spring.version}</version>
          <exclusions>
            <exclusion>
              <groupId>commons-logging</groupId>
              <artifactId>commons-logging</artifactId>
            </exclusion>
          </exclusions>
          <type>jar</type>
          <scope>compile</scope>
        </dependency>
        <dependency>
          <groupId>org.springframework</groupId>
          <artifactId>spring-expression</artifactId>
          <version>${spring.version}</version>
          <type>jar</type>
          <scope>compile</scope>
        </dependency>
        <!-- 2)Spring DAO层 -->
        <dependency>
          <groupId>org.springframework</groupId>
          <artifactId>spring-jdbc</artifactId>
          <version>${spring.version}</version>
          <type>jar</type>
          <scope>compile</scope>
        </dependency>
        <dependency>
          <groupId>org.springframework</groupId>
          <artifactId>spring-tx</artifactId>
          <version>${spring.version}</version>
          <type>jar</type>
          <scope>compile</scope>
        </dependency>
        <dependency>
          <groupId>org.springframework</groupId>
          <artifactId>spring-jms</artifactId>
          <version>${spring.version}</version>
          <type>jar</type>
          <scope>compile</scope>
        </dependency>
        <dependency>
          <groupId>org.springframework</groupId>
          <artifactId>spring-orm</artifactId>
          <version>${spring.version}</version>
          <type>jar</type>
          <scope>compile</scope>
        </dependency>
        <dependency>
          <groupId>org.springframework</groupId>
          <artifactId>spring-oxm</artifactId>
          <version>${spring.version}</version>
          <type>jar</type>
          <scope>compile</scope>
        </dependency>
        <!-- 3)Spring web -->
        <dependency>
          <groupId>org.springframework</groupId>
          <artifactId>spring-web</artifactId>
          <version>${spring.version}</version>
          <type>jar</type>
          <scope>compile</scope>
        </dependency>
        <dependency>
          <groupId>org.springframework</groupId>
          <artifactId>spring-webmvc</artifactId>
          <version>${spring.version}</version>
          <type>jar</type>
          <scope>compile</scope>
        </dependency>
        <!-- 4)Spring test -->
        <dependency>
          <groupId>org.springframework</groupId>
          <artifactId>spring-test</artifactId>
          <version>${spring.version}</version>
          <type>jar</type>
          <scope>compile</scope>
        </dependency>
    
        <dependency>
          <groupId>commons-logging</groupId>
          <artifactId>commons-logging</artifactId>
          <version>${commons-logging.version}</version>
        </dependency>
    
        <!-- mybatis包-->
        <dependency>
          <groupId>org.mybatis</groupId>
          <artifactId>mybatis</artifactId>
          <version>${mybatis.version}</version>
        </dependency>
        <!--mybatis spring插件-->
        <dependency>
          <groupId>org.mybatis</groupId>
          <artifactId>mybatis-spring</artifactId>
          <version>${mybatis-spring.version}</version>
        </dependency>
        <!-- mysql连接驱动包-->
        <dependency>
          <groupId>mysql</groupId>
          <artifactId>mysql-connector-java</artifactId>
          <version>${mysql-connector-java.version}</version>
        </dependency>
        <!--druid==>阿里巴巴数据库连接池-->
        <dependency>
          <groupId>com.alibaba</groupId>
          <artifactId>druid</artifactId>
          <version>${druid.version}</version>
        </dependency>
        <!-- log4j-->
        <dependency>
          <groupId>log4j</groupId>
          <artifactId>log4j</artifactId>
          <version>${log4j.version}</version>
        </dependency>
        <dependency>
          <groupId>org.slf4j</groupId>
          <artifactId>slf4j-log4j12</artifactId>
          <version>${slf4j.log4j12.version}</version>
        </dependency>
        <!-- servlet-->
        <dependency>
          <groupId>javax.servlet</groupId>
          <artifactId>servlet-api</artifactId>
          <version>${servlet-api.version}</version>
        </dependency>
        <dependency>
          <groupId>javax.servlet</groupId>
          <artifactId>jstl</artifactId>
          <version>${jstl.version}</version>
        </dependency>
        <!-- 文件上传 -->
        <dependency>
          <groupId>commons-io</groupId>
          <artifactId>commons-io</artifactId>
          <version>${commons-io.version}</version>
        </dependency>
        <dependency>
          <groupId>commons-fileupload</groupId>
          <artifactId>commons-fileupload</artifactId>
          <version>${commons-fileupload.version}</version>
        </dependency>
        <!-- 解析json-->
        <dependency>
          <groupId>com.google.code.gson</groupId>
          <artifactId>gson</artifactId>
          <version>${gson.version}</version>
        </dependency>
    
        <dependency>
          <groupId>com.fasterxml.jackson.core</groupId>
          <artifactId>jackson-core</artifactId>
          <version>${jackson.version}</version>
        </dependency>
        <dependency>
          <groupId>com.fasterxml.jackson.core</groupId>
          <artifactId>jackson-databind</artifactId>
          <version>${jackson.version}</version>
        </dependency>
    
        <dependency>
          <groupId>com.fasterxml.jackson.core</groupId>
          <artifactId>jackson-annotations</artifactId>
          <version>${jackson.version}</version>
        </dependency>
    
        <dependency>
          <groupId>com.alibaba</groupId>
          <artifactId>fastjson</artifactId>
          <version>${fastjson.version}</version>
        </dependency>
    
        <!--  分页助手 -->
        <dependency>
          <groupId>com.github.pagehelper</groupId>
          <artifactId>pagehelper</artifactId>
          <version>${pagehelper.version}</version>
        </dependency>
    
        <!-- cxf webservice -->
        <dependency>
          <groupId>org.apache.cxf</groupId>
          <artifactId>cxf-rt-frontend-jaxws</artifactId>
          <version>${cxf.version}</version>
        </dependency>
        <dependency>
          <groupId>org.apache.cxf</groupId>
          <artifactId>cxf-core</artifactId>
          <version>${cxf.version}</version>
        </dependency>
        <dependency>
          <groupId>org.apache.cxf</groupId>
          <artifactId>cxf-rt-transports-http</artifactId>
          <version>${cxf.version}</version>
        </dependency>
      </dependencies>
    
      <!-- 构建项目需要的信息 -->
      <build>
        <!-- 产生的构件的文件名,默认值是${artifactId}-${version} -->
        <finalName>ssm-note</finalName>
        <!-- 子项目可以引用的默认插件信息。 -->
        <pluginManagement><!-- lock down plugins versions to avoid using Maven defaults (may be moved to parent pom) -->
          <!-- 插件列表 -->
          <plugins>
            <plugin>
              <artifactId>maven-clean-plugin</artifactId>
              <version>3.1.0</version>
            </plugin>
            <!-- see http://maven.apache.org/ref/current/maven-core/default-bindings.html#Plugin_bindings_for_war_packaging -->
            <plugin>
              <artifactId>maven-resources-plugin</artifactId>
              <version>3.0.2</version>
            </plugin>
            <plugin>
              <artifactId>maven-compiler-plugin</artifactId>
              <version>3.8.0</version>
            </plugin>
            <plugin>
              <artifactId>maven-surefire-plugin</artifactId>
              <version>2.22.1</version>
            </plugin>
            <plugin>
              <artifactId>maven-war-plugin</artifactId>
              <version>3.2.2</version>
            </plugin>
            <plugin>
              <artifactId>maven-install-plugin</artifactId>
              <version>2.5.2</version>
            </plugin>
            <plugin>
              <artifactId>maven-deploy-plugin</artifactId>
              <version>2.8.2</version>
            </plugin>
          </plugins>
        </pluginManagement>
      </build>
    </project>
    

    2. <code>spring-config.xml</code>

    <?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:tx="http://www.springframework.org/schema/tx"
           xmlns:aop="http://www.springframework.org/schema/aop"
           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 http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd">
    
        <!-- base-package属性指定了需要扫描的类包,类包及其递归子包中所有的类都会被处理
             如果某个类的头上带有特定的注解【@Component/@Repository/@Service/@Controller】,
             就会将这个对象作为Bean注册进Spring容器 -->
        <context:component-scan base-package="com.weyoung.service"/>
        <context:component-scan base-package="com.weyoung.dao"/>
    
        <!-- 配置mybatis的sqlSessionFactory -->
        <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
            <property name="dataSource" ref="MySQLDataSource"/>
            <!-- 自动扫描的mybatis mapper.xml文件路径 -->
            <property name="mapperLocations" value="classpath:/mappers/*.xml"/>
            <!-- Mybatis配置文件 -->
            <property name="configLocation" value="classpath:config/mybatis-config.xml"/>
        </bean>
    
        <!-- 事务管理 -->
        <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
            <property name="dataSource" ref="MySQLDataSource"/>
        </bean>
    
        <!-- 自动扫描的dao接口所在的包名 -->
        <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
            <property name="basePackage" value="com.weyoung.dao"/>
            <property name="sqlSessionFactoryBeanName" value="sqlSessionFactory"/>
        </bean>
    
        <!-- 引入数据库配置文件 -->
        <bean id="dataSourceConfig" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
            <property name="location" value="classpath:config/jdbc.properties"/>
        </bean>
    
        <bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping"/>
        <!-- 启动SpringMVC的注解功能,完成请求和注解POJO的映射 -->
        <bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter">
            <property name="messageConverters">
                <list>
                    <bean class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter"/>
                </list>
            </property>
        </bean>
    
        <!-- 配置事务通知属性 -->
        <tx:advice id="txAdvice" transaction-manager="transactionManager">
            <!-- 定义事务传播属性 -->
            <tx:attributes>
                <tx:method name="insert*" propagation="REQUIRED"/>
                <tx:method name="update*" propagation="REQUIRED"/>
                <tx:method name="edit*" propagation="REQUIRED"/>
                <tx:method name="save*" propagation="REQUIRED"/>
                <tx:method name="add*" propagation="REQUIRED"/>
                <tx:method name="new*" propagation="REQUIRED"/>
                <tx:method name="set*" propagation="REQUIRED"/>
                <tx:method name="remove*" propagation="REQUIRED"/>
                <tx:method name="delete*" propagation="REQUIRED"/>
                <tx:method name="change*" propagation="REQUIRED"/>
                <tx:method name="get*" propagation="REQUIRED" read-only="true"/>
                <tx:method name="find*" propagation="REQUIRED" read-only="true"/>
                <tx:method name="load*" propagation="REQUIRED" read-only="true"/>
                <tx:method name="*" propagation="REQUIRED" read-only="true"/>
            </tx:attributes>
        </tx:advice>
    
        <!-- 配置事务切面 -->
        <aop:config>
            <aop:pointcut id="serviceOperation" expression="execution(* com.weyoung.service.*.*Impl.*(..))"/>
            <aop:advisor advice-ref="txAdvice" pointcut-ref="serviceOperation"/>
        </aop:config>
    
        <!-- MySQL数据源配置-->
        <bean id="MySQLDataSource" class="com.alibaba.druid.pool.DruidDataSource" init-method="init" destroy-method="close">
            <property name="driverClassName" value="${jdbc.mysql.driver}"/>
            <property name="url" value="${jdbc.mysql.url}"/>
            <property name="username" value="${jdbc.mysql.username}"/>
            <property name="password" value="${jdbc.mysql.password}"/>
            <!-- 配置初始化大小、最小、最大 -->
            <property name="initialSize" value="${jdbc.initialSize}"/>
            <property name="minIdle" value="${jdbc.minIdle}"/>
            <property name="maxActive" value="${jdbc.maxActive}"/>
    
            <!-- 配置获取连接等待超时的时间 -->
            <property name="maxWait" value="${jdbc.maxWait}"/>
    
            <!-- 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒 -->
            <property name="timeBetweenEvictionRunsMillis" value="${jdbc.timeBetweenEvictionRunsMillis}"/>
    
            <property name="testWhileIdle" value="${jdbc.testWhileIdle}"/>
    
            <!-- 这里建议配置为TRUE,防止取到的连接不可用 -->
            <property name="testOnBorrow" value="true" />
            <property name="testOnReturn" value="false" />
    
            <!-- 打开PSCache,并且指定每个连接上PSCache的大小 -->
            <property name="poolPreparedStatements" value="true" />
            <property name="maxPoolPreparedStatementPerConnectionSize" value="20" />
    
            <!-- 配置提交方式,默认就是true,可以不用配置 -->
            <property name="defaultAutoCommit" value="${jdbc.defaultAutoCommit}"/>
    
            <!-- 验证连接有效与否的SQL,不同的数据配置不同 -->
            <!--<property name="validationQuery" value="select 1 " />-->
            <property name="filters" value="stat" />
            <property name="proxyFilters">
                <list>
                    <ref bean="logFilter" />
                </list>
            </property>
        </bean>
    
        <bean id="logFilter" class="com.alibaba.druid.filter.logging.Slf4jLogFilter">
            <property name="statementExecutableSqlLogEnable" value="false" />
        </bean>
    
    </beans>
    

    3. <code>spring-mvc.xml</code>

    <?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:mvc="http://www.springframework.org/schema/mvc"
           xmlns:context="http://www.springframework.org/schema/context"
           xsi:schemaLocation="
           http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.0.xsd
           http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-4.0.xsd
           http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.0.xsd">
    
        <!-- 自动扫描该包,使SpringMVC认为包下(包括子集)用了@controller注解的类是控制器 -->
        <context:component-scan base-package="com.weyoung.controller"/>
        <context:annotation-config/>
    
        <!-- 启动Spring MVC的注解功能,完成请求和注解POJO的映射 -->
        <!-- 默认的注解映射的支持 -->
        <mvc:annotation-driven>
            <mvc:message-converters>
                <ref bean="stringHttpMessageConverter"/>
            </mvc:message-converters>
        </mvc:annotation-driven>
    
        <!-- 解决js,main.webapp.layouts.css,images访问不到的问题-->
        <mvc:resources mapping="/plugins/**" location="/plugins/"/>
        <mvc:resources mapping="/layouts/**" location="/layouts/"/>
        <mvc:resources mapping="/statics/**" location="/statics/"/>
    
        <!--拦截器-->
        <mvc:interceptors>
            <mvc:interceptor>
                <mvc:mapping path="/**"/>
                <bean class="com.weyoung.system.LoginInterceptor"></bean>
            </mvc:interceptor>
        </mvc:interceptors>
    
        <!-- 文件上传配置注意:这里申明的id必须为multipartResolver -->
        <bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
            <!--文件编码-->
            <property name="defaultEncoding" value="UTF-8"/>
            <!--文件大小最大值-->
            <property name="maxUploadSize" value="10485760000"/>
            <!--内存中的最大值-->
            <property name="maxInMemorySize" value="40960"/>
        </bean>
    
        <!--简单的上传异常处理-->
        <bean id="exceptionResolver" class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver">
            <property name="exceptionMappings">
                <props>
                    <prop key="org.springframework.web.multipart.MaxUploadSizeExceededException">/error/upload_error.jsp
                    </prop>
                </props>
            </property>
        </bean>
    
        <!--根据 controller 返回的字符串 找到viewResolver -->
        <bean id="beanNameViewResolver" class="org.springframework.web.servlet.view.BeanNameViewResolver">
            <property name="order" value="1"></property>
        </bean>
        <!-- HandlerMapping -->
        <bean class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping"/>
        <!-- HandlerAdapter -->
        <bean class="org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter"/>
    
        <bean id="contentNegotiationManager"
              class="org.springframework.web.accept.ContentNegotiationManagerFactoryBean">
            <property name="favorParameter" value="false"/>
            <property name="parameterName" value="format"/>
            <property name="ignoreAcceptHeader" value="true"/>
            <property name="mediaTypes">
                <value>
                    json=application/json
                    xml=application/xml
                </value>
            </property>
            <property name="defaultContentType" value="text/html"/>
        </bean>
    
        <!-- SpringMVC消息处理——消息转换器 -->
        <bean id="stringHttpMessageConverter" class="org.springframework.http.converter.StringHttpMessageConverter">
            <constructor-arg value="UTF-8" index="0"/>
            <property name="supportedMediaTypes">
                <list>
                    <value>text/plain;charset=UTF-8</value>
                </list>
            </property>
        </bean>
    
        <!--spring-mvc 视图解析器-->
        <bean id="viewResolver"
              class="org.springframework.web.servlet.view.InternalResourceViewResolver">
            <property name="viewClass" value="org.springframework.web.servlet.view.JstlView"/>
            <property name="prefix" value="/front-end/"/>
            <property name="suffix" value=".jsp"/>
            <property name="order" value="1"/>
        </bean>
    
        <bean class="org.springframework.web.servlet.view.ContentNegotiatingViewResolver">
            <property name="contentNegotiationManager" ref="contentNegotiationManager"/>
            <property name="defaultViews">
                <bean class="org.springframework.web.servlet.view.json.MappingJackson2JsonView"/>
            </property>
        </bean>
    </beans>
    

    4. <code>jdbc.properties</code>

    #============================================================================
    # MySQL
    #============================================================================
    jdbc.mysql.driver=com.mysql.jdbc.Driver
    jdbc.mysql.url=jdbc:mysql://localhost:3306/SSM_NOTE?useUnicode=true&characterEncoding=utf8
    jdbc.mysql.username=root
    jdbc.mysql.password=lucifer
    
    #============================================================================
    # common settings
    #============================================================================
    jdbc.initialSize=5
    jdbc.minIdle=5
    jdbc.maxActive=100
    jdbc.maxWait=100000
    jdbc.defaultAutoCommit=false
    jdbc.removeAbandoned=true
    jdbc.removeAbandonedTimeout=600
    jdbc.testWhileIdle=true
    jdbc.timeBetweenEvictionRunsMillis=60000
    jdbc.minEvictableIdleTimeMillis=300000
    

    5. <code>log4j.properties</code>

    # 定义输出风格
    ConversionPattern=%d %-5p [%t] %c - %m%n
    
    # 配置根Logger
    ## 日志输出级别
    log4j.rootLogger=debug,Console,D
    log4j.logger.com.cnblogs.lzrabbit=DEBUG
    log4j.logger.org.springframework=ERROR
    log4j.logger.org.mybatis=DEBUG
    log4j.logger.org.apache.ibatis=DEBUG
    log4j.logger.org.quartz=ERROR
    log4j.logger.org.apache.axis2=ERROR
    log4j.logger.org.apache.axiom=ERROR
    log4j.logger.org.apache=ERROR
    log4j.logger.httpclient=ERROR
    #log4j.additivity.org.springframework=false
    
    # ==========输出到控制台==========
    log4j.appender.Console=org.apache.log4j.ConsoleAppender
    log4j.appender.Console.Target=System.out
    # Layout:日志输出格式
    # org.apache.log4j.PatternLayout:可以灵活地指定布局模式
    # org.apache.log4j.HTMLLayout:以HTML表格形式布局
    # org.apache.log4j.SimpleLayout:包含日志信息的级别和信息字符串
    # org.apache.log4j.TTCCLayout:包含日志产生的时间、线程、类别等等信息
    log4j.appender.Console.layout=org.apache.log4j.PatternLayout
    log4j.appender.Console.layout.ConversionPattern=${ConversionPattern}
    #log4j.appender.Console.encoding=UTF-8
    
    # ==========输出到日志文件==========
    # Appender为日志输出目的地,Log4j提供的appender有以下几种:
    # org.apache.log4j.ConsoleAppender(控制台),
    # org.apache.log4j.FileAppender(文件),
    # org.apache.log4j.DailyRollingFileAppender(每天产生一个日志文件),
    # org.apache.log4j.RollingFileAppender(文件大小到达指定尺寸的时候产生一个新的文件),
    # org.apache.log4j.WriterAppender(将日志信息以流格式发送到任意指定的地方)
    log4j.appender.D=org.apache.log4j.DailyRollingFileAppender
    log4j.appender.D.DatePattern='.'yyyy-MM-dd'.log'
    log4j.appender.D.File=logs/ssm-note.log
    log4j.appender.D.Append=true
    ## 输出日志级别
    log4j.appender.D.Threshold=DEBUG
    log4j.appender.D.layout=org.apache.log4j.PatternLayout
    log4j.appender.D.encoding=UTF-8
    
    # ==========输出异常信息日志文件==========
    log4j.appender.E=org.apache.log4j.DailyRollingFileAppender
    log4j.appender.E.DatePattern='.'yyyy-MM-dd'.log'
    log4j.appender.E.File=logs/daily.log
    log4j.appender.E.Append=true
    log4j.appender.E.Threshold=ERROR
    log4j.appender.E.layout=org.apache.log4j.PatternLayout
    log4j.appender.E.encoding=UTF-8
    log4j.appender.D.layout.ConversionPattern = %-d{yyyy-MM-dd HH:mm:ss}  [%t:%r]-[%p]  %m%n
    
    # 打印参数
    #    %c 输出日志信息所属的类的全名
    #    %d 输出日志时间点的日期或时间,默认格式为ISO8601,也可以在其后指定格式,比如:%d{yyy-MM-dd HH:mm:ss},
    #      输出类似:2019-2-21 01:38:37
    #    %f 输出日志信息所属的类的类名
    #    %l 输出日志事件的发生位置,即输出日志信息的的语句处于它所在的类的第几行
    #    %m 输出代码中指定的信息,如log(message)中的message
    #    %n 输出一个回车换行符,Windows平台为"rn",Unix平台为"n"
    #    %p 输出优先级,即DEBUG.INFO,WARN,ERROR,FATAL.如果是调用debug()输出的,则为DEBUG,以此类推
    #    %r 输出自应用启动到输出该日志信息所耗费的毫秒数
    #    %t 输出产生该日志的线程名
    

    6. 其他

    登录业务实现代码:<code>LoginController.java</code>,<code>LoginDao.java</code>,<code>User.java</code>,<code>LoginService.java</code>,<code>LoginServiceImpl.java</code>,<code>LoginMapper.xml.xml</code>的具体实现请下载源码。

    三、数据结构

    1. 登录表结构

    2. 登录表语句

    drop database if exists ssm_note;
    create database ssm_note;
    use ssm_note;
    
    /*==============================================================*/
    /* DBMS name:      MySQL 5.0                                    */
    /* Created on:     2019/2/22 1:09:58                            */
    /*==============================================================*/
    
    
    drop table if exists USER_LOGIN;
    
    /*==============================================================*/
    /* Table: USER_LOGIN                                            */
    /*==============================================================*/
    create table USER_LOGIN
    (
       id                   int not null,
       USER_NAME            varchar(30) not null,
       PASSWORD             varchar(20) not null,
       REG_TIME             datetime not null default CURRENT_TIMESTAMP,
       primary key (id)
    );
    

    项目预览

    一、<code>登录页:</code>

    二、<code>欢迎页:</code>

    资料推荐

    概念整理

    1. Spring

      创建Spring的主要目的是用来替代更加重量级的企业级Java技术,尤其是EJB。Spring提供了更加轻量级和简单的编程模型。增强了简单老式Java对象(Plain Old Java Object,POJO)的功能。

    为了降低Java开发的复杂性,Spring采取了以下四种关键策略:

    • 基于POJO(Plain Old Java Object)的轻量级和最小侵入性编程;
    • 通过依赖注入和面向接口实现松耦合;
    • 基于切面和管理进行声明式编程;
    • 通过切面和模板减少样板式代码。

    2. Spring MVC

      <code>Spring MVC</code>基于模型-视图-控制器(Model-View-Controller,MVC)模式实现,能够构建像<code>Spring</code>框架那样灵活和松耦合的Web应用程序。<code>Spring MVC</code>是一个基于<code>mvc</code>的<code>web</code>框架。<code>Spring MVC</code>是<code>Spring</code>框架的一个模块,<code>Spring MVC</code>和<code>Spring</code>无需通过中间整合层进行整合。

    3. Mybatis

      Mybatis是一款优秀的持久层框架,支持定制化SQL、存储过程以及高级映射。可以使用简单的XML或注解来配置和映射原生信息,将接口和Java的Pojo映射成数据库中的记录。

    分享

    欢迎扫描下方二维码,关注weyoung公众号,一起交流学习~~


    image

    更多联系方式

    平台 链接
    预览项目: https://nelucifer.gitee.io/
    个人微信公众号: weyoung
    segmentfault: https://segmentfault.com/u/nelucifer
    CSDN: https://me.csdn.net/wlx001
    简书: https://www.jianshu.com/u/99211cc23788
    掘金: https://juejin.im/user/59b08c575188250f4850e80e

    相关文章

      网友评论

        本文标题:SSM框架整合笔记(一)详细注释

        本文链接:https://www.haomeiwen.com/subject/tmxtuqtx.html