1、功能需求

①访问首页

img001.png

②在首页点超链接img002.png

2、搭建环境

①导入依赖

  1. <dependencies>
  2. <!-- SpringMVC -->
  3. <dependency>
  4. <groupId>org.springframework</groupId>
  5. <artifactId>spring-webmvc</artifactId>
  6. <version>5.3.1</version>
  7. </dependency>
  8. <!-- 日志 -->
  9. <dependency>
  10. <groupId>ch.qos.logback</groupId>
  11. <artifactId>logback-classic</artifactId>
  12. <version>1.2.3</version>
  13. </dependency>
  14. <!-- ServletAPI -->
  15. <dependency>
  16. <groupId>javax.servlet</groupId>
  17. <artifactId>javax.servlet-api</artifactId>
  18. <version>3.1.0</version>
  19. <scope>provided</scope>
  20. </dependency>
  21. <!-- Spring5和Thymeleaf整合包 -->
  22. <dependency>
  23. <groupId>org.thymeleaf</groupId>
  24. <artifactId>thymeleaf-spring5</artifactId>
  25. <version>3.0.12.RELEASE</version>
  26. </dependency>
  27. </dependencies>

由于 Maven 的传递性,我们不必将所有需要的包全部配置依赖,而是配置最顶端的依赖,其他靠传递性导入。
e805a745-ea8d-4e79-be42-24c6f3ba5af0.png

②日志配置文件

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <configuration debug="true">
  3. <!-- 指定日志输出的位置 -->
  4. <appender name="STDOUT"
  5. class="ch.qos.logback.core.ConsoleAppender">
  6. <encoder>
  7. <!-- 日志输出的格式 -->
  8. <!-- 按照顺序分别是:时间、日志级别、线程名称、打印日志的类、日志主体内容、换行 -->
  9. <pattern>[%d{HH:mm:ss.SSS}] [%-5level] [%thread] [%logger] [%msg]%n</pattern>
  10. </encoder>
  11. </appender>
  12. <!-- 设置全局日志级别。日志级别按顺序分别是:DEBUG、INFO、WARN、ERROR -->
  13. <!-- 指定任何一个日志级别都只打印当前级别和后面级别的日志。 -->
  14. <root level="INFO">
  15. <!-- 指定打印日志的appender,这里通过“STDOUT”引用了前面配置的appender -->
  16. <appender-ref ref="STDOUT" />
  17. </root>
  18. <!-- 根据特殊需求指定局部日志级别 -->
  19. <logger name="org.springframework.web.servlet.DispatcherServlet" level="DEBUG" />
  20. </configuration>

③web.xml

<!-- 配置SpringMVC中负责处理请求的核心Servlet,也被称为SpringMVC的前端控制器 -->
<servlet>
    <servlet-name>DispatcherServlet</servlet-name>

    <!-- DispatcherServlet的全类名 -->
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>

    <!-- 通过初始化参数指定SpringMVC配置文件位置 -->
    <init-param>

        <!-- 如果不记得contextConfigLocation配置项的名称,可以到DispatcherServlet的父类FrameworkServlet中查找 -->
        <param-name>contextConfigLocation</param-name>

        <!-- 使用classpath:说明这个路径从类路径的根目录开始才查找 -->
        <param-value>classpath:spring-mvc.xml</param-value>
    </init-param>

    <!-- 作为框架的核心组件,在启动过程中有大量的初始化操作要做,这些操作放在第一次请求时才执行非常不恰当 -->
    <!-- 我们应该将DispatcherServlet设置为随Web应用一起启动 -->
    <load-on-startup>1</load-on-startup>

</servlet>

<servlet-mapping>
    <servlet-name>DispatcherServlet</servlet-name>

    <!-- 对DispatcherServlet来说,url-pattern有两种方式配置 -->
    <!-- 方式一:配置“/”,表示匹配整个Web应用范围内所有请求。这里有一个硬性规定:不能写成“/*”。只有这一个地方有这个特殊要求,以后我们再配置Filter还是可以正常写“/*”。 -->
    <!-- 方式二:配置“*.扩展名”,表示匹配整个Web应用范围内部分请求 -->
    <url-pattern>/</url-pattern>
</servlet-mapping>

④Spring配置文件

!-- 自动扫描包 -->
<context:component-scan base-package="com.atguigu.mvc.handler"/>

<!-- Thymeleaf视图解析器 -->
<bean id="viewResolver" 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="templateMode" value="HTML5"/>
                    <property name="characterEncoding" value="UTF-8" />
                </bean>
            </property>
        </bean>
    </property>
</bean>

3、代码实现

①创建请求处理器类

[1]名称

SpringMVC 对处理请求的类并没有特殊要求,只要是 POJO 即可。我们自己习惯上有两种命名方式:

  • XxxHandler:意思是 Xxx 处理器的意思
  • XxxController:意思是 Xxx 控制器的意思


这只是一个命名的习惯,不是语法要求。所以往往把处理请求的类叫做『Handler类』,处理请求的方法叫做『Handler方法』。

[2]创建

img004.png

@Controller
public class Demo01Hellohandler{
}

②实现访问首页

[1]创建 handler 方法

@Controller
public class Demo01HelloHandler {

    // @RequestMapping注解在请求地址和Java方法之间建立映射关系
    @RequestMapping("/")
    public String showPortal() {
        return "portal";
    }

}

[2]在首页编写超链接

                      ![img006.png](https://cdn.nlark.com/yuque/0/2022/png/25844592/1644719855282-6d712c6c-30b1-416b-9980-24c2ca20132d.png#clientId=u01cacf84-346b-4&crop=0&crop=0&crop=1&crop=1&from=drop&id=ua603f0a7&margin=%5Bobject%20Object%5D&name=img006.png&originHeight=221&originWidth=279&originalType=binary&ratio=1&rotation=0&showTitle=false&size=4963&status=done&style=none&taskId=ue9cc64de-9323-436e-a909-9dd3c3da0e1&title=)
<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
    <meta charset="UTF-8">
    <title>首页</title>
</head>
<body>

    <h1>首页</h1>

    <!-- 以后我们会越来越倾向于用一句话来作为请求的URL地址,在这样的一句话中使用“/”分隔各个单词 -->
    <!-- say hello to spring mvc -->
    <!-- /say/hello/to/spring/mvc -->
    <a th:href="@{/say/hello/to/spring/mvc}">HelloWorld</a><br/>

</body>
</html>

③实现点击超链接

[1]加入日志记录仪在 handler 类中声明一个成员变量:

private Logger logger = LoggerFactory.getLogger(this.getClass());

  • Logger:org.slf4j.Logger
  • LoggerFactory:org.slf4j.LoggerFactory

    [2]声明 handler 方法

    // 以后我们会越来越倾向于用一句话来作为请求的URL地址
    // 在这样的一句话中使用“/”分隔各个单词
    @RequestMapping("/say/hello/to/spring/mvc")
    public String sayHello() {
    
      // 方法内部打印日志,证明 SpringMVC 确实调用了这个方法来处理请求
      logger.debug("我是 SpringMVC 的 Hello world。");
    
      return "target";
    }
    

    [3]创建目标页面

    img005.png ```xml <!DOCTYPE html>

    目标页面

    回首页

```

④整体流程解析

img007.png