一、前言
本文介绍了关于Java Web开发中的Servlet技术的基本概念和相关内容。Servlet是一种用于构建动态Web应用程序的Java组件,它可以处理客户端的HTTP请求并生成响应。
在本文中,我们探讨了Servlet的发展历史、BS模式的执行流程、请求与响应、J2EE、Tomcat与Servlet、JavaWeb工程结构、Servlet的开发步骤与访问、请求参数的发送与接收、GET和POST请求、Servlet的生命周期、使用注解配置Servlet以及预加载Servlet等方面的内容。
二、内容
2.1 软件结构发展史
随着科技的不断演进,软件结构也经历了多个时代的变革和发展。这些变革不仅改变了软件开发的方式,也影响了我们的日常生活和工作方式。
- 单机时代-桌面应用:
在计算机的早期阶段,软件主要是以单机桌面应用的形式存在的。用户必须在自己的计算机上安装软件,并且所有的数据和处理都在本地进行。这个时代的软件结构相对简单,通常是单一的可执行文件。这种模式的优点是速度快、响应迅速,但缺点是局限于单一机器,无法实现多用户协作和远程访问。
- 联机时代(Client-Server模式):
随着计算机网络的普及,软件结构迈入了联机时代。在这个时代,软件通常采用客户端-服务器模式,其中客户端是用户的终端设备,而服务器是存储和处理数据的中央计算机。这种结构允许多个用户同时访问共享的数据和资源,实现了协作和远程访问的可能性。这个时代的代表性应用包括数据库管理系统和电子邮件客户端。
- 互联网时代 (Browser-Server模式):
随着互联网的兴起,软件结构经历了巨大的变革。在互联网时代,我们看到了浏览器-服务器模式的崭露头角。这种模式允许用户通过标准的Web浏览器访问远程服务器上的应用程序和数据。这个时代的代表性应用包括Web应用、社交媒体平台和云计算服务。互联网时代的软件结构具有以下特点:
- 客户端轻量化:用户无需安装庞大的客户端应用,只需一个Web浏览器就能访问应用。
- 跨平台:Web应用通常不受操作系统的限制,因此可以在不同的设备和平台上运行。
- 实时协作:多用户可以实时协作,共享和编辑文档、数据和多媒体内容。
- 可扩展性:云计算技术使服务器资源能够根据需求进行动态扩展,以满足不断增长的用户需求。
互联网时代的软件结构以其跨平台性、实时协作和可扩展性而脱颖而出,成为现代应用开发的主流模式。
2.2 BS 模式执行流程
下面是BS模式的基本执行流程:
- 客户端请求:
- 浏览器(客户端)向服务器发起HTTP请求,请求特定的网页或资源。
- 请求通常包括URL、HTTP方法(如GET、POST等)以及可能的请求参数。
- 服务器响应:
- 服务器接收到客户端的请求后,会根据请求的内容和参数执行相应的处理。
- 服务器通常会与数据库或其他后端服务进行通信,获取所需的数据或进行计算。
- 服务器生成一个HTTP响应,包括HTTP状态码、响应头和响应体。
- 响应体通常包括HTML、CSS、JavaScript和其他资源,用于构建Web页面或提供数据。
- 数据传输:
- 服务器将HTTP响应发送回客户端,通常通过互联网进行数据传输。
- 客户端的浏览器接收到响应后,开始解析HTML和其他资源。
- 页面渲染:
- 浏览器解析HTML并构建DOM(文档对象模型)树。
- 浏览器解析CSS并构建CSSOM(CSS对象模型)树。
- 浏览器将DOM和CSSOM组合,生成渲染树。
- 渲染树用于绘制页面的布局和样式。
- 浏览器执行JavaScript代码,以便动态修改页面内容或处理用户交互。
- 用户交互:
- 用户与页面进行交互,例如点击链接、填写表单或执行其他操作。
- 交互触发事件,浏览器执行相应的JavaScript代码来响应这些事件。
- 如果需要与服务器进行进一步的通信(例如提交表单数据或获取动态内容),客户端可以发起新的HTTP请求。
- 更新页面:
- 如果需要更新页面内容,客户端会再次向服务器发起HTTP请求。
- 服务器执行相应的处理,生成新的HTTP响应。
- 新的响应被浏览器接收,页面内容得以更新。
- 页面加载完成:
- 当所有资源都被下载和渲染完毕,页面加载完成。
- 用户可以与页面进行交互,浏览和使用应用程序。
2.3 请求与响应
请求(Request)和响应(Response)是Web应用程序中的关键概念,它们描述了浏览器和服务器之间的通信过程。
(1)请求(Request)
请求是浏览器向服务器发送的数据包,其中包含了客户端的需求和指令。
请求通常包括以下重要信息:
- HTTP方法(例如,GET、POST、PUT、DELETE等):指定了请求的类型和操作。
- URL(统一资源定位符):用于标识请求的目标资源或服务的地址。
- 请求头:包含了与请求相关的元信息,如用户代理信息、Cookies、认证信息等。
- 请求体(对于POST请求等):包含了向服务器传输的数据,如表单数据或请求体内容。
(2)响应(Response)
响应是服务器对客户端请求的回应,包含了所请求资源的数据以及相关的元信息。
响应通常包括以下主要部分:
- HTTP状态码:用于表示请求的结果,例如200表示成功,404表示资源未找到,500表示服务器错误等。
- 响应头:包含了与响应相关的元信息,如服务器信息、日期、内容类型、Cookie等。
- 响应体:包含了实际的数据或资源,例如HTML网页、图片、JSON数据等。
请求和响应是Web应用程序中的核心,它们通过HTTP协议进行传输和交换,使浏览器和服务器能够互相通信。通过请求,浏览器告诉服务器它需要什么,而通过响应,服务器提供了所需的资源或信息。这个通信过程是Web应用程序的基础,使用户能够浏览网页、提交表单、获取数据等各种操作成为可能。
2.4 J2EE
J2EE(Java 2 Platform, Enterprise Edition)是Java平台的一种企业级扩展,旨在支持开发和部署分布式、可伸缩、安全和可维护的企业级应用程序。J2EE提供了一组规范和API,使开发人员能够构建复杂的多层次应用程序,这些应用程序可以在不同的计算机和平台上运行,并且能够满足企业级应用的高要求,如性能、安全性和可维护性。
J2EE的目标是简化企业级应用程序的开发过程,提供一组标准化的工具和组件,以便开发者能够更容易地构建可扩展、安全和高性能的应用程序。它已经演进为Java EE(Java Platform, Enterprise Edition),并在不同版本中引入了新的功能和技术,以适应不断变化的企业级应用需求。
2.5 Tomcat 与 Servlet
Tomcat 是一款轻量级的Web服务器,专门设计用于托管Java Web应用程序。它的主要功能是接收HTTP请求并将它们路由到合适的Web应用程序。Tomcat提供了一个运行环境,让Java Web应用能够在服务器上顺利运行。
Tomcat的关键功能包括:
- Servlet 容器:Tomcat充当了Servlet容器的角色,可以解释和执行Servlet代码,处理来自客户端的请求,并生成响应。
- JSP 支持:Tomcat还支持JavaServer Pages(JSP),这是一种用于创建动态Web页面的技术,它们可以与Servlet无缝集成。
- 管理和部署:Tomcat提供了管理工具,帮助开发人员轻松部署和管理Web应用程序。
- 安全性:Tomcat提供了许多安全特性,如身份验证和授权,以确保Web应用程序的数据和资源受到保护。
- 性能优化:Tomcat经过优化,具备高性能和可伸缩性,能够处理大量并发请求。
而 Servlet(服务器小程序)则是Java Web应用程序的关键组成部分,它们用于生成动态Web内容。事实上,Tomcat和Servlet之间的关系密不可分。Tomcat充当了Servlet容器的角色,它负责加载、初始化和执行Servlet,以响应客户端的HTTP请求。当客户端发起请求时,Tomcat会将请求路由到相应的Servlet,Servlet然后处理请求并生成响应。
Servlet是在Tomcat中运行的Java类,通过Tomcat提供的Servlet容器来执行。Servlet可以看作是Tomcat的客户端应用程序,它们与Tomcat之间通过一组规范和API进行通信,这些规范和API定义了Servlet的生命周期、请求处理方式以及与容器的交互方式。
2.6 Servlet 开发步骤
首先我们创建一个工程firstServlet
(这里使用的是 eclipse
)。
(1)创建 Servlet 类,继承 HttpServlet
这里,我们创建一个servlet 包 。在这个包下创建一个 Servlet 类为 FirstServlet
,该类继承于 HttpServlet。
java
package servlet;
import javax.servlet.http.HttpServlet;
public class FirstServlet extends HttpServlet {
}
(2)重写 service 方法,编写程序代码
(3)配置 web.xml,绑定 URL
xml
<servlet>
<servlet-name>first</servlet-name>
<servlet-class>servlet.FirstServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>first</servlet-name>
<url-pattern>/baidu</url-pattern>
</servlet-mapping>
(4)修改配置服务器上的资源
这里,我们需要修改配置服务器(Tomcat)上的资源,将我们的工程添加过去:
接着,我们启动 Tomcat 服务器。
(5)访问 URL
综合来说,Servlet的访问URL的格式如下:
bash
http://IP地址:端口/上下文路径/URL映射
记录如下:
- IP地址:这是服务器的IP地址。如果在本地运行Servlet,则可以使用"localhost"或"127.0.0.1"来代表本地主机。
- 端口:这是Web服务器监听的端口号。默认情况下,HTTP使用端口80,HTTPS使用端口443。我们可以在Web服务器的配置中更改端口号。
- 上下文路径(Context Path):上下文路径是Web应用程序的根路径。它通常与Web应用程序的名称或工程名相关联。如果未显式指定上下文路径,它通常默认为工程名。
- URL映射(URL Mapping):URL映射是与Servlet关联的路径。当客户端请求匹配该路径的URL时,Servlet容器将调用相应的Servlet来处理请求。
在示例中,本地运行一个名为"firstServlet
"的Web应用程序,其中一个Servlet映射到"/baidu
"路径,那么可以通过以下URL来访问它:
bash
http://localhost:8080/firstServlet/baidu
这将触发服务器调用"/baidu
"路径下的Servlet来处理请求。
效果如下:
2.7 请求参数的发送与接收
请求参数是通过HTTP请求向服务器提交的数据,通常是用户输入的数据,用于与Servlet进行交互和处理。
在地址栏中的格式如下:
ini
参数名1=值1&参数名2=值2&参数名n=值n...
在Servlet中,可以使用HttpServletRequest
对象来接收请求参数。具体来说,可以使用以下方法来获取请求参数:
-
request.getParameter(String name)
:用于接收单个参数。它接受参数名作为输入,并返回与该参数名关联的值。如果存在多个同名参数,它将返回第一个匹配的参数值。javaString paramName = request.getParameter("paramName");
-
request.getParameterValues(String name)
:用于接收多个同名参数。如果有多个同名参数,它将返回一个包含所有这些参数值的字符串数组。javaString[] paramValues = request.getParameterValues("paramName");
这些方法允许Servlet
获取HTTP请求中的数据,以便进一步处理和响应。在处理请求参数时,要小心处理可能的空值或不存在的参数,以防止NullPointerException
等异常。
2.8 GET和POS
GET 和 POST是 HTTP 请求方法,用于与服务器进行交互并传递数据。
(1)GET请求
GET请求通过URL的查询字符串参数将数据附加到请求中,这些参数是在URL中可见的,因此是显性的。GET请求通常用于不包含敏感信息的查询操作,因为查询字符串参数可能会在URL中被记录,而且有长度限制。
在Servlet中,GET请求通常由doGet
方法处理。这个方法用于处理HTTP的GET请求。当客户端向服务器发送一个GET请求时,Servlet容器会调用doGet
方法,并传递HTTP请求和响应对象作为参数。我们可以在doGet
方法中编写代码来处理这些请求,并向客户端发送响应。
如下所示:
java
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
// 处理GET请求的代码
}
(2)POST请求
POST请求将数据存储在HTTP请求的请求体中,而不是通过URL传递,因此数据是隐性的。POST请求通常用于对服务器执行更改(如创建、更新或删除资源)或包含敏感信息的操作,因为请求体中的数据不会在URL中可见。
在Servlet中,POST请求通常由doPost
方法处理。这个方法用于处理HTTP的POST请求。当客户端向服务器发送一个POST请求时,Servlet容器会调用doPost
方法,并传递HTTP请求和响应对象作为参数。我们可以在doPost
方法中编写代码来处理这些请求,并向客户端发送响应。
如下所示:
java
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
// 处理POST请求的代码
}
(3)应用场景
通常情况下,GET请求用于从服务器获取数据,例如搜索引擎查询、获取新闻文章、查看产品信息等。而POST请求用于向服务器提交数据,例如用户登录、注册、提交表单、上传文件等需要传递敏感信息或执行写操作的场景。这两种方法可以在同一个Servlet类中定义,以便根据请求类型执行不同的操作。
2.9 Servlet 生命周期
Servlet的生命周期通常包括装载、初始化、创建对象、提供服务和销毁等阶段。
在Web应用启动时,Servlet容器会根据配置信息(通常在web.xml
中)来装载Servlet。
当首次请求到达时(或配置的Servlet被访问时),Servlet实例会被创建,容器会调用其init()
方法。init()
方法用于执行一次性的初始化工作,例如配置参数、建立数据库连接或加载资源。Servlet在其生命周期内只会被初始化一次。这意味着init()
方法是在Servlet实例化后立即调用的,但在处理任何实际请求之前。
注意,Servlet实例将在Servlet的整个生命周期内被重用,以处理多个客户端请求。每个请求都不会创建一个新的Servlet实例,而是重复使用现有的实例。
Servlet的主要任务是提供服务,也就是处理来自客户端的HTTP请求。一旦Servlet被初始化,它可以处理来自客户端的多个请求。对于每个请求,容器会调用Servlet的service()
方法,并将请求和响应对象传递给它。service()
方法通常会根据请求的HTTP方法(如GET、POST等)将请求分派到适当的方法(如doGet()
、doPost()
等)来处理请求。
Servlet的生命周期的最后阶段是销毁阶段。当Web应用关闭或Servlet容器需要释放资源时,它会调用Servlet的destroy()
方法。在destroy()
方法中,您可以执行一些清理操作,如关闭数据库连接、释放资源等。destroy()
方法只会在Servlet被销毁时调用一次。
2.10 使用注解配置Servlet
Servlet 3.0及更高版本引入了注解(Annotations)特性,其中@WebServlet
是用于配置Servlet的核心注解。使用注解配置Servlet可以更简单地定义Servlet的映射和属性,而无需在web.xml
中进行繁琐的配置。
还是之前那个例子,我们在 web.xml 中注释掉之前的代码:
接着,在 FirstServlet
中设置注解:
这样配置后,我们就指定了URL模式 "/baidu"
,当我们刷新后重新访问 http://localhost:8080/firstServlet/baidu
后,结果一样。
我们发现,通过注解配置Servlet的有如下优点:
- 简化配置 :无需在
web.xml
中进行Servlet的详细配置,而是使用注解直接在Servlet类上进行配置。 - 更易读的代码:Servlet的映射信息与Servlet类紧密相关,使代码更具可读性和可维护性。
2.11 预加载 Servlet
在Servlet中,可以使用<load-on-startup>
元素来设置Servlet的启动加载顺序。这个元素可以在web.xml
文件中配置,它指定了Servlet的初始化时机,即Servlet在Web应用启动时是否立即加载以及加载的顺序。
<load-on-startup>
元素的值通常是一个整数,表示Servlet的加载顺序。Servlet容器会按照这个值的顺序来初始化Servlet,较小的值先加载,较大的值后加载。如果多个Servlet都有<load-on-startup>
元素,并且它们的值相同,那么Servlet容器会按照它们在web.xml
文件中的出现顺序来加载。
比如:
xml
<servlet>
<servlet-name>MyServlet</servlet-name>
<servlet-class>com.example.MyServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
在这个示例中,<load-on-startup>
的值为1,表示MyServlet
将会在Web应用启动时立即加载。
这种配置对于需要在应用启动时执行一些初始化工作的Servlet非常有用,例如初始化数据库连接池、加载配置文件等。这确保了这些Servlet在应用启动时就准备好工作,而不是等到第一次请求到达时再进行初始化。
另外,我们还可以使用注解来实现Servlet的预加载功能。即使用@WebServlet
注解的loadOnStartup
属性来配置Servlet的加载顺序。
举个例子:
java
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
@WebServlet(value = "/myservlet", loadOnStartup = 1)
public class MyServlet extends HttpServlet {
// Servlet代码
}
在这个示例中,我们使用了loadOnStartup
属性并将其值设置为1,这意味着MyServlet
将会在Web应用启动时预加载,并且是第一个加载的Servlet。通过注解方式设置加载顺序具有与<load-on-startup>
元素类似的效果,但更加简洁和直观。
三、小结
本文介绍了Java Web开发中的Servlet技术,了解Servlet是构建Web应用程序的重要基础,通过本文的学习,读者可以更好地理解和应用Servlet技术,同时,了解Servlet的生命周期和配置方式也有助于更好地管理和维护Web应用。