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.
这就是请求包含。