JavaWeb——SSM框架学习(1)

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 地址:

Github 仓库连接

上一篇
下一篇

发布了146 篇原创文章 · 获赞 15 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/qq_42896653/article/details/104024809