ServletContext--HttpServletResponse--web项目执行流程

一.ServletContext 接口(javax.servlet)

定义:public interface ServletContext

原理:
     Tomcat启动的时候,需要识别webapps下的各个WEB应用,识别各个WEB应用的同时为每个WEB应用创建对应的对象ServletContext,一个WEB应用对应一个ServletContext.ServletContext内置了2种至少MAP结构的数据,一种用于存放整个web应用中配置的键值对的参数信息,另外一种用于存放程序运行过程中产生的键值对的参数信息
     ServletContext生命周期:与项目共存亡.

介绍:
     定义一组方法,servlet 使用这些方法与其 servlet 容器进行通信,例如,获取文件的 MIME 类型、分发请求或写入日志文件。
     每个 Java 虚拟机的每个“Web应用程序”都有一个上下文,(“Web 应用程序”是 servlet 和内容的 Collection,这些 servlet 和内容安装在服务器的 URL 名称空间(比如 /    catalog)的特定子集下,并且可能通过.war文件安装。)如果 Web 应用程序在其部署描述符中标记为"distributed",那么每个虚拟机都将有一个上下文实例。在这种情况下,不能将上下文用作共享全局信息的位置(因为该信息不    会是真正全局共享的)。请使用外部资源(如数据库)替代。
     ServletContext 对象包含在 ServletConfig 对象中,ServletConfig 对象在初始化 servlet 时由 Web 服务器提供给 servlet。

常用方法:
     public Object getAttribute(String name){}:返回具有给定名称的servlet容器属性,如果不具有该名称的属性,则返回 null。属性允许 servlet
                                                 容器将此接口还没有提供的额外信息提供给servlet。可使用getAttributeNames 获取支持的属性的列表。
     public Enumeration<E> getAttributeNames(){}:返回包含此 servlet 上下文中可用属性的名称的 Enumeration。使用带有一个属性名称的 #getAttribute 方法获取属性值.
     public String getMimeType(String file){}:返回指定文件的 MIME 类型,如果 MIME 类型未知,则返回 null。MIME 类型由 servlet 容器的配置确定,可以在 Web 应用程序部署描述符中指定。常见    
                                             MIME类型是 "text/html" 和 "image/gif".
     public String getRealPath(String path){}:为给定虚拟路径返回包含实际路径的 String。
     public InputStream getResourceAsStream(String path){}:以 InputStream 对象的形式返回位于指定路径上的资源.InputStream 中的数据可以是任意类型或长度。该路径必须根据 getResource
                         中给出的规则指定。如果指定路径上没有资源,则此方法返回 null。使用此方法时,可通过 getResource 方法获得的元信息(比如内容长度和内容类型)将丢失。servlet     容器必须实现访问资源所需的 URL处理程序和 URLConnection 对象。此方法不同于 java.lang.Class.getResourceAsStream,后者使用类加载器。此方法允许 servlet     容器使某一资源可用于来自任意位置的 servlet,而不必使用类加载器。    
     public void removeAttribute(String name){}:从 servlet 上下文中移除具有给定名称的属性。完成移除操作后,为获取属性值而对 #getAttribute 进行的后续调用将返回 null。    
                                                 如果在 ServletContext 上配置了侦听器,则容器将相应地通知它们。   
     public void setAttribute(String name, Object object){}:将对象绑定到此 servlet 上下文中的给定属性名称。如果已将指定名称用于某个属性,则此方法将使用新属性替换具有该名称的属性。
                                                         如果在 ServletContext 上配置了侦听器,则容器将相应地通知它们。如果传递了 null 值,则效果将与调用 removeAttribute() 相同。

二.HttpServletResponse 接口(javax.servlet.http)

定义:public interface HttpServletResponse extends ServletResponse

作用:既然HttpServletResponse代表从服务端到客户端响应这个过程,那么结合协议我们知道HttpServletResponse可以控制HTTP协议响应的三大块内容,分别是响应行,响应头,响应体.

生命周期:每次服务端获取到来自客户端的请求之后,解析HTTP请求部分,将HTTP请求部分封装在HttpServletRequest对象中,同时创建HttpServletResponse对象, 之后在服务端完成本次响应
         之后,服务端就回收了刚才创建好的Request,Response对象. 下次请求到达服务端,会分配新的HttpServletRequest/HttpServletResponse对象.即只存活在一次请求/响应中;

三.Web项目执行流程

*_实现项目,发布到服务器下
    发布项目的本质:
      1_将源码位置中WebContent下的所有内容复制到tomcat下对应的项目中
      2_将源码下build下的class目录复制到tomcat下对应项目下的WEB-INF下

*_启动WEB服务器Tomcat
      1_运行tomcat内部的main函数,
      2_创建一个线程池(相当于之前的连接池),方便为客户端分配各个线程
      3_启动ServerSocket对象,监听服务端的8080端口号,等待来自客户端的请求

*_用户在浏览器地址栏输入 http://localhost:8080/day34/hello ,向服务端发起请求
    1_浏览器底层建立一个和服务端对应的socket
         浏览器底层通过socket可以获取到2种管道:输出,输入,
         通过输出流向服务端发送数据,通过输入流接收来自服务端的数据
    2_通过输出流将HTTP协议的请求部分发送到服务端

get  /day34/hello  http/1.1
    Host:"localhost:8080"
     User-Agent:"Mozilla/5.0 (Windows NT 6.1; WOW64; rv:46.0) Gecko/20100101 Firefox/46.0"
    Accept:"text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8"
    Accept-Language:"zh-CN,zh;q=0.8,en-US;q=0.5,en;q=0.3"
    Accept-Encoding:"gzip, deflate"
    Connection:"keep-alive"
    空行

*_服务端监听到一个和客户端对应的socket对象,通过socket可以获取到2种流对象
      输入流:读取客户端浏览器发送到服务端数据
      输出流:向客户端浏览器输出数据
    1_服务端为当前的客户端分配一条线程
    2_服务端通过读取输入流来获取客户端的HTTP请求部分后,将内容拆分,重新封装在
      一个HttpServletRequest的实例对象中,同时创建一个HttpServletResponse的实例化对象,可以向HttpServletResponse对象赋予部分属性(响应时间,服务器类型),
    3_服务端分析请求行部分,获取到本次请求的项目,以及项目下的资源
     GET /day34/demo.html  HTTP/1.1
    http://localhost:8080/day34/demo.html

*_如果请求的是静态文件资源
    通过输入流将静态的文件读入到内存,结合输出流和HTTP协议响应完成本次响应

GET /day34/hello  HTTP/1.1

http://localhost:8080/day34/hello

*_如果请求的是动态路径
    1_TOMCAT在当前的项目下day34下的web.xml中通过动态的路径”/hello”,寻找到
    “/hello”对应的类的全路径cn.itcast.test00.HelloServlet ;(Tomcat启动时即加载web.xml配置)
    2_tomcat可以通过反射,调用HelloServlet.class字节码上无参数的构造函数,
       创建HelloServlet对应的对象,执行对象上的init方法(仅执行一次);
    3_调用对象下的service方法,当前对象中,寻找不到,去父类中寻找,
      在service方法中判断本次请求是GET方式还是POST方式,调用对象下的doget/dopost
      方法(将创建好的request,reponse传递进去)

*_Tomcat结合http协议响应部分和输出流向客户端进行响应,
   服务端回收request,response,线程

*_浏览器通过输入流读取服务端响应到客户端的数据,对响应内容进行解析

时间: 2024-12-06 00:57:00

ServletContext--HttpServletResponse--web项目执行流程的相关文章

golang之web编程执行流程

为什么golang做web编程比其他语言并发高: Go是通过一个函数ListenAndServe来处理这些事情的,这个底层其实这样处 理的:初始化一个server对象,然后调用了net.Listen("tcp", addr),也就是底层用TCP协议搭建了一个服 务,然后监控我们设置的端口.下面代码来自Go的http包的源码,通过下面的代码我们可以看到整个的http处理过程: func (srv *Server) Serve(l net.Listener) error { defer l

web项目开发流程

对于一个web项目,在实际编码之前,有一些通用的步骤来planning a website: 1. 首先你需要对于网站拥有什么样的内容有一个清晰的想法(have an idea for the site's content); 2. 通过常用的工具使得网站的内容可视化: Wireframe the site's layout 3. 开始设计网页 designing the site 在这个阶段,你需要有更多更细致的关于你的用户将看到的细节以及如何和你的网站.应用来交互.这个流程又包括: grap

发布web项目一般流程

我发布的是maven管理的web项目,首先mave项目打包的话非常简单 mvn install 首先在pom.xml文件添加如下内容 在项目的目录下打开命令行输入mvn install(注意不是mvn package,这个命令只是打包源代码,项目的jar并不会包含在其中)这时就会在target的包下生成war包. 然后只需要把war包放在服务器上安装的tomcat下的webapps目录下重启tomcat就可以在浏览器看到新发布的web项目了. 提示:数据库导入sql文件的命令是 source /

Java web项目

前言 本文目标:使用eclipse为IDE环境搭建一个基于maven的web项目,讲解搭建过程,项目结构,程序运行.调试和测试过程,并使用maven作为持续集成工具. ? ? 面向对象:转型java的.net开发人员 ? ? 知识点:eclipse,maven,jfinal,jetty,tomcat,junit ? ? 环境准备 Maven 安装maven-3.3.9, 建议3.0+版本 检查安装版本,命令行输入: mvn -version ? ? ? ? ? ? Tomcat 下载tomcat

Eclipse运行jsp文件或者web项目

前提:Eclipse(中文版)正常运行,java环境(jdk1.8版本)搭建完毕 1.在自己的电脑上下载(部署)好Tomcat PS: tomcat是符合java ee标准的最小的web server,它可以完成大部分的小型系统的开发,并且提供支持,tomcat最大的分水岭是tomcat4.1之后,而在tomcat5.5之后也发生了一些改变,到今天使用的tomcat9. ①在官网上 http://tomcat.apache.org/上下载Tomcat安装程序(这里我选择用exe程序来安装Tomc

web项目启动时,执行某个方法

1.监听(Listener) web文件添加 <listener> <listener-class>cn.ro.common.InitListener</listener-class> </listener> 添加InitListener类,如下 package cn.ro.common; import javax.servlet.ServletContextEvent; import javax.servlet.ServletContextListener

mirantis fuel puppet执行顺序 和 对整个项目代码的执行流程理解

stage执行顺序 stage {'zero': } -> stage {'first': } -> stage {'openstack-custom-repo': } -> stage {'netconfig': } -> stage {'corosync_setup': } -> stage {'openstack-firewall': } -> Stage['main'] 1.class {'begin_deployment': stage => 'zero

web项目启动时,自动执行代码

tomcat启动时自动执行,以下两种方法的执行时长,会计算在tomcat的启动时长里. 1.ServletContextListener web.xml配置<listener> <listener-class>com.yuan.framework.GreyClientInitListener</listener-class> </listener> 1 public class GreyClientInitListener implements Servle

java项目上线的流程(将web项目部署到公网)

本博文来源于网络,原文的地址在本篇博文最下方. 如何将java web项目上线/部署到公网 关于如何将Java Web上线,部署到公网,让全世界的人都可以访问的问题.小编将作出系列化,完整的流程介绍. 1.在myeclipse中开发好项目,打包成war格式,不会的同学参考以下 http://zhidao.baidu.com/link?url=Gb0OV9pHiDtJr8nyjPrnSA65g49I4TEAn2N3pwXsxzVsCaX0gJ8RQZHQ2GmDrmdM0ltoBdCPYEtT1i