深入理解Servlet
什么是Servlet
在Java web中Servlet是一种用来处理请求和发送响应的组件。
image54.png
Servlet和Tomcat的关系
Tomcat 是Web应用服务器,是一个Servlet/JSP容器。 Tomcat 作为Servlet容器,负责处理客户请求,把请求传送给Servlet,并将Servlet的响应传送回给客户。而Servlet是一种运行在支持Java语言的服务器上的组件,Servlet最常见的用途是扩展Java Web服务器功能,提供非常安全的,可移植的,易于使用的CGI替代品。
image55.png
在整个请求和响应的过程中:
Tomcat将http请求文本接收并解析,然后封装成HttpServletRequest类型的request对象,所有的HTTP头数据读可以通过request对象调用对应的方法查询到。
Tomcat同时会要响应的信息封装为HttpServletResponse类型的response对象,通过设置response属性就可以控制要输出到浏览器的内容,然后将response交给tomcat,tomcat就会将其变成响应文本的格式发送给浏览器
Java Servlet API 是Servlet容器(tomcat)和servlet之间的接口,它定义了serlvet的各种方法,还定义了Servlet容器传送给Servlet的对象类,其中最重要的就是ServletRequest和ServletResponse。所以说我们在编写servlet时,需要实现Servlet接口,按照其规范进行操作。
Servlet生命周期
通过跟踪源码会发现,Servlet的根是一个接口,代码如下:
public interface Servlet {
void init(ServletConfig var1) throws ServletException;
ServletConfig getServletConfig();
void service(ServletRequest var1, ServletResponse var2) throws ServletException, IOException;
String getServletInfo();
void destroy();
}
这个接口定义了Servlet最重要的方法,service方法用于处理请求和响应,在它前后分别是init初始化方法和destroy回收资源方法。
image56.png
Servlet中的几个重点对象
1. ServletConfig
public interface ServletConfig {
String getServletName();/获取servlet的名称,也就是我们在web.xml中配置的servlet-name
ServletContext getServletContext();//获取ServletContext对象,关于ServletContext的内容在下面介绍
String getInitParameter(String var1);//获取在servlet中初始化参数的值。这里注意与全局初始化参数的区分。这个获取的只是在该servlet下的初始化参数
Enumeration getInitParameterNames();//获取在Servlet中所有初始化参数的名字,也就是key值,可以通过key值,来找到各个初始化参数的value值。
}
ServletConfig接口中定义了如上几个方法,用于操作web.xml中的内容。
2. ServletContext
tomcat为每个web项目都创建一个ServletContext实例,tomcat在启动时创建,服务器关闭时销毁,在一个web项目中共享数据,管理web项目资源,为整个web配置公共信息等,通俗点讲,就是一个web项目,就存在一个ServletContext实例,每个Servlet读可以访问到它。因此,它封装了一些公共资源的访问。
web项目中共享数据
getAttribute(String name)
setAttribute(String name, Object obj)
removeAttribute(String name)
整个web项目初始化参数 (这个就是全局初始化参数,每个Servlet中都能获取到该初始化值)
getInitPatameter(String name)
getInitParameterNames()
获取web项目资源
getServletContext().getRealPath("/WEB-INF/web.xml")
getServletContext().getResourceAsStream("/WEB-INF/web.xml")
指定路径下的所有内容
getServletContext().getResourcePaths("/WEB-INF")
3. request
request就是将请求文本封装而成的对象,所以通过request能获得请求文本中的所有内容,请求头、请求体、请求行。
4. response
response和request相反,response定义了返回给客户端的数据。