目录
HTTP协议
什么是HTTP协议
HTTP协议的特点
请求的HTTP协议格式
GET请求
POST请求
常用的请求头说明
哪些是GET请求,哪些是POST请求
响应的HTTP协议格式
常见的响应码说明
MIME类型说明
HttpServletRequest类
作用
常用方法
如何获取请求参数
post请求中文乱码问题
请求转发
base标签的作用
Web中的相对路径和绝对路径
Web中斜杠/的不同意义
HttpServletResponse类
作用
两个输出流的说明
如何向客户端回传字符串数据
请求重定向
协议:指双方或多方相互约定好,大家都需要遵守的规则
HTTP(HyperText Transfer Protocol),超文本传输协议,规定了浏览器和服务器之间数据传输的规则
HTTP协议中的数据又叫报文
客户端给服务器发送数据叫请求,服务器给客户端回传数据叫响应
请求分为GET请求和POST请求两种
GET请求和POST请求的区别:
1.请求行
(1)请求的方式:GET
(2)请求的资源路径:[+?+请求参数]
(3)请求的协议的版本号:HTTP/1.1
2.请求头
由key:value组成,不同的键值对表示不同的含义
1.请求行
(1)请求的方式:POST
(2)请求的资源路径:[+?+请求参数]
(3)请求的协议的版本号:HTTP/1.1
2.请求头
由key:value组成,不同的键值对表示不同的含义
请求头和请求体之间有空行
3.请求体:发送给服务器的数据
Accept:客户端可以接收的数据类型
Accept-Language:客户端可以接收的语言类型
User-Agent:客户端浏览器的信息
Host:请求时的服务器ip和端口号
GET请求有哪些:
POST请求有哪些:
1.响应行
(1)响应的协议和版本号:HTTP/1.1
(2)响应状态码:200
(3)响应状态描述符:OK
2.响应头
由key:value组成,不同的键值对表示不同的含义
响应头和响应体之间有空行
3.响应体:回传给客户端的数据
200:请求成功
302:请求重定向
404:请求服务器已经收到了,但数据不存在(请求地址错误)
500:服务器已经收到请求,但是服务器内部错误(代码错误)
MIME是HTTP协议中的数据类型
MIME类型的格式是“大类型/小类型”,并与某一种文件的扩展名相对应
常见的MIME类型:
每次只要有请求进入tomcat服务器,tomcat服务器就会把请求过来的HTTP协议信息解析好封装到Request对象中,然后传递到service方法(doGet和doPost)中给我们使用,我们可以通过HttpServletRequest对象获取到所有请求的信息
启动输出为:
要在获取请求参数之前设置才有效
请求转发是指服务器收到请求后,从一个资源跳转到另一个资源
请求转发的特点:
Servlet1类:
package com.qcby.servlet0724; import javax.servlet.*; import javax.servlet.http.*; import java.io.IOException; public class Servlet1 extends HttpServlet { @Override protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //获取请求参数 String username = request.getParameter("username"); System.out.println("在Servlet1中查看参数:"+username); //盖章,并传递到Servlet2 request.setAttribute("key1","柜台1的章"); //问路:Servlet2怎么走 /** * 请求转发必须要以斜杠开头 */ RequestDispatcher requestDispatcher = request.getRequestDispatcher("/servlet2"); //走向Servlet2 requestDispatcher.forward(request,response); } }
Servlet2类:
package com.qcby.servlet0724; import javax.servlet.*; import javax.servlet.http.*; import java.io.IOException; public class Servlet2 extends HttpServlet { @Override protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //获取请求参数 String username = request.getParameter("username"); System.out.println("在Servlet2中查看参数:"+username); //查看柜台1是否盖章 Object key1 = request.getAttribute("key1"); System.out.println("柜台1是否有章:"+key1); //处理自己的业务 System.out.println("Servlet2处理自己的业务"); } }
启动:
base标签可以设置当前页面中所有相对路径工作时,参照哪个路径来进行跳转
相对路径:
.表示当前目录
..表示上一级目录
资源名:表示当前目录/资源名
绝对路径:
http://ip:port/工程路径/资源路径
在web中/斜杠是一种绝对路径
特殊情况:
response.sendRedirect("/"):把斜杠发送给浏览器解析,得到http://ip:port/
每次请求进来,tomcat服务器都会创建一个Response对象传递给Servlet程序去使用,HttpServletResponse表示所有响应的信息,如果需要设置返回给客户端的信息,都可以通过HttpServletResponse对象来进行设置
两个流同时只能使用一个,使用了字节流,就不能再使用字符流,反之亦然,否则报错
PrintWriter writer = response.getWriter(); writer.write("response's content");
解决中文乱码问题:
方案一:
方案二:同时设置服务器和客户端都使用UTF-8,还设置了响应头,只有在获取流对象之前设置才有效
response.setContextType("text/html;charset=UTF-8");
请求重定向是指客户端给服务器发请求,然后服务器告诉客户端说我给你一些地址,你去新地址访问(因为之前的地址可能已废弃)
请求重定向的特点:
方案一:
Response1:
package com.qcby.servlet0724; 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 Response1 extends HttpServlet { @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { System.out.println("Response1"); //设置响应状态码302,表示重定向 resp.setStatus(302); //设置响应头,说明新的地址 resp.setHeader("Location","http://localhost:8080/servlet0724/response2"); } }
Response2:
package com.qcby.servlet0724; 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 Response2 extends HttpServlet { @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { resp.getWriter().write("response2的结果"); } }
启动:访问http://localhost:8080/servlet0724/response1
方案二(推荐):