spring mvc源码学习笔记之一

devtools/2025/1/8 7:58:34/
  • pom.xml 如下
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><groupId>com.qs.demo</groupId><artifactId>test-007</artifactId><version>1.0-SNAPSHOT</version><packaging>war</packaging><properties><maven.compiler.source>8</maven.compiler.source><maven.compiler.target>8</maven.compiler.target><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding></properties><dependencies><dependency><groupId>org.springframework</groupId><artifactId>spring-webmvc</artifactId><version>4.3.30.RELEASE</version></dependency><dependency><groupId>javax.servlet</groupId><artifactId>javax.servlet-api</artifactId><version>3.1.0</version><scope>provided</scope></dependency><dependency><groupId>org.thymeleaf</groupId><artifactId>thymeleaf-spring4</artifactId><version>3.0.11.RELEASE</version></dependency></dependencies></project>
  • src/main/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"><servlet><servlet-name>app</servlet-name><servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class><!-- 自己指定,不用默认的 <servlet-name>-servlet.xml --><init-param><param-name>contextConfigLocation</param-name><param-value>/WEB-INF/a.xml</param-value></init-param><!-- 小小优化,加快首次访问速度 --><load-on-startup>0</load-on-startup></servlet><servlet-mapping><servlet-name>app</servlet-name><!-- / 表示除了 xxx.jsp 之外的所有请求 --><!-- /* 表示所有请求 --><url-pattern>/</url-pattern></servlet-mapping>
</web-app>
  • src/main/webapp/WEB-INF/a.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"xsi:schemaLocation="http://www.springframework.org/schema/beanshttps://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd"><!-- 这个文件的名字是有讲究的 --><!-- springmvc 的配置 --><!-- 开启组件扫描 --><context:component-scan base-package="com.qs.demo"/><!-- 配置视图解析器 --><bean id="thymeleafViewResolver" class="org.thymeleaf.spring4.view.ThymeleafViewResolver"><property name="characterEncoding" value="UTF-8"/><property name="order" value="1"/><property name="templateEngine"><bean class="org.thymeleaf.spring4.SpringTemplateEngine"><property name="templateResolver"><bean class="org.thymeleaf.spring4.templateresolver.SpringResourceTemplateResolver"><property name="prefix" value="/WEB-INF/templates/"/><property name="suffix" value=".html"/><property name="templateMode" value="HTML"/><property name="characterEncoding" value="UTF-8"/></bean></property></bean></property></bean></beans>
  • src/main/webapp/WEB-INF/templates/t01.html 内容如下
<!DOCTYPE html>
<html lang="en" xmlns:th="https://www.thymeleaf.org">
<head><meta charset="UTF-8"><title>t01</title>
</head>
<body><a th:href="@{/t02}">hello</a>
</body>
</html>
  • src/main/webapp/WEB-INF/templates/t02.html 内容如下
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>t01</title>
</head>
<body><h1>Peter</h1>
</body>
</html>
  • com.qs.demo.FirstController 内容如下
package com.qs.demo;import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;/*** @author qs* @date 2024/12/20*/
@Controller
public class FirstController {@RequestMapping("/t01")public String t01() {return "t01";}@RequestMapping("/t02")public String t02() {return "t02";}}

以上就是全部代码

写这个例子只要是为了看 DispatcherServlet 的无参构造方法。如下

/*** 创建一个 DispatcherServlet。* 这个 DispatcherServlet 将会依据默认值和通过 servlet init-param 指定的值创建一个属于自己的内部的 web 应用上下文。* 这个无参的构造方法通常在 servlet 2.5 及之前的环境中使用,在 servlet 2.5 及之前的环境中注册 servlet 的唯一方式是通过 web.xml,而通过 web.xml 注册需要使用无参构造。** Create a new {@code DispatcherServlet} that will create its own internal web* application context based on defaults and values provided through servlet* init-params. Typically used in Servlet 2.5 or earlier environments, where the only* option for servlet registration is through {@code web.xml} which requires the use* of a no-arg constructor.** 名为 contextConfigLocation 的 servlet init-param 对应的是 setContextConfigLocation 方法。* 它决定了 DEFAULT_CONTEXT_CLASS(默认是 XmlWebApplicationContext)会加载哪个 XML 文件。* 在本文的例子中,我们指定的是 /WEB-INF/a.xml。其实还可以通过这个值指定多个配置文件,比如:"/WEB-INF/a.xml,/WEB-INF/b.xml"。* 可以从 DispatcherServlet 的父类 FrameworkServlet 了解到这些。其他文章会讲。** <p>Calling {@link #setContextConfigLocation} (init-param 'contextConfigLocation')* will dictate which XML files will be loaded by the* {@linkplain #DEFAULT_CONTEXT_CLASS default XmlWebApplicationContext}** 名为 contextClass 的 servlet init-param 对应的是 setContextClass 方法。* 指定了这个 servlet init-param 的话,默认的 XmlWebApplicationContext 就被覆盖了。* 可以用这个 servlet init-param 来指定用其他应用上下文,比如 AnnotationConfigWebApplicationContext。* 其他文章会演示。** <p>Calling {@link #setContextClass} (init-param 'contextClass') overrides the* default {@code XmlWebApplicationContext} and allows for specifying an alternative class,* such as {@code AnnotationConfigWebApplicationContext}.* * 名为 contextInitializerClasses 的 servlet init-param 对应的是 setContextInitializerClasses 方法。* 它指定了在本servlet的内部的web应用上下文的 refresh() 方法被调用之前可以使用哪些 ApplicationContextInitializer 来对web应用上下文进行配置。* 这也是个知识点。其他文章会详细讲。包括 ApplicationContextInitializer 这个接口,非常重要。* * <p>Calling {@link #setContextInitializerClasses} (init-param 'contextInitializerClasses')* indicates which {@code ApplicationContextInitializer} classes should be used to* further configure the internal application context prior to refresh().* @see #DispatcherServlet(WebApplicationContext)*/
public DispatcherServlet() {super(); // 不要忽略这个对父类无参构造方法的调用。它也很重要。对应的文档也值得好好看。System.out.println("看父类构造方法的javadoc");setDispatchOptionsRequest(true);System.out.println("这个构造方法一般在 servlet 2.5 及之前版本使用");
}

http://www.ppmy.cn/devtools/148553.html

相关文章

IDE和IDEA详解和具体差异

1. IDE(集成开发环境)概述 1.1 什么是 IDE? IDE(Integrated Development Environment,集成开发环境)是一种为开发者提供全面编程工具的软件应用程序。它将代码编辑、编译、调试、版本控制等功能集成在一个统一的界面中,旨在提高开发效率,减少开发者在不同工具之间切换…

【AI日记】25.01.05 kaggle 比赛 3-4 | 周反思

【AI论文解读】【AI知识点】【AI小项目】【AI战略思考】【AI日记】 AI 参加&#xff1a;kaggle 比赛 Forecasting Sticker Sales时间&#xff1a;6 小时 读书 书名&#xff1a;国家为什么会失败时间&#xff1a;1 小时阅读原因1&#xff1a;2024 年诺贝尔经济学奖得主的力作…

面向对象分析与设计Python版 用例与用例图

文章目录 一、用例二、用例图 一、用例 参与者 Actor 代表位于系统之外并和系统进行交互的一类事物&#xff08;人、物、其他软件子系统等&#xff09;通过它&#xff0c;可以对软件系统与外界发生的交互进行分析和描述&#xff0c;了解客户希望软件系统提供哪些功能参与者的…

Go语言的 的文件处理(File Handling)核心知识

Go语言的文件处理&#xff08;File Handling&#xff09;核心知识 Go语言是一种简洁高效的编程语言&#xff0c;深受开发者的喜爱。在开发过程中&#xff0c;文件处理是一个不可或缺的环节。本文将详细探讨Go语言的文件处理核心知识&#xff0c;包括文件的创建、读取、写入、删…

cat命令详解

cat 是 Linux/Unix 中的一个非常常用的命令&#xff0c;主要用于 连接 文件并显示文件内容。它的名称来源于 concatenate&#xff08;连接&#xff09;&#xff0c;不仅可以查看文件内容&#xff0c;还能将多个文件合并为一个文件&#xff0c;或用作其他数据流操作。 以下是对 …

Android开发电子书合集(pdf)

Android开发、移动app设计等电子书 &#xff08;使用手机保存资料可以获取1T免费网盘空间&#xff0c;电脑保存没有&#xff09; 资源链接&#xff1a;https://pan.quark.cn/s/d10097856045

动漫推荐系统django+vue前台后台完整源码

完整源码项目包获取→点击文章末尾名片&#xff01;

Linux(Ubuntu24.04)源码编译安装VTK7.1.1记录

VTK&#xff08;Visualization Toolkit&#xff09;是一个开源的3D可视化开发工具包&#xff0c;用于开发可视化和图形处理应用程序。VTK提供了一系列的算法和工具&#xff0c;用于创建、渲染和处理复杂的3D图形和数据。VTK由C编写&#xff0c;并提供了Python、Java和Tcl等语言…