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

3 篇文章 0 订阅
3 篇文章 0 订阅

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

前言

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

本文内容

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

相关文章

demo下载地址

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

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

前置技能

  • 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这一个
    在这里插入图片描述

  2. 完成之后填入相应的maven项目组信息,GroupId是项目组织的标识符,对应java的包结构;ArtifactId是项目的标识符,对应项目的名称,即项目根目录的名称。groupId和artifactId统称为“坐标”。
    在这里插入图片描述

  3. 填写完成之后点击Next,选择setting.xml和repository路径,如下图:
    在这里插入图片描述

  4. 点击Finish后,maven会根据原型自动创建需要的一些配置信息以及目录结构,等待配置完成,初始项目结构如下:
    在这里插入图片描述

  5. 在main文件夹下创建文件夹java、resources,src文件夹下创建test,test文件夹下创建java文件夹;
    在java文件夹上右键 -> Mark Directory as,java文件夹选择Sources Root,resources文件夹上选择Resources Root,test文件夹下的java文件夹上选择Test Resources Root
    操作如下:
    在这里插入图片描述
    完成后的项目结构如下:
    在这里插入图片描述

二、配置pom.xml和spring

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

1. pom.xml
<?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. spring-config.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: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. 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: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. jdbc.properties
#============================================================================
# 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. log4j.properties
# 定义输出风格
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. 其他

登录业务实现代码:LoginController.javaLoginDao.javaUser.javaLoginService.javaLoginServiceImpl.javaLoginMapper.xml.xml的具体实现请下载源码。

三、数据结构

1. 登录表结构

ssm数据结构

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)
);

项目预览

一、登录页:

ssm-note登录页

二、欢迎页:

ssm-note欢迎页-2019225235329

资料推荐

概念整理

1. Spring

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

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

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

2. Spring MVC

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

3. Mybatis

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

分享

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

在这里插入图片描述
更多联系方式

平台链接
预览项目: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
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值