本文源码:GitHub·点这里 || GitEE·点这里

一、基础概念

1、CS与BS架构

CS架构模式

客户端/服务器(Client/Server)模式,既要编写服务器端程序,也要开发客户端程序,软件更新时需要同时更新客户端和服务器端,整体模式相比BS架构要复杂,但是安全性比较高。

B/S架构模式

即浏览器/服务器(Browser/Server),只需要编写服务器端程序,浏览器的界面作为访问的服务端的入口,架构相对简单,可以快速迭代,但是安全性较差。

2、Socket通信机制

TCP/IP 协议

传输控制协议/网际协议是指能够在多个不同网络间实现信息传输的协议簇。TCP/IP协议不仅仅指的是TCP和IP两个协议,而是指一个由FTP、SMTP、TCP、UDP、IP等协议构成的协议簇,只是因为在TCP/IP协议中TCP协议和IP协议最具代表性,所以被称为TCP/IP协议。

Socket套接字

网络中不同主机上的应用进程之间进行双向通信的端点的抽象,一个套接字就是网络上进程通信的一端,提供了应用层进程利用网络协议交换数据的机制。通常接收请求数据,并做业务处理的称为服务端即ServerSocket,发送请求并接收处理结果的称为客户端。

二、Http协议

1、Http和Https

Http协议

HTTP超文本传输协议,是用于从万维网服务器传输超文本到本地浏览器的传送协议,基于TCP/IP通信协议来传递数据:HTML文件、图片、查询数据等。HTTP协议基于客户端-服务端架构模式。浏览器作为HTTP客户端通过URL向服务端即WEB服务器发送请求。Web服务器根据接收到的请求后,处理完请求后向客户端发送响应信息。

协议特点:简单快速、灵活、无连接、无状态、支持客户/服务器模式。

Https协议

以安全为准则的HTTP通道,是HTTP的安全版,在HTTP请求上加入SSL层,HTTPS的安全基础是SSL,因此加密的详细内容就需要SSL。简单来说,HTTPS协议是由SSL+HTTP协议构建的可进行加密传输、身份认证的网络协议,要比http协议安全。HTTPS协议的主要作用可以分为两种:一种是建立一个信息安全通道,来保证数据传输的安全;另一种就是确认网站的真实性。

Https和Http区别

安全证书:Https协议需要到CA申请证书,一般免费证书较少,因而需要一定费用。

数据传输:Http是超文本传输协议,信息是明文传输,https则是具有安全性的ssl加密传输协议。

连接方式:Http和Https使用的是完全不同的连接方式,用的端口也不一样,前者是80,后者是443。

2、Get和Post请求

浏览器端

从浏览器角度看这个两种请求的区别:GET方式读取资源,比如Get到静态页面,即使多次读取不会对访问数据产生影响,也被称为"幂等"请求。POST方式在页面中定义表单,提交表单会把数据提交到服务器,而且多数情况下会产生数据,比如常用的保存数据接口,并非"幂等"操作,不幂等也就意味着不能随意多次执行。

服务接口

这里指用Ajax程序请求服务接口,提交的请求类型。或者其他Http请求工具类,还有情况是微服务中各种Feign接口间的请求。这种情况接口发送请求时,限制相对较少,比如REST风格接口常用GET、POST、PUT、DELETE,几种方式分别获取、创建、更新、删除 资源。

3、握手挥手机制

三次握手

第一次握手:客户端主动向服务器发起请求连接,请求报文中发送SYN=1,此时随机生成初始序列号seq=x,此时,客户端进程进入SYN-SENT同步已发送状态。

第二次握手:服务端收到请求报文后,确认客户的SYN,如果请求没有拒绝,则发出确认报文。报文中应该ACK=1,SYN=1,确认号是ack=x+1,同时自己也发送一个SYN包seq=y,此时,服务器进程进入SYN-RCVD同步收到状态。

第三次握手:客户端收到确认后,需要向服务器确认报文的ACK=1,ack=y+1,此时,TCP连接建立,客户端进入ESTABLISHED已建立连接状态。完成三次握手,客户端与服务器开始传送数据。

四次挥手

第一次挥手:客户端发送一个结束FIN,用来主动关闭和服务端的数据传输,释放连接且停止发送数据,报文首部:FIN=1,序列号seq=u;随后客户端进入终止等待1状态FIN-WAIT-1。

第二次挥手:服务端收到这个FIN,发出确认报文ACK=1,确认收到序号是收到的序号+1,即ack=u+1,且带上自己的序列号seq=v,和SYN一样,一个FIN将占用一个序号。如此,服务器通知应用进程,客户端已经没有数据要发送,如果服务器发送数据,客户端依然要接收,该状态会持续一段时间,服务端进入关闭等待状态CLOSE-WAIT。客户端收到服务器的确认请求后,进入终止等待2状态FIN-WAIT-2,等待服务器发送连接释放报文。

第三次挥手:服务器向客户端发送释放连接报文FIN=1,ack=u+1,此时服务端还处于半关闭状态,服务器可能还会发送一些数据,此时序列号为seq=w,如此,服务器进入最后确认状态LAST-ACK,等待客户端的确认。

第四次挥手:客户端收到服务器的连接释放报文后,回发确认,ACK=1,ack=w+1,序列号是seq=u+1,如此,客户端进入时间等待状态TIME-WAIT。此时TCP连接还没有释放,必须经过最长报文段寿命的时间后,才进入CLOSED状态。MSL:最长报文段寿命,一般2分钟,TCP连接释放时,主动方必须经过2MSL后才进入CLOSED状态,因此主动方关闭时间比较晚。

三、Servlet组件

Java编写的服务器端程序,具有独立于平台和协议的特性,主要功能在于交互式地浏览和生成数据,生成动态Web内容。使用Servlet,可以收集来自网页表单的用户输入,呈现来自数据库或者其他源的记录,还可以动态创建网页。

1、实现方式

继承HttpServlet,HttpServlet担任抽象模板角色,模板方法:由service()方法担任;

继承GenericServlet抽象类,其中的service方法为抽象方法;

实现Servlet接口,包含init、getServletConfig、service、getServletInfo、destroy几个核心方法;

2、生命周期

加载和实例化,初始化init,服务service,销毁:destroy。

3、核心API组件

ServletConfig:获取servlet初始化参数和servletContext对象;

ServletContext:在整个Web应用的动态资源之间共享数据;

ServletRequest:封装Http请求信息,在请求时创建;

ServletResponse:封装Http响应信息,在请求时创建;

4、转发和重定向

转发:服务器端进行的页面跳转的控制 ;

重定向:服务端响应跳转信息,浏览器端进行的页面跳转 ;

5、Cookie与Session

Cookie机制

Cookie在HTTP中通常是用来辨别用户身份,进行会话跟踪而储存在用户本地终端上的数据,一般会加密处理,由用户客户端计算机暂时或永久保存的信息。其结构就是一个键和一个值构成的。随着服务器端的响应发送给客户端浏览器。然后客户端浏览器会把Cookie保存起来,当下一次再访问服务器时把Cookie再发送给服务器。

Session会话

用户在应用程序的Web页之间跳转时,存储在Session对象中的变量将不会丢失,而是在整个用户会话中一直存在下去。Servlet中可以把一个会话内需要共享的数据保存到HttSession对象中。四大域对象:PageContext、ServletRequest、HttpSession、ServletContext。

6、监听.过滤.拦截

监听器

JavaWeb三大组件:Servlet,Listener,Filter,监听器就是指在应用程序中监听相关对象状态变化的组件。

过滤器

客户端请求Servlet时,先执行相关Filter,如果Filter通过,则继承执行请求的Servlet;如果Filter不通过,则不会执行用户请求的Servlet。过滤器可以动态地拦截请求和响应。

拦截器

Spring框架中的拦截器Interceptor类似于Servlet中的过滤器Filter,主要用于拦截用户请求并作相应的处理。例如通过拦截器可以进行权限验证、记录请求信息的日志、判断用户是否登录等。请求转发不执行拦截、过滤;重定向执行拦截和过滤。

四、数据库连接池

1、C3P0连接池

C3P0是一个开源的JDBC连接池,应用程序根据C3P0配置来初始化数据库连接,可以自动回收空闲连接的功能。

2、Druid连接池

Druid连接池为监控而生,内置强大的监控功能,监控特性不影响性能。内置了StatFilter功能,能采集非常完备的连接池中访问数据库执行信息,Druid连接池内置一个监控页面,提供了非常完备的监控信息,可以快速诊断系统的瓶颈,也是当前最常用的连接池。

五、运行服务器

1、Jetty容器

Jetty 是一个开源的servlet容器,它为基于Java的web容器,例如JSP和servlet提供运行环境。Jetty是使用Java语言编写的,它的API以一组JAR包的形式发布。开发人员可以将Jetty容器实例化成一个对象,可以迅速为一些独立运行(stand-alone)的Java应用提供网络和web连接。

2、Tomcat服务器

Tomcat服务器是一个免费的开放源代码的Web应用服务器,属于轻量级应用服务器,在中小型系统和并发访问用户不是很多的场合下被普遍使用,是开发和调试JSP程序的首选。使用Tomcat最关键的两个操作:使用开发工具连接Tomcat并部署web应用;将应用程序打包放到Tomcat服务下运行。

六、源代码地址

GitHub·地址
https://github.com/cicadasmile
GitEE·地址
https://gitee.com/cicadasmile

推荐阅读:编程体系整理

序号 项目名称 GitHub地址 GitEE地址 推荐指数
01 Java描述设计模式,算法,数据结构 GitHub·点这里 GitEE·点这里 ☆☆☆☆☆
02 Java基础、并发、面向对象、Web开发 GitHub·点这里 GitEE·点这里 ☆☆☆☆
03 SpringCloud微服务基础组件案例详解 GitHub·点这里 GitEE·点这里 ☆☆☆
04 SpringCloud微服务架构实战综合案例 GitHub·点这里 GitEE·点这里 ☆☆☆☆☆
05 SpringBoot框架基础应用入门到进阶 GitHub·点这里 GitEE·点这里 ☆☆☆☆
06 SpringBoot框架整合开发常用中间件 GitHub·点这里 GitEE·点这里 ☆☆☆☆☆
07 数据管理、分布式、架构设计基础案例 GitHub·点这里 GitEE·点这里 ☆☆☆☆☆
08 大数据系列、存储、组件、计算等框架 GitHub·点这里 GitEE·点这里 ☆☆☆☆☆

编程体系结构(07):JavaEE之Web开发的更多相关文章

  1. web开发必备-网络基础知识---记录一下

    1.osi 7层网络模型 2.socket 套接字编程 PS:一个从事web开发的人来说,我们是使用http协议来和服务器来进行交互.后面会详细的分析这个过程.

  2. [web开发] php优势 - PHP与ASP.NET的比较

    php 优势 - PHP与ASP.NET的比较 如今当提到 Web 开发时,您有许多选择.这些方法中许多都涉及到预处理 — 即,利用特定的标记将代码嵌入到 HTML 页面中,这些标记告诉预处理器,它们 ...

  3. 关于Web开发里并发、同步、异步以及事件驱动编程的相关技术

    一.开篇语 我的上篇文章<关于如何提供Web服务端并发效率的异步编程技术>又成为了博客园里“编辑推荐”的文章,这是对我写博客很大的鼓励,也许是被推荐的原因很多童鞋在这篇文章里发表了评论,有 ...

  4. Manual | BSD手册| Linux手册 | 数据库手册 | 编程开发手册 | WEB开发手册 | 软件应用手册 | 网络技术手册 | GNU手册

    豆豆手册 □ BSD手册 □ Linux手册 □ 数据库手册 □ 编程开发手册 □ WEB开发手册 □ 软件应用手册 □ 网络技术手册 □ GNU手册 在线手册 首 页 BSD手册   ·FreeBS ...

  5. java web 开发快速宝典 ------电子书

    http://www.educity.cn/jiaocheng/j10259.html 1.2.1  JDk 简介 JDK是Sun公司在1995年推出的一套可以跨操作系统平台编译和运行Java程序的开 ...

  6. 为什么做java的web开发我们会使用struts2,springMVC和spring这样的框架?

    今年我一直在思考web开发里的前后端分离的问题,到了现在也颇有点心得了,随着这个问题的深入,再加以现在公司很多web项目的控制层的技术框架由struts2迁移到springMVC,我突然有了一个新的疑 ...

  7. .NET Web开发技术简单整理

    在最初学习一些编程语言.一些编程技术的时候,做的更多的是如何使用该技术,如何更好的使用该技术解决问题,而没有去关注它的相关性.关注它的理论支持,这种学习技术的方式是短平快.其实工作中有时候也是这样,公 ...

  8. Web开发技术发展历史

    Web开发技术发展历史   来自:天码营 原文:http://www.tianmaying.com/tutorial/web-history Web的诞生 提到Web,不得不提一个词就是"互 ...

  9. [Python] 利用Django进行Web开发系列(一)

    1 写在前面 在没有接触互联网这个行业的时候,我就一直很好奇网站是怎么构建的.现在虽然从事互联网相关的工作,但是也一直没有接触过Web开发之类的东西,但是兴趣终归还是要有的,而且是需要自己动手去实践的 ...

随机推荐

  1. AppStore SDK

    ios审核被拒4.3 http://www.cocoachina.com/bbs/read.php?tid-1731757.html ios审核4.3被拒? 别担心 这几步让你的 App 顺利过审 h ...

  2. 关于java的二维码的生成与解析

    本文说的是通过zxing实现二维码的生成与解析,看着很简单,直接上代码 import java.io.File; import java.io.IOException; import java.nio ...

  3. python小白入门基础(二:变量)

    #变量:可以改变的量就是变量,实际上是由内存开辟的一块空间,临时存在内存中,以便后续代码使用.#作用:代指内存中某个地址中的内容. #1.变量的概念name = "王五"name ...

  4. TDengine能比Hadoop快10倍?

    之前对国产的时序大数据存储引擎 TDengine 感兴趣,因为号称比Hadoop快十倍,一直很好奇怎么实现的,所以最近抽空看了下白皮书和设计文档. 如果用一句话总结,就是 TDengine 是为特定的 ...

  5. Ignatius and the Princess IV (水题)

    "OK, you are not too bad, em... But you can never pass the next test." feng5166 says.  &qu ...

  6. 免费获取 IntelliJ IDEA 激活码的 6 种方式!

    你还在满世界找 IntelliJ IDEA 激活码? 破解的不稳定,也是违法的,有安全风险还不一定,不建议大家使用来历不明的补丁. 今天栈长就分享免费获取 IntelliJ IDEA 的 6 种方式, ...

  7. Prometheus监控神器-服务发现篇(二)

    本章节讲解服务发现与Relabelling的机制与范例. 通过服务发现的方式,我们可以在不重启Prometheus服务的情况下动态的发现需要监控的Target实例信息. 如上图所示,对于线上环境我们可 ...

  8. SpringBoot整合Quartz及log4j实例

    SpringBoot整合Quartz及log4j实例 因为之前项目中经常会做一些定时Job的东西,所以在此记录一下,目前项目中已经使用elastic-job,这个能相对比Quartz更加简单方便一些, ...

  9. 9.下载ffmpeg、使QT支持同时编译32位和64位

    1.FFMPEG下载 进入http://ffmpeg.org/download.html,如果下载源码,则在右下方: 如果在linux中,直接输入git clone https://git.ffmpe ...

  10. PHP的七个数组指针函数

    1. PHP的七个数组指针函数 函数 描述 reset() 将一个数组的内部指针重置到首位,并返回第一个元素的值 end() 将一个数组的内部指针移动到数组的最后一个元素所在的位置,并返回最后一个元素 ...