SSM(Spring,SpringMVC,MyBatis)框架整合 项目搭建

SSM框架整合 项目搭建

数据库准备

CREATE DATABASE /*!32312 IF NOT EXISTS*/`test_ssm` /*!40100 DEFAULT CHARACTER SET utf8 */ /*!80016 DEFAULT ENCRYPTION='N' */;

USE `test_ssm`;

/*Table structure for table `tbl_employee` */

DROP TABLE IF EXISTS `tbl_employee`;

CREATE TABLE `tbl_employee` (
  `id` int NOT NULL AUTO_INCREMENT,
  `last_name` varchar(50) DEFAULT NULL,
  `email` varchar(50) DEFAULT NULL,
  `salary` double(10,2) DEFAULT NULL,
  `dept_id` int DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=311 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;

/*Data for the table `tbl_employee` */

insert  into `tbl_employee`(`id`,`last_name`,`email`,`salary`,`dept_id`) values (1,'zhanghao','zhanghao@163.com',16666.00,3),(2,'huahua','huahua@163.com',18000.00,4),(5,'zhangsan','zs@163.com',10000.00,1),(6,'lisi','lisi@163.com',10000.00,1),(7,'ww','ww@163.com',10000.00,2),(8,'zl','zl@163.com',10000.00,2),(9,'qianqi','qq@163.com',16000.00,4),(10,'yuanyuan','yy@163.com',15000.00,1),(11,'yuanyuan2','yy@163.com',15000.00,1),(12,'yuanyuan3','yy@163.com',15000.00,1),(13,'yuanyuan4','yy@163.com',15000.00,1),(14,'yuanyuan5','yy@163.com',15000.00,1),(15,'yuanyuan6','yy@163.com',15000.00,1),(16,'yuanyuan22','yy@163.com',15000.00,1),(17,'yuanyuan33','yy@163.com',15000.00,1),(18,'yuanyuan44','yy@163.com',15000.00,1),(19,'yuanyuan55','yy@163.com',15000.00,1),(20,'yuanyuan','yy@163.com',15000.00,1),(21,'yuanyuan2','yy@163.com',15000.00,1),(22,'yuanyuan3','yy@163.com',15000.00,1),(23,'yuanyuan4','yy@163.com',15000.00,1),(24,'yuanyuan5','yy@163.com',15000.00,1),(25,'yuanyuan6','yy@163.com',15000.00,1),(26,'yuanyuan22','yy@163.com',15000.00,1),(27,'yuanyuan33','yy@163.com',15000.00,1),(28,'yuanyuan44','yy@163.com',15000.00,1),(29,'yuanyuan55','yy@163.com',15000.00,1),(30,'yuanyuan','yy@163.com',15000.00,1),(31,'yuanyuan2','yy@163.com',15000.00,1),(32,'yuanyuan3','yy@163.com',15000.00,1),(33,'yuanyuan4','yy@163.com',15000.00,1),(34,'yuanyuan5','yy@163.com',15000.00,1),(35,'yuanyuan6','yy@163.com',15000.00,1),(36,'yuanyuan22','yy@163.com',15000.00,1),(37,'yuanyuan33','yy@163.com',15000.00,1),(38,'yuanyuan44','yy@163.com',15000.00,1),(39,'yuanyuan55','yy@163.com',15000.00,1),(40,'yuanyuan','yy@163.com',15000.00,1),(41,'yuanyuan2','yy@163.com',15000.00,1),(42,'yuanyuan3','yy@163.com',15000.00,1),(43,'yuanyuan4','yy@163.com',15000.00,1),(44,'yuanyuan5','yy@163.com',15000.00,1),(45,'yuanyuan6','yy@163.com',15000.00,1),(46,'yuanyuan22','yy@163.com',15000.00,1),(47,'yuanyuan33','yy@163.com',15000.00,1),(48,'yuanyuan44','yy@163.com',15000.00,1),(49,'yuanyuan55','yy@163.com',15000.00,1),(50,'颜胜','yanshegn@s.com',8000.00,4),(51,'颜胜','yanshegn@s.com',8000.00,4),(52,'颜胜','yanshegn@s.com',8000.00,4),(53,'颜胜','yanshegn@s.com',8000.00,4),(54,'颜胜','yanshegn@s.com',8000.00,4),(55,'颜胜','yanshegn@s.com',8000.00,4),(56,'颜胜','yanshegn@s.com',8000.00,4),(57,'颜胜','yanshegn@s.com',8000.00,4),(58,'颜胜','yanshegn@s.com',8000.00,4),(59,'颜胜','yanshegn@s.com',8000.00,4),(60,'颜胜','yanshegn@s.com',8000.00,4),(61,'颜胜','yanshegn@s.com',8000.00,4),(62,'颜胜','yanshegn@s.com',8000.00,4),(63,'颜胜','yanshegn@s.com',8000.00,4),(64,'颜胜','yanshegn@s.com',8000.00,4),(65,'颜胜','yanshegn@s.com',8000.00,4);

/*!40101 SET SQL_MODE=@OLD_SQL_MODE */;
/*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */;
/*!40014 SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS */;
/*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */;

操作步骤:

​ 这里以 员工信息查询 为例

1. 新建maven工程

image-20220906020433956

image-20220906020503810

image-20220906020522573

image-20220906015210022

创建完成

2. 给模块整合Web框架

2.1 构建webapp/WEB-INF/web.xml

image-20220906023026721

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">
</web-app>
2.2 指定部署描述符路径(web.xml路径)

image-20220906020400050

image-20220906020321761

image-20220906020838341

image-20220906021236402

image-20220906021308174

2.3 指定资源目录(webapp路径)

image-20220906021821342

image-20220906021925129

image-20220906022008702

image-20220906022033684

image-20220906022415582

2.4 手动打war包

image-20220906020400050

image-20220906022621334

image-20220906022639321

image-20220906022706849

3. pom.xml 设置

3.1 设置打包方式 war
    <!--设置打包方式-->
    <packaging>war</packaging>

image-20220906023123928

3.2 添加依赖(添加坐标,导入jar包)

image-20220906023637339

<dependencies>

    <!--spring-webmvc-->
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-webmvc</artifactId>
        <version>5.3.1</version>
    </dependency>

    <!-- 导入thymeleaf与spring5的整合包 -->
    <dependency>
        <groupId>org.thymeleaf</groupId>
        <artifactId>thymeleaf-spring5</artifactId>
        <version>3.0.12.RELEASE</version>
    </dependency>

    <!--servlet-api-->
    <dependency>
        <groupId>javax.servlet</groupId>
        <artifactId>javax.servlet-api</artifactId>
        <version>4.0.1</version>
        <scope>provided</scope>
    </dependency>

    <!--mybatis-->
    <dependency>
        <groupId>org.mybatis</groupId>
        <artifactId>mybatis</artifactId>
        <version>3.5.7</version>
    </dependency>

    <!-- pagehelper 分页-->
    <dependency>
        <groupId>com.github.pagehelper</groupId>
        <artifactId>pagehelper</artifactId>
        <version>5.1.8</version>
    </dependency>

    <!--logback 日志-->
    <dependency>
        <groupId>ch.qos.logback</groupId>
        <artifactId>logback-classic</artifactId>
        <version>1.2.3</version>
    </dependency>

    <!--导入druid的jar包-->
    <dependency>
        <groupId>com.alibaba</groupId>
        <artifactId>druid</artifactId>
        <version>1.1.10</version>
    </dependency>

    <!--导入mysql的jar包-->
    <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
        <version>8.0.26</version>
    </dependency>

    <!--spring-orm-->
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-orm</artifactId>
        <version>5.3.1</version>
    </dependency>

    <!--mybatis-->
    <dependency>
        <groupId>org.mybatis</groupId>
        <artifactId>mybatis-spring</artifactId>
        <version>2.0.6</version>
    </dependency>

    <!--lombok  -->
    <dependency>
        <groupId>org.projectlombok</groupId>
        <artifactId>lombok</artifactId>
        <version>1.18.12</version>
        <scope>provided</scope>
    </dependency>

    <!-- Junit5 测试框架 -->
    <dependency>
        <groupId>org.junit.jupiter</groupId>
        <artifactId>junit-jupiter-api</artifactId>
        <version>5.7.0</version>
        <scope>test</scope>
    </dependency>
    

</dependencies>

4. 配置文件

配置文件的目录结构 :

image-20220906031506895

代码如下 :

4.1 ( webapp/WEB-INF/ ) 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">
    <!--    web.xml  配 置 文 件   -->

    <!-- 1. 设置 ContextConfigLocation 上下文参数  设置 spring 配置文件路径 -->
    <context-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>classpath:spring.xml</param-value>
    </context-param>

    <!-- 2. 注册 ContextLoaderListener 监听器 管理 spring 容器对象 -->
    <listener>
        <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
    </listener>

    <!-- 3. 注册字符编码过滤器 CharacterEncodingFilter -->
    <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>forceRequestEncoding</param-name>
            <param-value>true</param-value>
        </init-param>
    </filter>
    <filter-mapping>
        <filter-name>CharacterEncodingFilter</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>

    <!-- 4. 注册 HiddenHttpMethodFilter -->
    <filter>
        <filter-name>HiddenHttpMethodFilter</filter-name>
        <filter-class>org.springframework.web.filter.HiddenHttpMethodFilter</filter-class>
    </filter>
    <filter-mapping>
        <filter-name>HiddenHttpMethodFilter</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>

    <!-- 5. 注册 DispatcherServlet -->
    <servlet>
        <servlet-name>DispatcherServlet</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <init-param>
            <param-name>contextConfigLocation</param-name>
            <param-value>classpath:springmvc.xml</param-value>
        </init-param>
        <load-on-startup>1</load-on-startup>
    </servlet>
    <servlet-mapping>
        <servlet-name>DispatcherServlet</servlet-name>
        <url-pattern>/</url-pattern>
    </servlet-mapping>

</web-app>
4.2 resources 资源
( 1 ) db.properties
db.driverClassName=com.mysql.cj.jdbc.Driver
db.url=jdbc:mysql://localhost:3306/test_ssm?useUnicode=true&characterEncoding=UTF-8&rewriteBatchedStatements=true
db.username=root
db.password=root
( 2 ) logback.xml
<?xml version="1.0" encoding="UTF-8"?>
<configuration debug="true">
    <!-- 指定日志输出的位置 -->
    <appender name="STDOUT"
              class="ch.qos.logback.core.ConsoleAppender">
        <encoder>
            <!-- 日志输出的格式 -->
            <!-- 按照顺序分别是:时间、日志级别、线程名称、打印日志的类、日志主体内容、换行 -->
            <pattern>[%d{HH:mm:ss.SSS}] [%-5level] [%thread] [%logger] [%msg]%n</pattern>
        </encoder>
    </appender>
    <!-- 设置全局日志级别。日志级别按顺序分别是:DEBUG、INFO、WARN、ERROR -->
    <!-- 指定任何一个日志级别都只打印当前级别和后面级别的日志。 -->
    <root level="INFO">
        <!-- 指定打印日志的appender,这里通过“STDOUT”引用了前面配置的appender -->
        <appender-ref ref="STDOUT" />
    </root>
    <!-- 根据特殊需求指定局部日志级别 -->
    <logger name="org.springframework.web.servlet.DispatcherServlet" level="DEBUG" />
    <!--包级别的日志设置 -->
    <logger name="com.itdamu.myssm.controller" level="DEBUG"></logger>
    <logger name="com.itdamu.myssm.serivce" level="DEBUG"></logger>
    <logger name="com.itdamu.myssm.mapper" level="DEBUG"></logger>

</configuration>
( 3 ) spring.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:tx="http://www.springframework.org/schema/tx"
       xmlns:mybatis-spring="http://mybatis.org/schema/mybatis-spring"
       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
       http://mybatis.org/schema/mybatis-spring
       http://mybatis.org/schema/mybatis-spring.xsd">

    <!-- spring.xml 配 置 文 件 -->


    <!-- 1. 开启组件扫描,排除Controller层 -->
    <context:component-scan base-package="com.itdamu.myssm">
        <context:exclude-filter type="annotation" expression="org.springframework.stereotype.Controller"/>
    </context:component-scan>

    <!-- 2. 加载外部数据文件 -->
    <context:property-placeholder location="classpath:db.properties"></context:property-placeholder>

    <!-- 3. 装配Druid数据文件 -->
    <bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource">
        <property name="driverClassName" value="${db.driverClassName}"/>
        <property name="url" value="${db.url}"/>
        <property name="username" value="${db.username}"/>
        <property name="password" value="${db.password}"/>
    </bean>

    <!-- 4. 装配事务管理器 -->
    <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
        <property name="dataSource" ref="dataSource"/>
    </bean>

    <!-- 5. 开启注解支持 -->
    <tx:annotation-driven transaction-manager="transactionManager"></tx:annotation-driven>

    <!-- 6. 装配SqlSessionFactoryBean 管理SqlSessionFactory -->
    <bean class="org.mybatis.spring.SqlSessionFactoryBean">
    <!-- 6.1 设置数据源 -->
        <property name="dataSource" ref="dataSource"></property>
        <!-- 6.2 设置别名 -->
        <property name="typeAliasesPackage" value="com.itdamu.myssm.pojo"></property>
        <!-- 6.3 设置映射文件 -->
        <property name="mapperLocations" value="classpath:mappers/*.xml"/>
        <!-- 6.4 设置配置 类似于mybatis中的setting -->
        <property name="configuration">
            <bean class="org.apache.ibatis.session.Configuration">
                <!-- 6.4.1 开启驼峰式自动映射 -->
                <property name="mapUnderscoreToCamelCase" value="true"/>
                <!-- 6.4.2 开启延迟加载 -->
                <property name="lazyLoadingEnabled" value="true"/>
                <!-- 6.4.3 关闭激进式加载 -->
                <property name="aggressiveLazyLoading" value="false"/>
            </bean>
        </property>

        <!-- 6.5 添加插件 -->
        <property name="plugins">
            <array>
                <bean class="com.github.pagehelper.PageInterceptor">
                    <property name="properties">
                        <props>
                            <!-- 设置resonable 为 true 表示将页码进行合理化修正. 页码的有效范围:1~总页数 -->
                            <prop key="reasonable">true</prop>
                            <!--数据库方言: 同样是SQL语句,拿到不同数据库中,在语法上会有差异-->
                            <!--默认情况下,按照 MySQL 作为数据库方言来运行-->
                            <prop key="helperDialect">mysql</prop>
                        </props>
                    </property>
                </bean>
            </array>
        </property>
    </bean>
    <!-- 7. 装配MapperScannerConfigurer管理代理对象 -->
    <mybatis-spring:scan base-package="com.itdamu.myssm.mapper"></mybatis-spring:scan>

</beans>
( 4 ) 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
       https://www.springframework.org/schema/context/spring-context.xsd
       http://www.springframework.org/schema/mvc
       https://www.springframework.org/schema/mvc/spring-mvc.xsd">

    <!-- springmvc.xml 配 置 文 件 -->


    <!--1. 开启组件扫描,只扫描Controller -->
    <context:component-scan base-package="com.itdamu.myssm"
                            use-default-filters="false">
        <context:include-filter type="annotation" expression="org.springframework.stereotype.Controller"/>
    </context:component-scan>

    <!--2. 装配视图解析器: ThymeleafViewResolver -->
    <bean class="org.thymeleaf.spring5.view.ThymeleafViewResolver">
        <property name="characterEncoding" value="UTF-8"/>
        <property name="templateEngine">
            <bean class="org.thymeleaf.spring5.SpringTemplateEngine">
                <property name="templateResolver">
                    <bean class="org.thymeleaf.spring5.templateresolver.SpringResourceTemplateResolver">
                        <property name="characterEncoding" value="UTF-8"/>
                        <property name="prefix" value="/WEB-INF/pages/"/>
                        <property name="suffix" value=".html"/>
                    </bean>
                </property>
            </bean>
        </property>
    </bean>

    <!--3. 装配视图控制器 -->
    <mvc:view-controller path="/" view-name="index"/>

    <!--4. 解决静态资源加载问题 -->
    <mvc:default-servlet-handler/>

    <!--5. 装配annotation-driven -->
    <mvc:annotation-driven/>


</beans>
( 5 ) mappers(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">
<!--注意三个一致-->
    <!--1. 文件名与mapper名一致-->
    <!--2. namespace与mapper全类名一致-->
    <!--3. id属性与方法名一致-->
<mapper namespace="com.itdamu.myssm.mapper.EmpMapper">
    <!-- 书写sql 语句-->
    <select id="selectAllEmp" resultType="employee">
        SELECT
            id,
            last_name,
            email,
            salary
        FROM
            tbl_employee
    </select>

</mapper>

5. 后端代码(src/main/java/com/xxx/ssm/)

后端代码目录结构 :

image-20220906032324470

代码如下 :

5.1 pojo包(数据bean)

Employee.java

package com.itdamu.myssm.pojo;

import lombok.*;
/**
 * @author damu
 * @date 2022/9/5 19:06
 */
@Data
@NoArgsConstructor
@AllArgsConstructor
public class Employee {

    private Integer id;
    private String lastName;   //last_name
    private String email;
    private Double salary;

}

5.2 mapper包(数据访问层)

EmpMapper.java

package com.itdamu.myssm.mapper;


import com.itdamu.myssm.pojo.Employee;
import org.springframework.stereotype.Controller;

import java.util.List;

/**
 * @author damu
 * @date 2022/9/5 23:16
 */
@Controller("empMapper")
public interface EmpMapper {

    public List<Employee> selectAllEmp();

}

5.3 service包(业务逻辑层)

EmpService.java

package com.itdamu.myssm.service;


import com.itdamu.myssm.pojo.Employee;

import java.util.List;

/**
 * @author damu
 * @date 2022/9/6 0:16
 */
public interface EmpService {
    /**
     * 查询所有员工信息
     */
    public List<Employee> getAllEmps();

}

EmpServiceImpl.java

package com.itdamu.myssm.service.impl;


import com.itdamu.myssm.mapper.EmpMapper;
import com.itdamu.myssm.pojo.Employee;
import com.itdamu.myssm.service.EmpService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.stereotype.Service;

import java.util.List;

/**
 * @author damu
 * @date 2022/9/6 0:18
 */
@Service("empService")
public class EmpServiceImpl implements EmpService {

    @Autowired
    @Qualifier("empMapper")
    private EmpMapper empMapper;


    @Override
    public List<Employee> getAllEmps() {
        return empMapper.selectAllEmp();
    }
}

5.4 controller包(表示层[控制层])

EmoControllerImps.java

package com.itdamu.myssm.controller;


import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import com.itdamu.myssm.pojo.Employee;
import com.itdamu.myssm.service.EmpService;
import com.itdamu.myssm.utils.PageUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;

import javax.servlet.http.HttpServletRequest;
import java.util.List;
import java.util.Map;

/**
 * @author damu
 * @date 2022/9/6 0:20
 */
@Controller
public class EmoControllerImps {

    @Autowired
    @Qualifier("empService")
    private EmpService empService;

    @GetMapping("/emps/{pageNum}")
    public String toListPage(Map<String, Object> map,
                             HttpServletRequest request,
                             @PathVariable("pageNum")Integer pageNum) {

        int pNum = 1;
        if (pageNum != null) {
            pNum = pageNum;
        }

        // 在查询前开启分页
        PageHelper.startPage(pageNum, 5);

        // 调用Service层 查询数据
        List<Employee> empList = empService.getAllEmps();

        // 封装pageInfo
        PageInfo<Employee> pageInfo = new PageInfo<>(empList, 5);
        String pageRs = PageUtils.getPageInfo(pageInfo, request);
        empList = pageInfo.getList();
        System.out.println("empList = " + empList);
        // 共享数据到域中
        map.put("empList",empList);
        map.put("pageRs", pageRs);

        // 跳转界面
        return "emp/list";
    }
}
5.5 utils包(工具包)

PageUtils.java

package com.itdamu.myssm.utils;


import com.github.pagehelper.PageInfo;
import com.itdamu.myssm.pojo.Employee;

import javax.servlet.http.HttpServletRequest;

/**
 * @author damu
 * @date 2022/9/6 0:26
 */
public class PageUtils {
    /**
     *  将分页功能所有信息拼接到一个字符串中,作为返回结果,直接传递到jsp页面使用,拼接效果如下:
     *  首页   上一页   1  2  3  4  5  下一页  尾页
     */
    public static  String  getPageInfo(PageInfo<Employee> pageInfo , HttpServletRequest request ) {
        //String basePath = "/当前项目名/";
        String basePath = request.getContextPath() + "/";

        //定义结果字符串StringBuilder
        StringBuilder builder =  new StringBuilder();

        //拼接首页
        builder.append("<a href='"+basePath+"emps/1'>首页</a>");
        builder.append("&nbsp;&nbsp;");

        //拼接上一页
        if(pageInfo.isHasPreviousPage()) {
            builder.append("<a href='"+basePath+"emps/"+(pageInfo.getPageNum()-1)+"'>上一页</a>");
            builder.append("&nbsp;&nbsp;");
        }else {
            builder.append("上一页");
            builder.append("&nbsp;&nbsp;");
        }

        //拼接页码超链接  1 2 3 4 5
        int [] nums = pageInfo.getNavigatepageNums();
        for (int i : nums) {
            if(i == pageInfo.getPageNum()) {
                builder.append("<a style='text-decoration: none;' href='"+basePath+"emps/"+i+"'><font style='color:#FFD700;'>"+ i +"</font></a>");
                builder.append("&nbsp;&nbsp;");
            }else {
                builder.append("<a href='"+basePath+"emps/"+i+"'>"+ i +"</a>");
                builder.append("&nbsp;&nbsp;");
            }
        }

        //拼接下一页
        if(pageInfo.isHasNextPage()) {
            builder.append("<a href='"+basePath+"emps/"+(pageInfo.getPageNum()+1)+"'>下一页</a>");
            builder.append("&nbsp;&nbsp;");
        }else {
            builder.append("下一页");
            builder.append("&nbsp;&nbsp;");
        }

        //拼接尾页
        builder.append("<a href='"+basePath+"emps/"+pageInfo.getPages()+"'>尾页</a>");

        return builder.toString();
    }
}

6. 前端代码(src/main/webapp/)

前端代码目录结构:

image-20220906032927260

代码如下:

6.1服务器内部(WEB-INF/)
(1) pages(一般将html页面放在pages下)
index(首页)
<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
    <meta charset="UTF-8">
    <title>首页</title>
</head>
<body>
<h2>首页</h2>
<a th:href="@{/emps/1}">查看员工信息</a>

</body>
</html>
(2) 其它页面

list.html

<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<div align="center">
    <div>
        <h2>员工信息</h2>
        <table border="1" cellspacing="0" width="650px" height="450px">
            <tr>
                <th>员工编号</th>
                <th>员工姓名</th>
                <th>员工邮箱</th>
                <th>员工薪资</th>
                <th>员工部门</th>
                <th colspan="2">编辑</th>
            </tr>
            <tr th:each="emp:${empList}">
                <td th:text="${emp.id}"></td>
                <td th:text="${emp.lastName}"></td>
                <td th:text="${emp.email}"></td>
                <td th:text="${emp.salary}"></td>
                <td th:text="垃圾部门"></td>
                <td><a th:href="@{/#}">修改</a></td>
                <td><a th:href="@{/#}">删除</a></td>
            </tr>
        </table>
        <div th:utext="${pageRs}"></div>
    </div>
    <div>
        <a th:href="@{/#}">添加员工信息</a>
    </div>
</div>
</body>
</html>
6.2 静态资源(static)

暂无

(1) js(JavaScript代码)
(2) css(CSS层叠样式表)
(3) image(图象资源)
(4) 其它静态资源

总体目录结构:

image-20220906032146878

运行效果

image-20220906033519472

image-20220906033528823

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

大木学长

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值