JavaWeb中的Tomcat,Servlet详解
JavaWeb
JavaWeb技术主要包括服务器技术(后端),如
Tomcat,Servlet,JSP
等待,以及客户端技术(前端)如HTML,CSS,JavaScript
等等
Web服务器
Web服务器主要负责处理客户端发出的HTTP请求,并做出相应回应
- Web服务器:安装了服务器软件的计算机,只用于复杂处理请求,发出相应
- Web服务器软件:接受客户端的请求,处理请求做出响应
- 在Web服务器中可以部署web项目,让浏览器作为媒介就行访问
Web服务器软件
服务器软件是部署在服务器中的程序,主要有以下几种,我们主要学习Tomcat的使用
- weblogic:oracle公司,大型的javaEE服务器,支持所有的JavaEE规范,收费的。
- websphere:IBM公司,大型的javaEE服务器,支持所有的ovaTE规范,收费的。
- JBOSS:JBOSS公司,大型的javaEE服务器,支持所有的JavaIL规范,收费的。
- Tomcat:Apache基金组织,中小型的javaEE服务器,开源的,免费的。
Tomcat
Tomcat是一个免费开源的Java Servlet(Server Applet,服务程序)容器,主要用于部署和运行基于Java的Web应用程序,是由Apache基金组织成立,属于轻量级服务器.
Tomcat主要特点
- Servlet容器:Tomcat实现一个Servlet规范的容器,可以用来部署Servlet和JSP的Web应用程序.JSP(JavaServer Pages)是一种动态web内容技术,其允许开发者将Java代码和特点的JS嵌入到HTML页面中
- 轻量级:Tomcat是一个轻量级的服务器,相比其他商业服务器启动速度快,资源消耗少
- 易配置:Tomcat的配置文件简单明了,易于理解修改
Tomcat的架构
- Connector(连接器):用于接收客户端HTTP的请求并将其转发至相应的
Servlet
,并提供Socket
与Request
和Response
相关的转化; - Container(容器):
Container
是Tomcat
处理Servlet
的核心部件,其包括Engine(引擎),Host(主机),Context(上下文),Wrapper(包装器)
Tomcat
中只有一个Server
; 一个Server
中可以包含多个Service
; 一个Service
只能包含一个Container
但可以包含多个Connector
因为一个服务可以有多个连接;示意图如下:
多个Connector
和一个Container
就可以构成一个Sevrice
,有了Service
就可以对外提供,但还需一个运行环境,Server
提供了一个运行环境,其关系可以在Tomcat
的conf
目录下的sever.xml
配置文件中查看
Connector与Container的关系
由上诉内容可知,一个请求发送给
Tomcat
时,会经过Service,
然后转交到我们的Connector
Connector
用于接收请求并将请求封装成Request
和Response
来具体处理,Request
和Response
封装完之后再交由Container
进行处理,Container
处理完请求之后再返回给Connector
,最后Connector
通过Socket
将处理的结果放回给客户端
Servlet
Java Servlet是运行在Web服务器或应用服务器上的程序,它是作为来自Web浏览器或其他HTTP客户端的请求和HTTP服务器上数据库和应用程序的中间层,其本质上是用java语言编写的一个接口
Servlet的优势
- 良好的性能
- Servlet在Web服务器的地址空间执行,因此就不用再创建一个单独的进程来处理每个客户端的请求
- Servlet是独立与平台的,因为它用Java开发语言编写
Servlet架构
下图展示了Servlet在Web应用程序中的位置:
Servlet任务
- 读取客户端(浏览器)发送的显示数据.在包括网页上的HTML表单,或者也可以是来自applet或自定义的HTTP客户端的表单
- 读取客户端(浏览器)发送的隐式HTTP请求数据,包括cookies,媒体类型和浏览器能理解的压缩格式等等
- 处理数据并生成结果,这个过程可能需要访问数据库,执行RMI或CORBA调用,调用Web服务,或者直接计算得出对应响应
- 发送显式的数据(即文档)到客户端(浏览器).该文档格式可以是多种多样的,包括文本文件(HTML或XML),二进制文件(GIF图像)
- 发送隐式HTTP响应到客户端
Servlet生命周期
*Servlet
的生命周期可以理解为从创建到被销毁的过程*
- Servlet初始化后调用
init()
方法 - Servlet调用
service()
方法来处理客户端请求 - Servlet销毁前调用
destroy()
方法 - 最后,Servlet是由JVM的垃圾回收器进行垃圾回收的
现在我们开始详细讲解Servlet的生命周期方法
init()方法
init()
方法被设计成只能调用一次.它在第一次创建Servlet时被调用,在后续每次用户请求时不再调用.因此其是用于一次性初始
Servlet
创建于用户第一次调用对应于该Servlet
的URL时,但也可以指定Servlet
在服务器第一次启动时被加载- 当一个用户调用一个
Servlet
时,就会创建一个Servlet
实例,每一个用户请求都会产生一个新的线程. init()
方法只要用途是简单第创建或加载一些数据,这些数据被用户Servlet的整个周期
init()方法的定义如下:
public void init(ServletConfig servletConfig) throws ServletException {
//初始化代码
}
service()方法
service()方法是执行实际任务的主要方法.
- 每次服务器接收到一个Servlet请求时,服务器就会产生一个新的线程并调用服务.
- service()方法检查HTTP请求类型
(GET,POST,PUT,DELETE)
并在适当时候调用doGet.doPost.doPut.doDelete
等方法
下面是其方法代码
public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
}
service()方法由容器调用,service方法在适当的时候调用doGet.doPost.doPut.doDelete
,因此你不用对service()方法进行任何操作,你只需根据用户不同请求类型来重写doGet()
或doPost()
方法即可
doGet()方法
- GET请求来自于一个URL的正常请求,或者来自于一个未指定的
METHOD
的HTML
表单,它由doGet()方法进行处理
public void doGet(HttpServletRequest request,
HttpServletResponse response)
throws ServletException, IOException {
// Servlet 代码
}
doPost方法
- POST请求来自于一个特别指定了
METHDO
为POST
的HTML
表单,它由doPost()
方法处理
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
// Servlet 代码
}
destroy()方法
destory()
方法和init()
方法一样也只能调用一次,在Servlet生命周期结束时被调用- destroy()方法可以让你的Servlet关闭数据库连接,停止后台线程,把Cookie列表或点击计数器写入磁盘,
- 在调用了
destroy()
方法之后,servlet
对象就被标记为垃圾回收
destory()方法定义如下:
public void destroy() {
// 终止化代码...
}
架构图如下
Web.xml配置
<web-app>
:web.xml
的根元素,用于声明XML的版本.编码格式以及Web应用的模式文件(XSD)的位置<servlet>
和<servlet-mapping>
<servlet>
用于定义一个Servlet的类信息,包括它的名称和实现类<servlet-name>
:设置Servlet
实例的名字<servlet-class>
:配置类的路径,创建之前要确保有相对应的类
<servlet-mapping>
:用于指定一个或多个URL模式于前面定义的Servlet
之间的映射<servlet-name>
:用于绑定servlet
标签名字需和<servlet>
标签下的<servlet-name>
一致<url-patter>
:配置请求路径,客户端按该路径请求,可触发对应的Servlet
实例中的servlet
方法
<load-on-startup>
:第一次访问时创建Servlet对象,将中间的值设为负数<load-on-startup>
:服务器启动后创建,将中间值设为大于大于0的数E.g
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
version="4.0">
<servlet>
<servlet-name>servlet01</servlet-name>
<servlet-class>com.mashang.web.MyServlet01</servlet-class>
<load-on-startup>0</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>servlet01</servlet-name>
<url-pattern>/a</url-pattern>
</servlet-mapping>
</web-app>
Servlet注释
使用注解可以避免在
web.xml
文件中进行显性配置,从而减少配置文件的复杂性和提高开发效率
@WebServlet
- 作用:标签用于直接在Servlet类上定义其URL映射和其他配置
- 属性:
value
或urlPatterns
:指定一个或多个URL模式,用于匹配HTTP请求并将其分发给Servletname
:为Servlet
配置一个名称loadOnStartup
:指定Servlet
在服务器启动时是否加载以及加载顺序asyncSupported
:指示Servlet是否支持异步处理initParams
:初始化参数列表
urlPatterns
配置方法:
配置多种属性时要写上其属性名
@WebServlet({"/demo1","/demo2",...})//配置多个请求路径对应一个Servlet
@WebServlet("/user/demo1")//配置多级路径
@WebServlet("/user/*")//匹配以user开头形式的请求
@WebServlet("/*")//匹配所有的请求
@WebServlet("/*.do")//匹配do结尾的请求
HttpServlet
HttpServlet
是Servlet
的一个实现类,是一个抽象类.其在源有的Servlet
接口上添加了一些关于Http
协议的处理方法,其功能比Servle
t功能强大,在实际开发中,实现接口服务通常会继承这个类,而避免直接继承Servlet
类
GET请求和POST请求
GET请求
GET请求是一种
HTTP
方法,用于从服务器请求资源.当客户端(通常是指浏览器),向服务器发起请求时,它是在请求特定的资源
- GET请求的参数
- GET请求的参数通常会附加在URL后面,使用
?
号分隔URL和参数 - 参数之间使用
&
分隔 - 例如:
https://example.com/resource?param1=value1¶m2=value2
- GET请求的参数通常会附加在URL后面,使用
- GET请求的安全性
- GET请求中的所有参数都会暴露在URL中,因此可能会被记录在浏览器的历史记录或日志文件中,安全性较低
- 因此GET请求不能用来传递敏感信息,例如密码等等
- 缓存速度
- 浏览器和其他中间部件会缓存GET请求的结果,因此会导致GET请求的速度较快,提高性能
- GET的限制
- 由于GET请求是通过URL发送的,而URL本身长度有限制,因此GET的长度是有限制的
- GET的一般使用场景
- GET请求通常用于检索信息,如查询数据库或获取静态资源
POST请求
和GET请求一致的是POST请求也是一个
HTTP
方法,用于向服务器发送数据.当客户端(浏览器)使用POST方法向服务器发送请求时,它是在提交数据交给服务器进行处理
POST的请求体
- POST请求通常不会放置在URL中,而是放置在请求体中
- 意味着数据不会显示在URL中,于GET请求相比更具有安全性和隐式性
安全性
- 由于数据不会显示在URL中,POST更适合传送更适合传输敏感信息
- POST请求中的数据通常使用编码格式来组织
POST限制
- POST长度不会受到限制,因此可以传输大量数据
- 但服务器仍有自己的最大限制
POST一般使用场景
- POST请求通常用于提交数据,如登入表单,注册表单
doGet()和doPost()
doGet()
doGet()
方法是HttpServlet
类中的一个方法
- 请求类型
doGet()
方法是专门用于处理HTTP GET请求的方法
doPost()
doPost()
方法是HttpServlet
类中的一个方法
- 请求类型
doPost()
方法是专门处理HTTP POST请求的方法
E.g:
@WebServlet("/login")
public class MyHttpServlet01 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("执行GET请求业务逻辑");
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("执行POST请求业务逻辑");
}
}
MyHttpServlet01
类是HttpServlet
的继承类,重写了其中的doGet()
和doPost()
方法,我们在Postman软件可以分别去测试其GET请求和POST请求
JavaWeb中的Tomcat,Servlet详解的更多相关文章
- JavaWeb笔记一、Servlet 详解
一.创建一个 Servlet 简单实现类 1.创建一个 HelloServlet 类(测试 Servlet 接口方法) 1 //创建一个 HelloServlet 类并实现 Servlet 接口 2 ...
- (14)javaWeb中的HttpServletResponse类详解
如果希望了解请求和响应的详细内容,可以看我的“HTTP协议”系列文章 响应体的简单概述: a,响应报文结构: b,常见的状态码,返回服务器处理的结果: c,常见的响应头: HttpServletRes ...
- tomcat中server.xml配置详解(转载)(一)
转载自:https://www.cnblogs.com/starhu/p/5599773.html tomcat中server.xml配置详解 Tomcat Server的结构图如下:(该文件描述了如 ...
- Servlet详解
原文出处:http://blog.csdn.net/q547550831/article/details/50458456 Servlet详解 基本概述 Session在计算机中,尤其是在网络应用中, ...
- 巨人大哥谈Web应用中的Session(session详解)
巨人大哥谈Web应用中的Session(session详解) 虽然session机制在web应用程序中被采用已经很长时间了,但是仍然有很多人不清楚session机制的本质,以至不能正确的应用这一技术. ...
- TOMCAT原理详解及请求过程(转载)
转自https://www.cnblogs.com/hggen/p/6264475.html TOMCAT原理详解及请求过程 Tomcat: Tomcat是一个JSP/Servlet容器.其作为Ser ...
- gvoory脚本中关于HttpClient使用详解实例
一.gvoory脚本中关于HttpClient使用详解实例 HttpClient:是一个接口 首先需要先创建一个DefaultHttpClient的实例 HttpClient httpClient=n ...
- Java Servlet详解(体系结构+注解配置+生命周期)
Java Servlet详解(注解配置+生命周期) 什么是Servlet : (Server applet)? 顾名思义:服务端的小程序 Servlet只是一个接口,定义了Java被浏览器访问到(To ...
- 【通信】JDK中的URLConnection参数详解
JDK中的URLConnection参数详解 来自:http://www.blogjava.net/supercrsky/articles/247449.html 针对JDK中的URLConnecti ...
- tomcat 日志详解
1 tomcat 日志详解 1.1 tomcat 日志配置文件 tomcat 对应日志的配置文件:tomcat目录下的/conf/logging.properties. tomcat 的日志等级有 ...
随机推荐
- MyBatis 关于查询语句上配置的详细内容
1. MyBatis 关于查询语句上配置的详细内容 @ 目录 1. MyBatis 关于查询语句上配置的详细内容 2. 准备工作 3. SQL查询结果,返回为POJO实体类型 4. SQL查询结果,返 ...
- 订单请求接口设计,避免timeout超时问题 下单解决
订单请求接口设计,避免timeout超时问题 下单解决 接上篇:外部系统对接下单幂等性校验逻辑及接口超时处理 https://www.cnblogs.com/oktokeep/p/17668039.h ...
- 前端使用 Konva 实现可视化设计器(16)- 旋转对齐、触摸板操作的优化
这一章解决两个缺陷,一是调整一些快捷键,使得 Mac 触摸板可以正常操作:二是修复一个 Issue,使得即使素材节点即使被旋转之后,也能正常触发磁贴对齐效果,有个小坑需要注意. 请大家动动小手,给我一 ...
- uniapp 开发微信小程序 使用微信小程序一键登录
研究了一天的uniapp开发微信小程序的第一步,登录! 刚开始使用uni.getUserInfo函数No!不行,无法运行,研究文档发现是这个函数被微信小程序团队给禁用了,OK换! 后来换成了uni.g ...
- spring使用jdk17运行出现编码问题
遇到一个比较奇怪的问题. 这个问题别人也遇到过. https://blog.csdn.net/gao_chuan_g/article/details/115117712 一.情况简介 使用jdk17+ ...
- ServiceMesh、SideCar和Istio
Service Mesh简介 Service Mesh直译过来就是服务网格,而他的架构就是一个个微服务组成的网络. Sidecar简介 Service Mesh中的节点就是Sidecar节点. sid ...
- CLR via C# 笔记 -- 可空值类型(19)
1. 值类型的变量永远不会为null,所有需要使用System.Nullable<T> 2. 操作数是null,结构是null:==.!=操作数都为null,则返回true:<.&g ...
- Linux 内核:sysfs 有关的API
背景 相关文章:1.sysfs与kobject基类 下面内容基本上参考(有删改):https://blog.csdn.net/qb_2008/article/details/6846412 API a ...
- 在 VSCode 中编写 Markdown 的进阶指南
最新版的 Visual Studio Code 对 Markdown 的支持已显著提升,其在预览方面的体验甚至可以与 Markdown Preview Enhanced 插件相比.本文将介绍一些优化方 ...
- Chrome插件:Postman Interceptor 调试的终极利器
今天给大家介绍一款非常实用的工具--Postman Interceptor. 这个工具可以捕捉任何网站的请求,并将其发送到Postman客户端. 对于经常和API打交道的程序员来说,Postman I ...