精华内容
下载资源
问答
  • Web服务器如何确定哪个Servlet处理请求 1、各种容器与服务器的区别与联系 1.1 容器与服务器的联系 1.2 各种容器的区别/联系 1.3 各种服务器的区别/联系 2、web服务器处理Servlet请求 2.1 处理Servlet请求图解 ...

    Web服务器如何确定哪个Servlet处理请求

    1、各种容器与服务器的区别与联系

    1.1 容器与服务器的联系

    在这里插入图片描述

    1.2 各种容器的区别/联系

    在这里插入图片描述

    1.3 各种服务器的区别/联系

    在这里插入图片描述

    2、web服务器处理Servlet请求

    2.1 处理Servlet请求图解

    在这里插入图片描述

    2.2 处理Servlet请求代码运行过程

    <?xml version="1.0" encoding="UTF-8"?>
    <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" id="WebApp_ID" version="2.5">
      <display-name>dubhe</display-name>
      <welcome-file-list>
        <welcome-file>login.jsp</welcome-file>
      </welcome-file-list>
      
      <servlet>
      	<servlet-name>UserInfoLoginServlet</servlet-name><!--step3 -->
      	<servlet-class>com.jd.userinfo.UserInfoLoginServlet</servlet-class><!--step4-->
      	<!--
      	<load-on-startup>1</load-on-startup>,
      	web项目发布时就创建Servlet实例
      	-->  
      </servlet>
      <servlet-mapping>
      	<servlet-name>UserInfoLoginServlet</servlet-name><!--step2-->
      	<url-pattern>/UserInfoLoginServlet</url-pattern><!--step1-->
      </servlet-mapping>
    </web-app>
    

    代码执行步骤:

    step1:根据客户端发过来的请求,Servlet容器判断是否创建并加载Servlet实例。如果是客户端第一次给服务器发送该Servlet请求时,Servlet容器会加载并创建Servlet实例 ,(注意:默认情况下不是Tomcat服务器或服务器上的Web应用启动的时候加载并实例化Servlet),之后会调用一次init()方法对Servlet实例初始化 。当客户端(可以是非第一次请求的客户端)再次向服务器发送该Servlet请求时,服务器会从内存 。中查找该Servlet实例,并用找到的Servlet实例处理用户请求。
    step2:根据URL得到servlet的name;
    step3:找到代码中的中与name 相同的那个 标签;
    step4:最后根据这行代码找到客户端对应的Servlet

    <servlet-class>com.jd.userinfo.UserInfoLoginServlet</servlet-class>
    

    step5执行Servlet中的代码

    • Servlet容器首先会针对该请求创建ServletRequest和ServletResponse对象;
    • 调用Servlet的service()方法并把这两个参数传递给service()方法处理客户端请求;
    • Servlet实例通过ServletRequest对象获得客户端的请求;
    • 通过调用ServletResponse对象的方法进行响应,通过web服务器向客户端返回静态页面
    • 请求处理完毕,ServletRequest和ServletResponse对象被销毁(销毁的方式:服务器关闭或重新发布项目,都由Servlet容器完成)

    如何确定请求的方式是Get还是POST?
    不管客户端发送请求的方式是Get还是POST,这个请求都由 service方法来处理。在service方法的处理过程中,会根据客户端发送请求的方式不同,调用 doGetdoPost方法分别进行处理,通过HttpServlet类中的service方法可以了解这一调用过程,如下代码:

    protected void service(HttpServletRequest req, HttpServletResponse resp)throws ServletException, IOException {
            String method = req.getMethod();
            if (method.equals(METHOD_GET)) {
                long lastModified = getLastModified(req);
                if (lastModified == -1) {
                    doGet(req, resp);
                } else {
                    long ifModifiedSince = req.getDateHeader(HEADER_IFMODSINCE);
                    if (ifModifiedSince < lastModified) {
                        maybeSetLastModified(resp, lastModified);
                        doGet(req, resp);
                    } else {
                        resp.setStatus(HttpServletResponse.SC_NOT_MODIFIED);
                    }
                }
            } else if (method.equals(METHOD_HEAD)) {
                long lastModified = getLastModified(req);
                maybeSetLastModified(resp, lastModified);
                doHead(req, resp);
            } else if (method.equals(METHOD_POST)) {
                doPost(req, resp);
            } else if (method.equals(METHOD_PUT)) {
                doPut(req, resp);
            } else if (method.equals(METHOD_DELETE)) {
                doDelete(req, resp);
            } else if (method.equals(METHOD_OPTIONS)) {
                doOptions(req,resp);
            } else if (method.equals(METHOD_TRACE)) {
                doTrace(req,resp);
            } else {
                String errMsg = lStrings.getString("http.method_not_implemented");
                Object[] errArgs = new Object[1];
                errArgs[0] = method;
                errMsg = MessageFormat.format(errMsg, errArgs);
                
                resp.sendError(HttpServletResponse.SC_NOT_IMPLEMENTED, errMsg);
            }
        }
    
    

    【参考资料】
    [服务器,容器的区别] https://blog.csdn.net/tjiyu/article/details/53148174

    展开全文
  • Servlet处理客户端请求过程

    千次阅读 2019-06-13 15:35:56
    前言 由于Servlet没有main函数,运行在容器中,所以整个生命周期由容器控制。具体可以分为5个状态: ... 处理客户端请求。容器在接到客户端请求时,都会创建一个新的线程,通过调用Servlet的serv...

    前言

    由于Servlet没有main函数,运行在容器中,所以整个生命周期由容器控制。具体可以分为5个状态:

    1. 加载,容器通过类加载器来加载Servlet。
    2. 创建,通过Servlet构造方法创建Servlet对象。
    3. 初始化,调用Servlet的init()方法,进行初始化工作,注意,只初始化一次
    4. 处理客户端请求。容器在接到客户端请求时,都会创建一个新的线程,通过调用Servlet的service()方法来处理客户端请求,而service()会根据请求的不同,调用相应的doGet()或者doPost()方法。
    5. 卸载,容器在卸载Servlet之前需要调用destory()方法,让Servlet自己释放所占用的系统资源,如果在执行完destory()方法后,重新需要这个Servlet,那么必须重新加载创建初始化Servlet对象了,destroy()方法在一个生命周期也只调用一次

    Servlet处理客户端请求过程

    1. 用户点击链接,客户端发送Servlet请求。
    2. 服务器接收到请求后交给相应的容器来进行处理,当容器发现是Servlet请求时,容器会创建两个对象:HttpServletResponse和HttpServletRequest。
    3. 容器通过请求消息中的URL找到相应的Servlet,创建一个新线程,将HttpServletResponse和HttpServletRequest两个对象以参数的形式传给新创建的线程。
    4. 容器调用Servlet的service()方法,service()方法会根据请求的不同调用相应的doPost()或者doGet()方法来完成具体的请求处理。
    5. 容器将响应消息按照HTTP组装好返回给客户端。同时这个线程运行结束,同时删除第二步中产生的两个对象。
    展开全文
  • 一、Web服务器 二、Servlet 三、Web服务器确定Servlet处理请求过程

    一、Web服务器

    Web服务器概念较为广泛,我们最常说的Web服务器指的是网站服务器,它是建立在Internet之上并且驻留在某种计算机上的程序。Web服务器可以向Web客户端(如浏览器)提供文档或其他服务,只要是遵循HTTP协议而设计的网络应用程序都可以是Web客户端。
    在这里插入图片描述

    二、Servlet

    Servlet概述:
    Servlet是服务器端的Java应用程序,可以生产动态Web页面。透过JSP执行过程可以知道JSP最终被编译成一个.class文件,查看该文件对应的Java类,发现该Java类继承自org.apache.jasper.runtime.HttpJspBase类,而HttpJspBase继承自HttpServlet类,由此可知JSP第一次运行时实质上是被JSP引擎翻译成了一个Servlet,然后再编译,最后再执行。

    自定义Servlet类继承HttpServlet抽象类,HttpServlet抽象类继承自GenericServlet抽象类,GenericServlet抽象类实现了Servlet、ServletConfig和Serializable接口

    Servlet声明周期:

    1、加载及实例化
    Servlet容器负责加载和实例化Servlet。当客户端第一次给服务器发送该Servlet请求时,Servlet容器会加载并创建Servlet实例,当客户端(可以是非第一次请求的客户端)再次向服务器发送该Servlet请求时,服务器会从内存中查找该Servlet实例,并用找到的Servlet实例处理用户请求。在该过程中,Servlet容器会创建一个ServletConfig对象,该对象包含了Servlet的初始化配置信息。根据用户请求的URL地址,Servlet容器会根据配置信息查找该请求对应的Servlet类,由容器创建并管理该Servlet。

    注意:默认情况下不是Tomcat服务器或服务器上的Web应用启动的时候加载并实例化Servlet,而是第一次向服务器发送请求时,但是:在web.xml文件中,通过load-on-startup标签可以配置Servlet,当web项目发布后立即创建Servlet实例。

    2、初始化
    在Servlet容器完成Servlet类的实例化操作后,Servlet容器会调用Servlet的init()方法(在javax.servelt.Servlet接口中定义)对该Servlet进行初始化。对于每一个Servlet实例来说,init()方法只会被调用一次。初始化的目的是让Servlet在处理用户请求之前,做一些必要的准备工作,例如建立数据库连接,引用其他资源等。

    3、处理请求
    Servlet初始化之后,就处于就绪状态等待接收用户请求。当Servlet容器接收到客户端针对该Servlet的请求后,首先会针对这个请求创建ServletRequest和ServletResponse对象,之后调用Servlet的service()方法并把这两个参数传递给service()方法处理客户端请求。Servlet实例通过ServletRequest对象获得客户端的请求,通过调用ServletResponse对象的方法进行响应。请求处理完毕,ServletRequest和ServletResponse对象被销毁。
    不管客户端发送请求的方式是Get还是POST,这个请求都由service方法来处理。在service方法的处理过程中,会根据客户端发送请求的方式不同,调用doGet和doPost方法分别进行处理。

    4、销毁
    销毁Servlet 由Servlet容器完成。默认情况下,用户第一次发送Servlet请求,该Servlet加载、实例化、初始化、处理用户请求,当请求处理完毕后,该Servlet通常情况下驻留在内存中,等待处理下一个针对该Servlet的请求。当下一个针对该Servlet的请求到达时,直接从内存中获取该Servlet实例并对该请求进行处理。如果Tomcat这个Web应用服务器关闭(服务器上所有的Web应用都关闭),或者该Servlet所在的Web应用关闭,该Servlet实例会被销毁。

    Web应用被关闭时,Servlet容器会先调用Servlet实例的destroy方法,然后再销毁Servlet实例,同时也会销毁与Servlet相关联的ServletConfig对象。程序员通常在destroy()方法的实现中释放该Servlet所占用的资源,如关闭数据库连接,关闭文件输入/输出流等。

    Servlet初始化参数设置

    在web.xml文件中配置Servlet时,还可以在servlet元素中添加init-param元素预先对Servlet进行初始化设置,当Servlet加载时即可从该Servlet配置文件中获取初始化参数。
    在这里插入图片描述

    获取:
    a、在无参init方法中直接调用getInitParameter(String name)方法即可,如下代码:
    在这里插入图片描述
    b、在参数为ServletConfig的方法中调用ServletConfig内getInitParameter(String name)方法即可,如下代码:
    在这里插入图片描述

    Servlet上下文(环境对象)初始化参数设置
    有时候不仅需要针对单个Servlet进行初始化参数设置,还需要对包含该Web引用中所有Servlet的环境对象进行初始化参数设置,使该参数能被所有的Servlet共享,如下代码:
    在这里插入图片描述

    获取:
    a、在无参init方法中直接调用getServletContext ()方法获取Servlet上下文对象,然后使用该对象调用getInitParameter方法即可,如下代码:
    在这里插入图片描述
    b、在参数为ServletConfig的方法中调用ServletConfig内getServletContext ()方法获取Servlet上下文对象,然后使用该对象调用getInitParameter方法即可,如下代码:
    在这里插入图片描述

    三、Web服务器确定Servlet处理请求过程

    1、Web服务器接收到请求
    2、Web服务器将请求转发给servlet容器
    3、servlet容器根据请求的URL去调用客户端要访问的Servlet
    4、在调用之前,servlet容器会根据web.xml中对Servlet的配置去查找要访问的Servlet
    (1)若找到,将此Servlet装载进虚拟机并调用servlet的init()方法对servlet进行初始化(该方法只会在servlet第一次被载入时调用),然后调用Servlet实例中的service()方法处理请求,即,读取请求中的数据,创建一个响应。servlet会被保留在容器的地址空间中,继续处理其他的HTTP请求。
    注: 当第二次去访问同一个Servlet时,若容器判断到该Servlet已经被装载并实例化,那么容器就不会再去创建一个新的Servlet实例,直接调用原来那个Servlet实例中的service()方法来处理请求。(2)若没有找到,直接返回一个404的错误代码到客户端,表示访问的资源不存在。注:但如果在Spring MVC中的web.xml中添加如下代码,就可以交给Web服务器默认Servlet处理。
    < mvc:default-servlet-handler/>
    < mvc:annotation-driven></mvc:annotation-driven>
    5、Web服务器将动态生成的结果返回到正确的地址。

    展开全文
  • Servlet处理请求过程

    2014-03-27 11:10:58
    Servlet是运行在web服务器端的java程序,可以生成动态的web页面,属于客户与服务器响应的中间层。实际上jsp的底层就是servle。学习它有助于了解底层的细节,毕竟servlet是一个java类。常见的servlet的写法有两种,一...

           Servlet是运行在web服务器端的java程序,可以生成动态的web页面,属于客户与服务器响应的中间层。实际上jsp的底层就是servle。学习它有助于了解底层的细节,毕竟servlet是一个java类。常见的servlet的写法有两种,一种就是extends HttpServlet;另一种是覆盖原有的service方法。在servlet中默认情况下,无论你是get还是post 提交过来 都会经过service()方法来处理,然后转向到doGet或是doPost方法,

     原代码:

      

      protected void service(HttpServletRequest req, HttpServletResponse resp)
            throws ServletException, IOException
        {
            String method = req.getMethod();
            if(method.equals("GET"))
            {
                long lastModified = getLastModified(req);
                if(lastModified == -1L)
                {
                    doGet(req, resp);
                } else
                {
                    long ifModifiedSince = req.getDateHeader("If-Modified-Since");
                    if(ifModifiedSince < (lastModified / 1000L) * 1000L)
                    {
                        maybeSetLastModified(resp, lastModified);
                        doGet(req, resp);
                    } else
                    {
                        resp.setStatus(304);
                    }
                }
            } else
            if(method.equals("HEAD"))
            {
                long lastModified = getLastModified(req);
                maybeSetLastModified(resp, lastModified);
                doHead(req, resp);
            } else
            if(method.equals("POST"))
                doPost(req, resp);
            else
            if(method.equals("PUT"))
                doPut(req, resp);
            else
            if(method.equals("DELETE"))
                doDelete(req, resp);
            else
            if(method.equals("OPTIONS"))
                doOptions(req, resp);
            else
            if(method.equals("TRACE"))
            {
                doTrace(req, resp);
            } else
            {
                String errMsg = lStrings.getString("http.method_not_implemented");
                Object errArgs[] = new Object[1];
                errArgs[0] = method;
                errMsg = MessageFormat.format(errMsg, errArgs);
                resp.sendError(501, errMsg);
            }
        }

     

    由源代码可以看出service只是用来转向,但如果servlet类中覆盖了service方法,比如:

    public class HelloServlet extends HttpServlet{
    	public void service(HttpServletRequest request,HttpServletResponse response) 
    	throws ServletException,IOException{
    		//设置一个消息头,告诉客户端(即浏览器)服务器
    		//返回的数据类型。
    		response.setContentType("text/html");
    		//通过response获得输出流。
    		PrintWriter out = response.getWriter();
    		out.println(
    				"<div style='color:red;font-size:30px;'>" +
    				"Hello World</div>");
    		out.close();
    	}
    }

     

    这时service用来做业务处理,不论客户端是用pos还是get来请求此servlet都会执行service方法也只能执行servlet方法,不会去执行doPost或是doGet方法。

    那么一次http请求,servlet内部是怎么处理并执行的呢?看下面这张图:



          画的很抽象是吧,凑合看吧!不过挺有手感的。这就是servlet执行的全过程。

          事实上,客户端对servlet发送一个请求,服务器就会开启一个线程,该线程会调用service方法,service方法会根据就收到的客户端的请求类型来决定是调用doGet还是doPost。

          servlet的生命周期如下图:


          这张看着还舒服点,当客户端向web服务器发送第一次servlet请求时,web服务器会实例化一个servlet,并调用init()方法;如果web服务器已经存在一个servlet实例,将直接调用次实例;然后调用service()方法,service()方法将根据客户端的请求方式来决定调用对应的doXXX方法;当servlet从web武器中消亡时,web服务器会调用servlet的destroy()方法。

    待续...

     

     

     

     

    展开全文
  • Servlet处理请求和响应

    千次阅读 2016-10-14 22:37:30
    Servlet处理请求的流程:  1) 客户端在浏览器的地址栏中输入一个请求的URL,按回车后就向服务器端发起一个http request(由浏览器生成)。  2) 服务器端的Web Server首先接受到请求,并将请求转交给容器,容器会根据...
  • Servlet容器请求处理

    千次阅读 2017-07-31 18:05:23
    本篇文章将给大家讲述Servlet容器中请求处理过程,在给本篇文章起标题时,一直在“应用服务器”与“Servlet容器”这两者之间拿捏不定,主要是因为要清晰的区分开这两者的关系:Servlet容器可以说是应用服务器的一...
  • Servlet处理请求的学习笔记

    千次阅读 2019-01-13 23:01:08
    如上图,Servlet要经过init(初始化)-->service(服务的相应请求)-->destroy(销毁)这三个过程。 1、init()方法 init()方法是在服务器创建一个servlet实例的时候被调用的,只被调用一次。在服务器启动的时候,...
  • Servlet处理HTTP请求

    千次阅读 2016-10-23 13:24:58
    使用Servlet接受服务器端请求信息 HTTP请求包括请求行、请求头、消息体以及分割请求头和消息体的一个空行。 客户端的HTTP请求通过HttpServletRequest对象代表。HttpServletRequest对象只要用于获取由客户端发送...
  • Tomcat的组成部分 ...Tomcat容器的处理请求过程 servlet的生命周期 HttpServletRequest HttpServletResponse
  • Servlet调用过程   1浏览器从地址栏中获取主机名,并获取主机名对应的ip地址,首先从windowshosts文件中查找是否有该主机对应的ip地址 ,如果没有,则查找dns服务器查找主机名对应的ip地址.  2.浏览器连接...
  • 一个Servlet请求的请求过程

    千次阅读 2018-10-21 15:44:06
    首先看servlet的接口定义 public interface Servlet { public void init(ServletConfig config) throws ServletException; public ServletConfig getServletConfig(); public void service...
  • Servlet代码 package project0816; import java.io.IOException; import java.io.PrintWriter; import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.htt....
  • 使用Servlet处理HTTP请求

    千次阅读 2016-10-24 22:05:24
    1、使用Servlet接受服务器端请求信息: (1)get/post提交方法:当点击超链接、提交表单、输入URL并回车时,浏览器向Web服务器发送HTTP请求 (2)两种提交方法的比较:get:①作为URL一部分显示在浏览器地址栏;②...
  • servlet 处理过程

    2015-07-30 11:38:20
    刚才花了一个小时找 servlet 的一个错误,最终找出来了,也大概明白 tomcat 服务器对请求处理顺序,下面做简单总结: 浏览器发送请求,传给 tomcat 在此请求地址指向的文件里定义了操作方式 请求 POST GET ...
  • Servlet Java Servlet 是运行在Web 服务器或应用服务器上的程序. 其主要功能在于交互式地浏览和修改数据,生成动态Web内容. 狭义的Servlet是指Java语言实现的一个接口,广义的Servlet是指任何实现了这个Servlet...
  • (2)Web服务器接收到请求之后,会把该请求交给相应的容器进行处理,此时容器会创建两个对象:HttpServletResponse和HttpServletRequest。 (3)容器根据请求的url信息找到对应的Servlet,然后针对该请求创建一个...
  • Servlet处理用户请求的完整流程 针对 Servlet 的每次请求,Web 服务器在调用 service() 方法之前,都会创建 HttpServletRequest 和 HttpServletResponse 对象。其中,HttpServletRequest 对象用于封装 HTTP 请求消息...
  • Servlet处理用户请求和响应(二)

    千次阅读 2017-09-15 12:49:41
    (一)浏览器访问Servlet过程示意图1.Servlet主要作用就是处理客户端请求和响应。浏览器每一次请求Servlet,服务器Tomcat在调用Service()方法之前,都会创建两个对象,分别是HttpServletRequest对象和...
  • servlet容器会根据请求的url-pattern找到对应的Servlet类,执行对应的doPost或doGet方法,再将响应信息返回给浏览器,这种情况下,一个具体的Servlet类只能处理对应的web.xml中配置的url-pattern请求,一个Servlet类...
  • 前面我们分析了springboot的启动,tomcat的源码,这一篇,我们将从tomcat的Acceptor开始,分析一个请求进入servlet处理过程   首先定位到NioEndpoint中的内部类Acceptor的run方法中的 socket = NioEndpoint....
  • Servlet如何处理请求及生命周期

    千次阅读 2016-04-07 17:59:28
    一、servlet容器如何处理请求资源路径?  比如,在浏览器地址栏输入  http://ip:port/web04_2/abc.html  浏览器会将请求资源路径("/web04_2/abc.html")放到请求数据包里面,发送给容器。容器收到之后,会依据应用...
  • Servlet 容器如何处理请求资源路径

    千次阅读 2015-08-19 15:47:05
    其中appName/xx.html 即为请求资源路径二、Web服务器对请求路径的处理过程 在浏览器地址栏中输入http://ip:port/appName/xx.html 浏览器依据ip,port建立与Servlet容器之间的连接,然后将请求资源路径appName/xx
  • 一个servlet处理多个请求

    千次阅读 2015-11-28 18:51:04
    在实际应用过程中,经常遇到一次请求就要对应一个servlet,比如做一个简单的登录注册,那么登录对应一个servlet,注册也需要一个servlet,登录成功后,还需要添加,删除,编辑等等,对需要一个对应的servlet,那么有...
  • JSP+Servlet请求处理方法的指定

    千次阅读 2015-05-11 22:09:51
    2、新建一个对应请求servlet类,并添加doGet和doPost方法,并使用其中之一作为主要方法来使用调用 3、在作为主要方法的之一中的关键代码: 第一种: String methodName = request.getAttribute("method"); ...
  • //我们来看下通用ajax 对应的js//其中action为系统内对应的Action...//即调用了app.action.ActionConfig类的goodsPutAwayCheck方法,返回数据在js中已经有处理,就不再细说,完整的公用callObjectAction适用所有请求

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 140,694
精华内容 56,277
关键字:

servlet处理请求的过程