WEB相关
WebApplicationContextServletContextAwareProcessor
用于处理带有WebApplicationContextServletContextAware
接口的Bean,该接口的目的是:用于指示 Spring 中的 Bean 希望获取 ServletContext 对象。这个接口不包含任何方法,它仅仅是为了告诉 Spring 容器,实现了这个接口的 Bean 希望在初始化时获取 ServletContext
实例。
该网址中有详细讲解 https://blog.csdn.net/andy_zhang2007/article/details/86289823
注:ServletContext
与ApplicationContext
的区别:
-
来源:
ServletContext
是属于Java Servlet规范的,表示的是整个web应用程序的上下文环境。ApplicationContext
是Spring框架中的,用于表示 Spring 应用程序的上下文环境。ApplicationContext
是 Spring 特有的概念,它提供了更加丰富和强大的功能,比如依赖注入、AOP、事件机制等。 -
创建时机:
ServletContext
对象,它在应用程序启动时由 Servlet 容器(比如 Tomcat、Jetty 等)创建并初始化。ApplicationContext
是SpringBoot程序启动时创建的。 -
功能:
-
ServletContext
可以用来在整个 Web 应用程序范围内共享信息和资源,比如初始化参数、全局配置等。可以用来管理 Web 应用程序中的静态资源,如 HTML 文件、图片、CSS 和 JavaScript 文件等。 具有请求转发和请求包含的功能,允许将请求转发到其他资源或将其他资源包含在当前响应中。 支持监听器,允许注册监听器来监听 Web 应用程序的生命周期事件,如应用程序的启动、关闭等。
-
ApplicationContext
-
可以管理 Bean的生命周期,并通过依赖注入将 Bean 注入到其他 Bean 中,在 Bean 初始化和销毁时执行特定的操作,实现组件之间的解耦和灵活性。
-
ApplicationContext 支持 AOP,允许将横切关注点(如日志、事务管理)从主要业务逻辑中分离出来,提高代码的模块化和可维护性。
-
ApplicationContext
提供了事件机制,允许发布和监听事件,实现组件之间的解耦和消息传递。 -
ApplicationContext
支持国际化,允许在应用程序中轻松实现多语言支持。 -
ApplicationContext
管理 Bean 的生命周期,可以在 Bean 初始化和销毁时执行特定的操作。
-
-
-
使用
-
获取信息:
-
数据源: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"> <!-- 配置初始化参数 --> <context-param> <param-name>appName</param-name> <param-value>MyApp</param-value> </context-param> <context-param> <param-name>appVersion</param-name> <param-value>1.0</param-value> </context-param> <!-- 配置 Servlet --> <servlet> <servlet-name>MyServlet</servlet-name> <servlet-class>com.example.MyServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>MyServlet</servlet-name> <url-pattern>/myServlet</url-pattern> </servlet-mapping> </web-app>
-
ServletContext获取信息
import java.io.IOException; import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.servlet.ServletContext; @WebServlet("/myServlet") public class MyServlet extends HttpServlet { protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // 获取 ServletContext 对象 // 该方法由HttpServlet提供 ServletContext servletContext = getServletContext(); // 从 ServletContext 中获取初始化参数 String appName = servletContext.getInitParameter("appName"); String appVersion = servletContext.getInitParameter("appVersion"); // 设置响应内容类型 response.setContentType("text/html"); // 输出 HTML 页面 response.getWriter().println("<html><head><title>Servlet Example</title></head><body>"); response.getWriter().println("<h1>Application Name: " + appName + "</h1>"); response.getWriter().println("<h2>Application Version: " + appVersion + "</h2>"); response.getWriter().println("</body></html>"); } }
-
ApplicationContext获取信息
import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; public class MyApp { public static void main(String[] args) { // 创建 Spring 应用程序上下文 ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml"); // 获取应用程序的环境对象 org.springframework.core.env.Environment env = context.getEnvironment(); // 获取初始化参数 String appName = env.getProperty("appName"); String appVersion = env.getProperty("appVersion"); // 输出参数值 System.out.println("Application Name: " + appName); System.out.println("Application Version: " + appVersion); } }
-
-
请求转发,请求包含等
请求转发与请求包含,重定向的使用对象是RequestDispatcher,这里使用
ServletContext
进行获取,不过一般是使用HttpServletRequest
直接获取RequestDispatcher
对象。//通过ServletContext获取RequestDispatcher import java.io.IOException; import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.servlet.RequestDispatcher; import javax.servlet.ServletContext; @WebServlet("/forwardAndIncludeServlet") public class ForwardAndIncludeServlet extends HttpServlet { protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // 获取 ServletContext 对象 ServletContext servletContext = getServletContext(); // 设置响应内容类型 response.setContentType("text/html"); // 获取请求转发的目标 Servlet 的路径 String forwardPath = "/forwardedServlet"; // 获取请求包含的目标 Servlet 的路径 String includePath = "/includedServlet"; // 请求转发 RequestDispatcher dispatcher = servletContext.getRequestDispatcher(forwardPath); dispatcher.forward(request, response); // 请求包含 RequestDispatcher includeDispatcher = servletContext.getRequestDispatcher(includePath); includeDispatcher.include(request, response); } }
//通过HttpServletRequest获取RequestDispatcher对象 import java.io.IOException; import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.servlet.RequestDispatcher; @WebServlet("/forwardAndIncludeServlet") public class ForwardAndIncludeServlet extends HttpServlet { protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // 设置响应内容类型 response.setContentType("text/html"); // 获取请求转发的目标 Servlet 的路径 String forwardPath = "/forwardedServlet"; // 获取请求包含的目标 Servlet 的路径 String includePath = "/includedServlet"; // 请求转发 RequestDispatcher dispatcher = request.getRequestDispatcher(forwardPath); dispatcher.forward(request, response); // 请求包含 RequestDispatcher includeDispatcher = request.getRequestDispatcher(includePath); includeDispatcher.include(request, response); } }
-
注:请求包含,请求转发,重定向的区别:
-
请求转发&重定向
请求转发:是在服务器内部完成的,转发前的 Servlet 将控制权交给转发后的 Servlet,转发后的 Servlet 生成的响应直接返回给客户端,客户端不会感知到转发的过程。
重定向:是通过向客户端发送一个特殊的响应(HTTP 302 Found 或 HTTP 303 See Other),告诉客户端重新发送一个新的请求到指定的 URL。客户端收到重定向响应后,会发起一个新的请求,服务器接收到新的请求后再返回响应。
请求转发不会改变客户端的 URL 地址,客户端仍然看到原始请求的 URL 地址。
重定向会改变客户端的 URL 地址,客户端会收到一个新的 URL 地址,然后发起新的请求。
请求转发可以访问转发前的 Servlet 的资源路径。
重定向无法访问原始请求的资源路径,因为它实际上是一个全新的请求。
-
请求转发&请求包含
import java.io.IOException; import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; @WebServlet("/includeServlet") public class IncludeServlet extends HttpServlet { protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // 设置响应内容类型 response.setContentType("text/html"); // 生成一些内容 String content = "<h2>This is IncludeServlet's content</h2>"; // 输出内容到响应 response.getWriter().println(content); } }
import java.io.IOException; import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.servlet.RequestDispatcher; @WebServlet("/mainServlet") public class MainServlet extends HttpServlet { protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // 设置响应内容类型 response.setContentType("text/html"); // 输出一些主要内容 response.getWriter().println("<h1>MainServlet Content</h1>"); response.getWriter().println("<p>This is the main content of the page.</p>"); // 包含IncludeServlet的响应内容 RequestDispatcher dispatcher = request.getRequestDispatcher("/includeServlet"); dispatcher.include(request, response); // 输出一些其他内容 response.getWriter().println("<p>This is some additional content.</p>"); } }
最终输出:
MainServlet Content This is the main content of the page. This is IncludeServlet's content This is some additional content.
这就是请求包含。