第一章:本质
- ContextLoaderListener:读取 spring-persist.xml。
- DispatcherServlet:读取 springmvc.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"> <!-- ContextLoaderListener --> <!-- 通过 context-param 指定 Spring 框架的配置文件位置 --> <context-param> <param-name>contextConfigLocation</param-name> <param-value>classpath:spring-persist.xml</param-value> </context-param> <!-- 配置 ContextLoaderListener 监听器 --> <listener> <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> </listener> <!-- 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> <!-- 需要注意两个 Filter 的顺序:字符集过滤器在前,转换请求方式过滤器在后 --> <!-- 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> <init-param> <param-name>forceResponseEncoding</param-name> <param-value>true</param-value> </init-param> </filter> <filter-mapping> <filter-name>characterEncodingFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> <!-- 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></web-app>
第三章: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" 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"> <!-- SpringMVC 只扫描 handler 类所在的包 --> <!-- Spring 和 SpringMVC 扫描各自负责的组件,扫描的范围没有重合的部分,直接避免了重复创建对象 --> <context:component-scan base-package="com.github.fairy.era.handler"/> <!-- 配置 Thymeleaf 的视图解析器 --> <bean id="thymeleafViewResolver" class="org.thymeleaf.spring5.view.ThymeleafViewResolver"> <property name="order" value="1"/> <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="prefix" value="/WEB-INF/templates/"/> <property name="suffix" value=".html"/> <property name="characterEncoding" value="UTF-8"/> <property name="templateMode" value="HTML5"/> </bean> </property> </bean> </property> </bean> <!-- SpringMVC 注解驱动(标配) --> <mvc:annotation-driven/> <!-- 对于没有映射的请求直接转发放行,主要是静态资源 --> <mvc:default-servlet-handler/> <!-- 匹配请求路径直接前往视图,不经过 handler 方法 --> <mvc:view-controller path="/" view-name="portal"/> <mvc:view-controller path="/index.html" view-name="portal"/></beans>
第四章:创建组件
package com.github.fairy.era.handler;import com.github.fairy.era.entity.Employee;import com.github.fairy.era.service.EmployeeService;import lombok.RequiredArgsConstructor;import org.springframework.stereotype.Controller;import org.springframework.ui.Model;import org.springframework.web.bind.annotation.GetMapping;import java.util.List;/** * @author 许大仙 * @version 1.0 * @since 2021-11-22 13:48 */@Controller@RequiredArgsConstructorpublic class EmployeeHandler { private final EmployeeService employeeService; @GetMapping("/get/all") public String getAll(Model model) { // 1、查询数据 List<Employee> empList = employeeService.findAll(); // 2.存入模型 model.addAttribute("empList", empList); return "emp-list"; }}
第五章:页面操作
5.1 首页超链接
<!DOCTYPE html><html lang="en" xmlns:th="http://www.thymeleaf.org"><head> <meta charset="UTF-8"> <title>Title</title></head><body> <a th:href="@{/get/all}">显示全部数据</a></body></html>
5.2 显示数据的页面
<!DOCTYPE html><html lang="en" xmlns:th="http://www.thymeleaf.org"><head> <meta charset="UTF-8"> <title>$Title$</title></head><body> <table> <tr> <th>id</th> <th>lastName</th> <th>gender</th> <th>email</th> </tr> <tbody th:if="${#lists.isEmpty(empList)}"> <tr> <td colspan="3">抱歉!没有查询到数据!</td> </tr> </tbody> <tbody th:if="${not #lists.isEmpty(empList)}"> <tr th:each="emp : ${empList}"> <td th:text="${emp.id}">这里显示员工ID</td> <td th:text="${emp.lastName}">这里显示员工lastName</td> <td th:text="${emp.gender}">这里显示员工gender</td> <td th:text="${emp.email}">这里显示员工email</td> </tr> </tbody> </table> <a th:href="@{/}">回首页</a></body></html>