文章说明
文章源码只截取部分,完整源码(ssm-demo)请访问:
GitHub:https://github.com/superkarx/ssm-demo
在本人的csdn账号资源中也有上传ssm-demo.zip
此文章的图片来源于网络
知识储备(仅此项目用到)
- 三层架构:
- ssm:springmvc(表示层) + spring(业务层) + mybatis(持久层)
- springmvc:(mvc思想:模型、视图、控制器)
- spring:控制反转(这里用到bean管理,自动注入等)
- mybatis:预编译sql语句的接口映射(mapper)
项目结构
- 整体结构
- 类目录
配置文件(给出部分代码)
- pom.xml:maven管理
①springframework的各种依赖(包含web和web-mvc)
②servlet-api:拥有此包可以用servlet
③mybatis
④mybatis-spring:sm整合所用
…略
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<maven.compiler.source>1.7</maven.compiler.source>
<maven.compiler.target>1.7</maven.compiler.target>
<org.springframework.version>4.3.19.RELEASE</org.springframework.version>
<commons-logging.version>1.2</commons-logging.version>
<junit.version>4.12</junit.version>
</properties>
<dependencies>
<!-- Spring核心依赖 -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>${org.springframework.version}</version>
</dependency>
<!-- Spring beans包-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-beans</artifactId>
<version>${org.springframework.version}</version>
</dependency>
<!-- Spring 容器包 -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>${org.springframework.version}</version>
</dependency>
<!-- Spring容器依赖包,将第三方库整合进Spring应用上下文,提供支持 -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context-support</artifactId>
<version>${org.springframework.version}</version>
</dependency>
<!-- Spring aop依赖 -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-aop</artifactId>
<version>${org.springframework.version}</version>
</dependency>
<!-- Spring aspects依赖 -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-aspects</artifactId>
<version>${org.springframework.version}</version>
</dependency>
<!-- aspectj依赖 -->
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjrt</artifactId>
<version>1.9.4</version>
</dependency>
<!-- commons-logging依赖 -->
<dependency>
<groupId>commons-logging</groupId>
<artifactId>commons-logging</artifactId>
<version>${commons-logging.version}</version>
</dependency>
<!-- Spring jdbc依赖 -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>${org.springframework.version}</version>
</dependency>
<!--Spring事物依赖 -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-tx</artifactId>
<version>${org.springframework.version}</version>
</dependency>
<!-- Spring web依赖 -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-web</artifactId>
<version>${org.springframework.version}</version>
</dependency>
<!--Spring webmvc依赖 -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>${org.springframework.version}</version>
</dependency>
<!-- Spring test依赖 -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-test</artifactId>
<version>${org.springframework.version}</version>
</dependency>
<!-- https://mvnrepository.com/artifact/com.alibaba/druid -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.1.24</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.mybatis/mybatis -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.5</version>
</dependency>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis-spring</artifactId>
<version>2.0.5</version>
</dependency>
<!-- https://mvnrepository.com/artifact/mysql/mysql-connector-java -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.21</version>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>servlet-api</artifactId>
<version>2.5</version>
<scope>provided</scope>
</dependency>
</dependencies>
- web.xml:(web项目的总配置文件)
①串联spring-config.xml
②创建DispatcherServlet类(springmvc的核心)到请求路径,并用springmvc-servlet.xml配置此类。
③初始界面
<web-app>
<display-name>Archetype Created Web Application</display-name>
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:spring-config.xml</param-value>
</context-param>
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<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:springmvc-servlet.xml</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>springmvc</servlet-name>
<url-pattern>/</url-pattern>
<!--只要请求,不要/index.jsp这种-->
</servlet-mapping>
<welcome-file-list>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>
</web-app>
- spring-config.xml:(以下交给spring管理)
①进行bean管理(自动注入等)
②用数据库配置文件jdbc.properties配置数据源
③用mybatis-config.xml和②中的数据源配置一个mybatis会话对象,并且指定映射接口(mapper或者dao等)
<!--在所设置的包下将所有的接口生成动态代理实现类,并由spring容器管理-->
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<property name="basePackage" value="com.xin.dao"/>
</bean>
<!--扫描组件-->
<context:component-scan base-package="com.xin">
<context:exclude-filter type="annotation" expression="org.springframework.stereotype.Controller"/>
</context:component-scan>
<!--引入资源文件-->
<context:property-placeholder location="classpath:jdbc-config.properties"/>
<!--数据源-->
<bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource">
<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="dataSourceTransactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource"/>
</bean>
<!--开启事务注解驱动-->
<tx:annotation-driven transaction-manager="dataSourceTransactionManager"/>
<!--管理mybatis操作数据库的会话对象-->
<bean class="org.mybatis.spring.SqlSessionFactoryBean">
<!--核心配置文件路径-->
<property name="configLocation" value="classpath:mybatis-config.xml"/>
<!--映射文件路径-->
<property name="mapperLocations" value="classpath*:com/xin/dao/*Dao.java"/>
<!--数据源-->
<property name="dataSource" ref="dataSource"/>
</bean>
- springmvc-servlet.xml:(springmvc的配置文件)
①扫描Controller控制器(mvc中c的作用,相当于servlet的作用)
②配置视图解析器(将控制器返回的视图解析为跳转的界面路径)
③映射器和适配器(一行代码封装)
<!--扫描controller组件,pojo作为控制层类(单例)-->
<context:component-scan base-package="com.xin.controller" use-default-filters="false">
<context:include-filter type="annotation" expression="org.springframework.stereotype.Controller"/>
</context:component-scan>
<!--
配置视图解析器:前缀+视图名(return的String)+后缀 = 要跳转的页面
-->
<bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<!--前缀和后缀-->
<property name="prefix" value="/WEB-INF/view/"/>
<property name="suffix" value=".jsp"/>
</bean>
<!--映射器和适配器-->
<mvc:annotation-driven/>
- mybatis-config.xml
①设置驼峰命名和下划线命名的互转支持
②不能为null
<configuration>
<settings>
<setting name="mapUnderscoreToCamelCase" value="true"/>
<setting name="jdbcTypeForNull" value="NULL"/>
</settings>
</configuration>
- jdbc.properties(数据库配置)
注意:此配置运用druid的属性命名规范,请根据自身情况配置!
jdbc.driver = com.mysql.jdbc.Driver
jdbc.username = root
jdbc.password = root
jdbc.url = jdbc:mysql://localhost:3306/*?serverTimezone=UTC
类讲解
- UserDao(接口)
@Mapper有两个作用:
定位 | 具体作用 |
---|---|
映射类 | 被spring-config.xml配置文件指定为sql语句映射类,将预编译sql语句映射为接口中的方法 |
bean | 类自动被扫描为bean对象交给Ioc容器管理(方便自动注入) |
@Mapper
public interface UserDao {
@Select("select * from user where id = #{id} and password = #{password}")
User getUserByIdAndPassword(@Param("id") int id, @Param("password") String password);
}
- UserService和UserServiceImpl
业务层的类,根据业务需要对dao层的sql映射进行一层封装。
@Service注解会被spring扫描成Ioc中的bean
@Autowired注解根据类型,在Ioc容器中找到UserDao这个类型的bean对象进行自动装配。
public interface UserService {
User login(int id, String password);
}
@Service
public class UserServiceImpl implements UserService {
private final UserDao userDao;
@Autowired
public UserServiceImpl(UserDao userDao) {
this.userDao = userDao;
}
@Override
public User login(int id, String password) {
return userDao.getUserByIdAndPassword(id,password);
}
}
- UserController
@Controller的两层含义
功能定位 | 具体功能 |
---|---|
mvc的控制层c | 处理请求,解析为视图,交给视图解析器解析为页面 |
service的上层 | 对service层进行进一步的封装 |
注意:扫描bean的时候,springmvc配置文件和spring配置文件根据自身的需要都会扫描@Controller,所以可以在spring配置文件中加上过滤器,不扫描它。
@RequestMapping
注册接受请求的方法,相当于在web.xml中配置servlet和servlet-mapping标签,会接受处理相应名称的请求。
登录验证逻辑:把session域中的key为id和password的属性拿到后调用service层的login方法去取数据库中相应的用户数据,return的结果(字符串)即“视图”,会自动交给视图解析器去解析为页面(前缀+return+后缀)。
@Controller
public class UserController {
private final UserService userService;
@Autowired
public UserController(UserService userService) {
this.userService = userService;
}
@RequestMapping(value = "login",params = {"id","password"})
public String login(HttpServletResponse response, HttpServletRequest request){
User user = userService.login(Integer.parseInt(request.getParameter("id")),request.getParameter("password"));
if(user!=null){
request.getSession().setAttribute("user",user);//存User
return "success";
}else {
return "";//回到首页
}
}
}
页面
- index.jsp
登录界面,提交form表单后会发送/login请求,参数为id和password,交给controller层的类去处理。
<%@page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<body>
<h2>Hello World!</h2>
<form method="post" action="/login">
<p> 账号:<input name="id" type="text"> </p>
<p> 密码:<input name="password" type="password"> </p>
<p>
<input type="submit" name="Button" value="提交"/>
<input type="reset" name="Reset" value="重填">
</p>
</form>
</body>
</html>
- success.jsp
简单输出登录后取到后放在session域中的用户数据。
<html>
<head>
<title>success</title>
</head>
<body>
<h1>User-Inf</h1>
<p>
<%=session.getAttribute("user").toString()%>
</p>
</body>
</html>
数据库
- 可视化设计
- 数据库脚本
SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 0;
-- ----------------------------
-- Table structure for user
-- ----------------------------
DROP TABLE IF EXISTS `user`;
CREATE TABLE `user` (
`name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL,
`id` int NOT NULL AUTO_INCREMENT,
`email` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL,
`password` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL,
PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 10001 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci ROW_FORMAT = Dynamic;
-- ----------------------------
-- Records of user
-- ----------------------------
INSERT INTO `user` VALUES ('admin', 10000, '15815179079@163.com', '10000');
SET FOREIGN_KEY_CHECKS = 1;
- pojo(模型)
public class User {
private Integer id;
private String name;
private String email;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
@Override
public String toString() {
return "User{" +
"id=" + id +
", name='" + name + '\'' +
", email='" + email + '\'' +
'}';
}
public User(Integer id, String name, String email) {
this.id = id;
this.name = name;
this.email = email;
}
public User() {
}
}
环境配置
- jdk:1.8以上
- Tomcat:7.0(版本不宜过高,不然会产生servlet-api的jar包冲突)