JavaWeb 开发进阶 SpringMVC 的 DispatcherServlet

本书作者:测试开发刚哥,文章版权归个人所有,未经授权请勿转载。 DispatcherServlet 简介 DispatcherServlet是 Spring MVC 框架的核心组件,充当前端控制器(Front Controller)的角色。它负责接收所有的 HTTP 请求,并将它们分发给适当的处理器(控制器)。DispatcherServlet是整个 Spring MVC 应用程序的入口点,管理请求的整个生命周期。 通过源码查看 DispatcherServlet 定义: public class DispatcherServlet extends FrameworkServlet public abstract class FrameworkServlet extends HttpServletBean implements ApplicationContextAware public abstract class HttpServletBean extends HttpServlet implements EnvironmentCapable, EnvironmentAware DispatcherServlet 继承了 FrameworkServlet,继承了 HttpServletBean,继承了 HttpServlet。HttpServlet 来自jakarta.servlet.http.HttpServlet,也就是新版 Servlet: <dependency> <groupId>jakarta.servlet</groupId> <artifactId>jakarta.servlet-api</artifactId> <version>6.1.0</version> <scope>provided</scope> </dependency> 果然,Spring MVC 是基于 Servlet 的! DispatcherServlet 注册 DispatcherServlet 是个 Servlet,需要注册后才能使用。有 3 种注册方式:web.xml、Spring MVC、Spring Boot ① web.xml <web-app> <listener> <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> </listener> <context-param> <param-name>contextConfigLocation</param-name> <param-value>/WEB-INF/app-context.xml</param-value> </context-param> <servlet> <servlet-name>app</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <init-param> <param-name>contextConfigLocation</param-name> <param-value></param-value> </init-param> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>app</servlet-name> <url-pattern>/app/*</url-pattern> </servlet-mapping> </web-app> ② Spring MVC ...

JavaWeb 开发进阶 SpringMVC 简介

Spring MVC,又称为 Spring Web MVC,名字来源于 Spring 模块spring-webmvc,是一个基于 Servlet API 开发的 Web 框架。

JavaWeb 开发基础 ServletFilter

本书作者:测试开发刚哥,文章版权归个人所有,未经授权请勿转载。 Filter 是什么 Filter 用于对请求和响应进行预处理和后处理。Filter 链(Filter Chain)允许多个 Filter 依次处理同一个请求和响应。 Filter 的使用场景 日志记录:记录请求和响应的详细信息,例如请求时间、响应时间、请求参数等 安全检查:检查用户是否有权限访问特定资源,例如验证用户身份、检查用户角色等 压缩:对响应内容进行压缩,例如使用 GZIP 压缩响应数据 字符编码设置:设置请求和响应的字符编码,例如将请求和响应的字符编码设置为 UTF-8 输入验证:对请求参数进行验证,例如检查参数是否为空、参数格式是否正确等 Filter Interface Filter 接口有 3 个方法: package javax.servlet; import java.io.IOException; public interface Filter { void init(FilterConfig var1) throws ServletException; void doFilter(ServletRequest var1, ServletResponse var2, FilterChain var3) throws IOException, ServletException; void destroy(); } 容器在启动时创建 Filter 实例,并调用其init(FilterConfig filterConfig)方法进行初始化。每次请求到达时,容器调用 Filter 的doFilter(ServletRequest request, ServletResponse response, FilterChain chain)方法进行过滤。容器在关闭时调用 Filter 的destroy()方法进行清理。 ...

JavaWeb 开发基础 Servlet 事件和监听器

本书作者:测试开发刚哥,文章版权归个人所有,未经授权请勿转载。 事件和监听器 事件是指在程序运行过程中发生的特定动作或情况。比如: 用户操作,如点击按钮、输入文本 系统操作,如文件读取完成、网络连接断开 应用程序内部的状态变化,如对象属性改变、方法调用 监听器是一个接口或类,用于定义在特定事件发生时要执行的操作。监听器会“监听”特定的事件,当事件发生时,监听器中的相应方法会被调用,从而执行预定义的操作。 事件和监听器是相辅相成的,它们的工作原理如下: 事件源:触发事件的来源。例如,按钮是事件源,点击按钮会触发点击事件 事件对象:当事件发生时,事件源会创建一个事件对象,包含有关事件的信息 注册监听器:监听器需要注册到事件源,以便监听特定的事件。注册后,事件源会在事件发生时通知监听器 事件处理:当事件发生时,事件源会调用监听器中的相应方法,传递事件对象,从而执行预定义的操作 Servlet Event Class 事件(Event)是一个类,封装了与特定事件相关的信息。 基本是构造方法和 get 方法: ServletRequestEvent public class ServletRequestEvent extends EventObject { private static final long serialVersionUID = 1L; private final ServletRequest request; public ServletRequestEvent(ServletContext sc, ServletRequest request) { super(sc); this.request = request; } public ServletRequest getServletRequest() { return this.request; } public ServletContext getServletContext() { return (ServletContext) super.getSource(); } } ServletRequestAttributeEvent public class ServletRequestAttributeEvent extends ServletRequestEvent { private static final long serialVersionUID = 1L; private final String name; private final Object value; public ServletRequestAttributeEvent(ServletContext sc, ServletRequest request, String name, Object value) { super(sc, request); this.name = name; this.value = value; } public String getName() { return this.name; } public Object getValue() { return this.value; } } ServletContextEvent public class ServletContextEvent extends EventObject { private static final long serialVersionUID = 1L; public ServletContextEvent(ServletContext source) { super(source); } public ServletContext getServletContext() { return (ServletContext) super.getSource(); } } ServletContextAttributeEvent public class ServletContextAttributeEvent extends ServletContextEvent { private static final long serialVersionUID = 1L; private final String name; private final Object value; public ServletContextAttributeEvent(ServletContext source, String name, Object value) { super(source); this.name = name; this.value = value; } public String getName() { return this.name; } public Object getValue() { return this.value; } } HttpSessionEvent public class HttpSessionEvent extends EventObject { private static final long serialVersionUID = 1L; public HttpSessionEvent(HttpSession source) { super(source); } public HttpSession getSession() { return (HttpSession) super.getSource(); } } HttpSessionBindingEvent public class HttpSessionBindingEvent extends HttpSessionEvent { private static final long serialVersionUID = 1L; private final String name; private final Object value; public HttpSessionBindingEvent(HttpSession session, String name, Object value) { super(session); this.name = name; this.value = value; } public String getName() { return this.name; } public Object getValue() { return this.value; } } ...

JavaWeb 开发基础 ServletSession

本书作者:测试开发刚哥,文章版权归个人所有,未经授权请勿转载。 Session 是什么 在 Web 应用程序中,Session(会话)是用于在多个请求之间保持用户状态的一种机制。由于 HTTP 协议是无状态的,每个请求都是独立的,服务器无法直接知道两个请求是否来自同一个用户。Session 通过在服务器端存储用户状态信息,并在客户端使用一个唯一的 Session ID 来标识用户,从而实现状态保持。 Session 工作原理如下: 创建 Session:当用户第一次访问 Web 应用程序时,服务器创建一个新的 Session,并生成一个唯一的 Session ID 发送 Session ID:服务器将 Session ID 发送给客户端,通常通过 HTTP 响应头中的 Set-Cookie 字段 存储 Session ID:客户端浏览器将 Session ID 存储在 Cookie 中,并在后续请求中将其发送回服务器 识别 Session:服务器通过接收到的 Session ID 识别用户的会话,并从服务器端存储中获取相应的 Session 数据 四种主要技术 Cookies Hidden Form Field URL Rewriting HttpSession 1. Cookies(Cookie) Cookie 是存储在客户端浏览器中的小数据片段。它们会随着每个 HTTP 请求一起发送到服务器,可以用来存储会话标识符。 工作原理 当用户第一次访问网站时,服务器生成一个唯一的会话 ID,并将其作为 Cookie 发送到客户端浏览器 浏览器存储这个 Cookie,并在后续请求中将其发送回服务器 服务器使用 Cookie 中的会话 ID 来检索用户的会话数据 ...

JavaWeb 开发基础 ServletConfig 与 ServletContext

本书作者:测试开发刚哥,文章版权归个人所有,未经授权请勿转载。 ServletConfig package javax.servlet; import java.util.Enumeration; public interface ServletConfig { String getServletName(); ServletContext getServletContext(); String getInitParameter(String var1); Enumeration<String> getInitParameterNames(); } ServletConfig 用于 Servlet 初始化时从 web.xml 获取配置信息。主要有以下方法: public String getInitParameter(String name): Returns the parameter value for the specified parameter name. public Enumeration getInitParameterNames(): Returns an enumeration of all the initialization parameter names. public String getServletName(): Returns the name of the servlet. public ServletContext getServletContext(): Returns an object of ServletContext. 示例,web.xml ...

JavaWeb 开发基础 Servlet 请求分发与重定向

本书作者:测试开发刚哥,文章版权归个人所有,未经授权请勿转载。 请求分发 Servlet 的 RequestDispatcher 接口定义: package javax.servlet; import java.io.IOException; public interface RequestDispatcher { String FORWARD_REQUEST_URI = "javax.servlet.forward.request_uri"; String FORWARD_CONTEXT_PATH = "javax.servlet.forward.context_path"; String FORWARD_PATH_INFO = "javax.servlet.forward.path_info"; String FORWARD_SERVLET_PATH = "javax.servlet.forward.servlet_path"; String FORWARD_QUERY_STRING = "javax.servlet.forward.query_string"; String INCLUDE_REQUEST_URI = "javax.servlet.include.request_uri"; String INCLUDE_CONTEXT_PATH = "javax.servlet.include.context_path"; String INCLUDE_PATH_INFO = "javax.servlet.include.path_info"; String INCLUDE_SERVLET_PATH = "javax.servlet.include.servlet_path"; String INCLUDE_QUERY_STRING = "javax.servlet.include.query_string"; String ERROR_EXCEPTION = "javax.servlet.error.exception"; String ERROR_EXCEPTION_TYPE = "javax.servlet.error.exception_type"; String ERROR_MESSAGE = "javax.servlet.error.message"; String ERROR_REQUEST_URI = "javax.servlet.error.request_uri"; String ERROR_SERVLET_NAME = "javax.servlet.error.servlet_name"; String ERROR_STATUS_CODE = "javax.servlet.error.status_code"; void forward(ServletRequest var1, ServletResponse var2) throws ServletException, IOException; void include(ServletRequest var1, ServletResponse var2) throws ServletException, IOException; } 它有 2 个方法,forward 和 include: ...

JavaWeb 开发基础 Servlet 生命周期与工作原理

本书作者:测试开发刚哥,文章版权归个人所有,未经授权请勿转载。 Servlet 生命周期 Servlet 的生命周期由 Servlet 容器(如 Tomcat、Jetty 等)管理,主要包括以下 5 个阶段: 加载 Servlet 类 创建 Servlet 实例 调用 init 方法 调用 service 方法 调用 destroy 方法 加载(Loading): 当 Servlet 容器启动或第一次接收到对某个 Servlet 的请求时,它会加载 Servlet 类 这个过程只发生一次,除非 Servlet 被卸载或容器重新启动 实例化(Instantiation): 在加载 Servlet 类之后,容器会创建一个 Servlet 实例 这个实例化过程也是一次性的,除非 Servlet 被卸载或容器重新启动 初始化(Initialization): 容器调用 Servlet 实例的init()方法进行初始化 init()方法只被调用一次,用于执行一次性的初始化任务,如读取配置参数、初始化资源等 你可以重写init()方法以执行自定义的初始化逻辑 public void init(ServletConfig config) 请求处理(Request Handling): 每当有请求到达时,容器会调用 Servlet 的service()方法来处理请求 service()方法根据请求的类型(如 GET、POST 等)调用相应的处理方法(如doGet()、doPost()等) public void service(ServletRequest request, ServletResponse response) 销毁(Destruction): 当容器决定卸载 Servlet(如容器关闭或 Servlet 被重新加载)时,它会调用 Servlet 的destroy()方法 destroy()方法用于执行清理任务,如关闭资源、保存状态等 destroy()方法只被调用一次 public void destroy() ...

JavaWeb 开发基础 ServletAPI

本书作者:测试开发刚哥,文章版权归个人所有,未经授权请勿转载。 Servlet 版本 Oracle 将 Java EE(Java SE 还自己保留)交给开源组织,Eclipse 基金会接手。但 Oracle 不允许开源组织使用 Java 名号,所以 Jakarta EE 名称于 2018.02.26 应运而生。 正是因为组织变化,Servlet 被割裂为了 2 个版本,javax.servlet和jakarta.servlet。 javax.servlet已经停止维护,但它仍然是一个非常有用和重要的技术,特别是在许多现有项目中,学习和使用它将为你提供坚实的 Web 开发基础。 <dependency> <groupId>javax.servlet</groupId> <artifactId>javax.servlet-api</artifactId> <version>3.1.0</version> <scope>provided</scope> </dependency> 如果希望使用 Jakarta EE 9 或更高版本的 Servlet API,则需要切换到javax.servlet。 <dependency> <groupId>jakarta.servlet</groupId> <artifactId>jakarta.servlet-api</artifactId> <version>6.0.0</version> <scope>provided</scope> </dependency> 本文将基于javax.servlet来介绍 Servlet,从 Usages 来看,它仍然是使用最广泛的。 Servlet API Servlet API 主要有 2 个包,javax.servlet包含了 servlet 和 web container 使用的接口和类。javax.servlet.http包含了 http 相关的接口和类。 javax.servlet接口列表: Servlet ServletRequest ServletResponse RequestDispatcher ServletConfig ServletContext SingleThreadModel Filter FilterConfig FilterChain ServletRequestListener ServletRequestAttributeListener ServletContextListener ServletContextAttributeListener javax.servlet类列表: ...

JavaWeb 开发基础 Servlet 简介

本书作者:测试开发刚哥,文章版权归个人所有,未经授权请勿转载。 Servlet 是什么? 现在的 Java Web 开发,很少直接接触到 Servlet。在 Spring 项目中,Spring Boot 基于 Spring Framework,简化了 Spring 应用程序开发,Spring Framework 是一个全面的 Java 应用程序框架,其中包含 Spring MVC 模块,Spring MVC 封装了 Servlet,以实现 Web 功能。Servlet 不属于 Spirng 项目,而是 Java EE(后改名为 Jakarta EE)的一部分。 Oracle 将 Java EE(Java SE 还自己保留)交给开源组织,Eclipse 基金会接手。但 Oracle 不允许开源组织使用 Java 名号,所以 Jakarta EE 名称于 2018.02.26 应运而生。 Servlet 可以有很多种描述: Servlet 是一个技术,用来创建 Web 应用程序 Servlet 是一个 API,提供了很多接口、类和文档 Servlet 是一个接口,必须实现该接口来创建 Servlet Servlet 是一个类,位于服务端,接收请求,返回响应 Servlet 是一个 Web 组件,用来创建动态 Web 页面 ...