一、什么是Servlet
?
? ? ? ? ?Servlet(Server Applet),是一种运行在服务器中的小应用程序,由Java语言编写,但与传统的在命令行下运行的Java程序有所不同,那就是Servlet是由web服务器调用的。
?
二、与Servlet相关的核心类体系结构
?
?
? ? ?以Tomcat6.0(tomcat6.0支持Servlet2.5、Jsp2.1)为服务器,写一个简单的
? ? Servlet程序:
?
? ? ??import java.io.IOException;
import java.io.PrintWriter; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; public class HelloServlet extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // 设置输出流编码 response.setContentType("text/html;charset=UTF-8"); // 取得一个HttpServletResponse对象的输出流 PrintWriter out = response.getWriter(); out.println("Hello Servlet!"); } public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doGet(request, response); } }?
? ? 在浏览器中输入 http://localhost:8080/helloServlet/hello后会在页面打印
? ? 出Hello Servlet!
?
三、Tomcat服务器解析HTTP请求并响应的过程
? ? ? ? ?对该过程进行更为详细的分析:
?
? ? ? ?1、当客户端通过浏览器向服务器发出 ?
? ? ? ? ? ? http://localhost:8080/helloServlet/hello,此时服务器会对该http请
? ? ? ? ? ? ? ? ??求进行解析:如下形式:
?
? ? ? ? ? ? ? ? ? ? ? ? ? 1.1、GET /helloServlet/hello HTTP/1.1
? ? ? Accept:image/gif,image/jpeg,image/pjpeg ...
? ? ? ? ? ? ? ? ? ? ? ? ? ?? ? ? ? ?Accept-Language:zh-cn
? ? ? ?User-Agent:Mozilla/4.0
? ? ? ?Accept-Encoding:gzip,deflate
? ? ? ? ? ? ? ?Host:localhost:8080
? ? ? ?Connection:Keep-Alive
?
? ? ? ? ? ? ??2、服务器查找$CATALINA_HOME/conf/server.xml文件,查找
? ? ? ? ? ? ? <Host>节点中name="localhost"所对应的appBase属性的值,如下:
?
?
<Server port="8005" shutdown="SHUTDOWN"> <Service name="Catalina"> <Connector port="8080" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" /> <Engine name="Catalina" defaultHost="localhost"> <Host name="localhost" appBase="webapps" unpackWARs="true" autoDeploy="true" xmlValidation="false" xmlNamespaceAware="false"> </Host> </Engine> </Service> </Server>??
??3、根据<Host>的appBase属性的值到webapps的目录下查找名为
? ? ? ? ? ? ? ? ? ? ??helloServlet的这个web应用。
?
? ? ? ? ? 4、Tomcat服务器查询helloServlet/WEB-INF/web.xml文件(web应
? ? ? ? ? ? ? ?用的部署描述符),查询的具体过程如下:
?
<web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"> <servlet> <servlet-name>HelloServlet</servlet-name> <servlet-class>com.itheima.servlet.HelloServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>HelloServlet</servlet-name> <url-pattern>/hello</url-pattern> </servlet-mapping> <welcome-file-list> <welcome-file>index.jsp</welcome-file> </welcome-file-list> </web-app>?
? ? ? ? ? ? ? ? 4.1、先根据<servlet-mapping>元素中的<url-pattern>元素的值找
? ? ? ? ? ? ? ? ? ? ?到<servlet-name>元素的值
?
? ? ? ? ? ? ? ? ? ?4.2、根据<servlet-mapping>元素中找到的<servlet-name>映射到
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?<servlet>元素中的<servlet-name>的值,再找到对应的
? ? ? ? ? ? ? ? ? ? ?<servlet-class>元素的值,即为/hello所对应的HelloServlet
?
? ? ? ? ?5、Tomcat服务器查找并加载class文件的顺序:
?
? ? 5.1、首先到到com.itheima.servlet的路径下查找并加载
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??HelloServlet.class文件。
?
? ? ? ? ? ? ? 5.2、如果没有找到会继续查找helloServlet/WEB-INF/lib目录中查找
? ? ? ? 并加载HelloServlet.class文件。
?
? ? ? ? ? ? ? 5.3、如果还没有找到,Tomcat服务器会去$CATALINA_HOME/lib目
?录中继续加载,如果找不到就会抛出类找不到的异常
?
? ? ? ? ? 6、Tomcat服务器将处理后的数据写入HttpServletResponse对象之中
? ? ? ? ? ? ? ? ? ? ? ?并返回给客户端
?
?
?四、Servlet的生命周期? ? ? ? ????
?
? ? ? ? ? ? ? ?1.Servlet程序是供其他Java程序(Servlet引擎)调用的Java类,一个
? ? ? ? ? ? ? ? ? ??Servlet不能单独运行,它的运行完全有Servlet引擎来控制和调用。
?
? ? ? ? ? ? ? ? 2.对于客户端的多次Servlet请求,通常服务器只会创建一个Servlet的实
? ? ? ? ? ? ? 例,即一旦创建一个Servlet实例,该实例就会驻留在内存,为后续的
? ? ? ? ? ? ? 请求服务直到web容器推出,该servlet实例才会销毁.
?
? ? ? ? ? ? ? ? ?3.在Servlet的整个生命周期中,Servlet的init()方法只会被调用一次而
? ? ? ? ? ? ? ? ? ? ? 每一次Servlet的请求都会使Servlet引擎调用一次service()方法,创
? ? ? ? ? ? ? ?建一个新的用于封装HTTP请求消息的HttpServletRequest对象和一
? ? ? ? ? ? ? ?个用于封装HTTP响应消息的HttpServletResponse对象,然后会将这
? ? ? ? ? ? ? ? ? ?? 两个对象作为参数传递给service(HttpServletRequest request,
? ? ? ? ? ? ? ?HttpServletResponse response)方法,然后根据具体的请求方式
? ? ? ? ? ? ? ?(如:GET、POST等方式)调用doXXX()方法。
?
?
?
?
?
?
?
?
?
?
?
?
?
?