ServletContext
• WEB容器在启动时,它会为每个WEB应用程序都创建一个对应的ServletContext对象,它代表当前web应用。
• ServletConfig对象中维护了ServletContext对象的引用,开发人员在编写servlet时,可以通过ServletConfig.getServletContext方法获得ServletContext对象。
也可以使用 this.getServletContext方法
如:
在servlet1中:
//获取上下文:
//1、ServletContext context=this.getServletContext();
//2.ServletContext context =this.getServletConfig().getServletContext();
• 由于一个WEB应用中的所有Servlet共享同一个ServletContext对象,因此Servlet对象之间可以通过ServletContext对象来实现通讯。多个Servlet通过ServletContext对象实现数据共享。
• ServletContext对象通常也被称之为context域对象。(request,session,page)
setAttribute(),getAttribute();
例:使用ServletContext实现两个Servlet数据共享
在servlet2.java中
package net.csdn;
import java.io.IOException;
importjava.io.PrintWriter;
importjavax.servlet.ServletException;
importjavax.servlet.http.HttpServlet;
importjavax.servlet.http.HttpServletRequest;
importjavax.servlet.http.HttpServletResponse;
public class servlet2 extends HttpServlet {
publicvoid doGet(HttpServletRequest request, HttpServletResponse response)
throwsServletException, IOException {
this.getServletContext().setAttribute("data2","1992");
PrintWriterout = response.getWriter();
out.println("servlet");
}
publicvoid doPost(HttpServletRequest request, HttpServletResponse response)
throwsServletException, IOException {
doGet(request,response);
}
}
//然后在servlet3.java中:
package net.csdn;
importjava.io.IOException;
importjava.io.PrintWriter;
importjavax.servlet.ServletException;
importjavax.servlet.http.HttpServlet;
importjavax.servlet.http.HttpServletRequest;
importjavax.servlet.http.HttpServletResponse;
public class servlet3 extends HttpServlet {
publicvoid doGet(HttpServletRequest request, HttpServletResponse response)
throwsServletException, IOException {
System.out.println(this.getServletContext().getAttribute("data2"));
PrintWriterout = response.getWriter();
out.println(context);
}
publicvoid doPost(HttpServletRequest request, HttpServletResponse response)
throwsServletException, IOException {
doGet(request,response);
}
}
ServletContext应用
•获取WEB应用的初始化参数。
<context-param>
<param-name>data</param-name>
<param-value>xxxx</param-value>
</context-param>
例:设置ServletContext初始化参数,然后对其获取。
如在web.xml文件中:
<?xmlversion="1.0" encoding="UTF-8"?>
<web-appversion="2.5"
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_2_5.xsd">
<context-param>
<param-name>data</param-name>
<param-value>1991</param-value>
</context-param>
<servlet>
<servlet-name>FirstWeb</servlet-name>
<servlet-class>net.csdn.ServletWeb</servlet-class>
</servlet>
<servlet>
<servlet-name>servlet1</servlet-name>
<servlet-class>net.csdn.servlet1</servlet-class>
</servlet>
<servlet>
<servlet-name>servlet2</servlet-name>
<servlet-class>net.csdn.servlet2</servlet-class>
</servlet>
<servlet>
<servlet-name>servlet3</servlet-name>
<servlet-class>net.csdn.servlet3</servlet-class>
</servlet>
<servlet>
<servlet-name>servlet4</servlet-name>
<servlet-class>net.csdn.servlet4</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>FirstWeb</servlet-name>
<url-pattern>/firstWeb</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>servlet1</servlet-name>
<url-pattern>/servlet1</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>servlet2</servlet-name>
<url-pattern>/servlet2</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>servlet3</servlet-name>
<url-pattern>/servlet3</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>servlet4</servlet-name>
<url-pattern>/servlet4</url-pattern>
</servlet-mapping>
</web-app>
然后在servlet1.java
package net.csdn;
importjava.io.IOException;
importjava.io.PrintWriter;
importjavax.servlet.RequestDispatcher;
importjavax.servlet.ServletConfig;
importjavax.servlet.ServletContext;
importjavax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
importjavax.servlet.http.HttpServletRequest;
importjavax.servlet.http.HttpServletResponse;
public class servlet1 extends HttpServlet {
publicvoid doGet(HttpServletRequest request, HttpServletResponse response)
throwsServletException, IOException {
ServletContextcon = this.getServletContext();
String context=(String)con.getInitParameter("data");
PrintWriter out = response.getWriter();
out.println(con);
}
publicvoid doPost(HttpServletRequest request, HttpServletResponse response)
throwsServletException, IOException {
doGet(request,response);
}
}
中进行获取。
•实现Servlet的转发。
RequestDispatcher rd =getServletContext().getRequestDispatcher(“/1.jsp”);
rd.forward(request,response);
如何把数据传到 1.jsp ?(可以通过request域,不能用context域)
例:编写一个转发实现由servlet1到index.jsp的转发
在servlet1.java中:
package net.csdn;
importjava.io.IOException;
importjava.io.PrintWriter;
importjavax.servlet.RequestDispatcher;
importjavax.servlet.ServletConfig;
importjavax.servlet.ServletContext;
importjavax.servlet.ServletException;
importjavax.servlet.http.HttpServlet;
importjavax.servlet.http.HttpServletRequest;
importjavax.servlet.http.HttpServletResponse;
public class servlet1 extends HttpServlet {
publicvoid doGet(HttpServletRequest request, HttpServletResponse response)
throwsServletException, IOException {
ServletContextcon = this.getServletContext();
RequestDispatcher rd =con.getRequestDispatcher("/index.jsp");
rd.forward(request, response);
}
publicvoid doPost(HttpServletRequest request, HttpServletResponse response)
throwsServletException, IOException {
doGet(request,response);
}
}
在index.jsp中:
<%@ pagelanguage="java" import="java.util.*"pageEncoding="ISO-8859-1"%>
<%
String path = request.getContextPath();
String basePath =request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<base href="<%=basePath%>">
<title>My JSP 'index.jsp' starting page</title>
<metahttp-equiv="pragma" content="no-cache">
<meta http-equiv="cache-control"content="no-cache">
<meta http-equiv="expires"content="0">
<meta http-equiv="keywords"content="keyword1,keyword2,keyword3">
<metahttp-equiv="description" content="This is my page">
<!--
<linkrel="stylesheet" type="text/css"href="styles.css">
-->
</head>
<body>
This is my JSP page. <br>
<!--在此处获取应用的上下文中的属性data2的值-->
<%= application.getAttribute("data2")%>
</body>
</html>
•利用ServletContext对象读取资源文件。
–得到文件路径
–读取资源文件的三种方式
–.properties文件(属性文件)
例如:通过ServletContext读取配置文件的内容。
如在src下有一个file.properties的配置文件
文件内容:
username = root;
password = root;
然后通过servlet4.java进行读取:
方式一:
package net.csdn;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.PrintWriter;
import java.util.Properties;
import javax.servlet.ServletException;
importjavax.servlet.http.HttpServlet;
importjavax.servlet.http.HttpServletRequest;
importjavax.servlet.http.HttpServletResponse;
public class servlet4 extends HttpServlet {
publicvoid doGet(HttpServletRequest request, HttpServletResponse response)
throwsServletException, IOException {
//在servlet类内使用this.getServletContext().getResourceAsStream()
InputStreamis =this.getServletContext().getResourceAsStream("/WEB-INF/classes/file.properties");
Propertiesp = new Properties();
p.load(is);
System.out.println(p.getProperty("username"));
PrintWriterout = response.getWriter();
out.println("servlet");
}
publicvoid doPost(HttpServletRequest request, HttpServletResponse response)
throwsServletException, IOException {
doGet(request,response);
}
}
方式二:
package net.csdn;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.PrintWriter;
import java.util.Properties;
import javax.servlet.ServletException;
importjavax.servlet.http.HttpServlet;
importjavax.servlet.http.HttpServletRequest;
importjavax.servlet.http.HttpServletResponse;
public class servlet4 extends HttpServlet {
publicvoid doGet(HttpServletRequest request, HttpServletResponse response)
throwsServletException, IOException {
//2、在servlet类内使用this.getServletContext().getRealPath()
String path =this.getServletContext().getRealPath("/WEB-INF/classes/file.properties");
FileInputStream fis = new FileInputStream(path);
Propertiesp = new Properties();
p.load(fis);
System.out.println(p.getProperty("username"));
}
publicvoid doPost(HttpServletRequest request, HttpServletResponse response)
throwsServletException, IOException {
doGet(request,response);
}
}
方式三:通过一个普通类进行读取file.properties文件内容:
NormalClass.java
package net.csdn;
importjava.io.IOException;
import java.io.InputStream;
import java.util.Properties;
public class NormalClass {
publicstatic void main(String[] args) throws IOException {
InputStreamfis = NormalClass.class.getClassLoader().getResourceAsStream("file.properties");
Properties p =new Properties();
p.load(fis);
System.out.println(p.getProperty("username"));
}
}
即可完成对file.properties文件的读取工作。
ServletConfig和ServletContext的区别
–整个Web应用只有一个ServletContext,在部署Web应用的时候,容器会建立这一个ServletContext对象,这个上下文对Web应用中的每个Servlet和JSP都可用。
–Web应用中的各个Servlet都有自己的ServletConfig,它只对当前Servlet有效。