一、Servlet简介
1、什么servlet
Servlet是运行在服务器端的java小程序,是sun公司提供的一套规范(即接口),用来处理客户端请求并将结果动态返回给浏览器。Servlet实质就是java代码,通过api动态地向客户端输出内容。
servlet规范:(1)Servlet技术
(2)filter技术——过滤器
(3)listener技术——监听器
二、Servlet的API(生命周期)
(1)Servlet接口中的方法
1)init(ServletConfig config) 第一次访问的时候调用(Servlet对象创建的时候)
ServletConfig:代表的是该Servlet对象的配置信息(web容器会在创建servlet实例对象时将web.xml内的初始化参数封装到servletconfig中)
2)Servlet(ServletRequest request,ServletResponse response)每次请求都会执行
ServletRequest:代表请求,可以理解为ServletRequest内部封装的是http请求的信息。
ServletResponse:代表响应,可以理解为ServletResponse内部封装的是要响应的信息。
3)destroy() Servlet销毁的时候执行
(3)Servlet的生命周期
1)Servlet何时创建:默认第一次访问Servlet时创建该对象
2)Servlet何时销毁:服务器关闭时
3)每次必然访问的方法:Servlet(ServletRequest request , ServletResponse response)
三、Servlet的访问过程
三、servlet配置
1、基本配置
web.xml中的配置中的url配置方式:
1、完全匹配。访问的资源与配置的资源完全相同才能访问。
2、目录匹配 格式:/虚拟目录../* (*代表可以访问该目录下的所有资源。)
3、扩展名匹配 格式:*.扩展名 (可以访问以该扩展名结束的所有资源)
注意:目录匹配与扩展名匹配不可一起使用。
2、服务器启动实例化Servlet配置
Servlet对象默认第一次启动时创建
可以对默认方式进行修改:在servlet配置中加上一个配置< load-on-startup >,这样servlet对象会在服务器启动时就创建。
3、缺省Servlet
可以将url-pattern配置成一个/ 代表该Servlet是缺省的Servlet(当访问的资源地址中所有的Servlet都不匹配时候即自动匹配缺省Servlet)
其实WEB应用中,所有的资源响应都是servlet负责,包括静态资源。(包括HTML,JSP等静态资源都是通过servlet访问的)例如:在WebContent下创建一个1.html文件,在查找该文件时也是由tomcat通过servlet进行查找,首先查找工程中的web.xml配置文件中,发现找不到,然后tomcat会去tomcat中位于config文件夹下的总配置文件web.xml中查找缺省Servlet,再由DefaultServlet类对WebContent文件夹下进行查找,找到1.html后,用write方法一句句的写出该静态资源中的内容。
下图为总配置文件web.xml中的缺省servlet
四、HttpServlet
现在多采用extend HttpServlet类来实现Servlet接口(可以通过jar包的源码找到继承树)
五、ServletContext
1、什么是ServletContext
ServletContext代表的是一个Web应用的环境(上下文)对象,内部封装的是该Web应用的信息。该对象每个Web应用只有一个(一个Web应用有多个Servlet对象)。
ServletContext的生命周期:Web应用被加载时创建,Web应用被卸载时销毁。
2、怎样获得ServletContext对象
1)ServletContext ServletContext=config.getServletContext();
2)ServletContext ServletContext=this.getServletContext();(此方法同方法一,通过继承方法)
3、ServletContext的作用
1)获得Web应用全局的初始化参数
在web.xml中配置初始化参数——< context-param>……< /context-param>
通过ServletContext对象获得参数——context.getInitParameter(name);(context为ServletContext对象)
2)获得Web应用中任何资源的绝对路径
方法:String path=context.getRealPath();(括号中为相对于该Web应用的相对地址)
有了这个可以得到相对于Web应用的相对路径后即使更换了发布环境,这个路径也永远都是正确的。
(如果是实际需要在非servlet环境下要读取资源文件时可以采用类加载器的方式)
3)ServletContext对象是一个域对象
什么是域?什么是域对象?
存储数据的区域就是域对象。如图,Servlet对象可以向域对象存取数据。
ServletContext域对象的作用范围:整个web应用(所有的web资源都可以随意向域中存取数据,而且数据可以共享)
常用方法:
void setAttribute(String,Object);
Object getAttribute(String);
void removeAttribute(String);
4)实现Servlet的转发
请求重定向:302+Location(两次请求两次响应)例如:甲找乙借钱,乙让甲去找丙借。
请求转发:服务器内不进行资源流转 (一次请求一次响应,来实现资源流转)例如:甲找乙借钱,乙去找丙借钱给甲。
在doGet方法中:
RequestDespatcher dispatcher=this.getServletContext().getRequestDispatcher(“url”);//参数为虚拟路径
dispatcher.forward(request,response);//将跳转到虚拟路径对应的类中执行。
在创建Servlet对象时,tomcat会自动调用GenericServlet类中的init(ServletConfig config)方法,读取web工程下的web.xml文件并将其中的信息打包传给这个参数,然后在此方法中将参数保存在GenericServlet类中的私有成员变量config中。如果程序员想要重写init方法,只需选择空参的init方法即可,因为在有参数的init方法中会调用空参的init方法。这样就保证了带参数的init方法正常执行(即保存了config成员变量),又保证了重写的init方法可以被执行。(Ps:如果重写带参数的init方法,为了保证config成员变量的存在,必须在方法体第一句写:super.init(config);)
public void init(ServletConfig config)
throws ServletException
{
this.config = config;
init();
}
public void init()
throws ServletException
{
}