本文将记录ServletConfig/ServletContext中提供了哪些方法,及方法的用法。
ServletConfig是一个抽象接口,它是由Servlet容器使用,在一个servlet对象初始化时,Servlet容器传递信息给正在初始化的servlet对象。
public abstract interface javax.servlet.ServletConfig { public abstract java.lang.String getServletName(); public abstract javax.servlet.ServletContext getServletContext(); public abstract java.lang.String getInitParameter(java.lang.String arg0); public abstract java.util.Enumeration getInitParameterNames();}
- getServletName()方法:
用来返回当前servlet在web.xml注册的servlet-name;
- getServletContext()方法:
获取servlet上下文信息。
- getInitParameter(String arg0)方法:
根据一个指定的参数名称,获取在servlet初始化时传递的参数值,而这样的参数信息往往配置在web.xml。
- getInitParameters()方法:
返回servlet初始化时,传递进来的所有参数名称集合。
为了能了解到ServletConfig相关的使用,我们需要在之前新建的MyServlet001工程中,修改web.xml,在<servlet>节点中添加<init-param>节点:
1 26 7 8 9 10 27helloServlet 11 12com.dx.hello.HelloServlet 13 14 1516 19username 17user001 1820 23 24 25password 21123456 22-1 2628 29 33 34helloServlet 30 31/hello 32
在配置参数时,需要注意事项:
<load-on-startup>节点必须在<init-param>节点的下边,否则会抛出异常信息,配置不通过。
之后再HelloServlet的init方法中,添加代码:
1 public void init(ServletConfig config) throws ServletException { 2 System.out.println("init"); 3 4 // 根据ServletConfig的getInitParameter()方法,根据特定初始化参数名称,获取对应的初始化参数值。 5 String username = config.getInitParameter("username"); 6 String password = config.getInitParameter("password"); 7 System.out.println("username:" + username); 8 System.out.println("password:" + password); 9 10 // 根据ServletConfig的getInitParameterNames()方法,获取初始化参数信息。11 Enumerationnames = config.getInitParameterNames();12 while (names.hasMoreElements()) {13 String name = names.nextElement();14 String value = config.getInitParameter(name);15 System.out.println(name + ":" + value);16 }17 18 // 获取Servlet名称。19 String servletName = config.getServletName();20 System.out.println(servletName);21 22 ServletContext servletContext = config.getServletContext();23 }
重新启动tomcat,并在浏览器中输入地址:http://localhost:8080/MyServlet001/hello,回车,之后查看tomcat服务器输出信息:
INFO: Server startup in 1262 msHelloServlet constructorinitusername:user001password:123456username:user001password:123456helloServletservice
从上边的输出信息,及代码中,就可以理解,getInitParameter(),getInitParameters(),getServletName()的用法。
ServletContext servletContext=config.getServletContext();
这个ServletContext是怎么解释,有什么用处呢?
我们查看官网对ServletContext的介绍:
- public interface ServletContext
Defines a set of methods that a servlet uses to communicate with its servlet container, for example, to get the MIME type of a file, dispatch requests, or write to a log file.
There is one context per "web application" per Java Virtual Machine. (A "web application" is a collection of servlets and content installed under a specific subset of the server's URL namespace such as
/catalog
and possibly installed via a.war
file.)In the case of a web application marked "distributed" in its deployment descriptor, there will be one context instance for each virtual machine. In this situation, the context cannot be used as a location to share global information (because the information won't be truly global). Use an external resource like a database instead.
The
ServletContext
object is contained within the object, which the Web server provides the servlet when the servlet is initialized.
ServletContext接口:
1、Servlet引擎为每个web应用程序都创建了一个对应的ServletContext对象,ServletContext对象被包含在ServletConfig对象中,调用ServletConfig.getServletContext()方法就可以返回ServletContext对象的引用。
2、由于一个web应用程序中的所有Servlet都共享一个ServletContext对象,所以ServletContext对象被称之为application对象(web应用程序对象)。
3、功能:
获取web应用程序的初始化参数;
记录日志;
application域范围的属性;
访问资源文件;
获取虚拟路径所映射的本地路径;
web应用程序之间的访问;
ServletContext的其他方法。
- 获取web应用程序的初始化参数;
首先,需要在web.xml中配置应用程序级别(<context-param>)的参数信息;
1 26 7 8 9 12driver 10com.mysql.jdbc.Driver 1113 16 17 18jdbcUrl 14jdbc:mysql://test 1519 20 37helloServlet 21 22com.dx.hello.HelloServlet 23 24 2526 29username 27user001 2830 33 34 35password 31123456 32-1 3638 39 43 44helloServlet 40 41/hello 42
注意:
这里的context-param是应用程级别的初始化参数,<servlet>节点下的<init-param>属于servlet局部的初始化参数,他们具有作用域范围不同。
然后,使用:
1 public void init(ServletConfig config) throws ServletException { 2 System.out.println("init"); 3 4 // 根据ServletConfig的getInitParameter()方法,根据特定初始化参数名称,获取对应的初始化参数值。 5 String username = config.getInitParameter("username"); 6 String password = config.getInitParameter("password"); 7 System.out.println("username:" + username); 8 System.out.println("password:" + password); 9 10 // 根据ServletConfig的getInitParameterNames()方法,获取初始化参数信息。11 Enumerationnames = config.getInitParameterNames();12 while (names.hasMoreElements()) {13 String name = names.nextElement();14 String value = config.getInitParameter(name);15 System.out.println(name + ":" + value);16 }17 18 // 获取Servlet名称。19 String servletName = config.getServletName();20 System.out.println(servletName);21 22 // 使用getServletContext(),获取ServletContext对象。23 ServletContext servletContext = config.getServletContext();24 25 // ServletContext获取初始化参数函数getInitParameter(String arg0)26 String driver=servletContext.getInitParameter("driver");27 String jdbc=servletContext.getInitParameter("jdbc");28 System.out.println("driver:"+driver);29 System.out.println("jdbc:"+jdbc);30 31 // ServletContext获取初始化参数集合函数getInitParameterNames()32 Enumeration names2= servletContext.getInitParameterNames();33 while (names2.hasMoreElements()) {34 String name = names2.nextElement();35 String value = servletContext.getInitParameter(name);36 System.out.println(name + ":" + value);37 }38 }
查看输出信息:
HelloServlet constructorinitusername:user001password:123456username:user001password:123456helloServletdriver:com.mysql.jdbc.DriverjdbcUrl:jdbc:mysql://testdriver:com.mysql.jdbc.DriverjdbcUrl:jdbc:mysql://testservice
- 访问资源文件(获取当前web应用的某一个文件对应的输入流。);
1 // 获取当前web应用的某一个文件对应的输入流。 2 try { 3 ClassLoader classLoader = this.getClass().getClassLoader(); 4 InputStream stream = classLoader.getResourceAsStream("jdbc.properties"); 5 //stream with method0:java.io.BufferedInputStream@1cd3bd82 6 System.out.println("stream with method0:"+stream); 7 } catch (Exception e) { 8 e.printStackTrace(); 9 }10 11 try {12 InputStream stream = servletContext.getResourceAsStream("/WEB-INF/classes/jdbc.properties");13 // stream with method1:java.io.FileInputStream@113eb097 14 System.out.println("stream with method1:"+stream); 15 } catch (Exception e) {16 e.printStackTrace();17 }
- 获取当前web应用的某一个文件,在服务器上的一个绝对路径
1 // 获取当前web应用的某一个文件,在服务器上的一个绝对路径:2 // D:\java\workset\.metadata\.plugins\org.eclipse.wst.server.core\tmp0\wtpwebapps\MyServlet001\WEB-INF\web.xml3 String realPath=servletContext.getRealPath("/WEB-INF/web.xml");4 System.out.println(realPath);
- 获取web当前应用的名称;
// 获取web当前应用的名称 String webName=servletContext.getContextPath(); // "/MyServlet001" System.out.println(webName);