一.简介
这篇文章是记录我自己手动搭建基于maven的SSM(spring+springMVC+mybatis)框架项目的整个过程,目的是为了加深印象和方便以后查阅以及整理思路。
二.开发环境准备
(1)系统:Windows10(专业版)
(2)eclispe版本:Eclipse Java EE IDE for Web Developers.(4.6.2)
(3)maven版本:apache-maven-3.5.3
(4)jdk版本:jdk1.8.0_172
(5)tomcat版本:apache-tomcat-7.0.90
(6)数据库:oracle(11.2.0.4.0)
三.搭建项目
(1)创建maven项目:
默认next到这个界面:
继续点击next到这个界面:输入web选择后缀是maven-archetype-webapp的选项,然后继续点击next
到了这个界面输入图中Group id,Artifac id两个ID(必须输入,名称自定义),然后点击next:
整个maven项目结构暂时完成:
接下来调整项目结构:
这个时候我们看到JRE System Libryary后面显示的是[J2SE-1.5],并且没有maven项目的src/main/java等文件夹,原因是我们没有选择正确的JDK版本,这时候我们需要调整对应的JRE环境,在工程上右键Build Path-Configure Build Path,在Libraries下选中JRE,右侧edit,选择我们自己的jdk版本:
点击apply后点击ok后完成jdk配置,你会神奇的发下项目结构变了,但是还是缺少一个src/test/resources文件夹,没关系,这里我们自己手动创建一个就是了
创建完成,项目结构调整完成
(2)添加pom依赖,下载SSM框架所需jar包
<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/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.zd</groupId>
<artifactId>testMavenSSM</artifactId>
<packaging>war</packaging>
<version>0.0.1-SNAPSHOT</version>
<name>SSMDemo Maven Webapp</name>
<url>http://maven.apache.org</url>
<properties>
<!-- Spring版本号 -->
<spring.version>4.3.8.RELEASE</spring.version>
<!--json版本号 -->
<jackson.version>2.5.4</jackson.version>
</properties>
<dependencies>
<!-- Spring相关包 -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-aop</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-web</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-tx</artifactId>
<version>${spring.version}</version>
</dependency>
<!-- AOP相关包 -->
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjrt</artifactId>
<version>1.8.0</version>
</dependency>
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjweaver</artifactId>
<version>1.8.0</version>
</dependency>
<!-- MyBatis相关包 -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.3.0</version>
</dependency>
<!-- MySQL相关包 -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.31</version>
</dependency>
<dependency>
<groupId>com.oracle</groupId>
<artifactId>ojdbc6</artifactId>
<version>11.2.0.4.0</version>
</dependency>
<!-- 数据库连接池 -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.0.20</version>
</dependency>
<!-- Spring集成MyBatis -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis-spring</artifactId>
<version>1.2.3</version>
</dependency>
<!-- JSP标准标签库 -->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>jstl</artifactId>
<version>1.2</version>
</dependency>
<!-- 日志相关包 -->
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.17</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
<version>1.7.21</version>
</dependency>
<!--添加json依赖 -->
<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>junit</groupId>
<artifactId>junit</artifactId>
<version>3.8.1</version>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<finalName>testMavenSSM</finalName>
</build>
</project>
Ctrl+s保存后就能看到相应的依赖包:
(3)配置文件
1.在resources文件夹下面创建spring-mybatis.xml,配置好该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:p="http://www.springframework.org/schema/p"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.1.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-3.1.xsd
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc-4.0.xsd">
<!-- 自动扫描 -->
<context:component-scan base-package="com.zd.maven" />
<!-- 引入配置文件 -->
<bean id="propertyConfigurer"
class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
<property name="locations">
<list>
<value>classpath:jdbc.properties</value>
<value>classpath:log4j.properties</value>
</list>
</property>
</bean>
<!-- 配置数据源 -->
<bean id="dataSource"
class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<property name="driverClassName" value="${jdbc.driver}" />
<property name="url" value="${jdbc.url}" />
<property name="username" value="${jdbc.username}" />
<property name="password" value="${jdbc.password}" />
</bean>
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="dataSource" />
<!-- 自动扫描mapping.xml文件 -->
<property name="mapperLocations" value="classpath:com/zd/maven/map/*.xml"></property>
<!-- 自动扫描实体类 -->
<property name="configLocation" value="classpath:mybatis-config.xml"></property>
</bean>
<!-- DAO接口所在包名,Spring会自动查找其下的类 -->
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<property name="basePackage" value="com.zd.maven.dao" />
<property name="sqlSessionFactoryBeanName" value="sqlSessionFactory"></property>
</bean>
<!-- 事务管理 -->
<bean id="transactionManager"
class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource" />
</bean>
</beans>
继续在resources目录下创建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:p="http://www.springframework.org/schema/p"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.1.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-3.1.xsd
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc-4.0.xsd">
<!-- 自动扫描该包,使SpringMVC认为包下用了@controller注解的类是控制器 -->
<context:component-scan base-package="com.zd.maven.controller" />
<!-- 这个配置是为了让返回的值转为json格式 -->
<mvc:default-servlet-handler/><mvc:annotation-driven/>
<!-- 定义跳转的文件的前后缀 ,视图模式配置-->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<!-- controller中return时会自动加上前缀和后缀,变成一个完整的url -->
<property name="prefix" value="/WEB-INF/jsp/" />
<property name="suffix" value=".jsp" />
</bean>
</beans>
创建jdbc.properties文件,并配置好相应的内容:
jdbc.driver=oracle.jdbc.driver.OracleDriver
jdbc.url=jdbc:oracle:thin:@localhost:1521:orcl
jdbc.username=scott
jdbc.password=admin
同时创建log4j.properties文件,配置好文件内容:
log4j.rootLogger=INFO,Console,File
#定义日志输出目的地为控制台
log4j.appender.Console=org.apache.log4j.ConsoleAppender
log4j.appender.Console.Target=System.out
#可以灵活地指定日志输出格式,下面一行是指定具体的格式
log4j.appender.Console.layout = org.apache.log4j.PatternLayout
log4j.appender.Console.layout.ConversionPattern=[%c] - %m%n
#文件大小到达指定尺寸的时候产生一个新的文件
log4j.appender.File = org.apache.log4j.RollingFileAppender
#指定输出目录
log4j.appender.File.File = logs/ssm.log
#定义文件最大大小
log4j.appender.File.MaxFileSize = 10MB
# 输出所以日志,如果换成DEBUG表示输出DEBUG以上级别日志
log4j.appender.File.Threshold = ALL
log4j.appender.File.layout = org.apache.log4j.PatternLayout
log4j.appender.File.layout.ConversionPattern =[%p] [%d{yyyy-MM-dd HH\:mm\:ss}][%c]%m%n
最后我们再来修改一下啊web.xml文件,基本的配置就完成了:
<!DOCTYPE web-app PUBLIC
"-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
"http://java.sun.com/dtd/web-app_2_3.dtd" >
<web-app>
<display-name>Archetype Created Web Application</display-name>
<!-- Spring和mybatis的配置文件 -->
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:spring-mybatis.xml</param-value>
</context-param>
<!-- 编码过滤器 -->
<filter>
<filter-name>encodingFilter</filter-name>
<filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
<async-supported>true</async-supported>
<init-param>
<param-name>encoding</param-name>
<param-value>UTF-8</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>encodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<!-- Spring监听器 -->
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<!-- 防止Spring内存溢出监听器 -->
<listener>
<listener-class>org.springframework.web.util.IntrospectorCleanupListener</listener-class>
</listener>
<!-- Spring MVC servlet -->
<servlet>
<servlet-name>SpringMVC</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:spring-mvc.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
<async-supported>true</async-supported>
</servlet>
<servlet-mapping>
<servlet-name>SpringMVC</servlet-name>
<!-- /表示全部拦截 -->
<url-pattern>/</url-pattern>
</servlet-mapping>
<welcome-file-list>
<welcome-file>/index.jsp</welcome-file>
</welcome-file-list>
</web-app>
(4)编写服务端代码,结构如下:
注意,在编写代码之前,可首先把数据库表建好,以便之后可以访问数据库拿数据到页面展示
1.UserDTO.java:
package com.zd.maven.dto;
public class UserDTO {
private String name;
private int age;
private String birthday;
private String address;
private String phoneNo;
private String sex;
private String id;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getBirthday() {
return birthday;
}
public void setBirthday(String birthday) {
this.birthday = birthday;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
public String getPhoneNo() {
return phoneNo;
}
public void setPhoneNo(String phoneNo) {
this.phoneNo = phoneNo;
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
}
2.UserService.java:
package com.zd.maven.service;
import com.zd.maven.dto.UserDTO;
public interface UserService {
public UserDTO selectUserInfo(String id);
}
3.UserServiceImpl.java:
package com.zd.maven.serviceimpl;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.util.StringUtils;
import com.zd.maven.dao.UserDao;
import com.zd.maven.dto.UserDTO;
import com.zd.maven.service.UserService;
@Service
public class UserServiceImpl implements UserService {
@Autowired
private UserDao userDao;
public UserDTO selectUserInfo(String id) {
System.out.println(id);
if (StringUtils.hasText(id)) {
System.out.println("id不为空");
return userDao.getUserDTO(id);
}
return null;
}
}
4.UserDao.java:
package com.zd.maven.dao;
import com.zd.maven.dto.UserDTO;
public interface UserDao {
public UserDTO getUserDTO(String id);
public int deleteUserDTO(String id);
public int insertUser(UserDTO userDTO);
}
5.UserDaoMapper.xml:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.zd.maven.dao.UserDao">
<resultMap id="BaseResultMap" type="UserDTO">
<id column="id" jdbcType="VARCHAR" property="id" />
<result column="user_name" jdbcType="VARCHAR" property="name" />
<result column="user_birthday" jdbcType="VARCHAR" property="birthday" />
<result column="user_sex" jdbcType="VARCHAR" property="sex"/>
<result column="user_address" jdbcType="VARCHAR" property="address"/>
<result column="user_phone" jdbcType="VARCHAR" property="phoneNo"/>
<result column="user_age" jdbcType="VARCHAR" property="age"/>
</resultMap>
<sql id="Base_Column_List">
id, user_name, user_sex, user_birthday, user_address, user_phone, user_age
</sql>
<select id="getUserDTO" parameterType="java.lang.String" resultMap="BaseResultMap">
select
<include refid="Base_Column_List" />
from user_tab
where id = #{id,jdbcType=VARCHAR}
</select>
<delete id="deleteUserDTO" parameterType="java.lang.String">
delete from user_tab
where id = #{id,jdbcType=VARCHAR}
</delete>
<insert id="insertUser" parameterType="UserDTO">
insert into user_tab (id, user_name, user_sex,
user_birthday,user_age,user_phone,user_address)
values (#{id,jdbcType=VARCHAR}, #{name,jdbcType=VARCHAR}, #{sex,jdbcType=VARCHAR},
#{birthday,jdbcType=VARCHAR},#{age,jdbcType=VARCHAR},#{phoneNo,jdbcType=VARCHAR},#{address,jdbcType=VARCHAR})
</insert>
<!-- <update id="updateByPrimaryKeySelective" parameterType="com.java.zxf.domain.User">
update user
<set>
<if test="userName != null">
user_name = #{userName,jdbcType=VARCHAR},
</if>
<if test="userGender != null">
user_gender = #{userGender,jdbcType=VARCHAR},
</if>
<if test="userBirthday != null">
user_birthday = #{userBirthday,jdbcType=VARCHAR},
</if>
</set>
where id = #{id,jdbcType=VARCHAR}
</update>
<update id="updateByPrimaryKey" parameterType="com.java.zxf.domain.User">
update user
set user_name = #{userName,jdbcType=VARCHAR},
user_gender = #{userGender,jdbcType=VARCHAR},
user_birthday = #{userBirthday,jdbcType=VARCHAR}
where id = #{id,jdbcType=VARCHAR}
</update> -->
</mapper>
6.UserController.java:
package com.zd.maven.controller;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.ResponseBody;
import com.zd.maven.dto.UserDTO;
import com.zd.maven.service.UserService;
@Controller
public class UserController {
@Autowired
private UserService userService;
@RequestMapping(value = "/getUserInfo", method = RequestMethod.GET)
@ResponseBody
public Object getUserInfo(String id) {
System.out.println("进入方法");
UserDTO userDTO = userService.selectUserInfo(id);
System.out.println("此人的电话号码为:" + userDTO.getPhoneNo());
return userDTO;
}
}
(5)项目构建:
1.在项目上右键,选择run-maven build..,然后输入命令clean install
控制台输出如下内容,表示构建成功:
[INFO] Scanning for projects...
[INFO]
[INFO] ------------------------< com.zd:testMavenSSM >-------------------------
[INFO] Building SSMDemo Maven Webapp 0.0.1-SNAPSHOT
[INFO] --------------------------------[ war ]---------------------------------
[INFO]
[INFO] --- maven-clean-plugin:2.5:clean (default-clean) @ testMavenSSM ---
[INFO] Deleting D:\workspace\testMavenSSM\target
[INFO]
[INFO] --- maven-resources-plugin:2.6:resources (default-resources) @ testMavenSSM ---
[WARNING] Using platform encoding (UTF-8 actually) to copy filtered resources, i.e. build is platform dependent!
[INFO] Copying 1 resource
[INFO]
[INFO] --- maven-compiler-plugin:3.1:compile (default-compile) @ testMavenSSM ---
[INFO] Nothing to compile - all classes are up to date
[INFO]
[INFO] --- maven-resources-plugin:2.6:testResources (default-testResources) @ testMavenSSM ---
[INFO] Not copying test resources
[INFO]
[INFO] --- maven-compiler-plugin:3.1:testCompile (default-testCompile) @ testMavenSSM ---
[INFO] Not compiling test sources
[INFO]
[INFO] --- maven-surefire-plugin:2.12.4:test (default-test) @ testMavenSSM ---
[INFO] Tests are skipped.
[INFO]
[INFO] --- maven-war-plugin:2.2:war (default-war) @ testMavenSSM ---
[INFO] Packaging webapp
[INFO] Assembling webapp [testMavenSSM] in [D:\workspace\testMavenSSM\target\testMavenSSM]
[INFO] Processing war project
[INFO] Copying webapp resources [D:\workspace\testMavenSSM\src\main\webapp]
[INFO] Webapp assembled in [475 msecs]
[INFO] Building war: D:\workspace\testMavenSSM\target\testMavenSSM.war
[INFO] WEB-INF\web.xml already added, skipping
[INFO]
[INFO] --- maven-install-plugin:2.4:install (default-install) @ testMavenSSM ---
[INFO] Installing D:\workspace\testMavenSSM\target\testMavenSSM.war to F:\maven_repositories\com\zd\testMavenSSM\0.0.1-SNAPSHOT\testMavenSSM-0.0.1-SNAPSHOT.war
[INFO] Installing D:\workspace\testMavenSSM\pom.xml to F:\maven_repositories\com\zd\testMavenSSM\0.0.1-SNAPSHOT\testMavenSSM-0.0.1-SNAPSHOT.pom
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 4.400 s
[INFO] Finished at: 2019-01-04T14:47:11+08:00
[INFO] ------------------------------------------------------------------------
(6)部署项目到tomcat:
点击finish完成tomcat项目部署,然后鼠标右键server,点击start,启动tomcat,
(7)访问项目:
在浏览器地址栏输入http://localhost:8080/testMavenSSM/getUserInfo?id=20190058;
成功访问: