JavaWeb之路02--请求与响应
请求与响应的基本知识
请求(request)
一个HTTP的请求由3部分组成:请求行、请求头、请求体
请求行
位置:请求信息的第一行
格式:请求的方式(GET/POST) 请求的资源 协议/版本(e.g. GET /xjm/1.html HTTP/1.1)
请求方式有两种:
get
- 会将参数追加在地址栏上,参数大小有限制
- e.g. http://ip地址:端口号/项目名/资源?参数名称=值&参数名称=值
post
- 不会将参数追加在地址栏,请求的参数在请求体中,参数的大小无限制
- e.g. 参数名称=值&参数名称=值
请求头
位置:请求行的下方,请求体的上方,与请求体有一个空行相隔。
格式为:key/value (value可以为多个值的)
常用的请求头(红色的是比较重要的):
key | e.g. | 含义 |
---|---|---|
Accept | text/html,image/* | 支持数据类型 mime类型 |
Accept-Language | zh-cn | –语言环境 |
If-Modified-Since
|
Sun, 10 Feb 2019 21:47:51 GMT | 缓存文件的最后修改时间 |
Accept-Encoding | gzip | 支持压缩 |
Accept-Charset | ISO-8859-1 | 字符集 |
Referer
|
http://www.csdn.net/index.html | 来自哪个页面、防盗链 |
Host | localhost | 请求的主机名,允许多个域名同处一个IP地址,即虚拟主机。 |
User-Agent
|
Mozilla/4.0 (compatible; MSIE 5.5; Windows NT 5.0) | 产生请求的浏览器内核 |
Cookie
|
会话技术 | |
Connection | close/Keep-Alive | 链接状态 |
请求体
位置:在请求头下面,和请求头之间有一个空行。
是post请求的参数,由于get方法中的参数在请求行中显示,因此get方法中请求体这部分为空。
格式:参数名称=值&参数名称=值(e.g. username=tom&hobby=smoking&hobby=drink)
响应(response)
与请求相类似,一个HTTP的响应也由3部分组成:响应行、响应头、响应体
响应行
位置:响应信息的第一行
格式:版本/协议 响应的状态码 状态码说明(e.g. HTTP/1.1 200 OK)
常见的状态码:
200 响应成功
302 重定向
304 读缓存
404 用户访问的数据不存在
500 服务器内部错误
响应头
位置:响应行的下方,响应体的上方,与响应体有一个空行相隔。
与请求头一样,格式为:key/value (value可以为多个值的)
常用的响应头(红色的是比较重要的):
key | e.g. | 含义 |
---|---|---|
Pragma | no-cache | 缓存 |
Connection | Keep-Alive | 连接 |
Cache-Control | no-cache | 缓存 |
Expires | -1 | 缓存 |
Set-Cookie
|
SS=Q0=5Lb_nQ; path=/search | |
Content-Disposition
|
attachment; filename=aaa.zip | 下载 |
Content-Language | zh-cn | 语言环境 |
Refresh
|
1;url=http://www.it315.org | 定时刷新 |
Last-Modified
|
Sun, 10 Feb 2019 21:47:51 GMT | 最后修改时间 |
Content-Type
|
text/html; charset=GB2312 | 数据类型 |
Content-Length | 80 | 数据长度 |
Content-Encoding | gzip | 数据压缩 |
Server | apache tomcat | 服务器型号 |
Location
|
http://www.it315.org/index.jsp | 跳转方向 |
响应体
位置:在请求头下面,和请求头之间有一个空行,是浏览器解析的内容。
相关API介绍
请求行、头、体数据的读取
方法标签 | |
---|---|
请求行 | |
String getMethod() | 获取请求的方式 |
String getContextPath() | 获取项目动态路径 |
String getRemoteAddr() | 获取请求者的ip |
请求头 | |
String getHeader(String name) | 获取的一个请求头(返回值为string) |
请求体 |
同时适用于get和post方法
|
Map<String,String[]> getParameterMap() | 获取的所有的参数名称和值 |
String[] getParameterValues(String name) | 获取的指定请求参数(多值) |
String getParameter(String name) | 获取的单值的请求参数 |
请求中文乱码、请求转发、request域对象
请求中文乱码
因为浏览器中使用的是iso8859-1编码方式,请求中使用utf-8,所以读取中文时需要处理乱码问题。
通用的方式:
new String(乱码.getBytes("iso8859-1"), "utf-8");
针对post请求:
request.setCharacterEncoding("utf-8");
请求转发
作用:两个资源可以在同一次请求之间,进行资源共享。
request.getRequestDispatcher("/内部路径").forward(request,response);
该方法可以将当前servlet中的request和response发送到另一个servlet中进行处理。
request域对象
request域对象:
域对象:在一个访问(请求来时创建,生成响应时销毁)内有效,并且域对象都有xxxAttribute()方法
API |
---|
request.setAttribute(name, value) |
request.getAttribute(name) |
request.removeAttribute(name) |
响应行、头、体数据的读取
方法标签 | |
---|---|
响应行 | |
void setStatus(int code) | 针对1xx 2xx 3xx的相关状态码 |
void sendError(int code) | 针对4xx 5xx相关的错误状态码 |
响应头 | |
void setHeader(String name,String value) | 设置一个字符串形式的响应头 |
响应体 | |
ServletOutputStream getOutputStream() | 字节流 |
PrintWriter getWriter() | 字符流 |
响应的中文乱码
响应信息也会因为编码问题而出现中文乱码的问题,下面这种方法就能处理这种现象:
response.setContentType(“文件的mime类型;charset=utf-8”);
上下文(servletContext)
用来获取全局初始化参数,实现资源共享(servlet通信)。
生命周期:
- 创建:服务器启动的时候会为每个项目创建一个servletContext上下文对象,servleContext是项目的一个引用。
- 销毁:在服务器关闭或者移除项目的时候servletContext销毁。
API | |
---|---|
ServletContext getServletContext() | 获取上下文对象的方法 |
InputStream getResourceAsStream(String filepath) | 以流的方式返回一个文件 |
String getMimeType(String 文件名) | 获取一个文件的mime类型 e.g. text/html image/gif |
void removeAttribute(String name) | 移除指定的属性 |
void getAttribute(String name) | 获取指定的属性值 |
void setAttribute(String name,Object value) | 设置指定的属性值 |
代码示例
index.html
<!DOCTYPE html>
<html lang="en"><head><meta charset="UTF-8" http-equiv="refresh" content="30;url=/xjm/index.html"><title>功能页</title><script type="text/javascript">var time = 30;window.onload = function () {window.setInterval(refresh,1000);}function refresh() {time--;document.getElementById("times").innerText=time;}</script></head><body><h1>请求响应信息</h1><h2>GET方法发送请求</h2><form method="get" action="/xjm/request">用户名:<input type="text" name="username" value="xjm"/><br/>密码:<input type="password" name="password" value="123"/><br/>姓名:<input type="text" name="name"/><br/>年龄:<input type="text" name="age"/><br/>性别:<input type="radio" name="sex" value="1"/>男<input type="radio" name="sex" value="0"/>女<br/>兴趣爱好:<input type="checkbox" name="hobby" value="踢足球"/>踢足球<input type="checkbox" name="hobby" value="玩手游"/>玩手游<input type="checkbox" name="hobby" value="逛街"/>逛街<br/><input type="submit" value="get方式提交"/></form><br/><hr/><h2>POST方法提交请求</h2><form method="post" action="/xjm/request">用户名:<input type="text" name="username" value="xjm"/><br/>密码:<input type="password" name="password" value="123"/><br/>姓名:<input type="text" name="name"/><br/>年龄:<input type="text" name="age"/><br/>性别:<input type="radio" name="sex" value="1"/>男<input type="radio" name="sex" value="0"/>女<br/>兴趣爱好:<input type="checkbox" name="hobby" value="踢足球"/>踢足球<input type="checkbox" name="hobby" value="玩手游"/>玩手游<input type="checkbox" name="hobby" value="逛街"/>逛街<br/><input type="submit" value="post方式提交"/></form><br/><hr/><h1>上下文示例</h1><a href="/xjm/count">记录访问次数</a><a href="/xjm/show">显示访问次数</a><br/><hr/><h1>响应头刷新</h1><span id="times">30</span>秒后会刷新本页面</body>
</html>
RequestServlet.java
package request;import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.net.URLDecoder;public class RequestServlet extends HttpServlet {protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {//解决请求的中文乱码request.setCharacterEncoding("utf-8");//解决响应的中文乱码response.setContentType("text/html;charset=utf-8");//请求行信息response.getWriter().println("请求行信息:<br/>");response.getWriter().println("请求的方式:" + request.getMethod() + "<br/>");response.getWriter().println("请求动态路径:" + request.getContextPath() + "<br/>");response.getWriter().println("请求的ip:" + request.getRemoteAddr() + "<br/>");response.getWriter().println("请求的资源:" + request.getRequestURI() + "<br/>");response.getWriter().println("获取请求的参数:" + request.getQueryString() + "<br/>");response.getWriter().println("获取请求协议和版本:" + request.getProtocol() + "<br/><br/>");//请求头信息response.getWriter().println("请求头信息:<br/>");//获取版本内核response.getWriter().println("获取版本内核" + request.getHeader("user-agent") + "<br/><br/>");//请求体信息response.getWriter().println("请求体信息:<br/>");response.getWriter().println("用户名:" + request.getParameter("username") + "<br/>");response.getWriter().println("密码:" + request.getParameter("password") + "<br/>");response.getWriter().println("姓名:" + request.getParameter("name") + "<br/>");response.getWriter().println("年龄:" + request.getParameter("age") + "<br/>");response.getWriter().println("性别:" + (request.getParameter("sex")==(Object)1 ? "男" : "女") + "<br/>");response.getWriter().println("爱好:");for (String ele : request.getParameterValues("hobby")) {response.getWriter().println(ele + "  ");}//响应头中定时刷新response.getWriter().println("<br/><font color=red>10秒后跳转回主界面</font>");response.setHeader("refresh","10;url=/xjm/index.html");//设置响应状态码 200 表示正常完成响应response.setStatus(200);System.out.println(response.getStatus());}protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {//请求行信息response.setContentType("text/html;charset=utf-8");response.getWriter().println("请求行信息:<br/>");response.getWriter().println("请求的方式:" + request.getMethod() + "<br/>");response.getWriter().println("请求动态路径:" + request.getContextPath() + "<br/>");response.getWriter().println("请求的ip:" + request.getRemoteAddr() + "<br/>");response.getWriter().println("请求的资源:" + request.getRequestURI() + "<br/>");response.getWriter().println("获取请求的参数:" + URLDecoder.decode(request.getQueryString(),"utf-8") + "<br/>");response.getWriter().println("获取请求协议和版本:" + request.getProtocol() + "<br/><br/>");//请求头信息response.getWriter().println("请求头信息:<br/>");//获取版本内核response.getWriter().println("获取版本内核" + request.getHeader("user-agent") + "<br/><br/>");//请求体信息response.getWriter().println("请求体信息:<br/>");response.getWriter().println("用户名:" + new String(request.getParameter("username").getBytes("iso8859-1"), "utf-8") + "<br/>");response.getWriter().println("密码:" + request.getParameter("password") + "<br/>");response.getWriter().println("姓名:" + new String(request.getParameter("name").getBytes("iso8859-1"), "utf-8") + "<br/>");response.getWriter().println("年龄:" + request.getParameter("age") + "<br/>");response.getWriter().println("性别:" + (request.getParameter("sex")==(Object)1 ? "男" : "女") + "<br/>");response.getWriter().println("爱好:");for (String ele : request.getParameterValues("hobby")) {response.getWriter().println(new String(ele.getBytes("iso8859-1"), "utf-8") + "  ");}//响应头中定时刷新response.getWriter().println("<br/><font color=red>10秒后跳转回主界面</font>");response.setHeader("refresh","10;url=/xjm/index.html");//设置响应状态码 200 表示正常完成响应response.setStatus(200);System.out.println(response.getStatus());}
}
ShowServlet.java
package servletContext;import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;public class ShowServlet extends HttpServlet {protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {}protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {//创建ServletContext对象值ServletContext sc = getServletContext();//通过ServletContext获取访问次数Integer count = (Integer) sc.getAttribute("count");//判断是否为第一次访问response.getWriter().println(count == 0 ? "0 time" : count == 1 ? "1 time" : count + "times");}
}
web.xml配置
<?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>RequestServlet</servlet-name><servlet-class>request.RequestServlet</servlet-class></servlet><servlet><servlet-name>CountServlet</servlet-name><servlet-class>servletContext.CountServlet</servlet-class></servlet><servlet><servlet-name>ShowServlet</servlet-name><servlet-class>servletContext.ShowServlet</servlet-class></servlet><servlet-mapping><servlet-name>RequestServlet</servlet-name><url-pattern>/request</url-pattern></servlet-mapping><servlet-mapping><servlet-name>CountServlet</servlet-name><url-pattern>/count</url-pattern></servlet-mapping><servlet-mapping><servlet-name>ShowServlet</servlet-name><url-pattern>/show</url-pattern></servlet-mapping>
</web-app>
index.html运行结果:
get方法结果:
post方法结果:
上下文数据共享结果(访问3次之后):
JavaWeb之路02--请求与响应相关推荐
- 一起复习:请求、响应、JavaWeb核心概念等知识
文章目录 一.前言 二.XML简介 三.解析XML 四.dom4j解析技术 五.JavaWeb概念 六.部署工程到Tomcat 1.方式一 2.方式二 七.细节对比 八.总结 一.前言 大家好,我是卷 ...
- JavaWeb框架(一):Web入门,Http的请求和响应,https介绍,Web实战自定义服务器
Servlet入门 MVC实战项目 仓储管理系统 JavaWeb入门介绍 Http协议 Http请求数据格式 Http响应数据格式 Web实战Demo:自定义服务器 对比Https协议 总结 Redi ...
- JavaWeb | HTTP 协议请求与响应格式
一.HTTP 是什么 计算机网络核心概念:网络协议 网络协议种类非常多,其中一些耳熟能详的,IP,TCP,UD- 其中还有一个应用非常广泛的协议HTTP,HTTP 协议大概率是咱们日后开发中用的最多的 ...
- SpringCloud Gateway打印请求、响应内容和唯一流水号配置
SpringCloudGateway默认不打印请求和响应body,对于问题排查非常不友好.通过以下方式打印请求和响应body,header等内容. 实现自定义netty handler,转发请求和接受 ...
- OkHttp3简单使用:请求和响应,post,get
一,HTTP请求.响应报文格式 要弄明白网络框架,首先需要先掌握Http请求的,响应的报文格式. HTTP请求报文格式: HTTP请求报文主要由请求行.请求头部.请求正文3部分组成. request. ...
- HTTP/HTTPS的请求和响应
HTTP和HTTPS HTTP协议(HyperText Transfer Protocol,超文本传输协议):是一种发布和接收 HTML页面的方法. HTTPS(Hypertext Transfer ...
- NETGEAR拒绝连接请求_3分钟理解HTTP的请求与响应
HTTP和HTTPS HTTP协议(HyperText Transfer Protocol,超文本传输协议):是一种发布和接收 HTML页面的方法. HTTPS(Hypertext Transfer ...
- 优雅地记录http请求和响应的数据
点击关注公众号,Java干货及时送达 来源:https://fredal.xin/http-body-recorder 经常会遇到需要处理 http 请求以及响应 body 的场景. 而这里比较大的一 ...
- 应用服务器与WSGI协议以及flask后端框架总结(后端接收请求返回响应的整个流程)...
上次遗留了两个问题,先说一下自己的看法 问题: 1.明明一个线程只能处理一个请求,那么栈里的元素永远是在栈顶,那为什么需要用栈这个结构?用普通变量不行吗. 2._request_ctx_stack和_ ...
- 老李分享:HTTP协议之请求和响应
老李分享:HTTP协议之请求和响应 HTTP请求头详解: GET http://www.foo.com/ HTTP/1.1 GET是请求方式,请求方式有GET/POST http://www.foo. ...
最新文章
- 压测接口线程数设置_ZAT掌门性能压测巡检系统实战和落地
- 山东计算机类好的民办大学,山东四大坑人学校-山东坑人的民办大学(野鸡大学)...
- 实现断网收银_便利店收银系统,可以实现简单又好用!
- OpenCV学习笔记(十七):图像修补:inpaint()
- python opencv3 特征提取与描述 DoG SIFT hessian surf
- python爬虫刷网课答题_python实践:利用爬虫刷网课
- 几分钟就可做出的酷炫PPT动画效果
- QT中的.pro文件,以及.pri .prj .prl文件说明
- 单片机、嵌入式ARM学习网站推荐(多年的积累)
- Hedgehog 信号通路与癌症
- python抢淘宝的东西-Python实现淘宝秒杀功能
- 收到微软律师函怎么办?当接到微软律师函的处理办法
- k8s 存活检查与就绪检查
- Python使用标准库zipfile+re提取docx文档中超链接文本和链接地址
- 阿里M8级大神整理出SQL手册:收获不止SQL优化,抓住SQL的本质
- php后台界面修改教程,帝国cms后台界面修改方法
- 红帽 linux 安装gns3,在Arch Linux和Manjaro系统上安装GNS3的方法
- 删除eclipse的SVN/Subclipse插件
- python ocr文字识别竖排繁体_繁体文字识别 ABBYY 与 千百OCR 使用比较
- vivado报错:USF-XSim-62的常见解决办法
热门文章
- 携程酒店数据爬取(新)
- VBA checkbook动态添加后,添加事件方式
- 数据库与MPP数仓(三十):pigsty部署
- AE(自动曝光)系统简介
- rms 公式 有效值_为什麼均方根值(RMS)比平均值表达好一些?
- RGB转HDMI模块解决方案
- flash player所有版本下载地址
- 怎么设置计算机键盘数字键,电脑右边的数字键不能用怎么办_电脑右边数字键盘用不了的修复方法...
- [乐意黎原创]JS函数声明、 函数表达式与立即执行函数的理解与执行顺序
- 易语言数字指令编程大全(发送信息代码数据集合)