SSM项目框架搭建
浅谈
本文大概花了我一周时间整理吧,大概涉及到了:基于Aspect的AOP日志切入、Lombok、log4j,Spring自动注入、基于JackSon的Json、ModelAndView、基于DateConverter的Date自动格式化处理、Junit…等等。
本文分两部分,第一部分仅仅包含项目搭建,第二部分包含简单的运行示例。
在Maven导入Maven依赖时,我不会扔一大堆给你让你直接拷贝过去,我会一个个介绍。虽然麻烦一点,但会有助于你理解jar包的结构,便于以后维护代码。
一、框架搭建
1.新建Maven项目
点击File->New->Project
在这里写上你的GroupId(把你的域名倒过来,比如说music.163.com,他的GroupId就是com.163.music,你也可以直接写com.demo)和ArtifactId(你项目的名称)
配置Maven的配置文件settings.xml和代码仓库,如果你没更改过代码仓库和设置的话,Ovaerride那里可以不选择,系统会默认给你配置一个
最后点击Finish,项目就搭建好了,这是Intellij会下载一些东西,你可能要等待一会。成功了之后,你会看到你的项目架构是这个样子的:
如果出现了以下提示,点击Enable Auto-Import
在一个标准的SSM仓库里面,你还得新建这些文件夹:
- src/test(用来放置test文件)
- src/main/java(用来放置Java代码)
- src/main/resource(用来放置一些xml配置文件、mybatis中的mapping和properties文件 )
其中Test需要被Mark Directory as Test Sources Root,右键test文件夹就行;以此类推,java文件夹需要被Mark Directory as Sources Root,resource需要被Mark Directory as Resources Sources Root
另外你还得在java文件夹下右键新建包,按照你之前创建项目时的GroupId,类似我就创建com.yech
所以最后你的项目框架是这个样子
2.Maven依赖
① 进入Pom.xml
进入Pom.xml文件,刚开始是这么个样子的,接下来就开始漫长的Maven依赖配置过程咯
② Spring生态系统依赖
因为Spring官方建议我们所有Spring的生态系统Jar包应该保证统一版本,所以我们在 properties节点下 加上这么一行代码,在下面的代码中如果需要用到Spring生态系统,只需要引用这个版本就行了,
<springversion>5.1.2.RELEASE</springversion>
我们这个项目需要用到的Spring Jar包有(所有的dependency都是放在 dependencies节点下 ):
Spring-context
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>${springversion}</version>
</dependency>
Spring测试
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-test</artifactId>
<version>${springversion}</version>
</dependency>
Spring JDBC
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>5.1.6.RELEASE</version>
</dependency>
③ Spring MVC相关
Spring MVC
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>${springversion}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-web</artifactId>
<version>${springversion}</version>
</dependency>
JSTL表达式
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>jstl</artifactId>
<version>1.2</version>
</dependency>
<dependency>
<groupId>taglibs</groupId>
<artifactId>standard</artifactId>
<version>1.1.2</version>
</dependency>
Java EE
<!-- Jave EE-->
<dependency>
<groupId>javax</groupId>
<artifactId>javaee-api</artifactId>
<version>8.0</version>
</dependency>
③ Mybatis相关
Mybatis核心Jar包
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.4.6</version>
</dependency>
Spring整合Mybatis中间件
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis-spring</artifactId>
<version>1.3.2</version>
</dependency>
为了配合Mybatis能找到mapping等文件,需要在 build节点下 添加以下配置
<!-- 为了让项目能够找到mapper等xml文件-->
<resources>
<resource>
<directory>src/main/resources</directory>
<includes>
<include>**/*.properties</include>
<include>**/*.xml</include>
</includes>
<filtering>false</filtering>
</resource>
</resources>
MySQL驱动
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.13</version>
</dependency>
数据库连接池
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.1.12</version>
</dependency>
Mybatis分页
<dependency>
<groupId>com.github.pagehelper</groupId>
<artifactId>pagehelper</artifactId>
<version>5.1.8</version>
</dependency>
④ 其他
JsckSon:用来处理JSON
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-core</artifactId>
<version>2.9.7</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.9.7</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-annotations</artifactId>
<version>2.9.7</version>
</dependency>
Lombok:用来在entity类下添加注解,自动生成toString、Build、构造方法等
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.4</version>
</dependency>
Log4j:用来管理项目的日志,搭配SpringAOP使用,会很方便
<dependency>
<groupId>commons-logging</groupId>
<artifactId>commons-logging-api</artifactId>
<version>1.1</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>1.7.26</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
<version>1.7.26</version>
</dependency>
AOP:可以用来嵌入日志
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjrt</artifactId>
<version>1.9.1</version>
</dependency>
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjtools</artifactId>
<version>1.9.1</version>
</dependency>
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjweaver</artifactId>
<version>1.9.1</version>
</dependency>
<dependency>
<groupId>aopalliance</groupId>
<artifactId>aopalliance</artifactId>
<version>1.0</version>
</dependency>
3.配置文件
①总结
SSM的配置文件有以下几种:
- application.xml:用来整合Spring配置文件、Spring MVC配置文件、Mybatis配置文件
- spring.xml:Spring的配置文件。主要配置:自动注入、AOP,也就是Spring的两大功能
- springmvc.xml:Spring MVC的配置文件。主要配置:禁止静态资源的拦截、配置InternalResourceViewResolver给Spring MVC返回值添加前缀和后缀、配置全局Date转换器,将来自客户端的类似"1999-10-20"字符串的日期格式转换为Date类型
- mybatis.xml:Mybatis的配置文件。主要配置:设置数据库连接属性、配置数据源、扫描Dao和Mapping、配置事务管理器、配置基于注解的声明式事务
- mybatisConfig.xml:会被mybatis.xml引入,是Mybatis在使用时会用到的另一些其他的配置,类似是否打印查询语句,配置分页插件等等。
- mapping:这个也是位于resource下,Mybatis会结合dao来执行sql语句,后面我们会再详细讲到
- log4j.properties:log4j日志的配置文件
- mysql.properties:记录MySQL的一些信息,类似connectionURL、用户名和密码等等
- web.xml:这个位于webapp/WEB-INF下,配置web的一些信息。类似Spring MVC拦截
②application.xml
主要用来连接Spring、Spring MVC、Mybatis配置文件,本身不配置任何东西
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd">
<import resource="spring.xml"/>
<import resource="springmvc.xml"/>
<import resource="mybatis.xml"/>
</beans>
③spring.xml
配置DI和AOP,注意把com.zparkep改成你自己的包名
<?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: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/aop http://www.springframework.org/schema/aop/spring-aop.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">
<!--Spring想为哪个包下面的类生成对象-->
<context:component-scan base-package="com.zparkep"/>
<!-- AOP-->
<aop:aspectj-autoproxy />
</beans>
④springmvc.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:aop="http://www.springframework.org/schema/aop"
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.3.xsd
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc-4.3.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">
<!-- 让SpringMVC不拦截静态资源,否则JS等文件无法加载-->
<mvc:default-servlet-handler/>
<!-- 配置来自服务器端请求的前缀和后缀,也可以将之写成“/WEB-INF/views/”来保证所有的网页安全-->
<bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/"/>
<property name="suffix" value=".jsp"/>
</bean>
⑤mysql.properties
主要记录你自己的数据库信息,便于之后被Mybatis导入,千万记得改成你自己电脑的Mysql数据库、用户名和密码,别傻傻的直接复制粘贴过去
driverClass=com.mysql.cj.jdbc.Driver
connectionURL=jdbc:mysql://localhost:3306/db_test?useSSL=false&serverTimezone=UTC&user=root&password=&useUnicode=true&characterEncoding=UTF8&autoReconnect=true&failOverReadOnly=false
user=root
password=root
⑥mybatis.xml
引用上面的mysql.properties来配置Mybatis,注意把com.zparkep改成你自己的包名
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:tx="http://www.springframework.org/schema/tx"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.1.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx-3.1.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd">
<!-- 加载数据库属性配置文件 -->
<context:property-placeholder location="classpath:mysql.properties" />
<!-- 配置数据源 -->
<bean id="ds"
class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<property name="driverClassName" value="${driverClass}"/>
<property name="url" value="${connectionURL}"/>
<property name="username" value="${user}"/>
<property name="password" value="${password}"/>
</bean>
<!-- 配置扫描DAO接口所在包名,Spring会自动查找其下的类 -->
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<!-- 给出需要扫描Dao接口包 -->
<property name="basePackage" value="com.zparkep.dao" />
<!-- 注入sqlSessionFactory -->
<property name="sqlSessionFactoryBeanName" value="sqlSessionFactory" />
</bean>
<!-- 注册SqlSessionFactoryBean,同时指定数据源-->
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="ds" />
<!-- 自动扫描mappers.xml文件 -->
<property name="mapperLocations" value="classpath:/mapping/*.xml" />
<property name="configLocation" value="classpath:mybatisConfig.xml"/>
</bean>
<!-- 配置事务管理器 -->
<bean id="txManager"
class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="ds"/>
</bean>
<!-- 配置基于注解的声明式事务 -->
<tx:annotation-driven transaction-manager="txManager"/>
</beans>
⑦ mybatisConfig.xml
主要配置分页插件
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
<settings>
<!-- 打印查询语句 -->
<setting name="logImpl" value="STDOUT_LOGGING"/>
<!--下划线转驼峰式 ,使得在UserDao.xml中可以直接使用resultType="user"来引用用Dao-->
<setting name="mapUnderscoreToCamelCase" value="true"/>
</settings>
<typeAliases>
<package name="com.zparkep.entity"/>
</typeAliases>
<!-- 配置分页插件 -->
<plugins>
<plugin interceptor="com.github.pagehelper.PageInterceptor">
<property name="helperDialect" value="mysql"/>
</plugin>
</plugins>
</configuration>
⑧log4j.properties
### 设置###
log4j.rootLogger = debug,stdout,D,E
### 输出信息到控制抬 ###
log4j.appender.stdout = org.apache.log4j.ConsoleAppender
log4j.appender.stdout.Target = System.out
log4j.appender.stdout.layout = org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern = [%-5p] %d{yyyy-MM-dd HH:mm:ss,SSS} method:%l%n%m%n
### 输出DEBUG 级别以上的日志到=E://logs/error.log ###
log4j.appender.D = org.apache.log4j.DailyRollingFileAppender
log4j.appender.D.File = E://logs/log.log
log4j.appender.D.Append = true
log4j.appender.D.Threshold = DEBUG
log4j.appender.D.layout = org.apache.log4j.PatternLayout
log4j.appender.D.layout.ConversionPattern = %-d{yyyy-MM-dd HH:mm:ss} [ %t:%r ] - [ %p ] %m%n
### 输出ERROR 级别以上的日志到=E://logs/error.log ###
log4j.appender.E = org.apache.log4j.DailyRollingFileAppender
log4j.appender.E.File =E://logs/error.log
log4j.appender.E.Append = true
log4j.appender.E.Threshold = ERROR
log4j.appender.E.layout = org.apache.log4j.PatternLayout
log4j.appender.E.layout.ConversionPattern = %-d{yyyy-MM-dd HH:mm:ss} [ %t:%r ] - [ %p ] %m%n
⑨web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee
http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
id="WebApp_ID"
version="4.0">
<!-- “/”代表所有的请求都会被定位到SpringMVCDispatcher-->
<servlet-mapping>
<servlet-name>SpringMVCDispatcher</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
<servlet>
<servlet-name>SpringMVCDispatcher</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<!-- 配置DispatcherServlet的初始化參數:设置文件的路径和文件名称 -->
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:application.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
<async-supported>true</async-supported>
</servlet>
</web-app>
⑩mapping
这个就暂时先不讲,等到讲到Mybatis时候再讲
配置完了之后,我们的项目框架是这个样子的:(其中有个rebel.xml不用管,那个是我装了jRebel时才多出来的,一般情况下是没有的):
4.代码分层架构
大家知道现在的SSM框架都采用MVC分层架构,所以我们的代码也是需要分层的,所以我们需要以下几个包:
- controller:来处理来自客户端的请求
- service:放置service的接口,被上层的controller调用,满足controller的需求,同时会在该目录下生成一个impl包,来放置service的实现类
- dao:放接口,每一个接口都是集合了对一个表的所有sql操作,Mybatis会调用在resource/mapping下的xml文件,来实现dao接口里面的sql操作,会被上层的service调用。
- entity:一一对应数据库中的表,会被dao调用
之后我们的代码框架会大致像这个样子,我在每个包下面都新建了一个类或接口:
5.配置Tomcat
点击Intellij的这个位置,添加一个tomcat服务器
点击这里添加一个本地的tomcat
点击这里选择你自己电脑的tomcat位置
点击这里的fix将自己电脑的War放到tomcat里面去,选择下面一个
最后点击这里的Run,就能运行成功啦
弹出这个界面就证明你成功了
至此环境配置就告一段落了,接下来我们会简单的写一个小应用来完善一下我们的SSM项目
二、简单应用
这里留个坑,过一段时间来更新哈