ServletContext对象
1.引入
ServletContext对象 ,叫做Servlet的上下文对象。表示一个当前的web应用环境。一个web应用中只有一个ServletContext对象。
2.对象创建和得到
创建时机:加载web应用时创建ServletContext对象。
得到对象: 从ServletConfig对象的getServletContext方法得到
3.ServletContext对象的核心API(作用)
得到web应用路径:context.getContextPath();得到当前web应用的路径,部署到tomcat服务器上运行的web应用名称。即项目名称。request.getContextPath(); 等价于上面的代码得到web应用参数:context.getInitParameter("name");context.getInitParameterNames();域对象:context.setAttribute("name",Object): 保存数据context.getAttribute("name") 得到数据context.removeAttribue("name") 清除数据转发context.getRequestDispatcher("路径").forward(request,response);request.getRequestDispacher("路径").forward(request,response); 等价于上面的代码得到web应用中的资源文件context.getRealPath("路径")context.getResourceAsStream("路径");
4.得到web应用路径
java.lang.String getContextPath() 用在请求重定向的资源名称中
package com.cn.servlet;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.Enumeration;
import javax.servlet.ServletConfig;
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 ServletContextDemo extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
/*
* 得到ServletContext对象
*/
// ServletContext context = this.getServletConfig().getServletContext();
ServletContext context = this.getServletContext();
/*
* 得到web应用路径 /myweb
* web应用路径:部署到tomcat服务器上运行的web应用名称。即项目名称。
*/
String contextPath = context.getContextPath();
System.out.println("contextPath->" + contextPath);
response.getWriter().write("hello , this project name is " + contextPath);
/**
* 案例:应用到请求重定向
* 假如项目名称改变,需要修改下面代码中的项目名称,很麻烦。
*/
// response.sendRedirect("/myweb/index.jsp");
// response.sendRedirect(contextPath + "/ServletContextDemo2?myname=liuzhiyong");
Enumeration<String> initParameterNames = this.getServletContext().getInitParameterNames();
while(initParameterNames.hasMoreElements()){
String parameterName = initParameterNames.nextElement();
String parameterValue = this.getServletContext().getInitParameter(parameterName);
System.out.println("parameterName:" + parameterValue);
}
String pathName = this.getServletConfig().getInitParameter("path");
System.out.println("pathName:" + pathName);
this.getServletContext().setAttribute("myname", "木丁西");
this.getServletContext().setAttribute("age", 22);
this.getServletContext().setAttribute("salary", 33.339);
Student student = new Student();
student.setName("刘先森");
student.setAge(18);
student.setSalary(20000);
this.getServletContext().setAttribute("student", student);
}
}
5.得到web应用的初始化参数(全局)
java.lang.String getInitParameter(java.lang.String name) --得到web应用的初始化参数
java.util.Enumeration getInitParameterNames()
注意:web应用参数可以让当前web应用的所有servlet获取!!!
package com.cn.servlet;
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class ServletContextDemo2 extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
/*
* 得到web应用的初始化参数
*/
String myname = this.getServletContext().getInitParameter("myname");
System.out.println("myname:" + myname);
String myname2 = (String)this.getServletContext().getAttribute("myname");
int age = (Integer)this.getServletContext().getAttribute("age");
double salary = (Double)this.getServletContext().getAttribute("salary");
System.out.println(myname2 + "-" + age + "-" + salary);
Student stu = (Student)this.getServletContext().getAttribute("student");
System.out.println(stu);
}
}
6.域对象有关的方法
域对象:作用是用于保存数据,获取数据。可以在不同的动态资源之间共享数据。
方案1: 可以通过传递参数的形式,共享数据。局限:只能传递字符串类型。
方案2: 可以使用域对象共享数据,好处:可以共享任何类型的数据!!!!!
注意:ServletContext就是一个域对象!!!!
保存数据: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域对象:作用范围在整个web应用中有效!!!
所有域对象:
HttpServletRequet 域对象
ServletContext域对象
HttpSession 域对象
PageContext域对象,属于jsp中的内置对象
7.转发
RequestDispatcher this.getServletContext().getRequestDispatcher(java.lang.String path).forward(request, response);
1)转发
a)地址栏不会改变
b)
转发只能转发到当前web应用内的资源
c)可以在转发过程中,可以把数据保存到request域对象中
2)重定向
a)地址栏会改变,变成重定向到地址。
b)
重定向可以跳转到当前web应用,或其他web应用,甚至是外部域名网站。
c)不能在重定向的过程,把数据保存到request中。
结论: 如果要使用request域对象进行数据共享,只能用转发技术!!!