ServletContext对象
代表当前管理或者说是 AP的运行区域, 该区域内所有 AP 共用这1个 ServletContext对象
里面包含了对区域本身特性的描述数据、区域所在服务器数据 及功能性的调度器Dispatcher
GenericServlet中在 init中缓存了 ServletConfig, 该对象中包含 ServletContext
实际实现
ServletContext本身是个接口, 实际实现为 tomcat里面的 org.apache.catalina.core.ApplicationContextFacade, servlet这项技术本身就是一系列的接口
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
System.out.println(this.getServletConfig().getServletContext());
// out : "org.apache.catalina.core.ApplicationContextFacade@9ce1c8"
}
虚拟路径 getRealPath
对于 ServletContext 来说, 一个应用主机名[127.0.0.1:8080]后跟的资源名[day06]就是虚拟路径了;
比如 http://127.0.0.1:8080/day06/ 可以访问到 tomcat下面的 day06项目
http://127.0.0.1:8080/day06/SetAttribute 可以访问到 /SetAttribute 这个资源, /SetAttribute就是虚拟路径, 在tomcat中映射为硬盘上的实际路径, D:/XXX/WEBAPP/DAY06
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
System.out.println(this.getServletContext().getRealPath("xxx.xx"));
// out : "D:\Program Files\apache-tomcat-6.0.39\webapps\ServletContext\xxx.xx"
}
获取资源
采用JAVA中 IO 的模式
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
URL recourseUrl = this.getServletContext().getResource("/index.jsp");
System.out.println(recourseUrl.getPath()); //输出 /localhost/ServletContext/index.jsp
String line = null;
InputStream recourseInputStream = this.getServletContext()
.getResourceAsStream("/index.jsp");
BufferedReader reader = new BufferedReader(new InputStreamReader(
recourseInputStream));
while ((line = reader.readLine()) != null) {
System.out.println(line); // 输出 index.jsp 文件所有内容
}
//这样输出不可以
// byte[] bytes = new byte[512];
// recourseInputStream.read(bytes, 0, 512);
// System.out.println(bytes.toString());
}
应用级别参数
getInitParameter 方法可以获取到 web.xml 里配置的 <context-param> 元素, 通常用来配置 数据库连接信息或者其他整个应用通用的参数
<context-param>
<param-name>webname</param-name>
<param-value>day06r</param-value>
</context-param>
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.setContentType("text/html");
System.out.println(getServletContext().getInitParameter("webname"));//输出day06r
}
Attribute 应用属性
Attribute在ServletContext类似于整个项目的 cook, 用字符串为索引, 只不过值可以为一个对象.
public void init() throws ServletException {
getServletContext().setAttribute("OBJ1", "SOM OBJ");
}
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.setContentType("text/html");
System.out.println(getServletContext().getAttribute("OBJ1")); //一直输出 "SOM OBJ"
}
public void destroy() {
super.destroy(); // Just puts "destroy" string in log
getServletContext().removeAttribute("OBJ1");
}
虽然现在只是学习这个特性, 但是觉得 在某个地方设置后, 在 destory中移除属性中的对象比较优雅
调度器
RequestDispatcher 转发请求调度器
服务器级别的页面跳转, 有 forward 和 include 两种方式
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.setContentType("text/html; charset=UTF-8");
PrintWriter responseWriter = response.getWriter();
responseWriter.write("hello 浏览器"); // 浏览器显示 : hello 浏览器
RequestDispatcher requestDispatcher = this.getServletContext()
.getRequestDispatcher("/TestPath"); // 必须 '/' 开头 相对于AP跳转
// requestDispatcher.forward(request, response); //浏览器只显示 TestPath页面
requestDispatcher.include(request, response); // TestPath页面嵌入在本页面中
}