Javaweb——SSM 框架系列
- SSM 框架指的是将 Spring、SpringMVC 和 MyBatis 框架结合起来开发 Java web 应用的框架集合。
一、SSM 框架基础
1、SSM 框架的组成
1.1、MyBatis
- MyBatis 是一个持久层框架,用于操作数据库,支持定制化 SQL、存储过程以及高级映射。MyBatis 可以用 XML 或注解来配置和映射原生信息,将接口和 Java POJOs 映射成数据库中的记录。
1.2、SpringMVC
- SpringMVC 是一个视图层框架,是后台 Java 程序和前台 JSP 页面的桥梁,类似于 Servlet。
1.3、Spring
- Spring 是一个分层的 JavaSE/EE full-stack 轻量级开源框架。
2、搭建 SSM 框架
2.1、准备 JAR 包
- SSM 框架所需的包共有 20 个,加上操作 MySQL 数据库的一个包,共 21 个,具体如下:
JAR JAR JAR asm-5.2.jar c3p0-0.9.5.2.jar commons-logging-1.2.jar log4j-1.2.17.jar jstl-1.2.jar mchange-commons-java-0.2.11.jar mybatis-3.4.6.jar mybatis-spring-1.3.0.jar mysql-connector-java-8.0.18.jar slf4j-api-1.7.25.jar slf4j-log4j12-1.7.25.jar spring-aop-5.0.9.RELEASE.jar spring-beans-5.0.9.RELEASE.jar spring-context-5.0.9.RELEASE.jar spring-core-5.0.9.RELEASE.jar spring-expression-5.0.9.RELEASE.jar spring-jdbc-5.0.9.RELEASE.jar spring-orm-5.0.9.RELEASE.jar spring-tx-5.0.9.RELEASE.jar spring-web-5.0.9.RELEASE.jar spring-webmvc-5.0.9.RELEASE.jar - 由于我的 MySQL 数据库版本是 8.* 的,所以 JAR 包也是 8 的。
- 将这些 JAR 包放置到 web/WEB-INF/lib 目录下。
2.2、准备配置文件
- 首先是 application.xml 文件,这个是 Spring 框架的配置文件,该文件的初始内容如下:
<?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"> </beans>
- 将该文件放在工程项目的 src 目录下,同时在该目录建立一个 db.properties 文件,用于配置数据库的 URL 和登录名、密码等信息
user=root password=****** driverClass=com.mysql.cj.jdbc.Driver url=jdbc:mysql://localhost:3306/test?serverTimezone=GMT%2B8
- 接着回到 application.xml 文件中配置 c3p0 连接池
<!-- c3p0连接池 --> <context:property-placeholder location="db.properties"/> <bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource"> <property name="user" value="${user}"/> <property name="password" value="${password}"/> <property name="driverClass" value="${driverClass}"/> <property name="jdbcUrl" value="${url}"/> </bean>
2.3、准备数据库
- 在 MySQL 的适当数据库中,新建一个数据表:
3、编写组件及其配置
- 这一步主要编写相关组件类及其配置
3.1、编写实体类
- 根据数据库中的数据表的属性,建立一个 JavaBean,代码如下:
package com.myCode.bean; import org.apache.ibatis.type.Alias; import org.springframework.stereotype.Component; @Alias("usersBean") @Component public class UserBean { private int uId; private String uName; private int uAge; private String uAddress; private String uTel; public void setuName(String uName) { this.uName = uName; } public String getuName() { return uName; } public void setuId(int uId) { this.uId = uId; } public int getuId() { return uId; } public void setuAge(int uAge) { this.uAge = uAge; } public int getuAge() { return uAge; } public void setuAddress(String uAddress) { this.uAddress = uAddress; } public String getuAddress() { return uAddress; } public void setuTel(String uTel) { this.uTel = uTel; } public String getuTel() { return uTel; } }
- 该类名上的两个 @ 就是注解,用于映射。
3.2、编写 interface
- 编写一个 interface 对刚刚的实体类进行使用,代码如下:
package com.myCode.dao; import com.myCode.bean.UserBean; import java.util.List; public interface UserDAO { // 查询 users 表中所有数据的方法 public List<UserBean> getAllUser(); // 根据用户 id 查询用户所有信息 public List<UserBean> getUserById(int uId); // 修改方法 public void updateUser(UserBean userBean); // 删除方法 public void delUser(int uId); }
3.3、创建一个 Mapper 配置文件
- 新建一个 xml 文件用于配置 Mybatis 的 Mapper,代码如下:
<?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.myCode.dao.UserDAO"> <select id="getAllUser" resultType="userBean"> select * from users </select> <select id="getUserById" resultType="userBean" parameterType="int"> select * from users where uId = #{id} </select> <select id="updateUser" parameterType="userBean"> update users set uName=#{uName},uAge=#{uAge} where uId=#{uId} </select> <delete id="delUser" parameterType="int"> delete from users where uId=#{id} </delete> </mapper>
3.4、配置 SqlSessionFactory
- 回到 application.xml 文件中,增加如下代码:
<!-- 配置SqlSessionFactory --> <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean"> <property name="dataSource" ref="dataSource"/> <property name="mapperLocations"> <list> <value>classpath:com/myCode/mapper/*-Mapper.xml</value> </list> </property> <property name="typeAliasesPackage" value="com.myCode.bean"/> </bean>
4、编写持久层
- 这一步主要编辑两个 daoImpl 方法,需要用到 MyBatis 的 SqlSessionFactory 对象并从中获取 SqlSession于映射实例,代码如下:
package com.myCode.dao.impl; import org.apache.ibatis.session.SqlSession; import org.apache.ibatis.session.SqlSessionFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Repository; @Repository public class BaseDaoImpl<T> { // 声明 SqlSessionFactory @Autowired private SqlSessionFactory sqlSessionFactory; // 声明 SqlSession protected SqlSession sqlSession; // 声明 Mapper 属性 private Class<T> mapper; // 为 mapper 创建 get set public T getMapper(){ return sqlSessionFactory.openSession().getMapper(mapper); } public void setMapper(Class<T> mapper) { this.mapper = mapper; } }
package com.myCode.dao.impl; import com.myCode.bean.UserBean; import com.myCode.dao.UserDAO; import org.springframework.stereotype.Repository; import java.util.List; @Repository public class UserDAOImpl extends BaseDaoImpl<UserDAO> implements UserDAO { public UserDAOImpl(){ super(); this.setMapper(UserDAO.class); } @Override public List<UserBean> getAllUser(){ return this.getMapper().getAllUser(); } @Override public List<UserBean> getUserById(int id){ return this.getMapper().getUserById(id); } @Override public void updateUser(UserBean userBean){ this.getMapper().updateUser(userBean); } @Override public void delUser(int id){ this.getMapper().delUser(id); } }
5、编写业务层
- 首先新建一个 Service 的 interface,代码如下:
package com.myCode.service; import com.myCode.bean.UserBean; import java.util.List; public interface UserService { // 查询 users 表中所有数据的方法 public List<UserBean> getAllUser(); // 根据用户 id 查询用户所有信息 public List<UserBean> getUserById(int uId); // 修改方法 public void updateUser(UserBean userBean); // 删除方法 public void delUser(int uId); }
- 接着编写它的实现类
package com.myCode.service; import com.myCode.bean.UserBean; import com.myCode.dao.UserDAO; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import java.util.List; @Service("userService") public class UserServiceImpl implements UserService{ @Autowired UserDAO userDAO; public List<UserBean> getAllUser(){ return userDAO.getAllUser(); } public List<UserBean> getUserById(int uId){ return userDAO.getUserById(uId); } public void updateUser(UserBean userBean){ userDAO.updateUser(userBean); } public void delUser(int uId){ userDAO.delUser(uId); } }
6、编写控制层
- 创建一个 controller 类,用于管理映射等
package com.myCode.controller; import com.myCode.bean.UserBean; import com.myCode.service.UserService; import org.apache.ibatis.annotations.Param; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.servlet.ModelAndView; import java.util.List; @Controller @RequestMapping("userController") public class UserController { @Autowired UserService userDao; @RequestMapping("/getAllUser") public ModelAndView getAllUser() { //创建一个List集合用于接收Service层方法的返回值 List<UserBean> listUser = userDao.getAllUser(); //创建一个ModelAndView对象 括号里面的参数是指定要跳转到哪个jsp页面 ModelAndView mav = new ModelAndView("getAll"); //通过addObject()方法 我们把要存的值存了进去。 mav.addObject("listUser", listUser); //最后把ModelAndView对象返回出去 return mav; } @RequestMapping("/getUserById") public ModelAndView getUserById(@Param("uId")Integer uId) { ModelAndView mav = new ModelAndView("toUpdate"); List<UserBean> list = userDao.getUserById(uId); mav.addObject("list", list); return mav; } @RequestMapping("/updateUser") public String toUpdate(UserBean usersBean){ userDao.updateUser(usersBean); return "forward:getAllUser"; } public String delUser(@Param("uId")Integer uId) { userDao.delUser(uId); return "forward:getAllUser"; } }
7、配置 SpringMVC
- 在 web/WEB-INF 目录下,新建一个 SpringMVC.xml 文件,用于配置 SpringMVC,文件代码如下:
<?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-4.0.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.0.xsd http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-4.0.xsd"> <!-- 配置视图解析器 --> <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"> <property name="prefix" value="/jsp/"/> <property name="suffix" value=".jsp"/> </bean> <!-- 配置静态资源加载 --> <mvc:resources location="/jsp" mapping="/jsp/**"/> <mvc:resources location="/js" mapping="/js/**"/> <mvc:resources location="/css" mapping="/css/**"/> <mvc:resources location="/img" mapping="/img/**"/> <!-- 扫描控制器 --> <context:component-scan base-package="com.myCode.controller"/> <!-- 配置指定的控制器--> <bean id="userController" class="com.myCode.controller.UserController"/> <!-- 自动扫描组件 --> <mvc:annotation-driven/> <mvc:default-servlet-handler/> </beans>
8、建立 JSP 页面
- 建立几个简单的 JSP 页面用于响应事务,分别如下:
- getAll.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %> <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> <html> <head> <title>获取所有用户信息</title> </head> <body> <table> <tr> <td> 序号 </td> <td> 姓名 </td> <td> 年龄 </td> <td> 操作 </td> </tr> <c:forEach items="${listUser}" var ="list"> <tr> <td> ${list.uId } </td> <td> ${list.uName } </td> <td> ${list.uAge } </td> <td> <input type="button" value="修改" onclick="toUpdate(${list.uId})"/> </td> </tr> </c:forEach> </table> </body> </html> <script> function toUpdate(id){ location.href="getUserById?uId="+id; } </script>
- toUpdate.sjp
<%@ page contentType="text/html;charset=UTF-8" language="java" %> <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> <html> <head> <title>更新用户信息</title> </head> <body> <form action="${pageContext.request.contextPath}/userController/updateUser" method="post"> <c:forEach items="${list }" var="list"> <table> <tr> <Td> 序号:<label> <input type="text" name="uId" value="${list.uId }" disabled="disabled"/> </label> <input type="hidden" name="uId" value="${list.uId }"/> </Td> </tr> <tr> <td> 姓名:<label> <input type="text" name="uName" value="${list.uName }"/> </label> </td> </tr> <tr> <Td> 年龄:<label> <input type="text" name="uAge" value="${list.uAge }"/> </label> </Td> </tr> <tr> <td> <input type="submit" value="提交"/> </td> </tr> </table> </c:forEach> </form> </body> </html>
- index.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %> <html> <head> <title>SSM 框架测试</title> </head> <body> <input type="button" value="查询所有" onclick="toGetAll()"/> <script type="text/javascript"> function toGetAll(){ location.href="userController/getAllUser"; } </script> </body> </html>
9、完成 webxml 和 application.xml 的配置:
- application.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" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.0.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.0.xsd"> <!-- c3p0连接池 --> <context:property-placeholder location="classpath:db.properties"/> <bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource"> <property name="user" value="${user}"/> <property name="password" value="${password}"/> <property name="driverClass" value="${driverClass}"/> <property name="jdbcUrl" value="${url}"/> </bean> <!-- 配置SqlSessionFactory --> <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean"> <property name="dataSource" ref="dataSource"/> <property name="mapperLocations"> <list> <value>classpath:com/myCode/mapper/*-Mapper.xml</value> </list> </property> <property name="typeAliasesPackage" value="com.myCode.bean"/> </bean> <!-- 自动配置dao层(dao层的Mapper可以直接通过spirng注入) --> <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer"> <property name="basePackage" value="com.myCode.mapper"/> <property name="sqlSessionFactoryBeanName" value="sqlSessionFactory"/> </bean> <!-- 自动扫描bean ,把做了注解的类转为bean(使用这句话就可以用spring注解) --> <context:component-scan base-package="com.myCode"/> <context:annotation-config/> <!-- 事务配置 --> <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> <property name="dataSource" ref="dataSource"/> </bean> </beans>
- web.xml 文件如下:
<?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"> <display-name>SSM</display-name> <!-- 配置监听程序 --> <listener> <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> </listener> <!-- 初始化Spring配置文件 --> <context-param> <param-name>contextConfigLocation</param-name> <param-value>classpath:application.xml</param-value> </context-param> <!-- 配置控制器 --> <servlet> <servlet-name>SpringMVC</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <!-- 初始化控制器 --> <init-param> <param-name>contextConfigLocation</param-name> <param-value>/WEB-INF/SpringMVC.xml</param-value> </init-param> </servlet> <!-- 控制器映射 --> <servlet-mapping> <servlet-name>SpringMVC</servlet-name> <url-pattern>/</url-pattern> </servlet-mapping> <filter> <filter-name>characterEncodingFilter</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>characterEncodingFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> </web-app>
10、部署运行
- 部署到 Tomcat 上面运行,首先访问的是 index.jsp 页面,显示如下:
- 点击按钮,控制层的控制器将映射到 userController/getAllUser,而该方法的表现层页面就是 getAll.jsp,浏览器最终显示如下:
- 此时点击修改,控制层又重新映射,映射路径为 userController/getUserById?uId,对应表现层的 toUpdate.jsp 页面,浏览器显示如下:
- 同样将年龄修改成 23 后,点击提交,控制层将路径映射到 /userController/updateUser,而目标方法中由于 return “forward:getAllUser”; 语句的作用,将页面重新映射会上一个页面:getAllUser,最终浏览器显示如下:
- 最后贴上我这个项目的 GitHub 地址: