1. 需求
构建SSM框架,查询数据库中用户的信息,在页面进行展示。
# 2. 创建数据库
DROP DATABASE IF EXISTS `ssm_test
`;
CREATE DATABASE IF NOT EXISTS `ssm_test
` CHARACTER SET 'utf8' COLLATE 'utf8_general_ci';
USE `ssm_test
`;
DROP TABLE IF EXISTS `user`;
CREATE TABLE IF NOT EXISTS `user`(
`pk_id
` INT AUTO_INCREMENT COMMENT '用户编号',
`username
` VARCHAR(20) COMMENT '用户账号',
`password
` VARCHAR(20) COMMENT '用户密码',
CONSTRAINT `pk_user
` PRIMARY KEY(`pk_id
`)
);
INSERT INTO `user` VALUES(NULL, '张三丰', '123'),(NULL, '郭靖', '456'),(NULL, '张无忌', '445'),(NULL, '杨过', '658');
3. 创建maven工程
3.1 创建一个maven工程
3.2 填写模块信息
3.3 确定maven信息
3.4 填写工程信息
3.5 目录结构
4. 依赖的传递问题
4.1 传递依赖
首先我们在pom.xml文件中引入spring-webmvc的依赖 我们发现它还偷偷的帮我们引入了其他的jar包 传递依赖 我们的项目依赖spring-webmvc.jar,而spring-webmvc.jar会依赖spring-beans.jar等等,所以spring-beans.jar这些jar包也出现在了我们的maven工程中,这种现象我们称为依赖传递。
4.2 解决依赖冲突
第一声明优先原则:先声明的依赖优先进入项目路径近者优先原则:直接依赖优先进入项目直接排除法:使用<exclusion>标签排除依赖(推荐使用)
5. 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>zw.ssm
</groupId>
<artifactId>ssm_01
</artifactId>
<version>1.0-SNAPSHOT
</version>
<packaging>war
</packaging>
<properties>
<spring.version>5.0.2.RELEASE
</spring.version>
<slf4j.version>1.6.6
</slf4j.version>
<log4j.version>1.2.12
</log4j.version>
<shiro.version>1.2.3
</shiro.version>
<mysql.version>5.1.6
</mysql.version>
<mybatis.version>3.4.5
</mybatis.version>
<spring.security.version>5.0.1.RELEASE
</spring.security.version>
</properties>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework
</groupId>
<artifactId>spring-context
</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-tx
</artifactId>
<version>${spring.version}
</version>
</dependency>
<dependency>
<groupId>org.springframework
</groupId>
<artifactId>spring-test
</artifactId>
<version>${spring.version}
</version>
</dependency>
<dependency>
<groupId>org.mybatis
</groupId>
<artifactId>mybatis
</artifactId>
<version>${mybatis.version}
</version>
</dependency>
</dependencies>
</dependencyManagement>
<dependencies>
<dependency>
<groupId>org.aspectj
</groupId>
<artifactId>aspectjweaver
</artifactId>
<version>1.6.8
</version>
</dependency>
<dependency>
<groupId>org.springframework
</groupId>
<artifactId>spring-aop
</artifactId>
<version>${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-support
</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-orm
</artifactId>
<version>${spring.version}
</version>
</dependency>
<dependency>
<groupId>org.springframework
</groupId>
<artifactId>spring-beans
</artifactId>
<version>${spring.version}
</version>
</dependency>
<dependency>
<groupId>org.springframework
</groupId>
<artifactId>spring-core
</artifactId>
<version>${spring.version}
</version>
</dependency>
<dependency>
<groupId>org.springframework
</groupId>
<artifactId>spring-test
</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-tx
</artifactId>
<version>${spring.version}
</version>
</dependency>
<dependency>
<groupId>junit
</groupId>
<artifactId>junit
</artifactId>
<version>4.12
</version>
<scope>test
</scope>
</dependency>
<dependency>
<groupId>mysql
</groupId>
<artifactId>mysql-connector-java
</artifactId>
<version>${mysql.version}
</version>
</dependency>
<dependency>
<groupId>javax.servlet
</groupId>
<artifactId>javax.servlet-api
</artifactId>
<version>3.1.0
</version>
<scope>provided
</scope>
</dependency>
<dependency>
<groupId>javax.servlet.jsp
</groupId>
<artifactId>jsp-api
</artifactId>
<version>2.0
</version>
<scope>provided
</scope>
</dependency>
<dependency>
<groupId>jstl
</groupId>
<artifactId>jstl
</artifactId>
<version>1.2
</version>
</dependency>
<dependency>
<groupId>log4j
</groupId>
<artifactId>log4j
</artifactId>
<version>${log4j.version}
</version>
</dependency>
<dependency>
<groupId>org.slf4j
</groupId>
<artifactId>slf4j-api
</artifactId>
<version>${slf4j.version}
</version>
</dependency>
<dependency>
<groupId>org.slf4j
</groupId>
<artifactId>slf4j-log4j12
</artifactId>
<version>${slf4j.version}
</version>
</dependency>
<dependency>
<groupId>org.mybatis
</groupId>
<artifactId>mybatis
</artifactId>
<version>${mybatis.version}
</version>
</dependency>
<dependency>
<groupId>org.mybatis
</groupId>
<artifactId>mybatis-spring
</artifactId>
<version>1.3.0
</version>
</dependency>
<dependency>
<groupId>c3p0
</groupId>
<artifactId>c3p0
</artifactId>
<version>0.9.1.2
</version>
<type>jar
</type>
<scope>compile
</scope>
</dependency>
<dependency>
<groupId>com.github.pagehelper
</groupId>
<artifactId>pagehelper
</artifactId>
<version>5.1.2
</version>
</dependency>
<dependency>
<groupId>org.springframework.security
</groupId>
<artifactId>spring-security-web
</artifactId>
<version>${spring.security.version}
</version>
</dependency>
<dependency>
<groupId>org.springframework.security
</groupId>
<artifactId>spring-security-config
</artifactId>
<version>${spring.security.version}
</version>
</dependency>
<dependency>
<groupId>org.springframework.security
</groupId>
<artifactId>spring-security-core
</artifactId>
<version>${spring.security.version}
</version>
</dependency>
<dependency>
<groupId>org.springframework.security
</groupId>
<artifactId>spring-security-taglibs
</artifactId>
<version>${spring.security.version}
</version>
</dependency>
<dependency>
<groupId>com.alibaba
</groupId>
<artifactId>druid
</artifactId>
<version>1.0.9
</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.apache.tomcat.maven
</groupId>
<artifactId>tomcat7-maven-plugin
</artifactId>
<version>2.2
</version>
</plugin>
</plugins>
</build>
</project>
6. 开发持久层
6.1 applicationContext-dao.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"
xsi
:schemaLocation
="http
://www
.springframework
.org
/schema
/beans
http
://www
.springframework
.org
/schema
/beans
/spring
-beans
.xsd"
>
<!--配置数据源
-->
<bean id
="dataSource" class="com.alibaba.druid.pool.DruidDataSource">
<property name
="driverClassName" value
="com.mysql.jdbc.Driver"/>
<property name
="url" value
="jdbc:mysql://127.0.0.1:3306/ssm_test"/>
<property name
="username" value
="root"/>
<property name
="password" value
="root"/>
</bean
>
<!--配置SqlSession对象的工厂
-->
<bean id
="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name
="dataSource" ref
="dataSource"/>
<!--别名包扫描
-->
<property name
="typeAliasesPackage" value
="zw.ssm.domain"/>
</bean
>
<!--mapper接口包扫描
-->
<bean
class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<property name
="basePackage" value
="zw.ssm.mapper"/>
</bean
>
</beans
>
6.2 用户实体类
package zw
.ssm
.domain
;
import java
.io
.Serializable
;
public class User implements Serializable
{
private Integer pk_id
;
private String username
;
private String password
;
public Integer
getPk_id()
{
return pk_id
;
}
public void setPk_id(Integer pk_id
)
{
this.pk_id
= pk_id
;
}
public String
getUsername()
{
return username
;
}
public void setUsername(String username
)
{
this.username
= username
;
}
public String
getPassword()
{
return password
;
}
public void setPassword(String password
)
{
this.password
= password
;
}
@Override
public String
toString()
{
return "User{" +
"pk_id=" + pk_id
+
", username='" + username
+ '\'' +
", password='" + password
+ '\'' +
'}';
}
}
6.3 用户持久层接口
package zw
.ssm
.mapper
;
import org
.apache
.ibatis
.annotations
.Select
;
import org
.springframework
.stereotype
.Repository
;
import zw
.ssm
.domain
.User
;
import java
.util
.List
;
@Repository
public interface UserMapper
{
@Select("select * from `user`")
List
<User> listUserAll();
}
6.4 用户持久层测试类
package zw
.ssm
.mapper
;
import org
.junit
.Test
;
import org
.junit
.runner
.RunWith
;
import org
.springframework
.beans
.factory
.annotation
.Autowired
;
import org
.springframework
.test
.context
.ContextConfiguration
;
import org
.springframework
.test
.context
.junit4
.SpringJUnit4ClassRunner
;
import zw
.ssm
.domain
.User
;
import java
.util
.List
;
@RunWith(SpringJUnit4ClassRunner
.class)
@ContextConfiguration(locations
={"classpath:spring/applicationContext*.xml"})
public class UserMapperTest
{
@Autowired
private UserMapper userMapper
;
@Test
public void listUserAllTest()
{
List
<User> users
= userMapper
.listUserAll();
for (User user
: users
)
{
System
.out
.println("user = " + user
);
}
}
}
7. 开发业务层
7.1 applicationContext-service.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
:aop
="http://www.springframework.org/schema/aop"
xmlns
:tx
="http://www.springframework.org/schema/tx"
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
/aop
http
://www
.springframework
.org
/schema
/aop
/spring
-aop
.xsd
http
://www
.springframework
.org
/schema
/tx
http
://www
.springframework
.org
/schema
/tx
/spring
-tx
.xsd"
>
<!--配置事务管理器
-->
<bean id
="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name
="dataSource" ref
="dataSource"/>
</bean
>
<!--配置事务的通知
-->
<tx
:advice id
="advice">
<tx
:attributes
>
<tx
:method name
="insert*" propagation
="REQUIRED"/>
<tx
:method name
="delete*" propagation
="REQUIRED"/>
<tx
:method name
="update*" propagation
="REQUIRED"/>
<tx
:method name
="find*" propagation
="SUPPORTS" read
-only
="true"/>
<tx
:method name
="list*" propagation
="SUPPORTS" read
-only
="true"/>
</tx
:attributes
>
</tx
:advice
>
<!--配置切面
-->
<aop
:config
>
<aop
:pointcut id
="pointcut" expression
="execution(* zw.ssm.service.impl.*.*(..))"/>
<aop
:advisor advice
-ref
="advice" pointcut
-ref
="pointcut"/>
</aop
:config
>
<!--业务层组件扫描
-->
<context
:component
-scan base
-package="zw.ssm.service"/>
</beans
>
7.2 用户业务层接口
package zw
.ssm
.service
;
import zw
.ssm
.domain
.User
;
import java
.util
.List
;
public interface UserService
{
List
<User> listUserAll();
}
7.3 用户业务层实现类
package zw
.ssm
.service
.impl
;
import org
.springframework
.beans
.factory
.annotation
.Autowired
;
import org
.springframework
.stereotype
.Service
;
import zw
.ssm
.domain
.User
;
import zw
.ssm
.mapper
.UserMapper
;
import zw
.ssm
.service
.UserService
;
import java
.util
.List
;
@Service
public class UserServiceImpl implements UserService
{
@Autowired
private UserMapper userMapper
;
public List
<User> listUserAll()
{
List
<User> users
= userMapper
.listUserAll();
return users
;
}
}
7.4 用户业务层测试类
package zw
.ssm
.service
;
import org
.junit
.Test
;
import org
.junit
.runner
.RunWith
;
import org
.springframework
.beans
.factory
.annotation
.Autowired
;
import org
.springframework
.test
.context
.ContextConfiguration
;
import org
.springframework
.test
.context
.junit4
.SpringJUnit4ClassRunner
;
import zw
.ssm
.domain
.User
;
import java
.util
.List
;
@RunWith(SpringJUnit4ClassRunner
.class)
@ContextConfiguration(locations
={"classpath:spring/applicationContext*.xml"})
public class UserServiceTest
{
@Autowired
private UserService userService
;
@Test
public void listUserAllTest()
{
List
<User> users
= userService
.listUserAll();
for (User user
: users
)
{
System
.out
.println("user = " + user
);
}
}
}
8. 开发表现层
8.1 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 xmlns
="http://java.sun.com/xml/ns/javaee"
xmlns
:xsi
="http://www.w3.org/2001/XMLSchema-instance"
xsi
:schemaLocation
="http
://java
.sun
.com
/xml
/ns
/javaee
http
://java
.sun
.com
/xml
/ns
/javaee
/web
-app_3_0
.xsd"
version
="3.0">
<!--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
>
<init
-param
>
<param
-name
>forceEncoding
</param
-name
>
<param
-value
>true</param
-value
>
</init
-param
>
</filter
>
<filter
-mapping
>
<filter
-name
>encoding
</filter
-name
>
<url
-pattern
>
8.2 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
: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
.xsd
http
://www
.springframework
.org
/schema
/context
http
://www
.springframework
.org
/schema
/context
/spring
-context
.xsd
http
://www
.springframework
.org
/schema
/mvc
http
://www
.springframework
.org
/schema
/mvc
/spring
-mvc
.xsd"
>
<!--表现层组件扫描
-->
<context
:component
-scan base
-package="zw.ssm.controller"/>
<!--处理器映射器
+处理器适配器
-->
<mvc
:annotation
-driven
/>
<!--视图解析器
-->
<bean id
="internalResourceViewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<!--配置逻辑视图名前缀
-->
<property name
="prefix" value
="/WEB-INF/page/"/>
<!--配置逻辑视图名后缀
-->
<property name
="suffix" value
=".jsp"/>
</bean
>
<!--释放静态资源
-->
<mvc
:default-servlet
-handler
/>
</beans
>
8.3 userMain.jsp
<%--
@Description 用户展现页面
@Author 周威
@Date 2020-06-14 - 20:46
--%>
<%@ page language
="java" contentType
="text/html;charset=utf-8" %>
<%--引入JSTL
--%>
<%@ taglib uri
="http://java.sun.com/jsp/jstl/core" prefix
="c" %>
<%@ taglib uri
="http://java.sun.com/jsp/jstl/fmt" prefix
="fmt"%>
<html>
<head>
<title>展示用户
</title
>
<meta http
-equiv
="Content-Type" content
="text/html;charset=utf-8"/>
<meta name
="author" content
="周威"/>
<style>
table
{width
:500px
;margin
: 100px auto
;}
tr
:nth
-child(even
){background
: #eeb0b0
;}
tr
:nth
-child(odd
){background
: #a9d6ff
;}
td
{text
-align
:center
;}
</style
>
</head
>
<body>
<table border
="1" cellspacing
="0">
<tr>
<th>pk_id
</th
>
<th>username
</th
>
<th>password
</th
>
</tr
>
<c
:forEach var
="user" items
="${requestScope.users}">
<tr>
<td>$
{user
.pk_id
}</td
>
<td>$
{user
.username
}</td
>
<td>$
{user
.password
}</td
>
</tr
>
</c
:forEach
>
</table
>
</body
>
</html
>
8.4 用户表现层控制器
package zw
.ssm
.controller
;
import org
.springframework
.beans
.factory
.annotation
.Autowired
;
import org
.springframework
.stereotype
.Controller
;
import org
.springframework
.ui
.Model
;
import org
.springframework
.web
.bind
.annotation
.RequestMapping
;
import zw
.ssm
.domain
.User
;
import zw
.ssm
.service
.UserService
;
import java
.util
.List
;
@Controller
public class UserController
{
@Autowired
private UserService userService
;
@RequestMapping("/list")
public String
requestListUserAll(Model model
)
{
List
<User> users
= userService
.listUserAll();
model
.addAttribute("users", users
);
return "userMain";
}
}
8.5 工程目录
9. 运行调试
运行maven的Tomcat7插件 在控制台找到访问路径 在浏览器中输入url地址 http://localhost:8080/ssm_01/list运行页面