本文将记录ServletConfig中提供了哪些方法,及方法的用法。
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(); }
用来返回当前servlet在web.xml注册的servlet-name;
获取servlet上下文信息。
根据一个指定的参数名称,获取在servlet初始化时传递的参数值,而这样的参数信息往往配置在web.xml。
返回servlet初始化时,传递进来的所有参数名称集合。
为了能了解到ServletConfig相关的使用,我们需要在之前新建的MyServlet001工程中,修改web.xml,在<servlet>节点中添加<init-param>节点:
1 <?xml version="1.0" encoding="UTF-8"?> 2 <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 3 xmlns="http://java.sun.com/xml/ns/javaee" 4 xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" 5 id="WebApp_ID" version="3.0"> 6 7 <!-- 配置和映射 servlet --> 8 <servlet> 9 <!-- Servlet注册的名字 --> 10 <servlet-name>helloServlet</servlet-name> 11 <!-- Servlet全类名 --> 12 <servlet-class>com.dx.hello.HelloServlet</servlet-class> 13 14 <!-- 配置Servlet的初始化参数。且节点必须在 load-on-startup节点的前边 --> 15 <init-param> 16 <param-name>username</param-name> 17 <param-value>user001</param-value> 18 </init-param> 19 <init-param> 20 <param-name>password</param-name> 21 <param-value>123456</param-value> 22 </init-param> 23 24 <!-- 指定servlet被初始化的时机 --> 25 <load-on-startup>-1</load-on-startup> 26 </servlet> 27 <servlet-mapping> 28 <!-- 对应servlet节点下的servlet-name的注册名字一致 --> 29 <servlet-name>helloServlet</servlet-name> 30 <!-- 映射具体的访问路径,其中/代表当前web的根目录 --> 31 <url-pattern>/hello</url-pattern> 32 </servlet-mapping> 33 34 </web-app>
在配置参数时,需要注意事项:
<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 Enumeration<String> names = 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 ms
HelloServlet constructor
init
username:user001
password:123456
username:user001
password:123456
helloServlet
service
从上边的输出信息,及代码中,就可以理解,getInitParameter(),getInitParameters(),getServletName()的用法。
ServletContext servletContext=config.getServletContext();
这个ServletContext是怎么解释,有什么用处呢?
我们查看官网对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 theServletConfig
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.xml中配置应用程序级别(<context-param>)的参数信息;
1 <?xml version="1.0" encoding="UTF-8"?> 2 <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 3 xmlns="http://java.sun.com/xml/ns/javaee" 4 xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" 5 id="WebApp_ID" version="3.0"> 6 7 <!-- 配置当前web应用的初始化参数 --> 8 <context-param> 9 <param-name>driver</param-name> 10 <param-value>com.mysql.jdbc.Driver</param-value> 11 </context-param> 12 <context-param> 13 <param-name>jdbcUrl</param-name> 14 <param-value>jdbc:mysql://test</param-value> 15 </context-param> 16 17 <!-- 配置和映射 servlet --> 18 <servlet> 19 <!-- Servlet注册的名字 --> 20 <servlet-name>helloServlet</servlet-name> 21 <!-- Servlet全类名 --> 22 <servlet-class>com.dx.hello.HelloServlet</servlet-class> 23 24 <!-- 配置Servlet的初始化参数。且节点必须在 load-on-startup节点的前边 --> 25 <init-param> 26 <param-name>username</param-name> 27 <param-value>user001</param-value> 28 </init-param> 29 <init-param> 30 <param-name>password</param-name> 31 <param-value>123456</param-value> 32 </init-param> 33 34 <!-- 指定servlet被初始化的时机 --> 35 <load-on-startup>-1</load-on-startup> 36 </servlet> 37 <servlet-mapping> 38 <!-- 对应servlet节点下的servlet-name的注册名字一致 --> 39 <servlet-name>helloServlet</servlet-name> 40 <!-- 映射具体的访问路径,其中/代表当前web的根目录 --> 41 <url-pattern>/hello</url-pattern> 42 </servlet-mapping> 43 44 </web-app>
注意:
这里的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 Enumeration<String> names = 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<String> 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 constructor init username:user001 password:123456 username:user001 password:123456 helloServlet driver:com.mysql.jdbc.Driver jdbcUrl:jdbc:mysql://test driver:com.mysql.jdbc.Driver jdbcUrl:jdbc:mysql://test service
d
的
1 // 获取当前web应用的某一个文件,在服务器上的一个绝对路径: 2 // D:\java\workset\.metadata\.plugins\org.eclipse.wst.server.core\tmp0\wtpwebapps\MyServlet001\WEB-INF\web.xml 3 String realPath=servletContext.getRealPath("/WEB-INF/web.xml"); 4 System.out.println(realPath);
// 获取web当前应用的名称 String webName=servletContext.getContextPath(); // "/MyServlet001" System.out.println(webName);
Java Servlet(三):Servlet中ServletConfig对象和ServletContext对象
原文:http://www.cnblogs.com/yy3b2007com/p/5224753.html