• 22-06-22 ssm终章 ssm整合、实现分页功能


    spring和springmvc可以使用同一个配置文件,但是建议分开。所谓整合就是把spring和springmvc分开各自管理自己的内容。

    1、创建maven工程
    2、导入依赖
    3、配置web.xml
    4、搭建SpringMVC框架
    5、配置Spring的配置文件(扫描组件、引入jdbc.properties、配置数据源)
    6、搭建MyBatis框架
    7、Spring整合MyBatis


    一、编写web.xml

    虽然老师是一行一行敲出来的,但是这东西能看得懂会改就行,建议直接复制。

    前置知识1:

    在服务器启动时获取springmvc ioc容器,自动装配就必须完成,

    那么怎么保证Contoller中的service能装配成功呢?即怎么让spring容器的获取一定要早于springmvc容器获取

    过滤器和监听器都可以,但是建议用监听器。我们想到ServletContextListener它的初始化是最早执行的,服务器启动时执行。

    监听器相关知识传送点:

    22-05-31 西安 javaweb(12) 监听器listener和过滤器filter、编码过滤器、登录过滤器、事务过滤器_£小羽毛的博客-CSDN博客

    spring当然也想到了,就给我提供了这样一个监听器ContextLoaderListener

    方法内容:

    1. @Override
    2. public void contextInitialized(ServletContextEvent event) {
    3. initWebApplicationContext(event.getServletContext());
    4. }

    创建了spring 的ioc容器,并把spring的ioc容器创建之后也会共享到应用域


    前置知识2:

    spring的配置文件默认的位置 WEB-INF下,默认名称 applicationContext.xml

    <context-param>自定义spring的配置文件位置和名称

    servlet相关知识传送点:

    22-05-20 西安 javaweb(06) Servlet入门案例、ServletConfig 、Servlet的生命周期、ServletContext 、快速创建servlet类_£小羽毛的博客-CSDN博客

    前置知识3:

    SpringMVC的IOC容器和Spring的IOC容器的关系?
    Spring的IOC容器是SpringMVC的IOC容器的父容器,子容器可以访问父容器中的bean,但是反之不行

     web.xml

    1. <?xml version="1.0" encoding="UTF-8"?>
    2. <web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
    3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    4. xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
    5. version="4.0">
    6. <!--配置编码过滤器-->
    7. <filter>
    8. <filter-name>CharacterEncodingFilter</filter-name>
    9. <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
    10. <init-param>
    11. <param-name>encoding</param-name>
    12. <param-value>UTF-8</param-value>
    13. </init-param>
    14. <init-param>
    15. <param-name>forceEncoding</param-name>
    16. <param-value>true</param-value>
    17. </init-param>
    18. </filter>
    19. <filter-mapping>
    20. <filter-name>CharacterEncodingFilter</filter-name>
    21. <url-pattern>/*</url-pattern>
    22. </filter-mapping>
    23. <!--配置处理请求方式的过滤器-->
    24. <filter>
    25. <filter-name>HiddenHttpMethodFilter</filter-name>
    26. <filter-class>org.springframework.web.filter.HiddenHttpMethodFilter</filter-class>
    27. </filter>
    28. <filter-mapping>
    29. <filter-name>HiddenHttpMethodFilter</filter-name>
    30. <url-pattern>/*</url-pattern>
    31. </filter-mapping>
    32. <!--配置SpringMVC的前端控制器-->
    33. <servlet>
    34. <servlet-name>SpringMVC</servlet-name>
    35. <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    36. <!--设置SpringMVC配置文件自定义的位置和名称-->
    37. <init-param>
    38. <param-name>contextConfigLocation</param-name>
    39. <param-value>classpath:spring-mvc.xml</param-value>
    40. </init-param>
    41. <!--将DispatcherServlet的初始化时间提前到服务器启动时-->
    42. <load-on-startup>1</load-on-startup>
    43. </servlet>
    44. <servlet-mapping>
    45. <servlet-name>SpringMVC</servlet-name>
    46. <url-pattern>/</url-pattern>
    47. </servlet-mapping>
    48. <!--配置Spring的监听器,在服务器启动时加载Spring的配置文件,获取IOC容器-->
    49. <listener>
    50. <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
    51. </listener>
    52. <!--配置Spring配置文件自定义的位置和名称-->
    53. <context-param>
    54. <param-name>contextConfigLocation</param-name>
    55. <param-value>classpath:spring.xml</param-value>
    56. </context-param>
    57. </web-app>

    二、编写springmvc的配置文件spring-mvc.xml

    这个文件的位置和名称在web.xml中都是可以自定义设置的。我这里并没有配置拦截器和异常处理器,甚至多配置了一个文件上传解析器。

    SpringMVC中配置的内容:
    扫描控制层组件、视图解析器、默认的servlet、mvc的注解驱动、视图控制器
    文件上传解析器、拦截器、异常解析器

    spring-mvc.xml

    1. <?xml version="1.0" encoding="UTF-8"?>
    2. <beans xmlns="http://www.springframework.org/schema/beans"
    3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    4. xmlns:context="http://www.springframework.org/schema/context"
    5. xmlns:mvc="http://www.springframework.org/schema/mvc"
    6. xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/mvc https://www.springframework.org/schema/mvc/spring-mvc.xsd">
    7. <!--扫描控制层组件-->
    8. <context:component-scan base-package="com.atguigu.ssm.controller"></context:component-scan>
    9. <!--配置视图解析器-->
    10. <bean id="viewResolver" class="org.thymeleaf.spring5.view.ThymeleafViewResolver">
    11. <property name="order" value="1"/>
    12. <property name="characterEncoding" value="UTF-8"/>
    13. <property name="templateEngine">
    14. <bean class="org.thymeleaf.spring5.SpringTemplateEngine">
    15. <property name="templateResolver">
    16. <bean class="org.thymeleaf.spring5.templateresolver.SpringResourceTemplateResolver">
    17. <!-- 视图前缀 -->
    18. <property name="prefix" value="/WEB-INF/templates/"/>
    19. <!-- 视图后缀 -->
    20. <property name="suffix" value=".html"/>
    21. <property name="templateMode" value="HTML5"/>
    22. <property name="characterEncoding" value="UTF-8" />
    23. </bean>
    24. </property>
    25. </bean>
    26. </property>
    27. </bean>
    28. <!--配置默认的servlet处理静态资源-->
    29. <mvc:default-servlet-handler />
    30. <!--开启mvc的注解驱动-->
    31. <mvc:annotation-driven />
    32. <!--配置视图控制器-->
    33. <mvc:view-controller path="/" view-name="index"></mvc:view-controller>
    34. <!--配置文件上传解析器-->
    35. <bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver"></bean>
    36. </beans>

    三、编写spring.xml

    Spring中配置的内容:
    扫描除控制层以外的组件、引入properties文件、配置数据源、aop相关配置、配置事务管理器、开启事务的注解驱动、事务通知、整合MyBatis相关内容

    前置知识1:

    spring如何整合mybatis,就2个标签


    SqlSessionFactoryBean:配置用于创建SqlSessionFactory的工厂bean,就可以通过ioc容器直接获取SqlSessionFactory对象。

    MapperScannerConfigurer:将所指定包下的mapper接口,通过SqlSession.getMapper()创建其代理实现类对象,并将这些对象交给IOC容器管理(可以对mapper接口进行自动装配)

    1. <bean class="org.mybatis.spring.SqlSessionFactoryBean">
    2. </bean>
    3. <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
    4. </bean>

    前置知识2:

    SqlSessionFactoryBean标签中的mapperLocations属性可以不配置,什么时候需要必须配置呢?

    若mapper接口和映射文件所在的包不一致,则必须设置该标签

    1. <property name="mapperLocations" value="classpath:mapper/*.xml"></property>
    2. <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
    3. <property name="basePackage" value="com.atguigu.ssm.mapper"></property>
    4. </bean>

    spring.xml

    1. <?xml version="1.0" encoding="UTF-8"?>
    2. <beans xmlns="http://www.springframework.org/schema/beans"
    3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    4. xmlns:context="http://www.springframework.org/schema/context" xmlns:tx="http://www.springframework.org/schema/tx"
    5. xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd">
    6. <!--扫描组件(除控制层)-->
    7. <context:component-scan base-package="com.atguigu.ssm">
    8. <!--排除对控制层组件的扫描-->
    9. <context:exclude-filter type="annotation" expression="org.springframework.stereotype.Controller"/>
    10. </context:component-scan>
    11. <!--引入jdbc.properties-->
    12. <context:property-placeholder location="classpath:jdbc.properties"></context:property-placeholder>
    13. <!--配置数据源-->
    14. <bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource">
    15. <property name="driverClassName" value="${jdbc.driver}"></property>
    16. <property name="url" value="${jdbc.url}"></property>
    17. <property name="username" value="${jdbc.username}"></property>
    18. <property name="password" value="${jdbc.password}"></property>
    19. </bean>
    20. <!--配置事务管理器-->
    21. <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
    22. <property name="dataSource" ref="dataSource"></property>
    23. </bean>
    24. <!--
    25. 开启事务的注解驱动
    26. 将使用@Transactional注解标识的方法或类中所有的方法被事务进行管理
    27. -->
    28. <tx:annotation-driven transaction-manager="transactionManager" />
    29. <!--配置SqlSessionFactoryBean-->
    30. <bean class="org.mybatis.spring.SqlSessionFactoryBean">
    31. <!--设置数据源-->
    32. <property name="dataSource" ref="dataSource"></property>
    33. <!--设置MyBatis的核心配置文件(可以不设置)-->
    34. <property name="configLocation" value="classpath:mybatis-config.xml"></property>
    35. <!--设置类型别名所在的包-->
    36. <property name="typeAliasesPackage" value="com.atguigu.ssm.pojo"></property>
    37. <!--
    38. 引入映射文件
    39. 当配置了MapperScannerConfigurer时,若mapper接口和映射文件所在的包一致,则该标签可以省略不写
    40. 但是若mapper接口和映射文件所在的包不一致,则必须设置该标签
    41. -->
    42. <!--
    43. <property name="mapperLocations" value="classpath:mapper/*.xml"></property>
    44. -->
    45. </bean>
    46. <!--
    47. 配置mapper接口的扫描
    48. 将所指定包下的mapper接口,通过SqlSession.getMapper()创建其代理实现类对象
    49. 并将这些对象交给IOC容器管理
    50. -->
    51. <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
    52. <property name="basePackage" value="com.atguigu.ssm.mapper"></property>
    53. </bean>
    54. </beans>

    settings 和plugins 写在spring的配置文件会看着麻烦,不如就写在配置在核心配置文件

    mybatis-config.xml中呢

    四、编写 mybtis-config.xml

    1. <?xml version="1.0" encoding="UTF-8" ?>
    2. <!DOCTYPE configuration
    3. PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
    4. "http://mybatis.org/dtd/mybatis-3-config.dtd">
    5. <configuration>
    6. <settings>
    7. <!--将表中字段的下划线映射为驼峰-->
    8. <setting name="mapUnderscoreToCamelCase" value="true"/>
    9. </settings>
    10. <plugins>
    11. <!--配置分页插件-->
    12. <plugin interceptor="com.github.pagehelper.PageInterceptor"></plugin>
    13. </plugins>
    14. </configuration>

    jdbc.properties文件:

    1. jdbc.driver=com.mysql.cj.jdbc.Driver
    2. jdbc.url=jdbc:mysql://localhost:3306/test?serverTimezone=UTC
    3. jdbc.username=root
    4. jdbc.password=123456

    五、测试SSM,实现分页功能

    一定要在pom.xml中加pagehelper的依赖,在mybatis-config.xml中加PageInterceptor插件

    分页插件是拦截器,我们直接查询所有,该插件自动帮我们加limit关键字

    1. @Override
    2. public PageInfo<Employee> getEmployeePage(Integer pageNo) {
    3. //开启分页功能
    4. PageHelper.startPage(pageNo,4);
    5. //查询员工信息
    6. List<Employee> list = employeeMapper.getAllEmployee();
    7. //获取分页相关信息的对象
    8. PageInfo<Employee> pageInfo = new PageInfo<>(list, 5);
    9. return pageInfo;
    10. }

    注意在EmployeeMapper接口上可没有什么@Repository,不要急病乱投医

    1. public interface EmployeeMapper {
    2. /**
    3. * 获取所有的员工信息
    4. * @return
    5. */
    6. List<Employee> getAllEmployee();
    7. }

    老师说:分页功能,难在页面中跟分页相关的超链接。还好我们有pageInfo,不然真的很难

    employee_list.html:

    1. <!DOCTYPE html>
    2. <html lang="en" xmlns:th="http://www.thymeleaf.org">
    3. <head>
    4. <meta charset="UTF-8">
    5. <title>员工列表</title>
    6. <link rel="stylesheet" th:href="@{/static/css/index_work.css}">
    7. </head>
    8. <body>
    9. <table>
    10. <tr>
    11. <th colspan="6">员工列表</th>
    12. </tr>
    13. <tr>
    14. <th>流水号</th>
    15. <th>员工姓名</th>
    16. <th>年龄</th>
    17. <th>性别</th>
    18. <th>邮箱</th>
    19. <th>操作</th>
    20. </tr>
    21. <tr th:each="employee,status : ${page.list}">
    22. <td th:text="${status.count}"></td>
    23. <td th:text="${employee.empName}"></td>
    24. <td th:text="${employee.age}"></td>
    25. <td th:text="${employee.gender}"></td>
    26. <td th:text="${employee.email}"></td>
    27. <td>
    28. <a href="">删除</a>
    29. <a href="">修改</a>
    30. </td>
    31. </tr>
    32. <tr>
    33. <td colspan="6">
    34. <a th:if="${page.hasPreviousPage}" th:href="@{/employee/page/1}">首页</a>
    35. <a th:if="${page.hasPreviousPage}" th:href="@{'/employee/page/'+${page.prePage}}">上一页</a>
    36. <span th:each="num : ${page.navigatepageNums}">
    37. <a th:if="${page.pageNum}==${num}" th:href="@{'/employee/page/'+${num}}" th:text="'【'+${num}+'】'" style="color: red;"></a>
    38. <a th:if="${page.pageNum}!=${num}" th:href="@{'/employee/page/'+${num}}" th:text="${num}"></a>
    39. </span>
    40. <a th:if="${page.hasNextPage}" th:href="@{'/employee/page/'+${page.nextPage}}">下一页</a>
    41. <a th:if="${page.hasNextPage}" th:href="@{'/employee/page/'+${page.pages}}">末页</a>
    42. <span th:text="${page.total}"></span>条数据,当前<span th:text="${page.pageNum}"></span>/<span th:text="${page.pages}"></span>
    43. </td>
    44. </tr>
    45. </table>
    46. </body>
    47. </html>

    在浏览器的控制台输出pageInfo对象,也就是我们上面共享在请求域中的page, 它就长这个样子!

    点开list,就可以看到我们要循环遍历显示的员工信息了

    最终页面效果如下,经我测试,红色框里关于分页的所有功能都是好用的!高级上档次啊

  • 相关阅读:
    【MATLAB】史上最全的7种回归预测算法全家桶
    RT-Smart 应用开发笔记:fopen 造成文件被清空问题的分析记录
    docker是什么,能做什么,如何用
    js 模拟鼠标移动事件,并监听鼠标移动
    鹅长微服务发现与治理巨作PolarisMesh实践-上
    win10安装及配置Gradle
    Vue2.js迁移到Vue3.js的API变化
    安装Hadoop单节点伪分布式集群
    在 Ubuntu Server 上配置静态 IP 地址
    js版微信测试号推送消息、生日、纪念日、网易云热评、舔狗日记【JavaScript版】保姆级教程 青龙面板做微信测试号推送生日、纪念日
  • 原文地址:https://blog.csdn.net/m0_56799642/article/details/125414533