一、ServletConfig对象
1.1、配置servlet初始化参数
在servlet的配置文件中web.xml中,可以使用一个或多个
例如:
ServletDemo6 class>my.servlet.demo.ServletDemo6 class>name my password 123 charset UTF-8 ServletDemo6 /ServletDemo6
1.2、通过ServletConfig获取servlet初始化参数
当servlet配置了初始化参数后,web容器在创建servlet实例对象时,会自动将这些初始化参数封装到ServletConfig对象中,并在调用servlet的init方法时,将ServletConfig对象传递给servlet。进而我们通过ServletConfig对象就可以得到当前servlet的初始化参数信息。
例如:
package my.servlet.demo; //导入必需的 java 库 import java.io.*; import java.util.Enumeration; import javax.servlet.*; import javax.servlet.http.*; // 扩展 HttpServlet 类 public class ServletDemo1 extends HttpServlet { /** * 定义ServletConfig对象来接收配置的初始化参数 */ private ServletConfig config; /** * 当servlet配置了初始化参数后,web容器在创建servlet实例对象时, * 会自动将这些初始化参数封装到ServletConfig对象中,并在调用servlet的init方法时, * 将ServletConfig对象传递给servlet。进而,程序员通过ServletConfig对象就可以 * 得到当前servlet的初始化参数信息。 */ public void init(ServletConfig config) throws ServletException { // 执行必需的初始化 this.config=config; } public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //获取在web.xml中配置的初始化参数 String paramVal=this.config.getInitParameter("name");//获取指定的初始化参数 response.getWriter().print(paramVal); response.getWriter().print("
"); //获取所有的初始化参数 Enumeratione =config.getInitParameterNames(); while(e.hasMoreElements()) { String name =e.nextElement(); String value=config.getInitParameter(name); response.getWriter().print(name+"="+value+"
"); } } public void destroy() { // 什么也不做 } }
运行结果如下:
二、ServletContext对象
WEB容器在启动时,它会为每个WEB应用程序都创建一个对应的ServletContxt对象,它代表当前web应用。
ServletConfig对象中维护了ServletContext对象的引用,开发人员在编写servlet时,可以通过ServletConfig.getServletContext方法获得ServletContext对象。
由于一个WEB应用中的所有Servlet共享同一个ServletContext对象,因此Servlet对象之间可以通过ServletContext对象来实现通讯。ServletContext对象通常也被称为context域对象。
2.1、多个servlet通过ServletContext对象实现数据共享
例子:ServletDemo1和ServletDemo2通过ServletContext对象实现数据共享
package my.servlet.demo; //导入必需的 java 库 import java.io.*; import java.util.Enumeration; import javax.servlet.*; import javax.servlet.http.*; // 扩展 HttpServlet 类 public class ServletDemo1 extends HttpServlet { private ServletConfig config; public void init(ServletConfig config) throws ServletException { // 执行必需的初始化 this.config=config; } public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { String data="itnnn"; ServletContext context=config.getServletContext(); context.setAttribute("data", data); } public void destroy() { // 什么也不做 } }
package my.servlet.demo; import java.io.IOException; import javax.servlet.ServletContext; import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; /** * Servlet implementation class ServletDemo2 */ @WebServlet("/ServletDemo2") public class ServletDemo2 extends HttpServlet { protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // TODO Auto-generated method stub ServletContext context =this.getServletContext(); String data=(String) context.getAttribute("data"); response.getWriter().print("data="+data); } /** * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response) */ protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // TODO Auto-generated method stub } }
先运行ServletDemo1,将数据data存储到ServletContext对象中,然后运行ServletDemo2就可以从ServletContext对象中取出数据了,这样就实现了数据共享,运行结果如下图所示:
2.2、获取WEB应用的初始化参数
在web.xml文件中使用
xml version="1.0" encoding="UTF-8"?> <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 http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"> <display-name>display-name> <context-param> <param-name>urlparam-name> <param-value>jdbc:mysql://localhost:3306/testparam-value> context-param> <welcome-file-list> <welcome-file>index.jspwelcome-file> welcome-file-list> web-app>
package my.servlet.demo; import java.io.IOException; import javax.servlet.ServletContext; import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; @WebServlet("/ServletDemo3") public class ServletDemo3 extends HttpServlet { protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { ServletContext context=this.getServletContext(); //获取整个web站点的初始化参数 String contextInitParam =context.getInitParameter("url"); response.getWriter().print(contextInitParam ); } protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // TODO Auto-generated method stub } }
运行结果:
2.3、用ServletContext实现请求转发
ServletDemo4.java
package my.servlet.demo; import java.io.IOException; import javax.servlet.RequestDispatcher; import javax.servlet.ServletContext; import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; public class ServletDemo4 extends HttpServlet { protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // TODO Auto-generated method stub String data="abc
"; response.getOutputStream().write(data.getBytes()); ServletContext context=this.getServletContext(); RequestDispatcher rd =context.getRequestDispatcher("/ServletDemo5"); rd.forward(request, response); } protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // TODO Auto-generated method stub } }
ServletDemo5.java
package my.servlet.demo; import java.io.IOException; import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; public class ServletDemo5 extends HttpServlet { protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // TODO Auto-generated method stub response.getOutputStream().write("servletDemo5".getBytes()); } protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // TODO Auto-generated method stub } }
web.xml
This is the description of my J2EEcomponent This is the display of my J2EEcomponent ServletDemo4 my.servlet.demo.ServletDemo4 This is the description of my J2EEcomponent This is the display of my J2EEcomponent ServletDemo5 my.servlet.demo.ServletDemo5 ServletDemo4 /ServletDemo4 ServletDemo5 /ServletDemo5
运行结果:
访问的是ServletDemo4,浏览器显示的却是ServletDemo5的内容,这就是使用ServletContext实现了请求转发。
2.4、利用ServletContext对象读取资源文件
2.5、在客户端缓存servlet输出