HTTP和Servlet快速入门
1、HTTP
1.1 请求数据格式
请求行:请求数据的第一行
包含三个内容,按顺序分别为:
请求方式(如
GET)、请求资源路径(如/)、协议版本(如HTTP/1.1)请求头:第二行开始
格式为
key:value,常见的请求头如下:Host: 表示请求的主机名
User-Agent: 浏览器版本,例如Chrome浏览器的标识类似Mozilla/5.0 ...Chrome/79,IE浏览器的标识类似Mozilla/5.0 (Windows NT ...)like Gecko;
Accept:表示浏览器能接收的资源类型,如text/*,image/*或者*/*表示所有;
Accept-Language:表示浏览器偏好的语言,服务器可以据此返回不同语言的网页;
Accept-Encoding:表示浏览器可以支持的压缩类型,例如gzip, deflate等。
请求体:最后一部分
POST请求才有,存放请求参数
和请求头使用空行隔开
// 请求头 username=root&password=123456
GET和POST请求的区别
- GET请求的请求参数在请求行中,没有请求体
- GET请求请求参数大小有限制,POST没有
1.2 相应数据格式
响应行:响应数据的第一行
包含三个内容,按顺序分别为:
协议版本(如
HTTP/1.1)、响应状态码(如200)、表示码描述(如OK)响应头:第二行开始
格式为
key:value格式,常见的响应头如下Content-Type:表示该响应内容的类型,例如text/html,image/jpeg;
Content-Length:表示该响应内容的长度(字节数);
Content-Encoding:表示该响应压缩算法,例如gzip;
Cache-Control:指示客户端应如何缓存,例如max-age=300表示可以最多缓存300秒
响应体:最后一部分
如HTML代码
与响应头使用空行隔开
响应状态码:响应行中内容
响应状态码分类:
状态码分类 说明 1xx 响应中——临时状态码,表示请求已经接收,告诉客户端应当继续请求或者如果它已完成则忽略 2xx 成功——表示请求已经被成功接收,处理已完成 3xx 重定向——重定向到其他地方:它让客户端再发起一个请求以完成整个处理 4xx 客户端错误——处理发生错误,责任在客户端。如:请求不存在资源、未授权或禁止访问等 5xx 服务器错误——处理发生错误,责任在服务器。如:抛出异常、路由出错、HTTP版本不支持等 状态码大全:https://cloud.tencent.com/developer/chapter/13553
常见的响应状态码:
状态码 英文描述 解释 200 OK客户端请求成功,即处理成功,这是我们最想看到的状态码 302 Found指示所请求的资源已移动到由 Location响应头给定的 URL,浏览器会自动重新访问到这个页面304 Not Modified告诉客户端,你请求的资源至上次取得后,服务端并未更改,你直接用你本地缓存吧。隐式重定向 400 Bad Request客户端请求有语法错误,不能被服务器所理解 403 Forbidden服务器收到请求,但是拒绝提供服务,比如:没有权限访问相关资源 404 Not Found请求资源不存在,一般是URL输入有误,或者网站资源被删除了 428 Precondition Required服务器要求有条件的请求,告诉客户端要想访问该资源,必须携带特定的请求头 429 Too Many Requests太多请求,可以限制客户端请求某个资源的数量,配合 Retry-After(多长时间后可以请求)响应头一起使用 431 Request Header Fields Too Large请求头太大,服务器不愿意处理请求,因为它的头部字段太大。请求可以在减少请求头域的大小后重新提交。 405 Method Not Allowed请求方式有误,比如应该用GET请求方式的资源,用了POST 500 Internal Server Error服务器发生不可预期的错误。服务器出异常了,赶紧看日志去吧 503 Service Unavailable服务器尚未准备好处理请求,服务器刚刚启动,还未初始化好 511 Network Authentication Required客户端需要进行身份验证才能获得网络访问权限
2、Servlet
快速入门
依赖:创建web项目,导入Servlet依赖坐标
Tomcat内置Servlet,若运行时使用该依赖则会导致冲突
使用
<scope>provided</scope>,仅测试和编译环境有效<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>3.1.0</version>
<scope>provided</scope>
</dependency>
创建:定义类,实现Servlet接口,并重写接口中所有方法,并在service方法中输入一句话
public class ServletDemo1 implements Servlet { @Override
public void init(ServletConfig servletConfig) throws ServletException { } @Override
public ServletConfig getServletConfig() {
return null;
} @Override
public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
System.out.println("servlet hello world!");
} @Override
public String getServletInfo() {
return null;
} @Override
public void destroy() { }
}配置:在类上使用
@WebServlet("")注解,配置该Servlet的访问路径@WebServlet("/demo1")
public class ServletDemo1 implements Servlet { }
访问:启动Server,输入URL访问该Servlet
http://localhost:8080/servlet_1_0_SNAPSHOT_war/demo1
执行流程
URL拆解
http://localhost:8080为本机的服务器地址http://localhost:8080/servlet_1_0_SNAPSHOT_war为本项目地址http://localhost:8080/servlet_1_0_SNAPSHOT_war/demo1为该Servlet的访问地址
创建和调用
客户端发送请求到服务器
服务器解析请求
Servlet对象由服务器自动创建
service()方法由服务器自动调用
自定义Servlet时,必须实现Servlet接口并覆写其中方法,故必然存在可以调用的
service()方法service()方法被执行,服务器对客户端做出响应
生命周期
Servlet运行在Servlet容器中,其生命周期由容器管理,分为四个阶段
加载和实例化
默认情况下,Servlet第一次被访问时,由容器创建Servlet对象
通过配置参数决定创建时机
负整数(默认):第一次被访问时创建
0或正整数:服务器启动时创建(数字越小优先级越高)
@WebServlet(urlPatterns = "/demo", loadOnStartup = 1)
初始化
- 调用
init()初始化对象,仅执行一次- 加载配置文件
- 创建连接
...
- 调用
请求处理
- 调用
service()对请求进行处理
- 调用
服务终止
- 调用
destroy()进行资源回收 - 释放Servlet实例,随后其会被Java垃圾收集器回收
- 调用
方法介绍
初始化方法
public void init(ServletConfig servletConfig);
提供服务方法
public void service(ServletRequest servletRequest, ServletResponse servletResponse);
销毁方法
public void destroy();
获取
ServletConfig对象public ServletConfig getServletConfig();
获取Servlet信息
public String getServletInfo();
体系结构
多数时候不需要覆写上述五个方法全部,可以简化
Servlet体系结构
类或接口 说明 Servlet Servlet体系根接口 ↑ -- GenericServlet Servlet抽象类实现 ↑ -- HttpServlet 对HTTP协议封装的Servlet实现 由于以开发B/S的Web项目为主,均针对HTTP协议,故可在自定义Servlet时继承
HttpServletHttpServlet示例HttpServlet已经对service()方法中请求方式判断的方式进行封装在使用时需要进一步对不同请求方式实现不同的逻辑
@WebServlet("/demo4")
public class ServletDemo4 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...");
}
}
Servlet urlPattern配置
一个Servlet可以配置多个urlPattern
urlPattern配置规则
配置规则总共四种,如下所示,优先级逐级降低
精确匹配
// 准确输入主机端口项目地址并在最后加上请求路由即可访问
@WebServlet("/user/select")
// 两个请求路由均可访问
@WebServlet(urlPatterns = {"/servlet1","/servlet2"})
目录匹配
// * 为通配符,可匹配任意的字符串
@WebServlet("/user/*")
拓展名匹配
// 拓展名匹配不能以 / 开头,如示例,任何路由以.do结尾即可访问
@WebServlet("*.do")
任意匹配
// 匹配任意请求路由,二者作用相同, /* 的优先级高于 / ,覆盖Tomcat服务器的default的Servlet
@WebServlet("/")
@WebServlet("/*")
DefaultServlet是用来处理静态资源,如果配置了"/"会把默认的覆盖掉,就会引发请求静态资源的时候没有走默认的而是走了自定义的Servlet类,最终导致静态资源不能被访问
3、Servlert的xml配置
说明
@WebServlet()注解仅支持3.0版本及以上,3.0以下版本仅支持使用XML进行配置快速入门
编写Servlet类
package priv.dandelion.web; import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException; @WebServlet("/demo13")
public class ServletDemo13 extends HttpServlet { @Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("demo13 get...");
} @Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("demo13 post...");
}
}
在web.xml中对该Servlet进行配置
<web-app> <!-- ... --> <!--
Servlet全类名
-->
<servlet>
<servlet-name>demo13</servlet-name>
<servlet-class>priv.dandelion.web.ServletDemo13</servlet-class>
</servlet>
<!--
Servlet访问路径
-->
<servlet-mapping>
<servlet-name>demo13</servlet-name>
<url-pattern>/demo13</url-pattern>
</servlet-mapping> </web-app>
HTTP和Servlet快速入门的更多相关文章
- Servlet快速入门
servlet是运行在服务端的java小程序,用来处理客户端请求,响应给浏览器的动态资源 servlet规范:包含3个技术点 1.servlet技术 2.filter技术 3.listener技术 s ...
- 【servlet】Servlet快速入门&使用Eclipse发布web项目
创建时间:6.15 1.什么是Servlet Servlet 运行在服务端的Java小程序,是sun公司提供一套规范(接口),用来处理客户端请求.响应给浏览器的动态资源.但servlet的实质就是ja ...
- Servlet快速入门及运行流程
一.Servlet快速入门 1.创建一个web工程 2.在JavaResource中src下创建一个包名称为com.myxq.servlet 3.在创建的servlet包当中创建一个class文件起名 ...
- Servlet快速入门:第一个Servlet程序
Servlet是整个JavaWeb开发的核心,同时也是一套规范,即公共接口.用于处理客户端发来的请求并作出响应.通常情况下我们会发送不同的请求并交由不同的处理程序来处理,例如处理用户信息和处理订单信息 ...
- Servlet(一)----快速入门
## Servlet:server applet * 概念:运行在服务端的小程序 * servlet就是一个接口,定义了Java类被浏览器访问到(tomcat识别)的规则. * 将来我们自定义一 ...
- 快速入门系列--MVC--02路由
现在补上URL路由的学习,至于蒋老师自建的MVC小引擎和相关案例就放在论文提交后再实践咯.通过ASP.NET的路由系统,可以完成请求URL与物理文件的分离,其优点是:灵活性.可读性.SEO优化.接下来 ...
- quartz-2.2.x 快速入门 (1)
欢迎来到quartz快速入门教程.阅读本教程,你将会了解: quartz下载 quartz安装 根据你的需要,配置Quartz 开始一个示例应用 当熟悉了quratz调度的基本功能后,可以尝试一些 ...
- SpringMvc_快速入门,深入分析
目录 一.前言二.spring mvc 核心类与接口三.spring mvc 核心流程图 四.spring mvc DispatcherServlet说明 五.spring mvc 父子上下文的说明 ...
- Spring MVC 教程,快速入门,深入分析
http://elf8848.iteye.com/blog/875830/ Spring MVC 教程,快速入门,深入分析 博客分类: SPRING Spring MVC 教程快速入门 资源下载: ...
随机推荐
- 如何用Python实现配置热加载?
背景 由于最近工作需求,需要在已有项目添加一个新功能,实现配置热加载的功能.所谓的配置热加载,也就是说当服务收到配置更新消息之后,我们不用重启服务就可以使用最新的配置去执行任务. 如何实现 下面我分别 ...
- 跟HR在大群吵架是什么体验?
原创不易,求分享.求一键三连 昨天跟HR负责人在公司大群吵了一架,先说结论:我输了... 事情原委是,老板在周一司庆上聊嗨了,说了一句:我觉得打卡没用,建议取消打卡. 下来后老板在公司论坛发了一个问题 ...
- Mac上安装proxychains4
brew install proxychains-ng vim /usr/local/etc/proxychains.conf proxychains4 wget www.google.com
- 如何优雅的升级 Flink Job?
Flink 作为有状态计算的流批一体分布式计算引擎,会在运行过程中保存很多的「状态」数据,并依赖这些数据完成任务的 Failover 以及任务的重启恢复. 那么,请思考一个问题:如果程序升级迭代调整了 ...
- 1.9. 触摸按钮(touch pad)测试
1.9.1. 基础 Esp32部分GPIO内置了touch按钮功能(电容式),具体有touch功能的引脚在配置为touchpad后,单片机读入的电容值随是否被触碰发生变化,系统根据电容值的变化判断判断 ...
- 同时安装py2和py3-安装多版本python
遇到问题和需求 我的电脑环境:先安装py2再安装py3,平时我工作中是使用python2,如何保证两个版本共存且让代码来选择要使用的版本. 遇到问题 在cmd中输入python,进入的是py2的环境, ...
- async和await详解
async和await详解 1.非UI线程中执行 Test()函数带有async 和await ,返回值写成Task. 1 using System; 2 using System.Threadin ...
- 缓冲流的原理和BufferedOutputStream字节缓冲输出流
缓冲流的原理 BufferedOutputStream字节缓冲输出流 package com.yang.Test.BufferedStudy; import java.io.BufferedOutpu ...
- 石火电光追风逐日|前端优化之次时代图片压缩格式WebP的项目级躬身实践(Python3 PIL+Nginx)
原文转载自「刘悦的技术博客」https://v3u.cn/a_id_190 我们知道,在前端界有一个共识:速度就是生命,带宽就是金钱.怎样将页面加载速度有效提升是无数前端工程师无时不刻在思考的课题,目 ...
- MySQL主从复制之GTID模式介绍
GreatSQL社区原创内容未经授权不得随意使用,转载请联系小编并注明来源. GTID概述 MySQL5.6 在原有主从复制的基础上增加了一个新的复制方式,即基于GTID的复制方式,它由UUID和事务 ...