ServletContext
web容器在启动时,会为每个web应用程序都创建一个对应的ServletContext对象,代表当前web应用。
ServletConfig对象中维护了ServletContext对象的引用,开发人员在编写servlet时,可以通过ServletConfig.getServletContext方法获得
ServletContext对象。
由于一个WEB应用中的所有Servlet共享一个ServletContext对象,因此Servlet对象之间可以通过ServletContext对象实现通讯。
ServletContext对象通常也被称为context对象。
ServletContext的应用:
1:作为域对象可以在整个web应用范围内共享对象。
作用范围:整个web应用范围内共享数据。
生命周期:当服务器启动web应用加载后创建出ServletContext对象后,域产生。当web应用被移出容器或服务器关闭,随着web应用的销毁域销毁。
代码:
public class ServletContext1 extends HttpServlet{
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
ServletContext context=this.getServletContext();
context.setAttribute("name", "helw");
}
}
public class ServletContext2 extends HttpServlet{
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
ServletContext context=this.getServletContext();
String Name=(String) context.getAttribute("name");
PrintWriter out=resp.getWriter();
out.println(Name);
}
需要先访问1然后2中才有数据。不访问的时候,1的servlet还没有创建。
常用方法:
void setAttribute(String,Object);
Object getAttribute(String);
void removeAttribute(String); 移出属性;
2:获得WEB应用的初始化参数
我们通过<init-param>标签为某一个单独的servlet加配置信息,这种配置信息在其他的Servlet中无法访问到的,可如果我们使用
<context-param>标签(与Servlet标签并列)为整个Web应用配置属性的话,那所有的servlet就能访问里面的参数了。例如可以把数据库的配置放在这里。
请求参数:parameter----浏览器发送过来的请求中的参数信息。
初始化参数:initparameter----在web.xml中为servlet或servletcontext配置的初始化时带有的基本参数
域属性:attribute-----四大作用域中存取的键值对
代码应用:
web.xml中
<context-param>
<param-name>username</param-name>
<param-value>helw</param-value>
</context-param>
<context-param>
<param-name>password</param-name>
<param-value>123456</param-value>
</context-param>
<servlet>
<servlet-name>ServletContext3</servlet-name>
<servlet-class>com.helw.ServletContext3</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>ServletContext3</servlet-name>
<url-pattern>/context3</url-pattern>
</servlet-mapping>
servlet中:
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
PrintWriter out=response.getWriter();
ServletContext context=this.getServletContext();//得到上下文对象
//获取单个的context中的初始化参数
String value1=context.getInitParameter("username");
String value2=context.getInitParameter("password");
out.println(value1);
out.print(value2);
// 一次性获取Context里所有的初始化参数 Enumeration enumeration = context.getInitParameterNames(); while (enumeration.hasMoreElements()) { String name = (String) enumeration.nextElement(); String value = context.getInitParameter(name); System.out.println(name + ";" + value); }
}
3:实现servlet的转发
请求重定向:302+Location(两次请求两次响应)
请求转发:服务器内不进行资源流转(一次请求一次响应,来实现资源流转)
区别:自己理解:假如你找我借钱,如果是请求重定向的话,那你再去找别人借。请求转发的话,我找别人借,然后再借给你。
代码:
public class ServletContext4 extends HttpServlet{
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
RequestDispatcher dispatcher =this.getServletContext().getRequestDispatcher("/context5");///context5是在web.xml中配置的路径,要去寻找的
dispatcher.forward(request, response);
}
}
public class ServletContext5 extends HttpServlet{
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
PrintWriter out =response.getWriter();
out.print("haha");
}
}
4:利用ServletContext对象读取资源文件
ServletContext提供了getRealPath方法,在这个方法中传入一个路径,这个方法的底层会在传入的路径的前面拼接当前web应用的硬盘路径,从而得到当前资源的硬盘路径,这种方式即使换了发布环境,方法的底层也能得到正确的web应用的路径从而永远都是正确的路径。
this.getServletContext().getRealPath("config.properties")
代码:
config.properties文件中
public class ServletContext6 extends HttpServlet{
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
Properties prop=new Properties();
prop.load(new FileReader(this.getServletContext().getRealPath("config.properties")));
PrintWriter out=response.getWriter();
out.print(prop.getProperty("username"));
out.print(prop.getProperty("password"));
}
}
如果在非Servlet环境下要读取资源文件时可以采用类加载器加载文件的方式读取资源:
MyService.class.getClassLoader().getResource(".../.../config.properties").getPath()
getResource()里面的路径该怎么写呢,只要记住一句话:类加载器从哪里加载类,就从哪里加载资源
getServletConfig()和getServletContext()的区别:
getServletConfig()方法返回一个ServletConfig对象,该对象中包含servlet启动配置信息.这个信息中包括了所有初始化参数和一个ServletContext对象.
getServletContext()返回一个ServletContext对象,该对象包含关于servlet运行环境的信息.这个方法在GenericServlet类中为方便应用而定义的.
实际上,它从传送到servlet的init(ServletConfig)方法中的ServletConfig对象中检索ServletContext.