一、什么是Servlet
Servlet是一种小型的Java程序,它扩展了Web服务器的功能。作为一种服务器端的应用,他是运行在Servlet容器当中,例如Tomcat就是一种流行的Servlet容器。Servlet提供的功能大多与JSP类似,不过实现的方式不同。JSP通常是大多数HTML代码中嵌入少量的Java代码,而servlets全部由Java写成并且生成HTML。Servlet容器负责Servlet和客户的通信以及调用Servlet的方法,Servlet和客户的通信采用“请求/响应”的模式。
二、Servlet类
在eclipse里面新建一个Servlet类,在代码区域可以看出它是继承HttpServlet类,继续通过F3键追踪HttpServlet类,发现HttpServlet继承GenericServlet类,继续深入发现GenericServlet是继承实现接口Servlet、ServletConfig、Serializable接口,看下面类图:
附类定义如下:
public abstract class HttpServlet extends GenericServlet public abstract class GenericServlet implements Servlet, ServletConfig, java.io.Serializable
三、Servlet容器响应客户请求的过程
具体的请求过程如下,不过这里需要注意的是如果Servlet实例已经创建那么会直接从D步骤开始执行,否则从B步骤开始执行请求流程。
A、Servlet引擎检查是否已经装载并创建了该Servlet的实例对象
B、装载并创建该Servlet的一个实例对象;调用该Servlet的构造器
C、调用Servlet实例对象的init方法
D、创建一个用于封装请求的ServletRequest对象和一个代表响应消息的ServletResponse对象,然后调用Servlet的Service方法并将请求和响应对象作为参数传递进去
E、Web应用程序被停止或重新启动之前,Servlet引擎将卸载Servlet,并在卸载之前调用Servlet的destory方法
其核心步骤无非就是接口Servlet里面的init(ServletConfig config),void service(ServletRequest req, ServletResponse res),destroy()三个方法。
四、Servlet的注册与运行以及映射
Servlet程序必须在web.xml文件中进行注册和映射其访问路径,只有这样才可以被Servlet引擎加载和被外界访问。一个<Servlet>元素用于注册一个Servlet,主要包含两个子元素,分别是<servlet-name>和<servlet-class>,表示是
Servlet的名称与全类名。一个<servlet-mapping>元素用于映射一个已经注册的Servlet对外访问的路径,包含两个子元素,<servlet-name>和<url-pattern>,表示Servlet的名称与web访问的相对路径。具体的模板如下:
<!-- 配置和映射 Servlet --> <servlet> <!-- Servlet 注册的名字 --> <servlet-name>servletname</servlet-name> <!-- Servlet 的全类名 --> <servlet-class>com.wucj.defaultpkg.servlet</servlet-class> </servlet> <servlet-mapping> <!-- 需要和某一个 servlet 节点的 serlvet-name 子节点的文本节点一致 --> <servlet-name>servlet</servlet-name> <!-- 映射具体的访问路径: / 代表当前 WEB 应用的根目录. --> <url-pattern>/demo.html</url-pattern> </servlet-mapping>
这里需要注意的是同一个Servlet可以被映射到多个url上面,就是多个<servlet-mapping>元素的<servlet-name>子元素的设置值可以是同一个Servlet的注册名字。在这里不得不提通配符,只有两种固定格式;A、 *.扩展名;B、/* ,如下:
<servlet-mapping> <servlet-name>servletname</servlet-name> <url-pattern>*.html</url-pattern> </servlet-mapping> <servlet-mapping> <servlet-name>servletname</servlet-name> <url-pattern>/action/*</url-pattern> </servlet-mapping>
五、ServletConfig 接口
Servlet引擎将代表Servlet容器的对象ServletContext和servlet的配置参数封装到ServletContext对象中,在初始化Servlet实例对象时传递给该Servlet。接口具体定义如下:
public interface ServletConfig { public String getServletName(); public ServletContext getServletContext(); public String getInitParameter(String name); public Enumeration<String> getInitParameterNames(); }
具体的作用就是在Servlet程序中可以调用这些方法获取相关信息。Servlet引擎调用Servlet的实例对象init(ServletConfig config)方法会将ServletConfig对象传递给Servlet。Servlet.getServletConfig()方法必须返回init(ServletConfig config)方法传递进来的这个ServletConfig对象的引用。
六、ServletContext接口
Servlet引擎为每个web应用程序都创建一个对应的ServletContext对象,ServletContext对象包含在ServletConfig对象中,调用ServletConfig.getServletContext方法可以返回ServletContext对象的引用。同一个web应用程序中所有的Servlet都共享同一个ServletContext对象。
ServletContext servletContext = servletConfig.getServletContext();
七、HttpServletRequest 与 HttpServletResponse
在这里不得不说HttpServlet对象,它是一个 Servlet, 继承自 GenericServle, 针对于 HTTP 协议所定制。ServletResponse: 封装了响应信息, 如果想给用户什么响应, 具体可以使用该接口的方法实现。在 service() 方法中直接把 ServletReuqest 和 ServletResponse 转为 HttpServletRequest 和 HttpServletResponse。并调用了重载的 service(HttpServletRequest, HttpServletResponse),源代码是:
@Override public void service(ServletRequest req, ServletResponse res) throws ServletException, IOException { HttpServletRequest request; HttpServletResponse response; try { request = (HttpServletRequest) req; response = (HttpServletResponse) res; } catch (ClassCastException e) { throw new ServletException("non-HTTP request or response"); } service(request, response); } public void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //1. 获取请求方式. String method = request.getMethod(); //2. 根据请求方式再调用对应的处理方法 if("GET".equalsIgnoreCase(method)){ doGet(request, response); }else if("POST".equalsIgnoreCase(method)){ doPost(request, response); } }
在对象HttpServletRequest中可以获取丰富的请求信息,例如:
getMethod:返回HTTP请求消息中的请求方式。
getQueryString :返回请求行中的参数部分。
getServletPath方法:Servlet的名称或Servlet所映射的路径。
getRemoteAddr方法返回发出请求的客户机的IP地址。
getRemoteHost方法返回发出请求的客户机的完整主机名。
getRequestURL方法返回客户端发出请求时的完整URL。
getHeaders方法 。
以及获取请求参数的方法:getParameter方法、getParameterValues方法、getParameterNames方法、getParameterMap方法 。
八、那么该怎样用一句话来形容Servlet了?