1、ServletContext代表着整个JavaWeb应用,每个项目只有唯一的ServletContext的实例。

2、生命周期

  服务器启动时创建

  服务器关闭时销毁

3、获取ServletContext对象:从ServletConfig对象的getServletContext方法得到

  方式1:通过ServletConfig来获取ServeltContext

//获取ServletContext的引用
public class ServletDemo1 extends HttpServlet {
//获取ServletConfig
private ServletConfig config; public void init(ServletConfig config) throws ServletException {
this.config = config;
} public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
     //获取servletContext
ServletContext sc = config.getServletContext();
sc.setAttribute("p", "abc"); //获取全局参数
System.out.println(sc.getInitParameter("encoding")); System.out.println("Demo1:"+sc);
} public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doGet(request, response);
} }

方式2:直接获取,推荐

public class ServletDemo2 extends HttpServlet {

    public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
     //获取ServletContext
ServletContext sc = this.getServletContext();
} public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doGet(request, response);
} }

4、ServletContext对象的核心API

java.lang.String getContextPath()   --得到当前web应用的路径(就是运行的项目名称)

public class ContextDemo1 extends HttpServlet {

    public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
//1.得到ServletContext对象
//ServletContext context = this.getServletConfig().getServletContext();
ServletContext context = this.getServletContext(); //(推荐使用) //2.得到web应用路径 /Demo
/**
* web应用路径:部署到tomcat服务器上运行的web应用名称
*/
String contextPath = context.getContextPath(); System.out.println(contextPath); /**
* 案例:应用到请求重定向
*/
response.sendRedirect(contextPath+"/index.html");
} }

--得到web应用的初始化参数

java.lang.String getInitParameter(java.lang.String name)   根据初始化参数名字得到参数的值

java.util.Enumeration getInitParameterNames()  获取所有参数的值

注意:初始化参数配置在web.xml文件中。用<context-param>标签,web应用参数可以让当前web应用的所有servlet获取!!!

<!-- 配置web应用参数 -->
<context-param>
<param-name>AAA</param-name>
<param-value>AAA's value</param-value>
</context-param>
<context-param>
<param-name>BBB</param-name>
<param-value>BBB's value</param-value>
</context-param>
<context-param>
<param-name>CCC</param-name>
<param-value>CCC's value</param-value>
</context-param>

代码:

/**
* 得到web应用参数
*
*
*/
public class ContextDemo2 extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
//得到SErvletContext对象
ServletContext context = this.getServletContext(); //根据初始化参数的名字得到初始化参数的值:java.lang.String getInitParameter(java.lang.String name)
String gp =sc.getInitParameter("AAA");
System.out.println(gp); //获取所有初始化参数 java.util.Enumeration getInitParameterNames()
Enumeration<String > en =sc.getInitParameterNames();
//遍历
while(en.hasMoreElements()){
String paramterName = en.nextElement();
String paramterValue = sc.getInitParameter(paramterName);
System.out.println(paramterName+":"+paramterValue);
}
//尝试得到ConfigDemo中的servlet参数
String path = this.getServletConfig().getInitParameter("path");
System.out.println("path="+path);
} }

域对象有关的方法

void setAttribute(java.lang.String name, java.lang.Object object)  保存数据

java.lang.Object getAttribute(java.lang.String name)  等到数据

void removeAttribute(java.lang.String name)  移除数据

域对象:作用是用于保存数据,获取数据。可以在不同的动态资源之间共享数据。

    ServletContext就是一个域对象!!!!

ServletContext域对象:作用范围在整个web应用中有效!!!

/**
* 保存数据
*
*
*/
public class ContextDemo3 extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
//1.得到域对象
ServletContext context = this.getServletContext(); //2.把数据保存到域对象中
//context.setAttribute("name", "eric");
context.setAttribute("student", new Student("jacky",20));
System.out.println("保存成功");
} } class Student{
private String name;
private int age;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public Student(String name, int age) {
super();
this.name = name;
this.age = age;
}
@Override
public String toString() {
return "Student [age=" + age + ", name=" + name + "]";
} }
=============================================
/**
* 获取数据
*
*
*/
public class ContextDemo4 extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
//1.得到域对象
ServletContext context = this.getServletContext(); //2.从域对象中取出数据
//String name = (String)context.getAttribute("name");
Student student = (Student)context.getAttribute("student");
//System.out.println("name="+name); System.out.println(student);
} }

转发

RequestDispatcher getRequestDispatcher(java.lang.String path)   --转发(类似于重定向)

/**
* 转发(效果:跳转页面)
*
*
*/
public class ForwardDemo1 extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException { /**
* 保存数据到request域对象
*/
request.setAttribute("name", "rose"); //转发
/**
* 注意:不能转发当前web应用以外的资源。getRequsertDispatcher后面的路径必须以“/“开头,目标servlet的访问路径
*/
/*RequestDispatcher rd = this.getServletContext().getRequestDispatcher("/GetDataServlet");
rd.forward(request, response);*/
this.getServletContext().getRequestDispatcher("/GetDateServlet").forward(request, response);
} }
=================================
public class GetDataServlet extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException { /**
* 从request域对象中获取数据
*/
String name = (String)request.getAttribute("name");
System.out.println("name="+name);
} }
===============================================================

public class RedirectDemo1 extends HttpServlet {


public void doGet(HttpServletRequest request, HttpServletResponse response)
   throws ServletException, IOException {
  /**
   * 保存数据到request域对象
   */
  request.setAttribute("name", "rose");
  
  //重定向
  /**
   * 注意:可以跳转到web应用内,或其他web应用,甚至其他外部域名。
   */
  //response.sendRedirect("/demo11/adv.html");
  response.sendRedirect("/demo/GetDataServlet");
 }


}

 

转发与重定向的区别:

  1)转发

a)地址栏不会改变

b)转发只能转发到当前web应用内的资源

c)可以在转发过程中,可以把数据保存到request域对象中

2)重定向

a)地址栏会改变,变成重定向到地址。

b)重定向可以跳转到当前web应用,或其他web应用,甚至是外部域名网站。

c)不能再重定向的过程,把数据保存到request中。

结论: 如果要使用request域对象进行数据共享,只能用转发技术!!!

得到web应用的资源文件

    java.lang.String getRealPath(java.lang.String path)    返回资源文件的绝对路径

java.io.InputStream getResourceAsStream(java.lang.String path)  得到资源文件,返回的是输入流

/**
* 读取web应用下的资源文件(例如properties)
* @author APPle
*/
public class ResourceDemo extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
/**
* . 代表java命令运行目录。java运行命令在哪里?? 在tomcat/bin目录下
* 结论: 在web项目中, . 代表在tomcat/bin目录下开始,所以不能使用这种相对路径。
*/ //读取文件。在web项目下不要这样读取。因为.表示在tomcat/bin目录下
/*File file = new File("./src/db.properties");
FileInputStream in = new FileInputStream(file);*/ /**
* 使用web应用下加载资源文件的方法
*/
/**
* 1. getRealPath读取,返回资源文件的绝对路径
*/
/*String path = this.getServletContext().getRealPath("/WEB-INF/classes/db.properties");
System.out.println(path);
File file = new File(path);
FileInputStream in = new FileInputStream(file);*/ /**
* 2. getResourceAsStream() 得到资源文件,返回的是输入流
*/
InputStream in = this.getServletContext().getResourceAsStream("/WEB-INF/classes/db.properties"); Properties prop = new Properties();
//读取资源文件
prop.load(in); String user = prop.getProperty("user");
String password = prop.getProperty("password");
System.out.println("user="+user);
System.out.println("password="+password); } }

补充: web应用的路径问题

/**
* web应用中路径问题
*
*
*/
public class PathDemo extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.setContentType("text/html;charset=utf-8");
//目标资源: target.html
/**
* 思考: 目标资源是给谁使用的。
* 给服务器使用的: / 表示在当前web应用的根目录(webRoot下)
* 给浏览器使用的: / 表示在webapps的根目录下
*/
/**
* 1.转发
*/
//request.getRequestDispatcher("/target.html").forward(request, response); /**
* 2.请求重定向
*/
//response.sendRedirect("/demo/target.html"); /**
* 3.html页面的超连接href
*/
response.getWriter().write("<html><body><a href='/demo/target.html'>超链接</a></body></html>"); /**
* 4.html页面中的form提交地址
*/
response.getWriter().write("<html><body><form action='/demo/target.html'><input type='submit'/></form></body></html>");
} }

ServlertContext的更多相关文章

  1. JavaWeb中读取文件资源的路径问题

    在做javaweb开发的时候,我们可能会需要从本地硬盘上读取某一个文件资源,或者修改某一个文件,这个时候就需要先找到这个文件,然后用FileInputStrem等文件字节.字符流来将这个文件读取到内存 ...

  2. JavaWeb中读取文件资源的路径问题 -- 转自新浪博客

    在做javaweb开发的时候,我们可能会需要从本地硬盘上读取某一个文件资源,或者修改某一个文件,这个时候就需要先找到这个文件,然后用FileInputStrem等文件字节.字符流来将这个文件读取到内存 ...

  3. Spring和SpringMVC整合及关系

    SpringMVC扼要的讲,就是控制请求和处理.有必要将Spring和SpringMVC整合,否则仅配置SpringMVC并完成Spring的功能,会造成业务逻辑混乱. 简要总结:①原理:采用监听器, ...

随机推荐

  1. 【Zookeeper】初识zookeeper

    单机模式 安装并解压: 修改配置文件,conf/zoo.cfg(配置完成后,启动后,可以通过netstat-ano命令查看是否有你配置的clientPort端口号在监听服务) tickTime: zo ...

  2. jmeter 测试restful接口

    jmeter 测试restful接口,JSON数据格式 1.添加线程组 2.添加HTTP信息头管理器 请求发送JSON数据格式参数,需要设置Content-Type为application/json ...

  3. 流量分析系统---kafka集群部署

    1.集群部署的基本流程 Storm上游数据源之Kakfa 下载安装包.解压安装包.修改配置文件.分发安装包.启动集群 2.基础环境准备 安装前的准备工作(zk集群已经部署完毕)  关闭防火墙 chk ...

  4. iOS self 和 super 学习

    有人问我 这个问题 回答错了,题干大概是说 [self class] 和 [super class]打印结果 是不是一样的. 我睁着眼睛说是不一样的 .因为我明明记得 几天前 做 DFS 获取反射基类 ...

  5. 快速查找文件——Everything

    Everything Search Engine Locate files and folders by name instantly. Small installation file Clean a ...

  6. OpenGL学习进程(8)第六课:点、边和图形(三)绘制图形

    本节是OpenGL学习的第六个课时,下面介绍OpenGL图形的相关知识:     (1)多边形的概念: 多边形是由多条线段首尾相连而形成的闭合区域.OpenGL规定,一个多边形必须是一个“凸多边形”. ...

  7. 【HackerRank】Ice Cream Parlor

    Sunny and Johnny together have M dollars which they intend to use at the ice cream parlour. Among N ...

  8. 试坑不完美的 clip-path (我说的 CSS 的那个)

    需求跟我说,咱们要创新,想做一个蜂巢状的列表,年少无知的我竟然一口答应了,全然因为刚接触了 clip-path: But,然而,不幸的是,这只是坎坷路途的开始.... clip-path 的教程很多了 ...

  9. Python编程-常用模块及方法

    常用模块介绍 一.time模块 在Python中,通常有这几种方式来表示时间: 时间戳(timestamp):通常来说,时间戳表示的是从1970年1月1日00:00:00开始按秒计算的偏移量.我们运行 ...

  10. Linux 调优

    一.系统优化 1.硬件优化 增加内存 更换速度跟高磁盘(sata->sas)可以增加固态硬盘 更换更高校率的网卡,或者双网卡绑定,两个网卡作为一个网卡使用.服务器网卡一般为千兆 2.系统层优化 ...