ServletConfig()和ServletContext()
1.ServletConfig()
ServletConfig是一个接口,它由服务器提供商来实现。
ServletConfig封装了Servlet的配置信息,并且可以获取ServletContext对象。
Servlet容器在初始化servlet的时候会初始化一个servletConfig对象,这个对象在任何可访问的客户端都是有效的,但是,需注意的是,该对象只能在本servlet中应用,不能在其他servlet中访问。
主要的方法:
- public ServletContext getServletContext(); //暂不写,放在ServletContext中整理
- public String getInitParameter(String name); //获取指定参数名的初始化参数
- public Enumeration< String > getInitParameterNames(); //获取参数名组成的 Enumeration 对象
- public String getServletName(); //使用比较少
获取配置信息
如何配置
<servlet>
<servlet-name>helloServlet</servlet-name>
<servlet-class>com.buaa.zhao.HelloServlet</servlet-class>
<!-- 配置 Serlvet 的初始化参数。 且节点必须在 load-on-startup 节点的前面 -->
<init-param>
<!-- 参数名 -->
<param-name>user</param-name>
!-- 参数值 -->
<param-value>root</param-value>
</init-param>
<init-param>
<param-name>password</param-name>
<param-value>12345</param-value>
</init-param>
<load-on-startup>-1</load-on-startup>
</servlet>
获取配置信息
public void init(ServletConfig servletConfig) throws ServletException {
String user = servletConfig.getInitParameter("user");
//输出root
System.out.println(user);
System.out.println("--------------------------");
Enumeration<String> names = servletConfig.getInitParameterNames();
//输出:
//user: root
//password: 12345
while(names.hasMoreElements()){
String name = names.nextElement();
String value = servletConfig.getInitParameter(name);
System.out.println(name + ": " + value);
}
}
2.ServletContext()
可以认为 SerlvetContext 是当前 WEB 应用的一个大管家. 可以从中获取到当前 WEB 应用的各个方面的信息
主要的方法
- public String getInitParameter(String name); //获取指定参数名的初始化参数
- public Enumeration< String > getInitParameterNames(); //获取参数名组成的 Enumeration 对象
- public String getRealPath(String path);
- public String getContextPath();
- public InputStream getResourceAsStream(String path);
获取配置信息
ServletContext实例可以通过 serlvetConfig.getServletContext()方法获得的.
该对象代表当前 WEB 应用: 可以认为 SerlvetContext 是当前 WEB 应用的一个大管家. 可以从中获取到当前 WEB 应用的各个方面的信息。
如何配置
<!-- 配置当前 WEB 应用的初始化参数 -->
<context-param>
<param-name>driver</param-name>
<param-value>com.mysql.jdbc.Driver</param-value>
</context-param>
<context-param>
<param-name>jdbcUrl</param-name>
<param-value>jdbc:localhost:///test</param-value>
</context-param>
获取配置信息
public void init(ServletConfig servletConfig) throws ServletException {
//获取ServletContext对象
ServletContext servletContext = servletConfig.getServletContext();
String driver = servletContext.getInitParameter("driver");
//输出:driver: com.mysql.jdbc.Driver
System.out.println("driver: " + driver);
Enumeration<String> nameContext = servletContext.getInitParameterNames();
//输出
//name: driver
//name: jdbcUrl
while(nameContext.hasMoreElements()) {
String name = nameContext.nextElement();
System.out.println("name: " + name);
}
}
获取当前Web应用的某个文件部署在在服务器上的绝对路径
需要通过方法public String getRealPath(String path);
来获取。
代码:
String realPath = servletContext.getRealPath("/zhaoTest");
System.out.println(realPath);
输出结果:
D:\workspace\sts\.metadata\.plugins\org.eclipse.wst.server.core\tmp3\wtpwebapps\***\zhaoTest.xml
获取当前 WEB 应用的名称
需要通过方法getContextPath();
来获取。
代码:
String contextPath = servletContext.getContextPath();
System.out.println(contextPath);
获取当前web应用的而某一个文件对应的输入流
通过getResourceAsStream(String path)
获取,path 的 / 为当前 WEB 应用的根目录。
有两种方法可以获取到。
代码
try {
ClassLoader classLoader = getClass().getClassLoader();
InputStream is = classLoader.getResourceAsStream("jdbc.properties");
System.out.println("1. " + is);
pros.load(is);
System.out.println(pros.getProperty("name"));
} catch (Exception e) {
e.printStackTrace();
}
pros = new Properties();
try {
//注意: / 为当前 WEB 应用的根目录。
InputStream is2 = servletContext.getResourceAsStream("/WEB-INF/classes/jdbc.properties");
System.out.println("2. " + is2);
pros.load(is2);
System.out.println(pros.getProperty("name"));
} catch (Exception e) {
e.printStackTrace();
}
结果
1. java.io.BufferedInputStream@15d442ac
2. java.io.FileInputStream@22653566
ServletConfig()和ServletContext()的区别
- 作用范围不同:ServletContext的参数可以为所有的Servlet所获取,ServletConfig只能由当前Servlet所获取。也就是说他们的区别在于,所填写的配置的信息是想让一个Servlet用还是多个Servlet用。
- 配置不同:ServletContext是在两个元素间配置,ServletConfig是在元素之间的间配置。