ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

Servlet的相关概念和调用过程

2019-04-16 17:55:39  阅读:264  来源: 互联网

标签:web 调用 请求 FirstServlet Servlet 概念 服务器 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目录下

 

 

 

标签:web,调用,请求,FirstServlet,Servlet,概念,服务器,servlet
来源: https://blog.csdn.net/qq_40531768/article/details/89337963

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有