详细注释的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
实践步骤
一、创建项目
-
打开IDEA,选择New->Projects,按照下面的步骤选择:
选择Maven,然后勾选Create from archetype,选择webapp这一个
-
完成之后填入相应的maven项目组信息,GroupId是项目组织的标识符,对应java的包结构;ArtifactId是项目的标识符,对应项目的名称,即项目根目录的名称。groupId和artifactId统称为“坐标”。
-
填写完成之后点击Next,选择setting.xml和repository路径,如下图:
-
点击Finish后,maven会根据原型自动创建需要的一些配置信息以及目录结构,等待配置完成,初始项目结构如下:
-
在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.java
,LoginDao.java
,User.java
,LoginService.java
,LoginServiceImpl.java
,LoginMapper.xml.xml
的具体实现请下载源码。
三、数据结构
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)
);
项目预览
一、登录页:
二、欢迎页:
资料推荐
-
Spring文档:https://spring.io/docs
-
史上最全的maven的pom.xml文件详解:https://www.cnblogs.com/hafiz/p/5360195.html
-
Spring 实战(第四版) [美]Craig Walls 著 张卫滨 译
-
Spring MVC 和 Spring 总结:https://www.cnblogs.com/doudouxiaoye/p/5693399.html
-
Mybatis 官方文档:http://www.mybatis.org/mybatis-3/zh/index.html
概念整理
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
是一个基于mvc
的web
框架。Spring MVC
是Spring
框架的一个模块,Spring MVC
和Spring
无需通过中间整合层进行整合。
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 |