一. Servlet上下文
1. 每个web工程都只有一个ServletContext对象。也就是在同一个web工程里, 所有的servlet获取到的这个类的对象都是同一个。
2. 获取上下文对象: ServletContext context = getServletContext();
3. ServletContext 的作用
3.1. 获取全局配置参数;
3.2. 获取web工程中的资源;
3.3. 存取数据, servlet间共享数据。
4. ServletContext何时创建: 服务器启动的时候, 会为托管的每一个web应用程序, 创建一个ServletContext对象。
5. ServletContext何时销毁: 从服务器移除托管或者是关闭服务器。
6. ServletContext 的作用范围: 只要在这个项目里面, 都可以取。
二. ServletContext 获取全局配置参数
1. 新建一个UseServletContext的Web工程
2. 在下WebContent新建一个index.html
3. 编写index.html
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8" />
<title>servlet上下文</title>
</head>
<body>
<a href="GetContextParam.action">获取全局配置参数</a><br/>
</body>
</html>
4. 新建一个GetContextParam.java类
5. 编辑GetContextParam.java
package com.lywgames.myservlet;
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 GetContextParam extends HttpServlet {
private static final long serialVersionUID = 1L;
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// 获取ServletContext对象
ServletContext servletContext = getServletContext();
// 获取全局配置参数
String address = servletContext.getInitParameter("address");
System.out.println("address = " + address);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req, resp);
}
}
6. 编辑web.xml
7. 部署运行
8. 点击”获取全局配置参数”超链接, 控制台打印
三. ServletContext 获取资源
1. 在WebContent目录下, 新建一个file目录, 放入config.properties文件, 文件内容如下图:
2. servletContext.getRealPath("/"): 工程(项目)在tomcat里面的根目录。
C:\Users\lywgames\Desktop\software\apache-tomcat-7.0.52\wtpwebapps\UseServletContext\
3. 新建一个GetResources.java类
4. 编辑GetResources.java, 使用getRealPath获取资源
package com.lywgames.myservlet;
import java.io.FileInputStream;
import java.io.IOException;
import java.util.Properties;
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 GetResources extends HttpServlet {
private static final long serialVersionUID = 1L;
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// 获取ServletContext对象
ServletContext servletContext = getServletContext();
/* servletContext.getRealPath("/"): 工程在tomcat里面的根目录。
* C:\Users\lywgames\Desktop\software\apache-tomcat-7.0.52\wtpwebapps\UseServletContext\
*/
// 获取给定的文件在服务器上面的绝对路径
String realPath = servletContext.getRealPath("file/config.properties");
Properties properties = new Properties();
properties.load(new FileInputStream(realPath));
System.out.println("name = " + properties.getProperty("name"));
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req, resp);
}
}
5. 编写web.xml
6. 编辑index.html
7. 部署运行项目
8. 点击”获取资源”超链接, 控制台打印
9. 使用servletContext.getResourceAsStream(“资源文件路径”)获取资源文件输入流, 资源文件路径之前的路径是工程在tomcat里面的根目录。资源文件路径必须存在, 否则返回null。继续编辑我们的GetResources.java
package com.lywgames.myservlet;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.Properties;
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 GetResources extends HttpServlet {
private static final long serialVersionUID = 1L;
public void getRealPath() throws ServletException, IOException {
// 获取ServletContext对象
ServletContext servletContext = getServletContext();
/* servletContext.getRealPath("/"): 工程在tomcat里面的根目录。
* C:\Users\lywgames\Desktop\software\apache-tomcat-7.0.52\wtpwebapps\UseServletContext\
*/
// 获取给定的文件在服务器上面的绝对路径
String realPath = servletContext.getRealPath("file/config.properties");
Properties properties = new Properties();
properties.load(new FileInputStream(realPath));
System.out.println("name = " + properties.getProperty("name"));
}
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// 获取ServletContext对象
ServletContext servletContext = getServletContext();
// servletContext.getResourceAsStream使用工程在tomcat里面的根目录。
InputStream is = servletContext.getResourceAsStream("file/config.properties");
Properties properties = new Properties();
properties.load(is);
System.out.println("name = " + properties.getProperty("name"));
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req, resp);
}
}
10. 类路径相对的是classes目录
11. 使用类路径获取资源, 继续编辑我们的GetResources.java
package com.lywgames.myservlet;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.Properties;
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 GetResources extends HttpServlet {
private static final long serialVersionUID = 1L;
public void getRealPath() throws ServletException, IOException {
// 获取ServletContext对象
ServletContext servletContext = getServletContext();
/* servletContext.getRealPath("/"): 工程在tomcat里面的根目录。
* C:\Users\lywgames\Desktop\software\apache-tomcat-7.0.52\wtpwebapps\UseServletContext\
*/
// 获取给定的文件在服务器上面的绝对路径
String realPath = servletContext.getRealPath("file/config.properties");
Properties properties = new Properties();
properties.load(new FileInputStream(realPath));
System.out.println("name = " + properties.getProperty("name"));
}
public void getResourceAsStream() throws ServletException, IOException {
// 获取ServletContext对象
ServletContext servletContext = getServletContext();
// servletContext.getResourceAsStream使用工程在tomcat里面的根目录。
InputStream is = servletContext.getResourceAsStream("file/config.properties");
Properties properties = new Properties();
properties.load(is);
System.out.println("name = " + properties.getProperty("name"));
}
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// 类路径相对于classes路径:C:\Users\lywgames\Desktop\software\apache-tomcat-7.0.52\wtpwebapps\UseServletContext\WEB-INF\classes
InputStream is = this.getClass().getClassLoader().getResourceAsStream("../../file/config.properties");
Properties properties = new Properties();
properties.load(is);
System.out.println("name = " + properties.getProperty("name"));
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req, resp);
}
}
四. ServletContext存取数据, servlet间共享数据
1. 新建CunQuData.java和OutLoginCount.java
2. 编辑CunQuData.java
package com.lywgames.myservlet;
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 CunQuData extends HttpServlet {
private static final long serialVersionUID = 1L;
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// 获取ServletContext对象
ServletContext servletContext = getServletContext();
Object loginCount = servletContext.getAttribute("loginCount");
if(loginCount != null){
servletContext.setAttribute("loginCount", (((int)loginCount) + 1));
}else{
servletContext.setAttribute("loginCount", 1);
}
resp.sendRedirect("OutLoginCount.action");
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req, resp);
}
}
3. 编辑OutLoginCount.java
package com.lywgames.myservlet;
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 OutLoginCount extends HttpServlet {
private static final long serialVersionUID = 1L;
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// 获取ServletContext对象
ServletContext servletContext = getServletContext();
int loginCount = (int)servletContext.getAttribute("loginCount");
StringBuilder sb = new StringBuilder();
sb.append("<!DOCTYPE html>").append("\r\n");
sb.append("<html>").append("\r\n");
sb.append("<head>").append("\r\n");
// 网页编码UTF-8
sb.append("<meta charset='UTF-8' />").append("\r\n");
sb.append("<title>登录次数</title>").append("\r\n");
sb.append("</head>").append("\r\n");
sb.append("<body>").append("\r\n");
sb.append("<h1>登录次数:").append(loginCount).append("</h1>").append("\r\n");
sb.append("</body>").append("\r\n");
sb.append("</html>");
// 相应客户端的内容类型是text/html 编码是UTF-8(包含字符编码和网页编码)
resp.setContentType("text/html;charset=UTF-8");
// 字符流响应客户端
resp.getWriter().println(sb.toString());
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req, resp);
}
}
4. 编辑index.html
5. 编辑web.xml
6. 部署运行项目
7. 多点击几次登录, 显示登录次数