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工程
创建完成
2. 给模块整合Web框架
2.1 构建webapp/WEB-INF/web.xml
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路径)
2.3 指定资源目录(webapp路径)
2.4 手动打war包
3. pom.xml 设置
3.1 设置打包方式 war
<!--设置打包方式-->
<packaging>war</packaging>
3.2 添加依赖(添加坐标,导入jar包)
<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. 配置文件
配置文件的目录结构 :
代码如下 :
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/)
后端代码目录结构 :
代码如下 :
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(" ");
//拼接上一页
if(pageInfo.isHasPreviousPage()) {
builder.append("<a href='"+basePath+"emps/"+(pageInfo.getPageNum()-1)+"'>上一页</a>");
builder.append(" ");
}else {
builder.append("上一页");
builder.append(" ");
}
//拼接页码超链接 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(" ");
}else {
builder.append("<a href='"+basePath+"emps/"+i+"'>"+ i +"</a>");
builder.append(" ");
}
}
//拼接下一页
if(pageInfo.isHasNextPage()) {
builder.append("<a href='"+basePath+"emps/"+(pageInfo.getPageNum()+1)+"'>下一页</a>");
builder.append(" ");
}else {
builder.append("下一页");
builder.append(" ");
}
//拼接尾页
builder.append("<a href='"+basePath+"emps/"+pageInfo.getPages()+"'>尾页</a>");
return builder.toString();
}
}
6. 前端代码(src/main/webapp/)
前端代码目录结构:
代码如下:
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)
暂无