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. LeetCode.1160-找到可以由给定字符组成的字符串(Find Words That Can Be Formed by Characters)

    这是小川的第411次更新,第443篇原创 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第262题(顺位题号是1160).你会得到一个字符串单词数组和一个字符串chars.如果字符串可 ...

  2. 又做了个新的Blog

    http://inkhin.com 服务器比较渣,访问不了的请见谅.

  3. 【并行计算-CUDA开发】CUDA线程、线程块、线程束、流多处理器、流处理器、网格概念的深入理解

    GPU的硬件结构,也不是具体的硬件结构,就是与CUDA相关的几个概念:thread,block,grid,warp,sp,sm. sp: 最基本的处理单元,streaming processor  最 ...

  4. MySQL_约束条件

    目录 八个约束条件 1.非空约束NOT NULL 2.主键约束PRIMARY KEY 3.多字段联合主键(复合主键) 4.唯一约束UNIQUE 5.默认约束DEFAULT 6.外键约束FOREIGN ...

  5. Flutter与Xamarin跨平台移动开发相比

    在过去十年中,移动行业经历了巨大的增长,特别是在应用程序开发方面.据Statista报告称,全球智能手机用户超过20亿,预计到2022年底这一数字将增加到50亿以上.在这些智能手机中,近100%在三个 ...

  6. Min swaps to sort array

    Given an array with distinct numbers, return an integer indicating the minimum number of swap operat ...

  7. Redis(1.8)Redis与mysql的数据库同步(缓存穿透与缓存雪崩)

    [1]缓存穿透与缓存雪崩 [1.1]缓存和数据库间数据一致性问题 分布式环境下(单机就不用说了)非常容易出现缓存和数据库间的数据一致性问题,针对这一点的话,只能说,如果你的项目对缓存的要求是强一致性的 ...

  8. PAT B1018.锤子剪刀布(20)

    一个没有通过,不知道为何 #include <cstdio> int change(char c) { if(c == 'B') return 0; if(c == 'C') return ...

  9. 用SPFA 解决POJ2240

    Arbitrage Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 30790   Accepted: 12761 Descr ...

  10. Django初步完成:登录、注册、退出

    python环境:python2.7 开发工具:pycharm 项目名称:mysite5 app名称:online settings:映射app路径 INSTALLED_APPS = [ 'djang ...