ServletContext(Application),代表整个应用
一个项目只有一个ServletContext对象,可以在N个Servlet中来获取这个唯一的对象,使用它可以给Servlet传递数据。
ServletContext在服务器启动时创建,在服务器关闭时销毁,一个JavaWeb只创建一个ServletContext对象。
ServletContext的功能就是获取全局配置信息、多个Servlet之间共享数据、获取资源路径。
获取ServletContext
- Servlet#getServletConfig#getServletContext();
- ServletConfig#getServletContext();
- HttpSession#getServletContext();
- ServletContextEvent#getServletContext();
在Servlet中获取ServletContext对象:
在void init(ServletConfig config)中:ServletContext context=config.getServletContext();
在GenericServlet中获取ServletContext对象:
在GenericServlet类中有getServletContext()方法,可以直接使用this.getServletContext()来获取。
在HttpServlet中获取ServletContext对象:
ServletContext sc=this.getServletContext();
ServletContext sc1=this.getServletConfig().getServletContext();
域对象的功能
ServletContext是JavaWeb四大域对象之一。域对象可以用来在多个Servlet中传递数据。
PageContext、ServletRequest、HttpSession和ServletContext。
所有域对象都有存取数据的功能,因为域对象内部是一个Map,用来存储数据。
常用方法:
- void setAttribute(String name,Object object):用来存储一个对象,也称为存储一个域属性。
- Object getAttribute(String name):用来获取ServletContext中的数据。
- void removeAttribute(String name):用来移除ServletContext中的域属性,如果参数name指定的域属性不存在,什么也不做。
- Enumeration getAttributeNames():获取所有域属性的名称。
- boolean setInitParameter(String name,String value):设置初始化参数,如果参数名存在,设置失败。
- ServletContext getContext(String uripath):返回映射到另一URL的servlet上下文。在同一服务器中URL必须是以“/”开头的绝对路径。
- String getContextPath():获取当前的项目根目录路径,也可以理解为项目名。
- String getInitParameter(String name):根据参数名来获取应用的初始化参数。
- Enumeration<String> getInitParameterNames():获取应用的的初始化参数集合。
- String getRealPath(String path):根据资源路径得到资源的绝对路径。
- RequestDispatcher getRequestDispatcher(String path):根据路径将指定的资源包装成RequestDispatcher实例并返回。
- URL getResource(String path):返回指定路径的URL实例。
- InputStream getResourceAsStream(String path):获取资源的输入流。
- Set<String> getResourcePaths(String path):获取指定目录下的所有资源路径。必须以"/"开头。
- String getServerInfo():返回Servlet容器的名称和版本,格式为servername/versionnumber.
- String getServletContextName():返回应用的名称,这里的名称是web.xml里面配置的display-name,如果没有配置,则返回null。
- void log(String msg):log方法都是记录日志到servlet日志文件,servlet日志文件的路径由具体的servlet容器去决定,如果你是在MyEclipse、STS这类的IDE中跑应用的话,那么日志信息将在控制台(Console)输出。如果是发布到Tomcat下的话,日志文件是Tomcat目录下的/logs/localhost.yyyy-MM-dd.log。
获取初始化参数
<context-param>
<param-name>param1</param-name>
<param-value>paramv1</param-value>
</context-param>
ServletContext sc=this.getServletContext();
String name =sc.getInitParameter("param1");
PrintWriter out = response.getWriter();
out.println(name);
获取资源相关方法
⑴获取真实路径
可以使用ServletConfig对象来获取Web应用下的资源。
如获取hello应用的根目录下创建a.txt文件,在Servlet中获取这个资源,可以使用ServletContext来获取。
- 获取a.txt的真实路径:String realPath=servletContext.getRealPath("/a.txt"),realPath的值为a.txt文件的真实路径:
- 获取b.txt的真实路径:String realPath=servletContext.getRealPath("/WEB-INF/a.txt"),以“/”开头,当前应用根目录。
⑵获取资源流
可以通过ServletContext获取资源流,即把资源以输入流的方式获取:
- 获取a.txt资源流:InputStream in=servletContext.getResourceAsStream("/a.txt");
- 获取b.txt资源流:InputStream in=servletContext.getResourceAsStream("/WEB-INF/b.txt");
⑶获取指定目录下所有资源路径
可以使用ServletContext获取指定目录下的所有资源路径,例如获取/WEB-INF下所有资源的路径:
Set set=context.getResourcePaths("/WEB-INF");
获取类路径下资源
获取类路径资源,类路径对一个JavaWeb项目而言,就是/WEB-INF/classes和/WEB-INF/lib/每个jar包。
InputStream in=this.getClass().getResourceAsStream("/xxx.txt");获取的是/WEB-INF/classes/xxx.txt,即类路径的根目录下的资源,类路径的根目录就是/classes目录。
System.out.println(IOUtils.toString(in));
InputStream in=this.getClassLoader().getResourceAsStream("xx.txt");
System.out.println(IOUtils.toString());获取的是当前Servlet同目录下的资源。
⑴Class类的getResouceAsStream(String path):
- 路径以"/"开头,相对classes路径。
- 路径不以""开头,相对当前class文件所有路径,例如在cn.yzgarden.servlet.MyServlet中执行,那么相对/classes/cn/yzgarden/servlet/目录。
⑵ClassLoader类的getResourceAsStream(String path):相对classes路径。
先得到Class,再得到ClassLoader:
ClassLoader cl=this.getClass().getClassLoader();
InputStream input=cl.getResourceAsStream("");