Servlet技术j详解1

系列文章目录

提示:这里可以添加系列文章的所有文章的目录,目录需要自己手动添加

Servlet技术j详解1


提示:写完文章后,目录可以自动生成,如何生成可参考右边的帮助文档

文章目录


前言

提示:这里可以添加本文要记录的大概内容:

本博客以 Servlet 为主题,旨在分享关于 Servlet 技术的知识、经验和见解。Servlet 作为 Java Web 开发中的重要组成部分,它为我们提供了一种强大的方式来处理 HTTP 请求和生成动态网页内容。通过 Servlet,我们可以构建高效、安全和可扩展的 Web 应用程序。

在这里,你将找到关于 Servlet 的各种教程、实践案例以及最新的技术动态。我们将深入探讨 Servlet 的核心概念、生命周期、请求处理机制等方面的内容,帮助你理解如何使用 Servlet 开发 Web 应用程序。同时,我们还将分享一些实际项目中的经验和最佳实践,以帮助你避免常见的陷阱和错误。

无论你是刚刚开始学习 Servlet 的新手,还是已经有一定经验的开发者,本博客都将为你提供有价值的内容。我们鼓励读者积极参与讨论,提出问题和分享自己的经验。通过交流和互动,我们可以共同学习和进步。


提示:以下是本篇文章正文内容,下面案例可供参考

一、Servlet简介

Servlet是Server Applet的简称,称为服务端小程序,是JavaEE平台下的技术标准,基于Java语言编写的服务端程序。Servlet 是一种服务器端的 Java 编程组件 ,用于处理客户端请求并生成动态网页内容。它运行在 Web 服务器上,可以接收和处理来自客户端的 HTTP 请求,并返回相应的响应。Servlet使用单进程多线程的方式运行。

Servlet 可以理解为一种运行在服务器端的小程序,它接收来自客户端(通常是浏览器)的请求,并根据请求的类型做出相应的处理,然后将处理结果返回给客户端。可以把 Servlet 想象成一个餐厅的服务员。当客人(客户端)走进餐厅并向服务员点菜时,服务员(Servlet)会接受客人的请求并将其传递给厨师(服务器端的其他组件)。厨师根据客人的要求准备食物,然后服务员将食物送给客人。

在 Web 应用中,Servlet 扮演着类似的角色。它接收来自客户端的 HTTP 请求(比如 GET 请求或 POST 请求),并根据请求的类型执行相应的操作,例如查询数据库、生成动态网页内容或处理用户提交的数据。然后,Servlet 将处理结果以 HTTP 响应的形式返回给客户端,客户端(浏览器)接收到响应后,会将其显示给用户。

总的来说,Servlet 是 Web 应用中的一个重要组成部分,它负责处理客户端的请求并生成相应的响应,从而实现动态网页和交互式应用的功能。

二、Servlet继承结构

Servlet的继承结构如下:

Servlet(顶层接口) -----> GenericServlet(抽象类) -----> HttpServlet(抽象类) ----->自定义的Servlet

Servlet接口:

  1. init(),创建Servlet对象后立即调用该方法完成一些初始化工作。
  2. service(),处理客户端请求,执行业务操作,利用响应对象响应客户端请求。
  3. destroy(),在销毁Servlet对象之前调用该方法,释放资源。
  4. getServletConfig(),ServletConfig是容器向servlet传递参数的载体。
  5. getServletInfo(),获取servlet相关信息。
    ServletConfig接口:
  6. getServletName(),返回 Servlet 的名字,即 web.xml 中 元素的值。
  7. ServletContext getServletContext(),返回一个代表当前 Web 应用的 ServletContext 对象。
  8. String getInitParameter(String name),根据初始化参数名返回对应的初始化参数值。
  9. Enumeration getInitParameterNames(),返回一个 Enumeration 对象,其中包含了所有的初始化参数名。

GenericServle抽象类:GenericServlet是实现了Servlet接口的抽象类。在GenericServlet中进一步的定义了Servlet接口的具体实现,其设计的目的是为了和应用层协议解耦,在GenericServlet中包含一个Service抽象方法。

HttpServlet类:继承自 GenericServlet,针对于处理 HTTP 协议的请求所定制。在 HttpServlet的service() 方法中已经把 ServletReuqest 和 ServletResponse 转为 HttpServletRequest 和 HttpServletResponse。 直接使用 HttpServletRequest 和 HttpServletResponse, 不再需要强转。实际开发中, 直接继承 HttpServlet, 并根据请求方式复写 doXxx() 方法即可。

三、Servlet的生命周期

Servlet 的生命周期包括以下几个阶段:

  1. 初始化:在加载 Servlet 类后,服务器会调用 Servlet 的 init()方法。这个方法只会被调用一次,用于初始化 Servlet 的状态。
  2. 服务:当客户端发送请求到服务器时,服务器会将请求传递给相应的 Servlet。Servlet 的 service()方法会被调用,用于处理请求。在这个方法中,你可以获取请求的参数、读取请求的头部信息、生成响应等。
  3. 销毁:当服务器决定停止或重新加载 Servlet 时,服务器会调用 Servlet 的 destroy()方法。这个方法用于释放 Servlet 占用的资源,如关闭数据库连接、释放文件句柄等。

注:Servlet 的生命周期是由服务器来管理的,而不是由客户端来控制的。因此,Servlet 可能会在服务器的整个运行期间持续存在,直到服务器关闭或重新加载为止。

四、Servlet的性能分析

在某些情况下,使用 Servlet 可能会对性能产生一定的影响。以下是一些可能影响性能的因素:

  • 数据库操作:如果你的 Servlet 需要执行大量的数据库查询或写入操作,这可能会导致性能下降。优化数据库查询和减少不必要的数据库交互可以提高性能。
  • 服务器负载:当大量并发请求到达服务器时,服务器需要处理这些请求并为每个请求创建一个新的 Servlet 实例。如果服务器的负载过高,可能会导致性能下降。可以考虑使用负载均衡器、缓存机制或优化代码来提高性能。
  • 资源消耗:如果你的 Servlet 占用了大量的内存、CPU 资源或文件句柄等,这可能会影响服务器的性能。确保合理使用资源,并在不需要时释放它们。
  • 网络延迟:如果你的 Servlet 需要与其他远程服务进行通信,如调用第三方 API 或访问外部数据库,网络延迟可能会对性能产生影响。尽量减少远程调用的次数,并优化网络通信。
  • 代码效率:如果你的 Servlet 代码效率低下,存在性能瓶颈或不必要的循环等,这可能会导致性能下降。进行性能分析和优化代码可以提高性能。

四、Servlet处理请求的原理

Servlet 是一种运行在服务器端的 Java 程序,它用于处理客户端发送的 HTTP 请求。当客户端发送一个 HTTP 请求到服务器时,服务器会将该请求传递给相应的 Servlet 进行处理。

以下是 Servlet 处理请求的原理:

  • 客户端发送 HTTP 请求:客户端(通常是浏览器)通过发送 HTTP 请求到服务器,请求特定的资源或服务。请求中包含了请求的方法(GET、POST 等)、请求的路径以及其他相关的请求头部信息。
  • 服务器接收请求:服务器接收到客户端发送的请求,并将其传递给 Web 容器(如 Tomcat、Jetty 等)。
  • Web 容器创建 HttpServletRequest 对象:Web 容器创建一个 HttpServletRequest 对象,该对象封装了客户端发送的请求信息,包括请求的方法、请求的路径、请求的参数、请求的头部等。
  • Web 容器创建 HttpServletResponse 对象:Web 容器同时创建一个 HttpServletResponse 对象,该对象用于向客户端发送响应。响应中包含了响应的状态码、响应的头部信息以及响应的内容。
  • 调用 Servlet 的 service()方法:Web 容器根据请求的路径映射到相应的 Servlet,并调用该 Servlet 的 service()方法。在 service()方法中,你可以获取 HttpServletRequest 对象和 HttpServletResponse 对象,并处理请求。
  • 处理请求:在 service()方法中,你可以通过 HttpServletRequest 对象获取请求的参数、读取请求的头部信息、获取请求的输入流等,并根据请求的类型(GET、POST 等)执行相应的操作。你可以进行业务逻辑处理、查询数据库、生成响应内容等。
  • 生成响应:在处理请求后,你可以通过 HttpServletResponse 对象设置响应的状态码、响应的头部信息,并将响应的内容写入响应的输出流中。你可以生成 HTML 页面、JSON 数据、文件下载等响应内容。
  • 发送响应:最后,Servlet 将生成的响应发送给客户端。客户端接收到响应后,浏览器将根据响应的内容进行显示或处理。

五、Servlet的作用

  • 获取用户提交的数据
  • 获取浏览器附加的信息
  • 处理数据(访问数据库或调用接口)
  • 给浏览器产生一个响应
  • 在响应中添加附加信息

六、Servlet的方法使用

Servlet的只用需要引入Jar包servlet-api.jar,这个大家去网上自行下载,当Jar包引进后,需要创建一个类继承HttpServlet,成功后大概是这样

java 复制代码
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;


public class HelloWorld extends HttpServlet{


    public void doGet(HttpServletRequest request,HttpServletResponse response)throws ServletException,IOException{
        
    }
}

HttpServletRequest对象

HttpServletRequest对象代表客户端浏览器的请求,当客户端浏览器通过HTTP协议访问服务器时,HTTP请求中的所有信息都会被Tomcat所解析并封装在这个对象中,通过这个对象提供的方法,可以获得客户端请求的所有信息。

java 复制代码
request.getRequestURL()
//返回客户端浏览器发出请求时的完整URL。
request.getRequestURI()
//返回请求行中指定资源部分。
request.getRemoteAddr()
//返回发出请求的客户机的IP地址。
request.getLocalAddr()
//返回WEB服务器的IP地址。
request.getLocalPort()
//返回WEB服务器处理Http协议的连接器所监听的端口。

获取请求数据

根据key获取指定value

java 复制代码
String str = request.getParameter("key");

获取复选框(checkbox组件)中的值

java 复制代码
String[] userlikes = request.getParameterValues("checkboxkey");

获取所有提交数据的key

java 复制代码
Enumeration<String> parameterNames = request.getParameterNames();

使用Map结构获取提交数据

获取请求中所有的数据并存放到一个Map结构中,该方法返回一个Map,其中key为String类型value为String[]类型。

java 复制代码
Map<String, String[]> parameterMap = req.getParameterMap()

设置请求编码

请求的数据包基于字节在网络上传输,Tomcat接收到请求的数据包后会将数据包中的字节转换为字符。在Tomcat中使用的是ISO-8859-1的单字节编码完成字节与字符的转换,所以数据中含有中文就会出现乱码,可以通过req.setCharacterEncoding("utf-8")方法来对提交的数据根据指定的编码方式重新做编码处理。

java 复制代码
req.setCharacterEncoding("utf-8");

获取请求头信息

根据请求头中的key获取对应的value。

java 复制代码
String headerValue = req.getHeader("headerKey");

获取请求头中所有的key,该方法返回枚举类型。

java 复制代码
Enumeration<String> headerNames = req.getHeaderNames();

设置响应类型

HttpServletResponse对象代表服务器的响应。这个对象中封装了响应客户端浏览器的流对象,以及向客户端浏览器响应的响应头、响应数据、响应状态码等信息。

java 复制代码
resp.setContentType("MIME");
Type Meaning
application/msword Microsoft Word document
application/octet-stream Unrecognized or binary data
application/pdf Acrobat (.pdf) file
application/postscript PostScript file
application/vnd.lotus-notes Lotus Notes file
application/vnd.ms-excel Excel spreadsheet
application/vnd.ms-powerpoint PowerPoint presentation
application/x-gzip Gzip archive
application/x-java-archive JAR file
application/x-java-serialized-object Serialized Java object
application/x-java-vm Java bytecode (.class) file
application/zip Zip archive
application/json JSON
audio/basic Sound file in .au or .snd format
audio/midi MIDI sound file
audio/x-aiff AIFF sound file
audio/x-wav Microsoft Windows sound file
image/gif GIF image
image/jpeg JPEG image
image/png PNG image
image/tiff TIFF image
image/x-xbitmap X Windows bitmap image
text/css HTML cascading style sheet
text/html HTML document
text/plain Plain text
text/xml XML
video/mpeg MPEG video clip
video/quicktime QuickTime video clip

设置字符型响应

java 复制代码
//常见的字符型响应类型:
resp.setContentType("text/html")
//设置响应类型为文本型,内容含有html字符串,是默认的响应类型
resp.setContentType("text/plain")
//设置响应类型为文本型,内容是普通文本。
resp.setContentType("application/json")
//设置响应类型为JSON格式的字符串。

设置字节型响应

java 复制代码
//常见的字节型响应:
resp.setContentType("image/jpeg")
//设置响应类型为图片类型,图片类型为jpeg或jpg格式。
resp.setContentType("image/gif")
//设置响应类型为图片类型,图片类型为gif格式。

设置响应编码

java 复制代码
response.setContentType("text/html;charset=utf-8");
//不仅发送到浏览器的内容会使用UTF-8编码,而且还通知浏览器使用UTF-8编码方式进行显示。所以总能正常显示中文
response.setCharacterEncoding("utf-8");
//仅仅是发送的浏览器的内容是UTF-8编码的,至于浏览器是用哪种编码方式显示不管。 所以当浏览器的显示编码方式不是UTF-8的时候,就会看到乱码,需要手动指定浏览器编码。

重定向响应

java 复制代码
response.sendRedirect(URL地址);

总结

提示:这里对文章进行总结:

Servlet技术现在已经不怎么使用了,只有在一些老项目中才能看见,所以大家只需理解就行

相关推荐
菜鸟小码10 小时前
Hive数据模型、架构、表类型与优化策略
hive·hadoop·架构
IT从业者张某某15 小时前
基于Docker的hadoop容器安装hive并测试
hive·hadoop·docker
IT从业者张某某16 小时前
基于Docker的hadoop容器安装zookeeper
hadoop·docker·zookeeper
菜鸟小码17 小时前
深入理解 Hive 数据模型
数据仓库·hive·hadoop
菜鸟小码18 小时前
Hive环境搭建与配置优化
数据仓库·hive·hadoop
看海的四叔1 天前
【SQL】SQL同环比计算的多种实现方式
数据库·hive·sql·mysql·数据分析·同环比
我登哥MVP2 天前
【SpringMVC笔记】 - 9 - 异常处理器
java·spring boot·spring·servlet·tomcat·maven
DianSan_ERP2 天前
淘宝订单接口集成中如何正确处理消费者敏感信息的安全与合规问题?
大数据·运维·网络·人工智能·安全·servlet
菜鸟小码2 天前
Hive数据类型全解析:从基础到复杂类型实战指南
数据仓库·hive·hadoop
IT从业者张某某2 天前
Docker部署伪分布Hadoop
hadoop·docker·容器