【Java Web编程 一】Java Web编程概述

本文涉及的产品
云解析 DNS,旗舰版 1个月
全局流量管理 GTM,标准版 1个月
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
简介: 【Java Web编程 一】Java Web编程概述

其实可以这么理解,Web开发就是计算机网络应用层里开发的一个专供Http协议使用的应用程序。在应用层 这篇Blog里我们提到过应用层的定义

应用层是为了解决某一类应用问题,而问题的解决又是通过位于不同主机中的多个应用进程之间的通信和协同工作来完成的。这些服务通常使用对应的协议,常见的几种服务协议有(HTTP,FTP/TFTP, TELENT)无论是哪种服务,都需要域名服务器(DNS)来解析ip地址才能通信以提供服务

所以其实Web请求实际上是客户使用浏览器充当客户端,通过http协议与部署了Web应用程序的服务器进行数据通信的过程,那么Web开发其实就是我们开发出能通过http协议与之通信的应用程序(这种架构我们叫B/S架构)。本质上与我们使用foxmail充当客户端,通过SMTP及POP3协议与部署了邮件应用程序的服务器进行数据通信没有什么区别(这种架构我们叫C/S架构)。之所以Web开发比较普遍是因为相比于其它通信协议的单一性,http能够传送的数据内容更丰富也更全面。

Web应用程序概述

我们上边提到了Web应用程序开发的两种架构模式,接下来详细讨论下并且关注下静态网站和动态网站的异同。

B/S架构和C/S架构

B/S 体系结构相对于 C/S 体系结构而言具有更多的优势,目前大量的应用程序开始转移到应用 B/S 体系结构,其主要优势在于以下几点

  • 安装维护升级方便,仅部署服务器,客户端有各种各样的浏览器开箱即用,例如谷歌,Edge
  • 对客户机配置要求不高,满足服务器配置即可,服务器我们也有较为通用的部署工具,Tomcat
  • 访问范围更广,超文本传输协议传递的内容更丰富

所以其实要搞清一个概念,Web开发不是独立的一个分支,而只是应用层开发里最火的一个分支。简单的可以这么认为,B/S架构是使用浏览器作为客户端的C/S架构。

静态网站和动态网站

Web 应用程序大致可以分为两种,即静态网站和动态网站,静态网站采用Html语言编写,放置于 Web 服务器上,用户通过浏览器直接请求解析显示,缺点:内容固定不变,改变显示必须修改html代码

随着网络技术的发展,基于 Internet 的 Web 应用程序也变得越来越复杂,更多的内容需根据用户的请求动态生成页面信息,即动态网站,动态网站指在Html静态页面中嵌入Java、C#、Php等脚本代码,将编写后的页面放入Web服务器,由服务器编译转换为最终Html返回给客户端

Http协议概述

HTTP全称超级文本传输协议(Hypertext Transfer Protocol)是关于如何在网络上传输超级文本及HTML 文档的协议(规范),Web 浏览器按照 HTTP 协议的规定向 Web 服务器发送请求信息,Web 服务器接收到浏览器的请求后,再按照 HTTP 协议的要求将结果发送给 Web 浏览器解析显示

统一资源定位符URL

URL 相当于一个文件名在网络范围的扩展,URL是与互联网相连的机器上的任何可访问对象的一个指针。由于访问不同对象所使用的协议不同,所以URL还指出读取某个对象时所使用的协议,URL的统一格式为:<协议>://<主机>:<端口>/<路径>

  • <协议>就是指出使用什么协议来获取该万维网文档。现在最常用的协议就是http(超文本传送协议HTTP )以及https(简单讲是HTTP的安全版),其次是ftp(文件传送协议FTP)
  • 在<协议>后面的://是规定的格式,: 也是固定格式。它的右边是第二部分<主机>,它指出这个万维网文档是在哪一台主机上。这里的<主机>就是指该主机在互联网上的域名
  • 再后面是第三和第四部分<端口>和<路径>,有时可省略

对应例如:http://localhost:8080/AIR/index.jsp端口和路径有时可以省略。HTTP的默认端口号是80,通常可省略。若再省略文件的<路径>项,则URL就指到互联网上的某个主页(home page)

超文本传送协议HTTP

HTTP 协议定义了浏览器(即万维网客户进程)怎样向万维网服务器请求万维网文档,以及服务器怎样把文档传送给浏览器。从层次的角度看,HTTP是面向事务的无状态的(transaction-oriented)应用层协议,它是万维网上能够可靠地交换文件(包括文本、声音、图像等各种多媒体文件)的重要基础。请注意,HTTP不仅传送完成超文本跳转所必需的信息,而且也传送任何可从互联网上得到的信息,如文本、超文本、声音和图像等

这是一个逻辑上的通信过程,实际通信还依赖下三层(物理层,数据链路层,网络层):

  • HTTP使用了面向连接的TCP作为运输层协议,保证了数据的可靠传输。HTTP不必考虑数据在传输过程中被丢弃后又怎样被重传。但是,HTTP协议本身是无连接的。这就是说,虽然HTTP使用了TCP连接,但通信的双方在交换HTTP报文之前不需要先建立HTTP连接
  • HTTP协议是无状态的(stateless)。也就是说,同一个客户第二次访问同一个服务器上的页面时,服务器的响应与第一次被访问时的相同(假定现在服务器还没有把该页面更新),因为服务器并不记得曾经访问过的这个客户,也不记得为该客户曾经服务过多少次。HTTP的无状态特性简化了服务器的设计,使服务器更容易支持大量并发的HTTP请求

HTTP的无状态可以理解为幂等的

Http协议工作流程

一次完整的请求响应过程分为以下几个步骤,主要是四个步骤,在这个过程中交互载体为协议包。

  1. 浏览器发起连接(通过dns把域名转为ip,ip通过ip路由找到服务器地址)
  2. 建立连接后,客户发送请求(第一条肯定是对该页面请求)
  3. 服务器响应请求(返回一个html页面,由浏览器把该html解析为网页,按请求顺序响应)
  4. 关闭连接(1.1版本开始持续连接,在一定时间内连接不会断开,只需建立一条连接)

更详细的过程可以参照我的这篇Blog【计算机网络基础 七】输入URL到浏览器发生了什么,我们讨论下整个过程中的连接双方(浏览器、Http服务器)和传递载体(Http请求协议包,Http响应协议包)。

Http请求协议包

在浏览器准备发送请求时,由浏览器负责生成一个Http请求协议包,并将请求信息写入Http请求协议包,然后将Http请求协议包推送给Http服务器。包括四部分内容:

  • 请求行:包括三部分,即方法,请求资源的URL,以及http的版本
  • 请求头:如果浏览器以GET方式发送请求,则请求参数存放在请求头中。
  • 空白行:无内容,但是必须存在。可以理解为用来分隔请求头和请求体。
  • 请求体:如果浏览器以POST方式发送请求,则请求参数存放在请求体中

我们重点关注下请求行里的请求方式:

重点关注Post和Get即可:

  • Get是从服务器上获取数据,是安全的和幂等的,POST是修改服务器上的数据安全的意味着该操作用于获取信息而非修改信息。换句话说,GET请求一般不应产生副作用。就是说,它仅仅是获取资源信息,就像数据库查询一样,不会修改,增加数据,不会影响资源的状态;幂等的意味着对同一URL的多个请求应该返回同样的结果。
  • GET请求的数据会附在URL之后,POST把提交的数据则放置在是HTTP包的包体中。POST的安全性更高
  • GET方式提交的数据最多只能是2048字节,理论上POST没有限制,可传较大量的数据
  • GET支持缓存(取到的资源),POST不支持缓存

总的来说,Get是向服务器发索取数据的一种请求,而Post是向服务器提交数据的一种请求。

Http响应协议包

在Http服务器准备返回结果时,由Http服务器负责生成一个Http响应协议包,调用输出流将文件内容(文字、数字、像素、帧)写入到Http响应协议包,然后将Http响应协议包推送给发起请求的浏览器。也包括四部分内容:

  • 响应行(状态行):http版本,状态码,以及解释状态码的简单短语。
  • 响应头:content-type,指定浏览器使用对应的解析器或者编译器,将从Http服务器返回过来的相应的二进制信息进行解析或者编译。
  • 空白行:无内容,但是必须存在。
  • 响应体:本次索要的文件内容。

状态码的含义如下:

  • 1XX Informational(信息性状态码),服务器收到请求,需要请求者继续执行
  • 2XX Success(成功状态码)。例如:200 OK 表示从客户端发来的请求在服务器端被正常处理了。
  • 3XX Redirection(重定向状态码) 例如:302,客户请求的文档转移到了一个新的地址,请求被重定向了。
  • 4XX Client Error(客户端错误状态码)。例如:404 Not Found 该状态码表明服务器上无法找到请求的资源。除此之外,也可以在服务器端拒绝请求且不想说明理由时使用。
  • 网站名不对。
  • 网站名正确,但是资源文件名不对。
  • tomcat没有在网站定位默认欢迎资源文件。(标签 <welcome-file-list>...</welcome-file-list>
  • 请求地址没有按照 uri 的标准格式进行设置。
  • IDEA没有将最新网站内容交给tomcat。
  • 5XX Server Error(服务器错误状态码)。例如:500 Internal Server Error 该状态码表明服务器端在执行请求时发生了错误

这里只列举大概含义,还有一些别的例如405:Http服务器通知浏览器本次索要的资源文件已经被找到了,但是这个资源文件对于浏览器请求方式无法接收。(get、post)。

Http服务器作用

在这个交互过程中浏览器不需要过多关注,对于我们后端开发来说,主要关注我们编写的服务端程序,所以我们关注Http服务器:

  • 对于一个Java程序员来说,所有的Http服务器都是由Java编程语言开发的应用程序。
  • Http服务器可以接收由浏览器发出的Http请求协议包。
  • Http服务器可以解析由浏览器发来的Http请求协议包,将该协议包解析为二进制数据,以便了解用户的请求。
  • Http服务器可以自动定位被访问的资源文件。
  • Http服务器可以自动将被访问的文件内容或者运行结果通过输出流以二进制形式写入到Http响应协议包中。
  • Http服务器可以自动将Http响应协议包推送给发起请求的浏览器

所以一个合格的Http服务器是可以自动接收、解析请求并定位资源文件,并且可以将响应写入并推送给发起请求的浏览器

Tomcat服务器概述

Tomcat就是上文提到的Http服务器中应用最广泛的一种。在另一篇Blog【Java SE基础 零】Java开发环境初始化里我详细介绍了Tomcat是如何与IDEA集成起来使用的,这里就不再赘述了,同时MAC版本的安装方式这篇博客有介绍Mac安装Tomcat【打开Finder窗口,输入shift + Command + G,再输入/Library,进入此目录后,将Tomcat文件夹复制到此目录下】,这里我们主要聊聊Tomcat的结构和它是如何工作的,可以看下目录的组成结构:

各个文件目录的主要作用如下:

  • bin:tomcat 管理命令,所有的可执行命令存放在这里,启动和关闭服务器的命令就在此文件夹中
  • conf:tomcat 配置文件。其中 server.xml是 tomcat 的核心配置文件。
  • lib:tomcat 应用程序在运行时依赖的第三方jar。
  • logs:存放 tomcat 的运行日志。
  • temp:存放 tomcat 运行时生成的临时文件。
  • webapps:tomcat 在默认情况下,接收到请求之后到 webapps下定位资源文件,Web 应用程序存放的目录,Web 项目保存到此目录中即可发布
  • work:tomcat在默认情况下,在work文件夹下将jsp文件编辑为java文件,并编译为.class文件。

在接下来要聊到的JSP和Servlet两种文件类型,其是运行到Tomcat这种Web服务器上来进行工作的。请求到达后先匹配到项目目录,然后去加载webapps里对应的项目的资源。后边我们会提到。

JSP&Servlet文件

JSP&Servlet是Java Web编程最常用的两种文件,非常重要,这里我们先简单了解下他们的区别和联系以及用途,后边详细说明:

  • JSP经编译后就变成了Servlet,JSP的本质就是Servlet,JVM只能识别java的类,不能识别JSP的代码,Web容器将JSP的代码编译成JVM能够识别的java类
  • JSP更擅长表现于页面显示,Servlet更擅长于逻辑控制.
  • Servlet中没有内置对象,JSP中的内置对象都是必须通过HttpServletRequest对象,HttpServletResponse对象以及HttpServlet对象得到.
  • JSP是Servlet的一种简化,使用Jsp只需要完成程序员需要输出到客户端的内容,JSP中的Java脚本如何镶嵌到一个类中,由JSP容器完成,而Servlet则是个完整的Java类,这个类的Service方法用于生成对客户端的响应。

Servlet和JSP最主要的不同点在于:Servlet的应用逻辑是在Java文件中,并且完全从表示层中的HTML里分离开来。而JSP的情况是Java和HTML可以组合成一个扩展名为.jsp的文件,JSP侧重于视图,Servlet主要用于控制逻辑

总结一下

说白了Web开发就是一个普通的应用程序开发,BS和CS架构的不同点就是客户端为浏览器,我们无需关系如何进行客户端的升级和开发,只要按照标准开发服务端程序即可;而Web开发也没什么神秘的,就是依赖http协议在获取到请求后给予响应即可,和依赖smtp协议开发的邮件程序没什么本质区别。更进一步我们甚至不用开发服务器,tomcat已经帮我们做好了一切,我们只需要按照tomcat的规范编写jsp&servlet这些文件和代码即可,换句话说专注业务逻辑即可。

相关文章
|
8天前
|
Java 开发者
Java多线程编程中的常见误区与最佳实践####
本文深入剖析了Java多线程编程中开发者常遇到的几个典型误区,如对`start()`与`run()`方法的混淆使用、忽视线程安全问题、错误处理未同步的共享变量等,并针对这些问题提出了具体的解决方案和最佳实践。通过实例代码对比,直观展示了正确与错误的实现方式,旨在帮助读者构建更加健壮、高效的多线程应用程序。 ####
|
14天前
|
JSON Java Apache
非常实用的Http应用框架,杜绝Java Http 接口对接繁琐编程
UniHttp 是一个声明式的 HTTP 接口对接框架,帮助开发者快速对接第三方 HTTP 接口。通过 @HttpApi 注解定义接口,使用 @GetHttpInterface 和 @PostHttpInterface 等注解配置请求方法和参数。支持自定义代理逻辑、全局请求参数、错误处理和连接池配置,提高代码的内聚性和可读性。
|
7天前
|
Java 开发者
Java多线程编程的艺术与实践####
本文深入探讨了Java多线程编程的核心概念、应用场景及实践技巧。不同于传统的技术文档,本文以实战为导向,通过生动的实例和详尽的代码解析,引领读者领略多线程编程的魅力,掌握其在提升应用性能、优化资源利用方面的关键作用。无论你是Java初学者还是有一定经验的开发者,本文都将为你打开多线程编程的新视角。 ####
|
6天前
|
存储 安全 Java
Java多线程编程中的并发容器:深入解析与实战应用####
在本文中,我们将探讨Java多线程编程中的一个核心话题——并发容器。不同于传统单一线程环境下的数据结构,并发容器专为多线程场景设计,确保数据访问的线程安全性和高效性。我们将从基础概念出发,逐步深入到`java.util.concurrent`包下的核心并发容器实现,如`ConcurrentHashMap`、`CopyOnWriteArrayList`以及`BlockingQueue`等,通过实例代码演示其使用方法,并分析它们背后的设计原理与适用场景。无论你是Java并发编程的初学者还是希望深化理解的开发者,本文都将为你提供有价值的见解与实践指导。 --- ####
|
9天前
|
安全 Java 开发者
Java多线程编程中的常见问题与解决方案
本文深入探讨了Java多线程编程中常见的问题,包括线程安全问题、死锁、竞态条件等,并提供了相应的解决策略。文章首先介绍了多线程的基础知识,随后详细分析了每个问题的产生原因和典型场景,最后提出了实用的解决方案,旨在帮助开发者提高多线程程序的稳定性和性能。
|
15天前
|
存储 安全 Java
Java多线程编程的艺术:从基础到实践####
本文深入探讨了Java多线程编程的核心概念、应用场景及其实现方式,旨在帮助开发者理解并掌握多线程编程的基本技能。文章首先概述了多线程的重要性和常见挑战,随后详细介绍了Java中创建和管理线程的两种主要方式:继承Thread类与实现Runnable接口。通过实例代码,本文展示了如何正确启动、运行及同步线程,以及如何处理线程间的通信与协作问题。最后,文章总结了多线程编程的最佳实践,为读者在实际项目中应用多线程技术提供了宝贵的参考。 ####
|
12天前
|
监控 安全 Java
Java中的多线程编程:从入门到实践####
本文将深入浅出地探讨Java多线程编程的核心概念、应用场景及实践技巧。不同于传统的摘要形式,本文将以一个简短的代码示例作为开篇,直接展示多线程的魅力,随后再详细解析其背后的原理与实现方式,旨在帮助读者快速理解并掌握Java多线程编程的基本技能。 ```java // 简单的多线程示例:创建两个线程,分别打印不同的消息 public class SimpleMultithreading { public static void main(String[] args) { Thread thread1 = new Thread(() -> System.out.prin
|
14天前
|
存储 缓存 安全
在 Java 编程中,创建临时文件用于存储临时数据或进行临时操作非常常见
在 Java 编程中,创建临时文件用于存储临时数据或进行临时操作非常常见。本文介绍了使用 `File.createTempFile` 方法和自定义创建临时文件的两种方式,详细探讨了它们的使用场景和注意事项,包括数据缓存、文件上传下载和日志记录等。强调了清理临时文件、确保文件名唯一性和合理设置文件权限的重要性。
36 2
|
15天前
|
Java UED
Java中的多线程编程基础与实践
【10月更文挑战第35天】在Java的世界中,多线程是提升应用性能和响应性的利器。本文将深入浅出地介绍如何在Java中创建和管理线程,以及如何利用同步机制确保数据一致性。我们将从简单的“Hello, World!”线程示例出发,逐步探索线程池的高效使用,并讨论常见的多线程问题。无论你是Java新手还是希望深化理解,这篇文章都将为你打开多线程的大门。
|
15天前
|
安全 Java 编译器
Java多线程编程的陷阱与最佳实践####
【10月更文挑战第29天】 本文深入探讨了Java多线程编程中的常见陷阱,如竞态条件、死锁、内存一致性错误等,并通过实例分析揭示了这些陷阱的成因。同时,文章也分享了一系列最佳实践,包括使用volatile关键字、原子类、线程安全集合以及并发框架(如java.util.concurrent包下的工具类),帮助开发者有效避免多线程编程中的问题,提升应用的稳定性和性能。 ####
42 1
下一篇
无影云桌面