Servlet的相关概念和调用过程

在web.xml中注册完整的servlet对外访问路径:

<servlet>和<servlet-mapping>标签对

<servlet>

    <servlet-name>FirstServlet</servlet-name>

    <servlet-class>cn.FirstServlet</servlet-class>

  </servlet>

  <servlet>



    <servlet-name>FirstServlet</servlet-name>

    <servlet-class>cn.SecondaryServlet</servlet-class>

  </servlet>

  <servlet>

    <servlet-name>RequestDemo1</servlet-name> <servlet-class>cn.request.RequestDemo1</servlet-class>

  </servlet>







  <servlet-mapping>

    <servlet-name>FirstServlet</servlet-name>

    <url-pattern>*.do</url-pattern>

  </servlet-mapping>

  <servlet-mapping>

    <servlet-name>FirstServlet</servlet-name>

    <url-pattern>/servlet/FirstServlet</url-pattern>

  </servlet-mapping>

  <servlet-mapping>

    <servlet-name>RequestDemo1</servlet-name>

    <url-pattern>/servlet/RequestDemo1</url-pattern>

  </servlet-mapping>

  <welcome-file-list>

    <welcome-file>index.jsp</welcome-file>

  </welcome-file-list>

注意:

   1.同一个Servlet可以被映射到多个URL上。

   2.请求地址支持模糊匹配 /abc/*    /*   /abc    *.do      (永远匹配级最低)

   3.Servlet是一个供其他Java程序(Servlet引擎)调用的Java类,它不能独立运行,它的运行完全由Servlet引擎来控制和调度。

4.如果在<servlet>元素中配置了一个<load-on-startup>元素,若标签中的数字为0或者大于0,那么WEB应用程序在启动时就会装载并创建Servlet的实例对象、以及调用Servlet实例对象的init()方法。当是一个负数或者没有指定,则指示容器在该servlet被选择时才加载。

 

 

 

 

 

 

Servlet的整个生命周期

(1)Servlet第一次被访问到时创建对象,创建出来后立即执行init方法执行初始化的操作。

(2)从此以后该对象一直驻留在内存中为后续的对这个Servlet的请求进行服务。

(3)直到服务器关闭或web应用移除出容器时,随着web应用的销毁Servlet对象销毁掉,在销毁之前调用destory方法执行善后工作。

(4)在存活期间,每次对Servlet 的调用都会导致Service方法的执行。

 

补充下整个请求-响应的调用过程

 

(1)在浏览器输入地址,浏览器先去查找hosts文件,将主机名翻译为ip地址,如果找不到就再去查询dns服务器将主机名翻译成ip地址。

(2)浏览器根据ip地址和端口号访问服务器,组织http请求信息发送给服务器。

(3)服务器收到请求后首先根据Host请求头判断当前访问的是哪台虚拟主机。

(4)服务器根据http请求头中的请求URI判断当前访问的是哪个web应用。

(5)服务器根据http请求头中的请求URI判断当前访问的是web应用中的哪个web资源。

(6)检查web应用的web.xml文件,如果根据路径找到具体的servlet处理类的全路径名交给该servlet处理,如果找不到就交给缺省servlet处理。

(7)这个过程中浏览器只知道自己发出来http请求,不久就收到了http响应,浏览器不知道也不关心服务器内部是如何处理的。浏览器和服务器之间的关系是非常单纯的,只有HTTP协议。

(8)解析请求、封装RequestResponse对象、创建Servlet、调用Service方法都是服务器自动进行的,开发人员只需要写好Servlet配置进容器中即可,无需操心具体的底层实现。

缺省Servlet(映射路径为/)

      如果某个Servlet的映射路径仅仅为一个正斜杠(/),那么这个Servlet就成为当前Web应用程序的缺省Servlet。

 

   凡是在web.xml文件中找不到匹配的<servlet-mapping>元素的URL,它们的访问请求都将交给缺省Servlet处理,也就是说,缺省Servlet用于处理所有其他Servlet都不处理的访问请求。

 

      在<tomcat的安装目录>\conf\web.xml文件中,注册了一个名org.apache.catalina.servlets.DefaultServlet的Servlet,并将这个Servlet设置为了缺省Servlet。

 

线程安全

      当多个客户端并发访问同一个Servlet时,web服务器会为每一个客户端的访问请求创建一个线程,并在这个线程上调用Servlet的service方法,因此service方法内如果访问了同一个资源的话,就有可能引发线程安全问题。

      实现SingleThreadModel接口的Servlet,Servlet引擎仍然支持对该Servlet的多线程并发访问,其采用的方式是产生多个Servlet实例对象,并发的每个线程分别调用一个独立的Servlet实例对象。这并不能真正解决Servlet的线程安全问题,因为Servlet引擎会创建多个Servlet实例对象,而真正意义上解决多线程安全问题是指一个Servlet实例对象被多个线程同时调用的问题,该方法已被标记过时.

 

 

 Servlet实现步骤

      i. 准备一个servlet文件

                 package cn.tedu;

                 import java.io.*;

                 import javax.servlet.*;

                 public class FirstServlet extends GenericServlet{

                      public void service(ServletRequest req, ServletResponse res) throws ServletException, java.io.IOException{

                            res.getWriter().write("Hello FirstServlet");

                      }

                 }

                

                 ii. 在web.xml中进行servlet映射配置

                     <servlet>

                         <servlet-name>FirstServlet</servlet-name>

                         <servlet-class>cn.tedu.FirstServlet</servlet-class>

                     </servlet>

                     <servlet-mapping>

                         <servlet-name>FirstServlet</servlet-name>

                         <url-pattern>/servlet/FirstServlet</url-pattern>

                     </servlet-mapping>

                 iii. 将编译好.class文件放入WEB-INF/classes目录下

 

 

 

猜你喜欢

转载自blog.csdn.net/qq_40531768/article/details/89337963