web 相信大家都不陌生,平常我们浏览网页用的都是web服务。互联网起初的web就是非常简单的页面,但是随着客户需求越来越复杂,需要的功能越来越多,我们的服务器端需要处理的请求越来越多,需要区分不同的请求,还需要按照不同请求进行请求数据的提取以及资源的分配和运算还有逻辑的处理,最后还需要响应给客户端,这就使得服务器端 代码越来越复杂,实现越来越困难。根据以往的经验,双方进行通信只需要遵循一定的规则就可以很明确地知道各部分数据的含义,于是出现了网络更上层的应用协议(后面讲的 HTTP 协议),规定 服务器 端和客户端通信的规则。客户端请求 服务器端和服务器端响应客户端,都按照固定的规则,那么接收请求和相应数据这部分操作就可以固定下来,交给特定的一段代码来执行,从而减少 服务器端的代码量,于是出现了各种web框架;如果大家想了解更加深入的话,就去了解web的发展历程吧,其中有不少有趣的小故事啊,这里就不详细赘述了。

一,socket通信

  说起web,肯定离不开tcp协议和http协议(https协议较为复杂,暂时不在本章讨论范围之内)。http协议在后面,那什么是tcp协议,cp协议就是网络的传输层面的东西,就是用来传输数据的,tcp协议相对安全可靠,主要连接过程如下图,客户端先发送一个SYN请求,包含一个随机数seq,假设这个随机数的值等于i。服务器就会发送一个ACK请求,并且对这个随机数加1,同时发给客户端,客户端收到服务端的ack之后也会向服务端发送一个ack(这里只是大概描述了一下tcp三次握手,如果想详细了解的话可以去看tcp/ip协议卷)

  

http是应用层的协议,它的传输层是tcp协议。可以说sock通信是web服务的底层通信,没有socket也就没有http协议,跟谈不上web服务了

二,体系架构

  主要有c/s 架构和b/s架构,c/s 主要由一般需要在客户端安装的应用程序和远程服务器组成的。它的优点是通信双方的通信量较少,因为大部分信息存储在本地,缺点是客户端的维护和升级较为麻烦,一般适用于大型的系统。

  b/s架构是由浏览器和服务器组成的,优点是方便,随时可以上网,缺点是通信量较大,相对于c/s不是特别的稳定;

          c/s 架构

          b/s架构

三,web应用程序的工作原理

    web应用程序大致上分为两种,即动态网站和静态网站。静态网站就是用HTML写的静态页面,动态网站是根据用户不同的请求动态的生成动态的不同的页面发送给客户端,通常使用HTML语言和动态脚本语言(ASP,PHP,JSP)等语言编写。下面的图片来源于网络

  

  在开发 Web 应用程序时,通常需要应用客户端和服务器端两方面的技术。其中,客户端应用的技术主要用于展现信息内容,而服务器端应用的技术,则主要用于进行业务逻辑的处理和与数据库的交互等。

四,HTTP协议

为了使互联网的web服务茁壮的发展,让客户端和服务端共同的遵守一些协议,http就出现了。http协议可以说是最伟大的协议之一,主要有1.0版本,1.1版本和2.0版本。在浏览器中的书写格式是http://127.0.0.1:80/mysite/index,主要由    http协议://ip地址:端口 / 资源地址    组成的,这也是常说的URL,URL也是URI的一种形式,有兴趣的可以查一下URL和URI有什么区别;

http的请求报文

请求格式:

请求行

请求头1

请求头2

.........

请求空行

请求正文

请求行由请求方式(get和post),请求资源地址,协议(http/1.1)  组成

请求头由报头域组成  每一个报头域都是由名字+“:”+空格+值组成,消息报头域的名字是大小写无关的。

请求正文(也有的叫请求体):只有post有请求正文,get是没有的

注意:请求头和请求正文之间必须有一个空白行的。

                请求头

http的响应报文

响应格式:

状态行

响应头1

响应头2

..........

响应空行

响应正文

状态行由协议(http/1.1   状态码   状态码的描述)

响应头由报头域组成  每一个报头域都是由名字+“:”+空格+值组成,消息报头域的名字是大小写无关的。

响应正文 一般由HTML组成

注意:响应头与响应正文之间必须有一个空白行

        响应头

        响应正文

五,第一servlet的实现

  Servlet 是 Server 与 Applet 的缩写,是服务端小程序的意思。使用 Java 语言编写的服务 器端程序,可以像生成动态的 WEB 页,Servlet 主要运行在服务器端,并由服务器调用执行, 是一种按照 Servlet 标准来开发的类。 是 SUN 公司提供的一门用于开发动态 Web 资源的技 术。 (言外之意:要实现 web 开发,需要实现 Servlet 标准)Servlet 本质上也是 Java 类,但要遵循 Servlet 规范进行编写,没有 main()方法,它的创 建、使用、销毁都由 Servlet 容器进行管理(如 Tomcat)。(言外之意:写自己的类,不用写 main 方法,别人自动调用)Servlet 是和 HTTP 协议是紧密联系的,其可以处理 HTTP 协议相关的所有内容。这也是 Servlet 应用广泛的原因之一。提供了 Servlet 功能的服务器,叫做 Servlet 容器,其常见容器有很多,如Tomcat, Jetty, WebLogic Server, WebSphere, JBoss 等。

  创建servlet的三种方式:

  第一种,继承HttpServlet

  

 package test;

 import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse; public class Servlet01 extends HttpServlet { @Override
public void init() throws ServletException {
System.out.println("我servlet01诞生了"); } @Override
protected void service(HttpServletRequest arg0, HttpServletResponse arg1) throws ServletException, IOException {
System.out.println("hello world");
} @Override
public void destroy() {
System.out.println("我servlet01要圆寂了");
} }

第二方式 ,继承GenericServlet

 package test;

 import java.io.IOException;

 import javax.servlet.GenericServlet;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletResponse; public class Servlet02 extends GenericServlet{
@Override
public void init() throws ServletException {
System.out.println("我servlet02诞生了");
} @Override
public void service(ServletRequest req, ServletResponse res) throws ServletException, IOException {
System.out.println("service...servlet02....");
HttpServletResponse hsr=(HttpServletResponse)res;
hsr.getWriter().write("hello world"); } @Override
public void destroy() {
System.out.println("我servlet02要走向死神的怀抱了");
} }

第三种方式,实现Servlet接口

 package test;

 import java.io.IOException;
import javax.servlet.Servlet;
import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse; public class Servlet03 implements Servlet{ @Override
public void init(ServletConfig config) throws ServletException {
System.out.println("servlet03的初试化"); } @Override
public ServletConfig getServletConfig() {
// TODO Auto-generated method stub
return null;
} @Override
public void service(ServletRequest req, ServletResponse res) throws ServletException, IOException {
// TODO Auto-generated method stub
System.out.println("servlet03。。。。。");
} @Override
public String getServletInfo() {
// TODO Auto-generated method stub
return null;
} @Override
public void destroy() {
// TODO Auto-generated method stub
System.out.println("servlet03的销毁。。。。。。。");
} }

servlet的工作原理

执行过程客户端发出请求 根据 web.xml 文件的配置,找到对应的读取中的值 找到对应的 找到该 class 并加载执行该 class,返回结果 由 Web 服务器将结果响应给客户端

web.xml的配置如下:

<?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>test</display-name>
<welcome-file-list>
<welcome-file>index.html</welcome-file>
<welcome-file>index.htm</welcome-file>
<welcome-file>index.jsp</welcome-file>
<welcome-file>default.html</welcome-file>
<welcome-file>default.htm</welcome-file>
<welcome-file>default.jsp</welcome-file>
</welcome-file-list> <servlet>
<servlet-name>Servlet01</servlet-name>
<servlet-class>test.Servlet01</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>Servlet01</servlet-name>
<url-pattern>/s01</url-pattern>
</servlet-mapping> <servlet>
<servlet-name>Servlet02</servlet-name>
<servlet-class>test.Servlet02</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>Servlet02</servlet-name>
<url-pattern>/s02</url-pattern>
</servlet-mapping> <servlet>
<servlet-name>Servlet03</servlet-name>
<servlet-class>test.Servlet03</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>Servlet03</servlet-name>
<url-pattern>/s03</url-pattern>
</servlet-mapping>
</web-app>

servlet的生命周期

Servlet 没有 main()方法,不能独立运行,它的运行完全由 Servlet 引擎来控制和调度。 所谓生命周期,指的是 servlet 容器何时创建 servlet 实例、何时调用其方法进行请求的处理、 何时并销毁其实例的整个过程。(此处讨论默认的生命周期)实例和初始化时机当请求到达容器时,容器查找该 servlet 对象是否存在,如果不存在,则会
创建实例并 进行初始化。就绪/调用/服务阶段有请求到达容器,容器调用 servlet 对象的 service()方法,处理请求的方法在整个声明周 期中可以被多次调用;HttpServlet 的 service()方法,会依据请求方式来调用 doGet()或者 doPost()方法。但是, 这两个 do 方法默认情况下,会抛出异常,需要子类去 override。
销毁时机当容器关闭时(应用程序停止时),会将程序中的 Servlet 实例进行销毁。上述的生命周期可以通过 Servlet 中的生命周期方法来观察。在 Servlet 中有三个生命周 期方法,不由用户手动调用,而是在特定的时机有容器自动调用,观察这三个生命周期方法 即可观察到 Servlet 的生命周期。init 方法,在 Servlet 实例创建之后执行(证明该 Servlet 有实例创建了)。

servlet的配置

Servlet 除了配置基本的访问信息,还可以配置初始化参数,自启动等,并且一个 Servlet 可以配置多个访问路径(),还可以使用通配符“ * ”

xml配置初试化参数

  <servlet>
<servlet-name>Servlet03</servlet-name>
<servlet-class>test.Servlet03</servlet-class>
<init-param>
<param-name>name</param-name>
<param-value>liu</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>Servlet03</servlet-name>
<url-pattern>/s03</url-pattern>
</servlet-mapping>

servlet的init方法中打印初始化参数信息

    @Override
public void init(ServletConfig config) throws ServletException {
System.out.println("servlet03的初试化");
String name=config.getInitParameter("name");
System.out.println(name);
}

<load-on-startup>2</load-on-startup>表示容器启动时就要创建servlet的对象,2表示启动的等级,数字1等级最高,即容器启动时,先创建1等级的servlet对象,当1等级的创建完成之后再创建2等级的servlet对象;

Web的了解和servlet的初次见面的更多相关文章

  1. java web学习总结(五) -------------------servlet开发(一)

    一.Servlet简介 Servlet是sun公司提供的一门用于开发动态web资源的技术. Sun公司在其API中提供了一个servlet接口,用户若想用发一个动态web资源(即开发一个Java程序向 ...

  2. java web学习总结(六) -------------------servlet开发(二)

    一.ServletConfig讲解 1.1.配置Servlet初始化参数 在Servlet的配置文件web.xml中,可以使用一个或多个<init-param>标签为servlet配置一些 ...

  3. java web 学习六(servlet开发2)

    一.ServletConfig讲解 1.1.配置Servlet初始化参数 在Servlet的配置文件web.xml中,可以使用一个或多个<init-param>标签为servlet配置一些 ...

  4. java web 学习五(servlet开发1)

    一.Servlet简介 Servlet是sun公司提供的一门用于开发动态web资源的技术. Sun公司在其API中提供了一个servlet接口,用户若想用发一个动态web资源(即开发一个Java程序向 ...

  5. web开发技术中Servlet技术的概述

    1.servlet是什么:servlet是一个位于服务器端的java应用程序它可以像jsp一样,直接输出信息 servlet类必须继承HttpServlet类,否则,不能称为serlvet servl ...

  6. Java web每天学之Servlet工作原理详情解析

    上篇文章中我们介绍了Servlet的实现方式以及Servlet的生命周期,我们这篇文章就来介绍一下常用对象. 点击回顾:<Java Web每天学之Servlet的工作原理解析>:<J ...

  7. Java Web每天学之Servlet的原理解析

    Java Web每天学之Servlet的工作原理解析,上海尚学堂Java技术文章Java Web系列之二上一篇文章Java Web每天学之Servlet的工作原理解析是之一,欢迎点击阅读. Servl ...

  8. 初学Java Web(3)——第一个Servlet

    这学期 Java Web 课程的第一节课就简短复习了一下 Java 的一些基础知识,所以觉得 Java 的基础知识还是很重要的,但当我想要去写一篇 Java 回顾的文章的时候发现很难,因为坑实在太多了 ...

  9. java web 开发入门 --- tomcat/servlet/jsp

    在做java web 开发时,要先安装tomcat.它是一个web服务器,也叫web容器,我们把写好的jsp, html页面放到它里面,然后启动它,就可以用浏览器访问这些页面,地址栏中输入localh ...

随机推荐

  1. 如何查看linux系统安装时间

    第一种方法: 先查看系统盘挂到哪个分区上,然后用 dumpe2fs  查看这个磁盘分区 创建的时间,即可查出此 服务器 系统安装的时间.() # dumpe2fs /dev/sda3|grep -i ...

  2. USACO 1.3 Name That Number【暴搜】

    裸的穷举搜索. 研究了好久怎么输入$dict.txt$,$USACO$好像对$freopen$的顺序还有要求? /* ID: Starry21 LANG: C++ TASK: namenum */ # ...

  3. 【Adobe Air程序开发】用Adobe Flex3开发AIR应用程序–入门指南

    1 安装Adobe AIR 运行时,和java的JVM类似.Adobe AIR 运行时允许在桌面运行AIR应用程序,脱离游览器的束缚.下载安装文件http://labs.adobe.com/downl ...

  4. C学习笔记-数组

    数组的概念 数组是一组具有相同数据类型的变量集合,这里要注意两点,数组只能存储相同的数据类型和数组的内存是连续的,这位数组和指针的联系奠定了基础. 一维数组 定义及初始化 一维数组指的是只有一个下标的 ...

  5. 在vue中让某个组件重新渲染的笨方法

    在vue中,推崇的是数据驱动也就是数据更新进而使组件得以重新渲染:在某些情况下,我们想要在数据不改变的情况下,重新渲染组件:我遇到的一个情况是:同一个页面,两个tab页分别为tab1和tab2,公用了 ...

  6. Hbase概述

    一.HBASE概述 Hadoop Database    NoSQL 面向列 提供实时更新查询 ....   是一个高可靠性 高性能 面向列 可伸缩的分布式存储系统 利用hbase技术可以在廉价的PC ...

  7. MySQL_表数据操作

    目录 1.添加数据 2.添加多条数据 3.更新数据 4. 删除数据 5.查看表数据 1.添加数据 insert into <表名>[<字段名>[,...]] values(&l ...

  8. Autoit安装及启动

    1.Autoit下载: 官网下载地址:https://www.autoitscript.com/site/autoit/downloads/ 提供百度网盘下载:https://pan.baidu.co ...

  9. Springboot使用launch.script打包后解压缩

    今天拿到一个SpringBoot的jar需要反编译看一下.直接用工具试了下提示报错. 于是用文本工具打开看了下,发现此JAR包在打包时候引入了启动脚本.如下图: 为了反编译,可以直接将所有启动脚本相关 ...

  10. redis db0-15 的概念

    redis默认有db0~db15之多. redis有没有什么方法使不同的应用程序数据彼此分开同时又存储在相同的实例上呢?就相当于mysql数据库,不同的应用程序数据存储在不同的数据库下. redis下 ...