杰瑞科技汇

JAVA web如何与服务器交互?

核心概念:谁在和谁交互?

我们要明确两个主角:

  1. Java Web应用 (客户端/前端):这是用户在浏览器中直接看到和交互的部分,它通常由HTML、CSS、JavaScript以及一些前端框架(如Vue.js, React)构成,它负责展示界面、收集用户输入,并将这些请求发送给服务器。
  2. 服务器 (后端):这是运行Java Web应用代码的地方,它负责接收前端的请求,进行业务逻辑处理(比如查询数据库、计算等),然后将处理结果返回给前端。

关键角色:Web服务器 vs. 应用服务器

这是一个初学者容易混淆的概念,但理解它至关重要。

特性 Web 服务器 应用服务器
主要职责 处理静态内容:直接返回HTML、CSS、JS、图片、视频等文件。 处理动态内容:执行Java代码,处理业务逻辑、数据库连接、事务管理等。
核心功能 请求分发:根据URL将请求转发给正确的处理程序。静态资源服务 动态请求处理:运行Servlet、JSP、EJB等。管理会话连接数据库
常见例子 Nginx, Apache (HTTPD) Tomcat, Jetty, JBoss/WildFly, WebLogic, WebSphere
关系 Web服务器可以独立工作,也可以作为应用服务器的“反向代理”或“前端”,接收所有请求,然后将动态请求转发给应用服务器处理。 应用服务器通常内置一个简单的Web服务器(如Tomcat内置了HTTP服务器),但也可以与更强大的Web服务器(如Nginx)配合使用。

一个典型的生产环境架构用户浏览器 -> Nginx (Web服务器) -> Tomcat (应用服务器) -> 数据库


核心交互流程:一次完整的请求-响应

当一个用户在浏览器中输入一个网址(如 http://example.com/user/list)并按下回车时,下面的事情发生了:

步骤1:建立连接 (TCP握手)

  1. 浏览器分析URL,知道需要访问 example.com 这个域名。
  2. 浏览器通过DNS(域名系统)将域名解析为服务器的IP地址。
  3. 浏览器与服务器在指定的端口(通常是80或443)上建立一个TCP连接(三次握手)。

步骤2:发送HTTP请求

  1. 连接建立后,浏览器向服务器发送一个HTTP请求,这个请求包含:
    • 请求方法:如 GET, POSTGET 通常用于获取数据,POST 通常用于提交数据。
    • 请求路径:如 /user/list
    • 协议版本:如 HTTP/1.1
    • 请求头:包含大量元信息,如 Host: example.com, User-Agent: ..., Accept: ... (告诉服务器我能接受什么类型的响应)。
    • 请求体:对于 POST 请求,这里会包含用户提交的数据(如表单数据、JSON数据)。

步骤3:服务器接收与处理

这是Java Web应用与服务器交互的核心环节。

  1. Web服务器接收:Web服务器(如Nginx)接收到这个HTTP请求。
  2. 请求分发
    • 如果请求的是静态资源(如 /css/style.css),Nginx会直接从自己的文件系统中找到这个文件,并将其内容作为HTTP响应返回给浏览器,Java应用不参与这个过程
    • 如果请求的是动态资源(如 /user/list),Nginx会将这个请求转发给它背后的应用服务器(如Tomcat)。
  3. 应用服务器处理
    • 容器启动:Tomcat是一个Servlet容器,它负责管理整个Java Web应用的生命周期,当应用部署时,Tomcat会加载应用的所有类和资源。
    • 解析请求:Tomcat解析收到的HTTP请求,将其封装成一个HttpServletRequest对象,这个对象包含了请求的所有信息(方法、路径、头、参数等)。
    • 创建响应对象:Tomcat创建一个空的HttpServletResponse对象,这个对象最终会被用来构建并发送回浏览器的响应。
    • 寻找Servlet:Tomcat根据请求的URL(通常在web.xml中配置或使用注解@WebServlet)来找到应该处理这个请求的ServletServlet是Java Web应用的核心,是一个用Java编写的、能够接收请求并生成响应的小程序。
    • 执行业务逻辑:Tomcat调用该Servlet的service()方法(通常是doGet()doPost()),在这个方法里,开发者编写的Java代码开始执行:
      • HttpServletRequest中获取用户参数。
      • 调用Service层的业务逻辑代码。
      • Service层可能会调用DAO (Data Access Object) 层来与数据库交互(使用JDBC、MyBatis、JPA等技术)。
      • 从数据库查询数据,进行计算和处理。
    • 生成响应:业务逻辑处理完成后,开发者将结果(比如一个用户列表)设置到HttpServletResponse对象中,这通常包括:
      • 设置状态码:如 200 OK, 404 Not Found, 500 Server Error
      • 设置响应头:如 Content-Type: application/json (告诉浏览器返回的是JSON数据)。
      • 设置响应体:将处理后的结果(如JSON字符串、HTML页面)写入到响应体中。

步骤4:返回HTTP响应

  1. Servlet执行完毕,将HttpServletResponse对象返回给Tomcat。
  2. Tomcat将这个对象转换成标准的HTTP响应格式。
  3. Tomcat将HTTP响应通过TCP连接发送回浏览器。

步骤5:浏览器渲染

  1. 浏览器接收到HTTP响应。
  2. 如果响应状态码是200,浏览器会解析响应体:
    • 如果是HTML,浏览器会渲染出页面。
    • 如果是CSS,会应用样式。
    • 如果是JavaScript,会执行脚本。
    • 如果是JSON,JavaScript代码(通常是AJAX请求的回调函数)会处理这个数据,并动态更新页面内容。

Java Web与服务器交互的核心组件

  1. Servlet API

    • HttpServletRequest:代表了客户端的请求,开发者用它来读取请求信息。
    • HttpServletResponse:代表了服务器的响应,开发者用它来构建响应内容。
    • 生命周期:Servlet由容器(Tomcat)创建和销毁。init() -> service()/doGet()/doPost() -> destroy()
  2. Web服务器

    • Tomcat:最流行、轻量级的Java Web服务器/应用服务器,它实现了Servlet和JSP规范,是学习和开发Java Web应用的绝佳选择。
    • Jetty:另一个轻量级、高性能的Servlet容器,常用于嵌入式系统和云计算环境。
  3. 框架

    • 直接使用Servlet开发应用比较繁琐,现代Java Web应用通常使用框架来简化开发。
    • Spring MVC:Spring框架的一部分,是目前Java Web领域最主流的框架,它通过一个前端控制器DispatcherServlet)来统一接收所有请求,然后根据配置将请求分发给不同的控制器处理,大大简化了Servlet的开发。
    • Spring Boot:极大地简化了Spring应用的创建和部署,它内嵌了Tomcat(或Jetty),你不再需要手动配置和部署WAR包,只需运行一个Java main方法就能启动整个应用。

如何部署:将应用放到服务器上

开发完成后,你需要将Java Web应用部署到服务器上才能让用户访问。

传统方式 (WAR包)

  1. 打包:使用Maven或Gradle等构建工具,将你的Java Web项目打包成一个.war (Web Application Archive) 文件,这个文件本质上是一个JAR文件,包含了你的应用所有编译后的.class文件、依赖库、以及Web内容(WEB-INF目录下的web.xml等)。
  2. 部署
    • .war文件复制到Tomcat的webapps目录下。
    • 启动Tomcat,Tomcat会自动检测到新的.war文件,并自动解压和部署它。
    • 访问 http://yourserver:8080/你的应用名 即可。

现代方式 (Spring Boot & JAR包)

  1. 打包:Spring Boot项目通常被打包成一个可执行的.jar文件。
  2. 部署
    • 直接运行:在服务器上安装Java运行环境,然后通过命令 java -jar your-app.jar 来启动应用,这种方式简单,但服务关闭后应用就停止了。
    • 作为服务运行:使用systemd (Linux) 或 NSSM (Windows) 等工具,将你的Spring Boot应用注册为系统服务,这样,应用就能在后台自动启动,并在服务器重启后自动恢复。
    • 使用Docker:这是目前最流行的方式,将你的Spring Boot应用打包成一个Docker镜像,然后运行一个Docker容器,这种方式实现了环境隔离和部署的标准化。

环节 关键技术/组件
前端 用户操作 -> 发送HTTP请求 HTML, CSS, JavaScript, AJAX, Fetch API
网络 浏览器与服务器建立TCP连接,传输HTTP报文 HTTP/HTTPS, TCP/IP, DNS
Web服务器 接收请求,分发静态资源,转发动态请求 Nginx, Apache (HTTPD)
应用服务器 接收动态请求,管理Java应用生命周期 Tomcat, Jetty
Java应用 执行业务逻辑,处理数据,生成响应 Servlet API, Spring MVC, Spring Boot
数据存储 读取或持久化数据 MySQL, Oracle, MongoDB, Redis
部署 将应用发布到服务器使其可访问 WAR包, 可执行JAR包, Docker

理解这个完整的流程,对于学习Java Web开发、排查问题、进行系统设计都至关重要,从最基础的Servlet开始,逐步过渡到Spring Boot,你会越来越清晰地看到Java Web应用是如何与服务器紧密协作,为用户提供服务的。

分享:
扫描分享到社交APP
上一篇
下一篇