ServletContext对象
ServletContext对象-三大域对象之一
- Servlet三大域对象的应用 request,session,application(ServletContext)
简介
- 作用:解决了不同用户的数据共享问题
- 作用域:由服务器创建,所有用户共享,在整个项目内
- 生命周期:服务器一启动时被创建,服务器关闭时被销毁
- request:一个用户可以有多个;session:一个用户一个;ServletContext:所有用户共有一个。为了节省空间,提高效率,ServletContext中只放了必须的,重要的,所有用户需要共享的,又是安全的信息。
使用
//获取ServletContext对象,有三种方式,都是同一个对象
//1.从this获取
ServletContext sc = this.getServletContext();
//2. 从ServletConfig中虎丘
sc = this.getServletConfig().getServletContext();
//3. 从Session中获取
sc = req.getSession().getServletContext();
//数据操作,不同的用户也能对ServletContext对象进行数据存取,存取的数据不存在返回null
//存储
sc.setAttribute("name","老四");
//获取
String name = (String) sc.getAttribute("name");
//获取网站根路径
String contextPath = sc.getContextPath(); //http://localhost:8088/test/context 的 /test
//获取版本信息
String info = sc.getServerInfo(); //Apache Tomcat/8.0.21
//获取应用名称,返回 web.xml 里的display-name 如<display-name>Archetype Created Web Application</display-name>
String servletContextName = sc.getServletContextName(); //Archetype Created Web Application
//获取文件真实路径
String fileRealPath = sc.getRealPath("/WEB-INF/web.xml"); //D:\tomcat\apache-tomcat-8.0.21\webapps\test\WEB-INF\web.xml
getMimeType 获取MIME类型
//获取MIME类型
String MIMEType = sc.getMimeType("/WEB-INF/web.xml"); //application/xml
- mime类型是容器内置的,可以在web.xml中配置
<!-- 设置类型,识别成功浏览器就会根据配置的类型自动调用相应的程序打开-->
<mime-mapping>
<extension>jsp</extension>
<mime-type>text/plain</mime-type>
</mime-mapping>
log() 输出日志
//打印日志
sc.log("好好吃");
sc.log("没有异常",new RuntimeException("真的没有异常"));
- 两个重载方法都是记录日志,如果已经放到tomcat下,则会输出到 /logs/localhost.yyyy-MM-dd.log,如果在idea下,可能会在C:\Users\用户名.IntelliJIdea2019.2\system\tomcat\war包名\logs下面
getResource和getResourceAsStream
- getResource将指定路径的资源封装成URL实例并返回,getResourceAsStream获取指定路径资源的输入流InputStream并返回。
getRequestDispatcher和getNamedDispatcher
-将指定的资源包装成RequestDispatcher实例并返回。区别是前者根据资源路径(该路径相对于当前应用上下文根),后者根据资源的名称(通过服务器控制台或者web.xml里面配置的,比如web.xml里面配置servlet的名称)
//获取分发器
//根据路径获取 , localhost:8088/test/b
RequestDispatcher dispatcher = sc.getRequestDispatcher("/b");
//根据servletName获取
RequestDispatcher dispatcher1 = sc.getNamedDispatcher("bServlet");
dispatcher1.forward(req,resp);
获取WEB.xml的配置文件的配置数据
- getInitParameter()和setInitParameter()和getInteParameterNames
- 配置web.xml
<!-- 可以设置多个-->
<context-param>
<param-name>eat</param-name>
<param-value>pear</param-value>
</context-param>
<context-param>
<param-name>lao</param-name>
<param-value>难吃</param-value>
</context-param>
//获取
//键值对获取
String init = sc.getInitParameter("lao");
//获取键名
Enumeration<String> initNames = sc.getInitParameterNames();
编程式创建Servlet
- 我们会使用到 ServletContainerInitializer 这个接口
-
- 用的是maven,要在resources目录下创建 MATE-INF目录,然后在MATE-INF目录下创建services目录和javax.servlet.ServletContainerInitializer文件,文件里面配置我们自己写的 ServletContainerInitializer 实现类的 全限定类名
- 用的是maven,要在resources目录下创建 MATE-INF目录,然后在MATE-INF目录下创建services目录和javax.servlet.ServletContainerInitializer文件,文件里面配置我们自己写的 ServletContainerInitializer 实现类的 全限定类名
-
- 编写实现类
@HandlesTypes(value = {HttpServlet.class}) //引入这个类型的实现类和子类
public class MyWebApplicationInitializer implements ServletContainerInitializer {
@Override
public void onStartup(Set<Class<?>> set, ServletContext servletContext) throws ServletException {
//就是@HandlesTypes引入的实现类的类型
for (Class clazz:set){
System.out.println(clazz.getName());
}
//添加Servlet addServlet、createServlet、getServletRegistration、getServletRegistrations
ServletRegistration.Dynamic servlet= servletContext.addServlet("cServlet","cn.lzm.servlet.CServlet");
//servlet.setInitParameter()//设置初始化参数
//servlet.setLoadOnStartup(); //设置加载顺序
servlet.addMapping("/c"); //设置路径
//添加过滤器 addFilter、createFilter、getFilterRegistration、getFilterRegistrations
//添加监听器 addListener、createListener
}
}