SSM框架组建之环境依赖配置
从 SSM 框架的项目目录开始
接 SSM 框架组建第一步,maven 工具加载完毕后开始。
maven - webapp 项目创建完成后,会自动创建如下整体目录结构。
- main 文件夹: 顾名思义就是项目的起始,所有跟项目有关的文件都要放到这个文件夹中。这样做的好处就是,在项目完成后利用 maven 打包工具打包后,打包出来的项目在部署到服务器上时,将会以同样的目录方式进行呈现,否则容易出现路径报错问题(无论何时,路径报错都是特别伤脑的“小问题”,一个出错,后面就会牵连出一连串的报错,想必对此都深有体会 o(*≧▽≦)ツ┏━┓)
- webapp 文件夹: 没啥好说,跟 web 有关的文件都放在这个文件夹中。(当然也是为了方便管理)
- pom.xml : SSM 项目的头号依赖配置文件,凡与项目有关的依赖都要写在这个 XML 文件中,通过 maven 进行统一管理。(项目依赖是一个令人又爱又恨的玩意,由于项目很多部分是相通的,故此完整配置了一次 pom.xml 之后,接下去建项目,就是基础的复制粘贴。
【懒人自嘲,不要学我。】但有个问题,当新的依赖加入时,需要对已有依赖进行检查,防止出现依赖不匹配的情况,依赖不匹配,在代码书写前期是无法发现的,但是项目一旦开始运行,就会报各种稀奇古怪的错误 【 get 一个点,当创建项目时,一旦遇到在网上搜不到解决方案的问题时,先检查一下获取的依赖是否与原有依赖相冲突。】 ) - web.xml: 没错,它是用来对 web 端进行相关配置的。配置出问题,影响范围在 web 页面及前后端数据传输之间。
上述目录对一个完整的 SSM 项目来说还少了四大关键文件夹: main/java(JavaBean 自定义库类存放文件夹) ; main/resources (SSM 项目关联访问配置);test/java(关联 main/java 对应测试类存放文件夹);test/resources(关联main/resources)
在 src 文件夹上右键,选择 new → Directory,出现New Directory 填写框,(使用IDEA的好处,自动关联显示了 Maven Source Directories 如下图所示。 同时自动对main/java-test/java 和 main/resources - test/resources 做了关联) 按住 “Ctrl”键 把四个目录全部选上,此时SSM项目基本框架目录创建完毕。
添加 Maven 依赖( pom.xml 文件配置)
Maven的依赖有很多,这个依赖配置完后,如果项目需要,可以不断往里面添加新的依赖。此处是我的项目依赖,也是比较常用的 java_web 项目依赖。
1. 修改 maven 依赖的 jdk
此处为 maven 依赖的 jdk 版本,(虽然目前我没发现不改会出啥问题,别的教程上也没有强制要改,但是为了防止意外,我将其改为我电脑的 jdk 13 环境)
<!-- maven 依赖的 jdk 版本 -->
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<java-version>13</java-version>
<maven.compiler.source>13</maven.compiler.source>
<maven.compiler.target>13</maven.compiler.target>
</properties>
修改如下图所示,所有的数字对应项目所用的 jdk 版本号:
2. 创建项目相关依赖
所有的项目依赖写在 <dependencies></dependencies>
中。注意!!在 XML 文件中,必须以<?xml version="1.0" encoding="UTF-8"?>
作为开头,开头不得有注释等,不然会报错
测试(test)所需依赖:
<!-- junit (单元)测试-->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<!--
将默认依赖改为使用4.11版本
3.0 版本的junit默认使用编程方式
4.0版本使用注解方式运行junit
-->
<version>4.11</version>
<scope>test</scope>
</dependency>
<!--切面编程 -->
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjweaver</artifactId>
<version>1.8.5</version>
</dependency>
日志文件依赖:
<!-- 1、日志 java日志: slf4j, log4j, logback, common-logging
slf4j :是规范/接口 -针对接口
日志实现:log4j, logback, common-logging
使用(项目常用组合):slf4j + logback
-->
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>1.7.12</version>
</dependency>
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-core</artifactId>
<version>1.1.1</version>
</dependency>
<!-- logback-classic实现slf4j接口并整合 -->
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-classic</artifactId>
<version>1.1.1</version>
<exclusions>
<exclusion>
<artifactId>slf4j-api</artifactId>
<groupId>org.slf4j</groupId>
</exclusion>
</exclusions>
</dependency>
数据库连接依赖(我用的数据库是 mysql 8.0.23 故此在配置数据库驱动时,<version></version>
中填写的是 8.0.23 ):
<!-- 2、数据库相关部分依赖 -->
<!-- 数据库驱动 -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.23</version>
<!-- 注意版本问题,如果驱动版本与mysql不匹配,会报错,
这里的版本 version 需要与服务器安装的 mysql 数据库版本一致。
不知道本机 mysql 版本的,可使用 'cmd' 打开命令行,通过 mysql -u root -p 打开 mysql 可知。 -->
<!-- 报错语句:Caused by: com.mysql.jdbc.exceptions.jdbc4.MySQLNonTransientConnectionException:
Could not create connection to database server. -->
<scope>runtime</scope>
<!-- maven工作范围 -->
<!-- 定义生命周期为runtime,只有在应用时启动 -->
</dependency>
<!-- 数据库链接池 -->
<dependency>
<groupId>c3p0</groupId>
<artifactId>c3p0</artifactId>
<version>0.9.1.2</version>
</dependency>
Mybatis管理依赖:
<!-- 3、DAO框架:MyBatis自身依赖 -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.3.0</version>
</dependency>
<!-- MyBatis自身实现的Spring依赖整合 -->
<!-- spring 中并没有提供对MyBatis 的依赖整合,这个整合是基于 MyBatis 的依赖整合 -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis-spring</artifactId>
<version>1.2.3</version>
</dependency>
web 端 servlet jsp 依赖:
<!-- 4、Servlet web 相关依赖 -->
<!-- jsp常用标签 -->
<dependency>
<groupId>taglibs</groupId>
<artifactId>standard</artifactId>
<version>1.1.2</version>
</dependency>
<!-- js默认标签库jstl -->
<dependency>
<groupId>jstl</groupId>
<artifactId>jstl</artifactId>
<version>1.2</version>
</dependency>
<!-- springMVC 默认的json转换 -->
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.5.4</version>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>4.0.1</version>
<scope>provided</scope>
</dependency>
框架核心—— spring 依赖 :
<!-- 5、spring依赖 -->
<!-- 1)spring 核心依赖 -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>4.1.7.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-beans</artifactId>
<version>4.1.7.RELEASE</version>
</dependency>
<!-- 包扫描依赖 -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>4.1.7.RELEASE</version>
</dependency>
<!-- 2)spring dao层依赖 -->
<!-- jdbc提供的数据库的数据管理器 -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>4.1.7.RELEASE</version>
</dependency>
<!-- spring 事务相关依赖 -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-tx</artifactId>
<version>4.1.7.RELEASE</version>
</dependency>
<!-- 3)spring web相关依赖 -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-web</artifactId>
<version>4.1.7.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>4.1.7.RELEASE</version>
</dependency>
<!-- 4)spring test相关依赖 -->
<!-- 方便单元测试和集成测试 -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-test</artifactId>
<version>4.1.7.RELEASE</version>
</dependency>
其他较为常见的依赖 :
- 在 SSM 项目中,我们常用注解的方式获取依赖的注入,但是有的 jdk 中并不包含“注解自动导入包” javax.annotation.Resource 。以下依赖用来解决
@Resource
等注解错误,无法导入 javax.annotation.Resource 包的问题。
<!-- Javax Annotation -->
<dependency>
<groupId>javax.annotation</groupId>
<artifactId>javax.annotation-api</artifactId>
<version>1.3.1</version>
</dependency>
- 在 java_web 项目中,常用的 web 构建方式中, spring 中的 视图渲染 viewResolver 默认是以 jsp 作为前端的渲染。jsp渲染好处是渲染速度较快,但坏处是,当团队开发的项目时候,由于 jsp 中内嵌大量 java 代码,使得开发工作无法很好的进行前后端分离。因此,如果想要使用HTML作为前端渲染,需要配置 HTML 渲染依赖。(如果选择以 HTML 作为前端渲染,则前面有关 jsp 的标签依赖可以不进行配置。)
<!-- html viewResolver support -->
<!-- start apache -->
<dependency>
<groupId>commons-logging</groupId>
<artifactId>commons-logging</artifactId>
<version>1.1.3</version>
</dependency>
<dependency>
<groupId>commons-collections</groupId>
<artifactId>commons-collections</artifactId>
<version>3.2.1</version>
</dependency>
<dependency>
<groupId>commons-fileupload</groupId>
<artifactId>commons-fileupload</artifactId>
<version>1.3</version>
</dependency>
<!-- end apache -->
<!-- 注意!! org.springframework.ui.freemarker.FreeMarkerConfigurationFactory类
在 spring-context-support 中,要配置 HTML 的 viewResolver 必须写
-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context-support</artifactId>
<version>4.1.6.RELEASE</version>
</dependency>
<dependency>
<groupId>org.freemarker</groupId>
<artifactId>freemarker</artifactId>
<version>2.3.22</version>
</dependency>
致此,pom.xml 配置完毕。附上我的完整 pom.xml 配置。
main/resources 文件夹相关路径(框架配置)
- 配置 mysql 数据库连接配置文件 : jdbc.properties 。
在main/rosources 文件夹上右键 new → File , 输入 jdbc.properties ,在新建出来的文件中写上如下代码:
# mysql 调用驱动
jdbc.driver = com.mysql.jdbc.Driver
# dream_db 为数据库名字,mysql默认端口为 3306 如果在安装mysql时修改了端口,则改为对应端口,否则会报错,连接不上数据库
jdbcUrl=jdbc:mysql://localhost:3306/dream_db?useUnicode=true&characterEncoding=utf-8&zeroDateTimeBehavior=convertToNull
# mysql 登录用户名,我用的是超级管理员 root
jdbc.username = root
# mysql 登录密码,为方便进入,我将 mysql - root 的登录密码改为无。
jdbc.password=
#定义初始连接数
initialSize=0
#定义最大连接数
maxActive=20
#定义最大空闲
maxIdle=20
#定义最小空闲
minIdle=1
#定义最长等待时间
maxWait=60000
附上 mysql 修改登录密码小贴士:(启动命令控制行“管理员模式”)
- 连接mysql服务 :net start mysql
- 启动mysql: mysql -u root -p (+初始化密码)
- 更改密码指令:ALTER USER ‘root’@‘localhost’ IDENTIFIED BY ‘新密码’;
- 配置 log 日志文件 :logback.xml
logback作为 log4j 日志的配置文件,将程序中的日志打印到控制台。可以通过配置,设置日志文件的输出级别,格式,输出路径等,我这附上官方给出的最简单的logback.xml配置。
在日志的输出上
附上logback配置官方详解地址:https://logback.qos.ch/manual/configuration.html
<?xml version="1.0" encoding="UTF-8"?>
<configuration debug="true">
<!--最简logback配置-->
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<!-- encoders are by default assigned the type
ch.qos.logback.classic.encoder.PatternLayoutEncoder -->
<!-- 打印方式:时间,线程,基本logback格式 -->
<encoder>
<pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>
</encoder>
</appender>
<!--打印级别-->
<root level="debug">
<appender-ref ref="STDOUT" />
</root>
</configuration>
- 配置 MyBatis 核心配置文件 :mybatis-config.xml(包括数据库下划线命名法与java驼峰命名法的自动转换,别名转换,主键自增忽略等)
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
<!-- 配置全局属性 -->
<settings>
<!-- 使用 jdbc 的 GeneratedKeys 获取数据库自增主键值,
主键值不进行传入打开时,不用关注底层API,自动赋值id 默认 value:false -->
<setting name="useGeneratedKeys" value="true" />
<!-- 使用列别名替换列名 -->
<setting name="useColumnLabel" value="true" />
<!-- 开启驼峰命名转换 -->
<setting name="mapUnderscoreToCamelCase" value="true" />
</settings>
</configuration>
- webapp/WEB-INF/web.xml 配置
web.xml 为 Web 容器的配置文件,用来初始化配置信息,主要定义了:
- Web 应用的名字、描述(display-name 和 description 标签);
- 应用范围的初始化参数(context-param标签);
- 过滤器配置(filter 标签);
- 监听器配置 (listener 标签);
- servlet 配置(servlet 标签,如前端控制器和验证码);
- 进入首页界面(welcome-file-list 标签,如 index.jsp 页面);
- session失效时间(session-config 标签);
- 错误页面配置(error-page 标签,如 404、500 错误页面等)。
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee
http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
version="4.0"
metadata-complete="true">
<!-- 修改servlet版本 -->
<!-- 用maven默认创建的web.xml无法使用,需要换成Tomcat样例中的web.xml -->
<!-- 配置 DispatcherServlet 前端控制器 -->
<servlet>
<servlet-name>servlet-dispatcher</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<!-- 配置springMVC需要加载的配置文件
spring-dao.xml, spring-service.xml, spring-web.xml
MyBatis -> spring -> springMVC
-->
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:spring/spring-*.xml</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>servlet-dispatcher</servlet-name>
<!-- ’/‘ ->特殊映射 默认匹配所有的请求 -->
<url-pattern>/</url-pattern>
</servlet-mapping>
<!-- 处理POST提交乱码问题 -->
<filter>
<filter-name>encoding</filter-name>
<filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>utf-8</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>encoding</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
</web-app>
致此,基本环境依赖配置完毕可以直接复制粘贴使用。
完整 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">
<modelVersion>4.0.0</modelVersion>
<groupId>org.example</groupId>
<artifactId>dreamLoad</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>war</packaging>
<name>dreamLoad Maven Webapp</name>
<!-- FIXME change it to the project's website -->
<url>http://www.example.com</url>
<!-- maven 依赖的 jdk 版本 -->
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<java-version>13</java-version>
<maven.compiler.source>13</maven.compiler.source>
<maven.compiler.target>13</maven.compiler.target>
</properties>
<dependencies>
<!-- junit (单元)测试-->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<!--
将默认依赖改为使用4.11版本
3.0 版本的junit默认使用编程方式
4.0版本使用注解方式运行junit
-->
<version>4.11</version>
<scope>test</scope>
</dependency>
<!--切面编程 -->
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjweaver</artifactId>
<version>1.8.5</version>
</dependency>
<!-- 补全项目依赖 -->
<!-- 1、日志 java日志: slf4j, log4j, logback, common-logging
slf4j :是规范/接口 -针对接口
日志实现:log4j, logback, common-logging
使用(项目常用组合):slf4j + logback
-->
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>1.7.12</version>
</dependency>
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-core</artifactId>
<version>1.1.1</version>
</dependency>
<!-- logback-classic实现slf4j接口并整合 -->
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-classic</artifactId>
<version>1.1.1</version>
<exclusions>
<exclusion>
<artifactId>slf4j-api</artifactId>
<groupId>org.slf4j</groupId>
</exclusion>
</exclusions>
</dependency>
<!-- 2、数据库相关部分依赖 -->
<!-- 数据库驱动 -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.23</version>
<scope>runtime</scope>
<!-- maven工作范围 -->
<!-- 定义生命周期为runtime,只有在应用时启动 -->
</dependency>
<!-- 数据库链接池 -->
<dependency>
<groupId>c3p0</groupId>
<artifactId>c3p0</artifactId>
<version>0.9.1.2</version>
</dependency>
<!-- 3、DAO框架:MyBatis自身依赖 -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.3.0</version>
</dependency>
<!-- MyBatis自身实现的Spring依赖整合 -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis-spring</artifactId>
<version>1.2.3</version>
</dependency>
<!-- 4、Servlet web 相关依赖 -->
<!-- jsp常用标签 -->
<dependency>
<groupId>taglibs</groupId>
<artifactId>standard</artifactId>
<version>1.1.2</version>
</dependency>
<!-- js默认标签库jstl -->
<dependency>
<groupId>jstl</groupId>
<artifactId>jstl</artifactId>
<version>1.2</version>
</dependency>
<!-- springMVC 默认的json转换 -->
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.5.4</version>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>4.0.1</version>
<scope>provided</scope>
</dependency>
<!-- 5、spring依赖 -->
<!-- 1)spring 核心依赖 -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>4.1.7.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-beans</artifactId>
<version>4.1.7.RELEASE</version>
</dependency>
<!-- 包扫描依赖 -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>4.1.7.RELEASE</version>
</dependency>
<!-- 2)spring dao层依赖 -->
<!-- jdbc提供的数据库的数据管理器 -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>4.1.7.RELEASE</version>
</dependency>
<!-- spring 事务相关依赖 -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-tx</artifactId>
<version>4.1.7.RELEASE</version>
</dependency>
<!-- 3)spring web相关依赖 -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-web</artifactId>
<version>4.1.7.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>4.1.7.RELEASE</version>
</dependency>
<!-- 4)spring test相关依赖 -->
<!-- 方便单元测试和集成测试 -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-test</artifactId>
<version>4.1.7.RELEASE</version>
</dependency>
<!-- Javax Annotation -->
<dependency>
<groupId>javax.annotation</groupId>
<artifactId>javax.annotation-api</artifactId>
<version>1.3.1</version>
</dependency>
</dependencies>
<build>
<finalName>dreamLoad</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>