创建Servlet的三种方法:
1,实现Servlet接口;
2,继承GenericServlet抽象类;
3,继承HttpServlet抽象类。
我们一般使用的是第三种方法,因为开发应用时一般是编写基于HTTP协议的Servlet类。
/************************************************************************************************************/
ServletContext非常非常重要!
一个项目只有一个ServletContext对象。
我们可以在N多个Servlet中获取这个唯一的对象,使用它可以给多个Servlet传递数据,即这个对象是所有Servlet的快递员,完成数据的共享。
这个对象在Tomcat启动是就被创建,在Tomcat关闭时才会死去。生命周期很长。
1.ServletContext概述
服务器会为每一个应用创建一个ServletContext对象:
--》ServletContext对象的创建是在服务器启动时完成的;
--》ServletContext对象的销毁是在服务器关闭时完成的。
ServletContext对象的作用是在整个Web应用的动态资源之间共享数据。例如在AServlet中向ServletContext对象中保存一个值,然后再BServlet中就可以获取这个值,这就是共享数据了。
2.获取ServletContext对象
(1)在Servlet中获取ServletContext对象:
在void init(ServletConfig config)中:ServletContext context=config.getServletContext();
即ServletConfig类中的getServletContext()方法可以获取ServletContext对象;
package com.ch02.myservlet;
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.Servlet;
import javax.servlet.ServletConfig;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class ServletContextTest implements Servlet {
public void init(ServletConfig config) throws ServletException {
// TODO Auto-generated method stub
ServletContext context=config.getServletContext();
}
public void service(ServletRequest req, ServletResponse res)
throws ServletException, IOException {
// TODO Auto-generated method stub
}
public void destroy() {
// TODO Auto-generated method stub
}
public ServletConfig getServletConfig() {
// TODO Auto-generated method stub
return null;
}
public String getServletInfo() {
// TODO Auto-generated method stub
return null;
}
}
(2)在GenericServlet或HttpServlet中获取ServletContext对象:
GenericServlet中有getServletContext()方法,所以可以直接使用this.getServletContext()来获取;
package com.ch02.myservlet;
import java.io.IOException;
import java.io.PrintWriter;
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 ServletContextByHttpServlet extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
ServletContext context=this.getServletContext();
}
}
可以通过HttpSession对象的getServletContext()方法获取。
可以通过ServletContextEvent对象的getgetServletContext()方法来获取。
3.域对象的功能
(域对象就是用来在多个Servlet中传递数据
域对象必须要有存数据的功能;
域对象必须要有取数据的功能;
域对象内部其实有一个Map,多个键值对,键不能相同。
)
ServletContext是JavaWeb四大域对象之一:
四大与对象分别是:PageContext(page)、ServletRequest(request)、HttpSession(session)、ServletContext(application)
所有与对象都有寻去数据的功能,因为与对象内部有一个Map,用来存储数据,下面是ServletContext对象用来操作数据的方法:
(1)void setAttribute(String name,Object value):用来存储一个对象,也可以称之为存储一个域属性,例如:servletContext.setAttribute("xxx","XXX"),在ServletContext中保存一个域属性,域属性的名称为xxx,域属性的值为XXX。请注意,如果多次调用该方法,并且使用了相同的name,那么会覆盖上一次的值,这种特性与Map相同。
(2)Object getAttribute(String name):用来获取ServletContext中的数据,当前在获取值前需要先去存储才行,例如String value=(String)servletContext.getAttribute("xxx");获取名为xxx的域属性。
(3)void removeAttribute(String name):用来移除ServletContext中的域属性,如果参数name指定的域属性不存在,那么本方法什么都不做。
(4)Enumeration getAttributeNames():获取所有域属性的名称。
4.获取应用初始化参数
(1)Servlet也可以获取Servlet初始化参数,但它是局部的参数,也就是说一个Servlet只能获取自己的初始化参数,不能获取别人的,即初始化参数只为一个Servlet准备!
(2)可以配置公共的初始化参数,为所有Servlet而用。这需要使用ServletContext才能获取。
public-name
zhangsan
public-sex
male
public-age
20
AServlet
com.servletcontext.test.AServlet
username
admin
password
123456
BServlet
com.servletcontext.test.BServlet
username1
admin1
password1
1234567
AServlet
/servlet/AServlet
BServlet
/servlet/BServlet
(1)获取真实路径,得到的是有盘符的路径
可以使用ServletContext对象来获取Web应用下的资源,例如在hello应用的根目录下创建a.txt文件,现在想在Servlet中获取这个资源,就可以使用ServletContext来获取。
--》获取a.txt的真是路径:String realPath=servletContext.getRealPath("/a.txt"),realPath的值为a.txt文件的绝对路径:F:\tomcat6\webapps\hello\a.txt;
(2)获取资源流
不仅可以通过servletContext获取资源的路径,还可以通过ServletContext获取资源流,即把资源以输入流的方式获取。
--》获取a.txt资源流:InputStream in=ServletContext。getResourceStream("/a.txt");
(3)获取指定目录下的所有资源路径
使用ServletContext获取指定目录下的所有资源路径,例如获取/WEB-INF下的所有资源的路径。
Set set=context.getResourcePaths("/WEB-INF");
注意,本方法必须以“/”开头!!!
6.获取类路径下资源
获取类路径资源,类路径对一个JavaWeb项目而言,就是/WEB-INF/classes和/WEB-INF/lib/每个jar包!
--》Class
--》ClassLoader
获取类路径下的资源,对于JavaWeb应用而言,就是获取classes目录下的资源。
InputStream in = this.getClass().getResourceAsStream("/xxx.txt");
System.out.println(IOUtils.toString(in));
InputStream in = this.getClass().getClassLoader().getResourceAsStream("xxx.txt");
System.out.println(IOUtils.toString(in));
--》Class类的getResourceAsStream(Stringpath):
路径以“/”开头,相对classes路径;
路径不以“/”开头,相对当前class文件所有路径,例如在cn.itcast.servlet.MyServlet中执行,那么相对/classes/cn/itcast/servlet/路径;
--》 ClassLoader类的getResourceAsStream(Stringpath):
相对classes路径;