系列文章目录
提示:这里可以添加系列文章的所有文章的目录,目录需要自己手动添加
Servlet技术j详解1
提示:写完文章后,目录可以自动生成,如何生成可参考右边的帮助文档
文章目录
- 系列文章目录
- 前言
- 一、Servlet简介
- 二、Servlet继承结构
- 三、Servlet的生命周期
- 四、Servlet的性能分析
- 四、Servlet处理请求的原理
- 五、Servlet的作用
- 六、Servlet的方法使用
- 总结
前言
提示:这里可以添加本文要记录的大概内容:
本博客以 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接口:
- init(),创建Servlet对象后立即调用该方法完成一些初始化工作。
- service(),处理客户端请求,执行业务操作,利用响应对象响应客户端请求。
- destroy(),在销毁Servlet对象之前调用该方法,释放资源。
- getServletConfig(),ServletConfig是容器向servlet传递参数的载体。
- getServletInfo(),获取servlet相关信息。
ServletConfig接口: - getServletName(),返回 Servlet 的名字,即 web.xml 中 元素的值。
- ServletContext getServletContext(),返回一个代表当前 Web 应用的 ServletContext 对象。
- String getInitParameter(String name),根据初始化参数名返回对应的初始化参数值。
- 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 的生命周期包括以下几个阶段:
- 初始化:在加载 Servlet 类后,服务器会调用 Servlet 的 init()方法。这个方法只会被调用一次,用于初始化 Servlet 的状态。
- 服务:当客户端发送请求到服务器时,服务器会将请求传递给相应的 Servlet。Servlet 的 service()方法会被调用,用于处理请求。在这个方法中,你可以获取请求的参数、读取请求的头部信息、生成响应等。
- 销毁:当服务器决定停止或重新加载 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技术现在已经不怎么使用了,只有在一些老项目中才能看见,所以大家只需理解就行