第一步:新建MAVEN项目
第二步:搭建项目整体架构
项目结构分析:(和三层架构类似)
.controller层:控制层,处理页面请求
interceptor:拦截器
mapper:后台持久层(相当于三层架构中的Dao层)
pojo:实体类
service:业务访问层
resource:存放SSM中的配置文件,方便管理
webapp-static:存放静态文件,js,css,images等
WEB-INF-page:存放jsp页面
test-java:junit单元测试
第三步: 配置maven:pom.xml文件
4.0.0
cn.testssm
TestSSM
1.0-SNAPSHOT
war
TestSSM Maven Webapp
http://www.example.com
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<maven.compiler.source>1.7</maven.compiler.source>
<maven.compiler.target>1.7</maven.compiler.target>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<spring.version>5.0.2.RELEASE</spring.version>
<mybatis.version>3.4.5</mybatis.version>
<slf4j.version>1.6.6</slf4j.version>
<log4j.version>1.2.12</log4j.version>
<mysql.version>5.1.6</mysql.version>
org.aspectj
aspectjweaver
1.6.8
org.springframework
spring-aop
s
p
r
i
n
g
.
v
e
r
s
i
o
n
<
/
v
e
r
s
i
o
n
>
<
/
d
e
p
e
n
d
e
n
c
y
>
<
d
e
p
e
n
d
e
n
c
y
>
<
g
r
o
u
p
I
d
>
o
r
g
.
s
p
r
i
n
g
f
r
a
m
e
w
o
r
k
<
/
g
r
o
u
p
I
d
>
<
a
r
t
i
f
a
c
t
I
d
>
s
p
r
i
n
g
−
c
o
n
t
e
x
t
<
/
a
r
t
i
f
a
c
t
I
d
>
<
v
e
r
s
i
o
n
>
{spring.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context</artifactId> <version>
spring.version</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring−context</artifactId><version>{spring.version}
org.springframework
spring-web
s
p
r
i
n
g
.
v
e
r
s
i
o
n
<
/
v
e
r
s
i
o
n
>
<
/
d
e
p
e
n
d
e
n
c
y
>
<
d
e
p
e
n
d
e
n
c
y
>
<
g
r
o
u
p
I
d
>
o
r
g
.
s
p
r
i
n
g
f
r
a
m
e
w
o
r
k
<
/
g
r
o
u
p
I
d
>
<
a
r
t
i
f
a
c
t
I
d
>
s
p
r
i
n
g
−
w
e
b
m
v
c
<
/
a
r
t
i
f
a
c
t
I
d
>
<
v
e
r
s
i
o
n
>
{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−webmvc</artifactId><version>{spring.version}
org.springframework
spring-test
s
p
r
i
n
g
.
v
e
r
s
i
o
n
<
/
v
e
r
s
i
o
n
>
<
/
d
e
p
e
n
d
e
n
c
y
>
<
d
e
p
e
n
d
e
n
c
y
>
<
g
r
o
u
p
I
d
>
o
r
g
.
s
p
r
i
n
g
f
r
a
m
e
w
o
r
k
<
/
g
r
o
u
p
I
d
>
<
a
r
t
i
f
a
c
t
I
d
>
s
p
r
i
n
g
−
t
x
<
/
a
r
t
i
f
a
c
t
I
d
>
<
v
e
r
s
i
o
n
>
{spring.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-tx</artifactId> <version>
spring.version</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring−tx</artifactId><version>{spring.version}
org.springframework
spring-jdbc
s
p
r
i
n
g
.
v
e
r
s
i
o
n
<
/
v
e
r
s
i
o
n
>
<
/
d
e
p
e
n
d
e
n
c
y
>
<
!
−
−
j
u
n
i
t
单
元
测
试
,
t
e
s
t
:
只
有
在
t
e
s
t
环
境
下
使
用
,
c
o
m
p
i
l
e
全
局
使
用
−
−
>
<
d
e
p
e
n
d
e
n
c
y
>
<
g
r
o
u
p
I
d
>
j
u
n
i
t
<
/
g
r
o
u
p
I
d
>
<
a
r
t
i
f
a
c
t
I
d
>
j
u
n
i
t
<
/
a
r
t
i
f
a
c
t
I
d
>
<
v
e
r
s
i
o
n
>
4.12
<
/
v
e
r
s
i
o
n
>
<
/
d
e
p
e
n
d
e
n
c
y
>
<
!
−
−
m
y
s
q
l
连
接
驱
动
−
−
>
<
d
e
p
e
n
d
e
n
c
y
>
<
g
r
o
u
p
I
d
>
m
y
s
q
l
<
/
g
r
o
u
p
I
d
>
<
a
r
t
i
f
a
c
t
I
d
>
m
y
s
q
l
−
c
o
n
n
e
c
t
o
r
−
j
a
v
a
<
/
a
r
t
i
f
a
c
t
I
d
>
<
v
e
r
s
i
o
n
>
{spring.version}</version> </dependency> <!-- junit单元测试,test:只有在test环境下使用,compile全局使用--> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.12</version> </dependency> <!-- mysql连接驱动--> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>
spring.version</version></dependency><!−−junit单元测试,test:只有在test环境下使用,compile全局使用−−><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.12</version></dependency><!−−mysql连接驱动−−><dependency><groupId>mysql</groupId><artifactId>mysql−connector−java</artifactId><version>{mysql.version}
javax.servlet
servlet-api
2.5
provided
javax.servlet.jsp
jsp-api
2.0
provided
jstl
jstl
1.2
log4j
log4j
l
o
g
4
j
.
v
e
r
s
i
o
n
<
/
v
e
r
s
i
o
n
>
<
/
d
e
p
e
n
d
e
n
c
y
>
<
d
e
p
e
n
d
e
n
c
y
>
<
g
r
o
u
p
I
d
>
o
r
g
.
s
l
f
4
j
<
/
g
r
o
u
p
I
d
>
<
a
r
t
i
f
a
c
t
I
d
>
s
l
f
4
j
−
a
p
i
<
/
a
r
t
i
f
a
c
t
I
d
>
<
v
e
r
s
i
o
n
>
{log4j.version}</version> </dependency> <dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-api</artifactId> <version>
log4j.version</version></dependency><dependency><groupId>org.slf4j</groupId><artifactId>slf4j−api</artifactId><version>{slf4j.version}
org.slf4j
slf4j-log4j12
s
l
f
4
j
.
v
e
r
s
i
o
n
<
/
v
e
r
s
i
o
n
>
<
/
d
e
p
e
n
d
e
n
c
y
>
<
!
−
−
l
o
g
e
n
d
−
−
>
<
!
−
−
m
y
b
a
t
i
s
持
久
层
−
−
>
<
d
e
p
e
n
d
e
n
c
y
>
<
g
r
o
u
p
I
d
>
o
r
g
.
m
y
b
a
t
i
s
<
/
g
r
o
u
p
I
d
>
<
a
r
t
i
f
a
c
t
I
d
>
m
y
b
a
t
i
s
<
/
a
r
t
i
f
a
c
t
I
d
>
<
v
e
r
s
i
o
n
>
{slf4j.version}</version> </dependency> <!-- log end --> <!-- mybatis持久层--> <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis</artifactId> <version>
slf4j.version</version></dependency><!−−logend−−><!−−mybatis持久层−−><dependency><groupId>org.mybatis</groupId><artifactId>mybatis</artifactId><version>{mybatis.version}
org.mybatis
mybatis-spring
1.3.0
c3p0
c3p0
0.9.1.2
jar
compile
com.fasterxml.jackson.core
jackson-core
2.9.8
com.fasterxml.jackson.core
jackson-databind
2.9.8
commons-fileupload
commons-fileupload
1.3.1
commons-io
commons-io
2.6
com.alibaba
fastjson
1.2.60
TestSSM
maven-clean-plugin
3.1.0
maven-resources-plugin
3.0.2
maven-compiler-plugin
3.8.0
maven-surefire-plugin
2.22.1
maven-war-plugin
3.2.2
maven-install-plugin
2.5.2
maven-deploy-plugin
2.8.2
src/main/java
/*.xml
src/main/resources
/.xml
**/.properties
**/*.html
第四步:编写四大配置文件
一.applicationContext.xml
<context:property-placeholder
location=“classpath:jdbcConfig.properties”/>
<context:component-scan
base-package=“cn.test.service”/>
<tx:advice id=“txAdvice” transaction-manager=“transactionManager”>
tx:attributes
<tx:method name=“find*” read-only=“true”/>
<tx:method name="" isolation=“DEFAULT”/>
</tx:attributes>
</tx:advice>
aop:config
<aop:advisor advice-ref=“txAdvice” pointcut="execution( cn.test.service.impl..(…))"></aop:advisor>
</aop:config>
二:mybatis.xml
<context:component-scan base-package=“cn.test.controller”/>
<mvc:resources location="/static/" mapping="/static/"></mvc:resources>
mvc:annotation-driven</mvc:annotation-driven>
mvc:annotation-driven
<mvc:message-converters register-defaults=“true”>
text/html;charset=UTF-8
application/json
WriteMapNullValue
QuoteFieldNames
</mvc:message-converters>
</mvc:annotation-driven>
mvc:default-servlet-handler/
mvc:interceptors
mvc:interceptor
<mvc:mapping path="/sys/"/>
</mvc:interceptor>
</mvc:interceptors>
四:web.xml
Archetype Created Web Application
characterEncodingFilter
org.springframework.web.filter.CharacterEncodingFilter
encoding
UTF-8
forceEncoding
true
characterEncodingFilter
/*
contextConfigLocation
classpath:applicationContext.xml
org.springframework.web.context.ContextLoaderListener
dispatcherServlet
org.springframework.web.servlet.DispatcherServlet
contextConfigLocation
classpath:spring-mvc.xml
1
dispatcherServlet
/
/WEB-INF/pages/login.jsp
第五步: jdbcConfig.properties
jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/ssm?useUnicode=true&characterEncoding=utf8
jdbc.username=root
jdbc.password=root
第六步: log4j.properties
Set root category priority to INFO and its only appender to CONSOLE.
#log4j.rootCategory=INFO, CONSOLE debug info warn error fatal
log4j.rootCategory=info, CONSOLE, LOGFILE
Set the enterprise logger category to FATAL and its only appender to CONSOLE.
log4j.logger.org.apache.axis.enterprise=FATAL, CONSOLE
CONSOLE is set to be a ConsoleAppender using a PatternLayout.
log4j.appender.CONSOLE=org.apache.log4j.ConsoleAppender
log4j.appender.CONSOLE.layout=org.apache.log4j.PatternLayout
log4j.appender.CONSOLE.layout.ConversionPattern=%d{ISO8601} %-6r [%15.15t] %-5p %30.30c %x - %m\n
LOGFILE is set to be a File appender using a PatternLayout.
log4j.appender.LOGFILE=org.apache.log4j.FileAppender
log4j.appender.LOGFILE.File=d:\axis.log
log4j.appender.LOGFILE.Append=true
log4j.appender.LOGFILE.layout=org.apache.log4j.PatternLayout
log4j.appender.LOGFILE.layout.ConversionPattern=%d{ISO8601} %-6r [%15.15t] %-5p %30.30c %x - %m\n
第七步:编写Junit单元测试
/**
- 测试类
*/
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = “classpath:applicationContext.xml”)
public class TestSSM {
@Resource
private ApplicationContext ac;
@Test
public void testUserLogin() {
UserService userService = (UserService) ac.getBean(“userService”, UserService.class);
User user = new User();
user.setUserName(“admin”);
user.setUserPassword(“admin”);
Integer result = userService.userLogin(user);
System.out.println(result);
System.out.println(“送悟空”);
}
}
测试框架整合
ok,框架基本上就是已将搭建完成了,下面创建的测试界面,看框架能否正常运行。
第一步:编写User实体类
package cn.test.pojo;
import java.io.Serializable;
public class User implements Serializable {
private Integer id;
private String userName;
private String userPassword;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
public String getUserPassword() {
return userPassword;
}
public void setUserPassword(String userPassword) {
this.userPassword = userPassword;
}
@Override
public String toString() {
return “User{” +
“id=” + id +
“, userName=’” + userName + ‘’’ +
“, userPassword=’” + userPassword + ‘’’ +
‘}’;
}
}
第二步: 编写持久层(mapper)
这里因为是刚学习ssm,所以将xml文件和接口放在了同一包下。
UserMapper.java
import cn.test.pojo.User;
public interface UserMapper {
/**
* 用户登录
*
* @param user
* @return
*/
public Integer userLogin(User user);
}
2. UserMapper.xml
```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="cn.test.mapper.UserMapper">
<select id="userLogin" resultType="Integer" parameterType="user">
SELECT COUNT(1) FROM user WHERE userName = #{userName} and userPassword = #{userPassword}
</select>
</mapper>
第三步:编写业务层(Service)
UserService.java
```java package cn.test.service;
import cn.test.pojo.User;
public interface UserService {
public Integer userLogin(User user);
}
2. UserServiceImpl.java
```java
package cn.test.service.impl;
import cn.test.mapper.UserMapper;
import cn.test.pojo.User;
import cn.test.service.UserService;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
@Service("userService")
public class UserServiceImpl implements UserService {
@Resource
private UserMapper userMapper;
@Override
public Integer userLogin(User user) {
return userMapper.userLogin(user);
}
}
第四步:编写Controller
package cn.test.controller;
import cn.test.pojo.User;
import cn.test.service.UserService;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import javax.annotation.Resource;
import java.util.HashMap;
import java.util.Map;
@Controller
@RequestMapping("/userController")
public class UserController {
@Resource
private UserService userService;
@RequestMapping("/userLogin")
public String userLogin(User user) {
System.out.println(user);
Integer result = userService.userLogin(user);
return "";
}
@RequestMapping("/testAjax")
@ResponseBody
public String testAjax(User user) {
System.out.println(user);
Map<String, User> map = new HashMap<String, User>();
map.put("data", user);
return JSONArray.toJSONString(map);
}
}
第五步:jsp页面
<%--
Created by IntelliJ IDEA.
User: Dell
Date: 2020/8/8
Time: 21:23
To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" isELIgnored="false" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<form action="userController/userLogin" method="post">
<div>
<p>测试登录</p>
<p>账号*</p>
<p><input type="text" name="userName" required placeholder="请输入账号"/></p>
<div id="login_password">
<p>密码*</p>
<p><input type="text" name="userPassword" required placeholder="请输入密码"/></p>
</div>
<p><input type="submit" name="login" value="登陆"/></p>
</div>
</form>
<button type="button" value="测试ajax" id="btn">测试ajax</button>
<script src="${pageContext.request.contextPath}/static/js/jquery.min.js"></script>
<script>
$(function () {
$("#btn").click(function () {
$.ajax({
url: "userController/testAjax",
type: "POST",
data:
{userName: "张三", userPassword: "1234"},
dataType: "json",
success: function (res) {
var data = JSON.parse(res);
alert(res);
alert(data);
for (var key in data) {
alert(data[key].userName);
}
}
})
})
})
</script>
</body>
</html>
启动服务器,在浏览器地址输入http://localhost:8080/index.jsp
整合成功
新手可能会出现的问题,以下整理了解决方法:
junit单元测试时提示:Can not find Class :cn.testssm.test 解决方案:因为开发工具使用的时idea,当初在建包时将java名称改成了test,重新改成java就好了
2.我使用的spring版本时5.0.2,spring5开始要求junit单元测试版本必须>=4.1.2
3.Error creating bean with name ‘org.springframework.web.servlet.mvc.method.anRequestMappingHandlerAda
4.jsp页面不识别el表达式
解决方案:在头部加入: isELIgnored=“false”
<%@ page contentType="text/html;charset=UTF-8" language="java" isELIgnored="false" %>
5.控制台输出中文乱码:
-Dfile.encoding=utf-8
解决方案:
![在这里插入图片描述](https://img-blog.csdnimg.cn/7f0614b86e954d1baafddd9938ef1751.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBA5rGH5pm655-l5LqG5aCC,size_20,color_FFFFFF,t_70,g_se,x_16)
end~