网站备案初审过了,理财网站开发,上海自助模板建站,网页设计作业成品代码和文字文章目录 1、ServletContext对象介绍1_方法介绍2_用例分析 2、ServletContainerInitializer1_整体结构2_工作原理3_使用案例 3、Spring案例源码分析1_注册DispatcherServlet2_注册配置类3_SpringServletContainerInitializer 4_总结 ServletContext 表示上下文对象#xff0c;… 文章目录 1、ServletContext对象介绍1_方法介绍2_用例分析 2、ServletContainerInitializer1_整体结构2_工作原理3_使用案例 3、Spring案例源码分析1_注册DispatcherServlet2_注册配置类3_SpringServletContainerInitializer 4_总结 ServletContext 表示上下文对象属于接口代表整个 Web 项目可以使用定义的方法与 S e r v l e t Servlet Servlet容器进行通信。例如获取文件的MIME类型、分发请求或写入日志文件。
能够共享数据的对象
request只能在一次请求一次响应中进行数据的共享 》请求转发session只能在一次会话过程中可以有多次请求和响应ServletContext只要项目存在就可以共享数据多次会话多次请求和响应都可以共享数据操作整个项目的配置文件
范围大小 ServletContext session request 1、ServletContext对象介绍 当 t o m c a t tomcat tomcat 服务器启动的时候会为每个 Web 项目创建一个唯一的 S e r v l e t C o n t e x t ServletContext ServletContext 对象该对象代表当前整个 Web 应用项目。
该对象不仅封装了当前 Web 应用的所有信息而且实现了多个 s e r v l e t servlet servlet 的数据共享。
在 S e r v l e t C o n t e x t ServletContext ServletContext 中可以存放共享数据 S e r v l e t C o n t e x t ServletContext ServletContext 对象是真正的一个全局对象凡是 Web 容器中的 S e r v l e t Servlet Servlet 都可以访问。
在每个项目中可以有多个 S e r v l e t Servlet Servlet 程序每个 S e r v l e t Servlet Servlet 程序都是独立的。当前这个项目的配置信息必须使用描述这个项目的 S e r v l e t C o n t e x t ServletContext ServletContext 对象获取。 1_方法介绍 方法名描述setAttribute(String name, Object object)向 S e r v l e t C o n t e x t ServletContext ServletContext中存数据 getAttribute(String name)从 S e r v l e t C o n t e x t ServletContext ServletContext中取数据removeAttribute(name) 从 S e r v l e t C o n t e x t ServletContext ServletContext中移除数据String getRealPath(String path)返回资源文件在服务器文件系统上的真实路径(文件的绝对路径)getMimeType(fileName)获取服务器中文件类型.txt text/plain .html text/htmlgetResourceAsStream(String path)获取某个资源的输入流getRequestDispatcher(String path)返回一个 RequestDispatcher 对象可以使用它将请求转发到指定资源或者在响应中包含资源。 S e r v l e t C o n t e x t ServletContext ServletContext 对象 t o m c a t tomcat tomcat为每一个 Web 项目单独创建的一个上下文知上知下贯穿全文对象。有如下功能 可以在多个 s e r v l e t servlet servlet 之间共享数据 存放setAttribute() 获得getAttribute() 删除removeAttribute() 可以获得当前 Web 项目中的指定资源文件 String path getRealPath( String string);将请求从一个 s e r v l e t servlet servlet 转发到服务器上的另一个资源。 RequestDispatcher requestDispatcher getRequestDispatcher(/1.jpg);
requestDispatcher.forward(req,res);将指定资源的内容包含到当前的响应中。 requestDispatcher.include(req,res);读取 Web 应用中的资源文件 InputStream resourceStream context.getResourceAsStream(/WEB-INF/config.properties);S e r v l e t C o n t e x t ServletContext ServletContext 还提供了如下方法动态注册 S e r v l e t Servlet Servlet、 F i l t e r Filter Filter、 L i s t e n e r Listener Listener以及及初始化参数信息
方法名描述addServlet(String servletName, Servlet servlet)动态注册 S e r v l e t Servlet ServletaddFilter(String filterName, Filter filter)动态注册 F i l t e r Filter FilteraddListener(String className)动态注册 L i s t e n e r Listener ListenersetInitParameter(String name, String value)为 Web 应用设置初始化参数。 2_用例分析
需求1如何获取上下文 S e r v l e t C o n t e x t ServletContext ServletContext 对象。
使用HttpServlet类的父类 GenericServlet 中的方法getServletContext();通过实现 ServletContextListener 来获取详见监听器博文。
代码如下
/*获取上下文ServletContext对象使用HttpServlet类的父类 GenericServlet 中的方法:getServletContext();
*/
ServletContext servletContext getServletContext();需求2如何获取服务器中每个文件的路径 例如在当前项目下的web文件夹下放一个1.jpg的图片获取其真实路径(绝对路径)。
WebServlet(/servletContextDemoServlet)
public class ServletContextDemoServlet extends HttpServlet {protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {doGet(request, response);}protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {ServletContext servletContext getServletContext();//如何获取服务器中每个文件的路径。// 例如在当前项目下的web文件夹下放一个1.jpg的图片获取其真实路径(绝对路径)。String realPath servletContext.getRealPath(/1.jpg);/*输出结果realPath E:\WorkAndClass\maven_war_pro\src\main\webapp\1.jpg说明我们的项目在发布的时候会被打成一个war包这个war包下的class文件会被放在tomcat下被运行。所以这里获取的真实路径是这个war包下的1.jpg所在的路径。*/System.out.println(realPath realPath);}
}需求3获取当前项目下的1.jpg在服务器中的文件类型。
/*需求3获取当前项目下的1.jpg在服务器中的文件类型。getMimeType(1.jpg);这里书写获取文件类型的文件名和后缀名即可
*/
String mimeType servletContext.getMimeType(1.jpg);
System.out.println(mimeType mimeType);//mimeType image/jpeg需求4请求转发将发往ServletContextDemoServlet的请求转发到MyServlet中。
RequestDispatcher requestDispatcher servletContext.getRequestDispatcher(/MyServlet);
requestDispatcher.forward(request, response);注意对于方法 getMimeType(1.jpg);这里书写获取文件类型的文件名和后缀名即可 2、ServletContainerInitializer 在 S e r v l e t 3.0 Servlet 3.0 Servlet3.0 规范中ServletContainerInitializer 接口被引入用于替代传统的 web.xml 配置方式允许开发者在 S e r v l e t Servlet Servlet 容器启动时动态地进行 S e r v l e t Servlet Servlet、 F i l t e r Filter Filter 和 L i s t e n e r Listener Listener 的注册与初始化配置。
这种通过编程来实现应用初始化过程的方式具有很大的灵活性尤其是在现代基于注解和 Java 配置的 Web 应用中减少了对 web.xml 配置文件的依赖提供了更强的动态配置能力。 1_整体结构
该接口只有一个方法
public interface ServletContainerInitializer {public void onStartup(SetClass? c, ServletContext ctx) throws ServletException;
}SetClass? c此参数表示与当前 Web 应用相关联的所有类。 通常这些类会通过类路径扫描来识别。 开发者可以利用这个参数进行自定义的初始化逻辑比如扫描特定的注解。 ServletContext ctx这是 S e r v l e t C o n t e x t ServletContext ServletContext 对象不再重复介绍。 2_工作原理
ServletContainerInitializer 接口通过反射机制SPI机制在 Web 容器启动时进行实例化。
当 Web 容器如 T o m c a t Tomcat Tomcat启动时它会扫描所有部署的应用程序查找是否有 META-INF/services/javax.servlet.ServletContainerInitializer 文件该文件中会包含一个实现类的全限定名。
如果这个文件存在Web 容器启动时会加载其中列出的所有 ServletContainerInitializer 实现类并调用它们的 onStartup() 方法来初始化 Web 应用。
在onStartup() 方法中可以通过 S e r v l e t C o n t e x t ServletContext ServletContext 来进行 S e r v l e t Servlet Servlet、 F i l t e r Filter Filter、 L i s t e n e r Listener Listener 等组件的注册。 3_使用案例
1、编写 ServletContainerInitializer 实现类
package com.example.sh;import javax.servlet.*;
import java.util.EnumSet;
import java.util.Set;public class MyServletContainerInitializer implements ServletContainerInitializer {Overridepublic void onStartup(SetClass? c, ServletContext ctx) throws ServletException {// 通过 ServletContext 注册 ServletServletRegistration.Dynamic myServlet ctx.addServlet(myServlet, MyServlet.class);// 大于0时web容器启动时立即创建myServlet.setLoadOnStartup(1);// servlet映射路径myServlet.addMapping(/myServlet);// 通过 ServletContext 注册 FilterFilterRegistration.Dynamic myFilter ctx.addFilter(myFilter, MyFilter.class);//REQUEST请求类型 除此之外还有 异步、转发等。。myFilter.addMappingForUrlPatterns(EnumSet.of(DispatcherType.REQUEST), true, /*);// 通过 ServletContext 注册 Listenerctx.addListener(MyListener.class);// 设置 Web 应用的初始化参数ctx.setInitParameter(appVersion, 1.0);}
}2、注册 ServletContainerInitializer 实现类
在 META-INF/services/javax.servlet.ServletContainerInitializer 文件中添加如下内容
com.example.sh.MyServletContainerInitializer3、Spring案例源码分析 在一个典型的 S p r i n g Spring Spring MVC 应用中 S e r v l e t C o n t e x t ServletContext ServletContext 是一个重要的组件它代表 Web 应用的上下文提供了访问应用范围内资源和配置的能力。
DispatcherServlet 是 S p r i n g Spring Spring MVC 的前端控制器处理所有传入的 HTTP 请求并负责将请求委派给适当的控制器方法。
在这个过程中 S e r v l e t C o n t e x t ServletContext ServletContext 作为 S p r i n g Spring Spring 容器的核心之一起到了协调和管理作用。 1_注册DispatcherServlet
在 S e r v l e t Servlet Servlet容器配置类的继承类 AbstractDispatcherServletInitializer 中也有与ServletContainerInitializer中同名的方法onStartup():
public static final String DEFAULT_SERVLET_NAME dispatcher;
Override
public void onStartup(ServletContext servletContext) throws ServletException {super.onStartup(servletContext);registerDispatcherServlet(servletContext);
}在onStartup()中调用了registerDispatcherServlet方法从方法名就可以看出这个方法是用于注册 DispatcherServlet 的方法 2_注册配置类
ServletContainerInitializer 的实现类需要通过配置文件来获取类的全限定名进行注册这在 S p r i n g Spring Spring MVC 中也是一样的。
首先我们看一下AbstractDispatcherServletInitializer的继承结构 发现顶级父类是 WebApplicationInitializer 接口
package org.springframework.web;import jakarta.servlet.ServletContext;
import jakarta.servlet.ServletException;public interface WebApplicationInitializer {void onStartup(ServletContext servletContext) throws ServletException;
}在此接口相关的 jar 包中就可以发现对应的配置文件了如下图我的版本较高 S e r v l e t 5.0 Servlet5.0 Servlet5.0 以后把javax.servlet包名改成了jakarta.servlet所以名称会略有差别 文件内容如下
org.springframework.web.SpringServletContainerInitializer3_SpringServletContainerInitializer
经过上述分析最终找到了一个以 S p r i n g Spring Spring 开头的配置类那么这个类的作用是什么呢先看结构
HandlesTypes(WebApplicationInitializer.class)//容器可以在启动时扫描并收集所有实现了 WebApplicationInitializer 接口的类
public class SpringServletContainerInitializer implements ServletContainerInitializer {Overridepublic void onStartup(Nullable SetClass? webAppInitializerClasses, ServletContext servletContext) throws ServletException {//略}}可以看到最重要的一点它实现了 ServletContainerInitializer 接口并将自己注册到了配置文件中去。 因此在 Web 容器启动时SpringServletContainerInitializer 会自动调用onStartup方法配置 S p r i n g Spring Spring 的 Web 环境。 除了配置 DispatcherServlet 外它其实还会注册 ContextLoaderListener用于加载 S p r i n g Spring Spring 的根应用上下文。 4_总结 S e r v l e t C o n t e x t ServletContext ServletContext 表示上下文对象代表整个web项目 t o m c a t tomcat tomcat 一启动就会创建该接口对象关闭 t o m c a t tomcat tomcat 就会消失 S e r v l e t C o n t e x t ServletContext ServletContext 属于对象多次会话多次请求限制三个域对象范围ServletContext HttpSession HttpServletRequest S e r v l e t C o n t e x t ServletContext ServletContext 其他作用 获取文件真实路径String getRealPath(String path) 参数 path 如果书写的是相对路径相对的是webapp。 获取文件的MIME类型String getMimeType(String file) 参数 file 只书写文件名 后缀名即可不会判断是否存在。 获取请求分发对象RequestDispatcher getRequestDispatcher(String path) 参数 path 书写的是资源路径。 动态注册 Web 组件。