servletContext对象
ServletContext对象,官方称为servlet上下文;服务器会为每一个web应用创建一个servletContext对象,它具有全局唯一性,web应用中的所有servlet都共享这个对象,所以也称之为全局应用程序共享对象;
作用
1.相对路径转为绝对路径;
2.获取容器的附加信息;
3.读取配置信息;
4.全局容器;
相对路径转为绝对路径
servletContext.getRealPath(“path”);
该方法可以将相对路径转为绝对路径,在文件的上传与下载的时候需要用到该方法进行路劲的转换;
案例:通过服务器下载图片到本机;
package com.bjsxt.servlet;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.OutputStream;
/**
*
* 文件下载
* */
public class DownFileServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
this.doPost(req, resp);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// 当前没有这个方法,但是父类有,调用父类的方法!在GenericServlet类中
// 获取servletContext对象
ServletContext servletContext = this.getServletContext();
// 路径转换
String realPath = servletContext.getRealPath("image/我妻善逸.jpg");
System.out.println(realPath);
// 读文件
// File file = new File("D:\\我妻善逸.jpg");
File file = new File(realPath);
FileInputStream fis = new FileInputStream(file);
byte[] buff = new byte[fis.available()];
fis.read(buff);
// 在响应中添加附加信息
// 正常情况下
// resp.addHeader("Content-Disposition","attachment;filename="+file.getName());
// 图片为中文名字的时候(本来应该用gbk的但是本机为日文系统所以用Shift_JIS)
resp.addHeader("Content-Disposition","attachment;filename="+
new String(file.getName().getBytes("Shift_JIS"),"iso-8859-1"));
OutputStream os = resp.getOutputStream();
os.write(buff);
os.flush();
os.close();
}
}
Xml配置文件
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
version="4.0">
<servlet>
<servlet-name>downFileServlet</servlet-name>
<servlet-class>com.bjsxt.servlet.DownFileServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>downFileServlet</servlet-name>
<url-pattern>/down.do</url-pattern>
</servlet-mapping>
</web-app>
获取容器的附加信息(基本信息)
1.获取servlet容器的名称以及版本号
ServletContext.getBaseInfo();(返回string类型)
2.获取容器所支持servlet的主版本号;
servletContext.getMajoyVersion();(返回int类型)
3.获取容器所支持servlet的副版本号;
servletContext.getMinorVersion();(返回int类型)
案例:查看当前servlet容器的版本号、名称,以及其所支持的servlet的版本号;
package com.bjsxt.servlet;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;
/**
* 获取容器附加信息
*
* */
public class GetBaseInfoServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
this.doPost(req, resp);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// 设置响应的编码类型
resp.setContentType("text/html;charset=utf-8");
// 获取ServletContext对象
ServletContext servletContext = this.getServletContext();
// 获取servlet容器的名称和版本号
String serverInfo = servletContext.getServerInfo();
// 获取servlet容器所支持的servlet的主版本号;
int majorVersion = servletContext.getMajorVersion();
// 获取servlet容器所支持的servlet的副版本号;
int minorVersion = servletContext.getMinorVersion();
// 输出(响应)给客户端浏览器 (利用字符输出流进行拼接)
PrintWriter out = resp.getWriter();
out.println("<!DOCTYPE HTML PUBLIC '-//W3C//DTD HTML 4.0 Transitional//EN'>");
out.println("<HTML>");
out.println("<HEAD><TITLE> ITBZ </TITLE></HEAD>");
out.println("<BODY>");
out.println("servlet容器的名称以及版本:"+serverInfo+"<br/>");
out.println("容器所支持的servlet的版本号:"+majorVersion+"\t"+minorVersion+"<br/>");
out.println("</BODY>");
out.println("</HTML>");
out.flush();
out.close();
}
}
Xml配置文件
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
version="4.0">
<servlet>
<servlet-name>getBaseInfoServlet</servlet-name>
<servlet-class>com.bjsxt.servlet.GetBaseInfoServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>getBaseInfoServlet</servlet-name>
<url-pattern>/getBaseInfo.do</url-pattern>
</servlet-mapping>
</web-app>
获取配置信息
<context-param>
<param-name>key</param-name>
<param-value>value</param-value>
</context-param>
1.获取xml文件中的context-param标签的配置信息;
ServeltContext.getInitParameter(“key”);
2.获取xml文件中所有param-name的值;
ServletContext.getInitParameterNames();(返回一个枚举类型);
案例:获取web.xml中context-param标签下所有param-name的值以及其配置信息;
package com.bjsxt.servlet;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.Enumeration;
/**
* ServletContext对象读取web.xml文件中的信息;
* */
public class ContextReadInfoServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
this.doPost(req, resp);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// 获取ServletContext对象
ServletContext servletContext = this.getServletContext();
// 获取所有的param-name的值
Enumeration<String> initParameterNames = servletContext.getInitParameterNames();
PrintWriter out = resp.getWriter();
out.println("<!DOCTYPE HTML PUBLIC '-//W3C//DTD HTML 4.0 Transitional//EN'>");
out.println("<HTML>");
out.println("<HEAD><TITLE> ITBZ </TITLE></HEAD>");
out.println("<BODY>");
while(initParameterNames.hasMoreElements()){
String name = initParameterNames.nextElement();
out.println("Name:"+name+"Value:"+servletContext.getInitParameter(name));
// 通过param—name的值获取其配置信息
}
out.println("</BODY>");
out.println("</HTML>");
out.flush();
out.close();
}
}
Xml文件
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
version="4.0">
<context-param>
<param-name>key1</param-name>
<param-value>value1</param-value>
</context-param>
<context-param>
<param-name>key2</param-name>
<param-value>value2</param-value>
</context-param>
<servlet>
<servlet-name>contextReadInfoServlet</servlet-name>
<servlet-class>com.bjsxt.servlet.ContextReadInfoServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>contextReadInfoServlet</servlet-name>
<url-pattern>/context.do</url-pattern>
</servlet-mapping>
</web-app>
全局容器
可以向ServletContext对象中缓冲一些数据,缓冲数据是,存储数据结构为key:value;
向ServletContext对象中缓冲数据后,其对应的web应用中的所有servlet都可以通过ServletContext对象获取该数据;
1.向ServletContext对象中存储数据;
ServletContext.setAttribute(“key”,ObjectValue);
2.从全局容器中获取数据;
servletContext.getAttribute(“key”);
3.根据key从全局容器中删除数据;
servletContext.removeAttribute(“key”);
案例:向ServletContext对象中存储数据,并在客户端浏览器上响应;
package com.bjsxt.servlet;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;
/**
* 全局容器
* */
public class GlobalContainerServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
this.doPost(req, resp);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// 获取ServletContext对象
ServletContext servletContext = this.getServletContext();
// 向全局容器中存放数据;
servletContext.setAttribute("key1","value1");
servletContext.setAttribute("key2","value2");
PrintWriter out = resp.getWriter();
out.println("<!DOCTYPE HTML PUBLIC '-//W3C//DTD HTML 4.0 Transitional//EN'>");
out.println("<HTML>");
out.println("<HEAD><TITLE> ITBZ </TITLE></HEAD>");
out.println("<BODY>");
// 从全局容器中获取信息,获得的是object类型,需要进行强制类型转换(添加数据的时候,加入的是object类型);
String value1 = (String)servletContext.getAttribute("key1");
String value2 = (String)servletContext.getAttribute("key2");
out.println("value1:"+value1+"<br/>");
out.println("value2:"+value2+"<br/>");
out.println("</BODY>");
out.println("</HTML>");
out.flush();
out.close();
}
}
Xml文件
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
version="4.0">
<servlet>
<servlet-name>globalContainerServlet</servlet-name>
<servlet-class>com.bjsxt.servlet.GlobalContainerServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>globalContainerServlet</servlet-name>
<url-pattern>/global.do</url-pattern>
</servlet-mapping>
</web-app>
ServletContext对象的生命周期
Servlet容器启动,创建ServletContext对象,servlet容器关闭,ServletContext对象的生命周期结束;
这样看来ServletContext对象的生命周期非常长,所以不建议存放一些(经常改动的数据例如:业务数据);(可以存储一些几乎不改动的信息例如:配置信息;)
感谢您的观看;