在Servlet的配置文件web.xml中,可使用一个或多个<init-param>标签为servlet配置一些初始化参数。java
例如:mysql
1 <servlet> 2 <servlet-name>ServletConfigDemo1</servlet-name> 3 <servlet-class>gacl.servlet.study.ServletConfigDemo1</servlet-class> 4 <!--配置ServletConfigDemo1的初始化参数 --> 5 <init-param> 6 <param-name>name</param-name> 7 <param-value>admin</param-value> 8 </init-param> 9 <init-param> 10 <param-name>password</param-name> 11 <param-value>123456</param-value> 12 </init-param> 13 <init-param> 14 <param-name>charset</param-name> 15 <param-value>UTF-8</param-value> 16 </init-param> 17 </servlet>
当servlet配置了初始化参数后,web容器在建立servlet实例对象时,会自动将这些初始化参数封装到ServletConfig对象中,并在调用servlet的init方法时,将ServletConfig对象传递给servlet。进而,咱们经过ServletConfig对象就能够获得当前servlet的初始化参数信息。程序员
例如:web
1 package gacl.servlet.study; 2 3 import java.io.IOException; 4 import java.util.Enumeration; 5 import javax.servlet.ServletConfig; 6 import javax.servlet.ServletException; 7 import javax.servlet.http.HttpServlet; 8 import javax.servlet.http.HttpServletRequest; 9 import javax.servlet.http.HttpServletResponse; 10 11 public class ServletConfigDemo1 extends HttpServlet { 12 13 /** 14 * 定义ServletConfig对象来接收配置的初始化参数 15 */ 16 private ServletConfig config; 17 18 /** 19 * 当servlet配置了初始化参数后,web容器在建立servlet实例对象时, 20 * 会自动将这些初始化参数封装到ServletConfig对象中,并在调用servlet的init方法时, 21 * 将ServletConfig对象传递给servlet。进而,程序员经过ServletConfig对象就能够 22 * 获得当前servlet的初始化参数信息。 23 */ 24 @Override 25 public void init(ServletConfig config) throws ServletException { 26 this.config = config; 27 } 28 29 public void doGet(HttpServletRequest request, HttpServletResponse response) 30 throws ServletException, IOException { 31 //获取在web.xml中配置的初始化参数 32 String paramVal = this.config.getInitParameter("name");//获取指定的初始化参数 String pwd = config.getInitParameter("password"); 33 response.getWriter().print(paramVal +": " + pwd); 36 //获取全部的初始化参数 37 Enumeration<String> e = config.getInitParameterNames(); 38 while(e.hasMoreElements()){ 39 String name = e.nextElement(); 40 String value = config.getInitParameter(name); 41 response.getWriter().print(name + "=" + value + "<br/>"); 42 } 43 } 44 45 public void doPost(HttpServletRequest request, HttpServletResponse response) 46 throws ServletException, IOException { 47 this.doGet(request, response); 48 } 49 50 }
运行结果以下:sql
WEB容器在启动时,它会为每一个WEB应用程序都建立一个对应的ServletContext对象,它表明当前web应用。
ServletConfig对象中维护了ServletContext对象的引用,开发人员在编写servlet时,能够经过ServletConfig.getServletContext方法得到ServletContext对象。
因为一个WEB应用中的全部Servlet共享同一个ServletContext对象,所以Servlet对象之间能够经过ServletContext对象来实现通信。ServletContext对象一般也被称之为context域对象。浏览器
范例:ServletContextDemo1和ServletContextDemo2经过ServletContext对象实现数据共享app
import java.io.IOException; import javax.servlet.ServletContext; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; public class ServletContextDemo1 extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { String data = "ABC"; /** * ServletConfig对象中维护了ServletContext对象的引用,开发人员在编写servlet时, * 能够经过ServletConfig.getServletContext方法得到ServletContext对象。 */ ServletContext context = this.getServletConfig().getServletContext();//得到ServletContext对象 context.setAttribute("data", data); //将data存储到ServletContext对象中 } public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doGet(request, response); } }
import java.io.IOException; import javax.servlet.ServletContext; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; public class ServletContextDemo2 extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { ServletContext context = this.getServletContext(); String data = (String) context.getAttribute("data");//从ServletContext对象中取出数据 response.getWriter().print(data); } public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doGet(request, response); } }
先运行ServletContextDemo1,将数据data存储到ServletContext对象中,而后运行ServletContextDemo2就能够从ServletContext对象中取出数据了,这样就实现了数据共享,以下图所示ide
:this
在web.xml文件中使用<context-param>标签配置WEB应用的初始化参数,以下所示:url
1 <?xml version="1.0" encoding="UTF-8"?> 2 <web-app version="3.0" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee 3 http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"> 4 <display-name></display-name> 5 <!-- 配置WEB应用的初始化参数 --> 6 <context-param> 7 <param-name>url</param-name> 8 <param-value>jdbc:mysql://localhost:3306/test</param-value> 9 </context-param> 10 </web-app>
获取Web应用的初始化参数,代码以下:
3 import java.io.IOException; 4 import javax.servlet.ServletContext; 5 import javax.servlet.ServletException; 6 import javax.servlet.http.HttpServlet; 7 import javax.servlet.http.HttpServletRequest; 8 import javax.servlet.http.HttpServletResponse; 9 10 11 public class ServletContextDemo3 extends HttpServlet { 12 13 public void doGet(HttpServletRequest request, HttpServletResponse response) 14 throws ServletException, IOException { 15 16 ServletContext context = this.getServletContext(); 17 //获取整个web站点的初始化参数 18 String contextInitParam = context.getInitParameter("url"); 19 response.getWriter().print(contextInitParam); 20 } 21 22 public void doPost(HttpServletRequest request, HttpServletResponse response) 23 throws ServletException, IOException { 24 doGet(request, response); 25 } 26 27 }
运行结果:
ServletContextDemo4 3 import java.io.IOException; 4 import java.io.PrintWriter; 5 import javax.servlet.RequestDispatcher; 6 import javax.servlet.ServletContext; 7 import javax.servlet.ServletException; 8 import javax.servlet.http.HttpServlet; 9 import javax.servlet.http.HttpServletRequest; 10 import javax.servlet.http.HttpServletResponse; 11 12 public class ServletContextDemo4 extends HttpServlet { 13 14 public void doGet(HttpServletRequest request, HttpServletResponse response) 15 throws ServletException, IOException { 16 String data = "<h1><font color='red'>abcdefghjkl</font></h1>"; 17 response.getOutputStream().write(data.getBytes()); 18 ServletContext context = this.getServletContext();//获取ServletContext对象 19 RequestDispatcher rd = context.getRequestDispatcher("/servlet/ServletContextDemo5");//获取请求转发对象(RequestDispatcher) 20 rd.forward(request, response);//调用forward方法实现请求转发 21 } 22 23 public void doPost(HttpServletRequest request, HttpServletResponse response) 24 throws ServletException, IOException { 25 } 26 }
ServletContextDemo5 3 import java.io.IOException; 4 import javax.servlet.ServletException; 5 import javax.servlet.http.HttpServlet; 6 import javax.servlet.http.HttpServletRequest; 7 import javax.servlet.http.HttpServletResponse; 8 9 public class ServletContextDemo5 extends HttpServlet { 10 11 public void doGet(HttpServletRequest request, HttpServletResponse response) 12 throws ServletException, IOException { 13 response.getOutputStream().write("servletDemo5".getBytes()); 14 } 15 16 public void doPost(HttpServletRequest request, HttpServletResponse response) 17 throws ServletException, IOException { 18 this.doGet(request, response); 19 } 20 21 }
运行结果:
访问的是ServletContextDemo4,浏览器显示的倒是ServletContextDemo5的内容,这就是使用ServletContext实现了请求转发。