1 servlet几个相关的接口
HttpServletRequest接口:ServletRequest接口的子接口:针对于http协议的请求对象
HttpServletResponse接口:ServletResponse接口的子接口:针对于http协议的请求对象
HttpSession接口:回话对象:同一个浏览器发出的几个连贯的请求
ServletConfig接口:配置对象:获取当前servlet的在web.xml中的配置信息
ServletContext接口:上下文对象 实现整个项目的所有请求之间的数据共享,
:是一个全局的储存信息的空间,服务器开始就存在,服务器关闭才释放
2 Request对象的功能
2.0 概念
request对象:类型是HttpServletRequest
当tomcat接受到对某个servlet的请求时 会为本次请求创建一个HttpServletRequest类型的请求对象和HttpServletResponse类型的响应对象
来分别装与请求和响应相关的所有信息,并传递给servlet的service方法来处理请求 给与响应
2.1 功能1:与请求参数相关的方法:Parameter
//url的?后面的内容:格式:?参数名=参数值&参数名=参数值&参数名=参数值
//请求参数:name=%E9%9F%A9%E6%A2%85%E6%A2%85&age=11&sex=%E7%94%B7&enjoy=zq&enjoy=pq&enjoy=tq
//HttpServletRequest对象功能1:请求参数(paramater)相关的方法
req.setCharacterEncoding("utf-8");//设置请求参数的编码集:如果参数有中文 必须设置编码集和页面相同
System.out.println("获取请求方式:"+req.getMethod());//请求方式:get/post
System.out.println("获取单值请求参数:"+req.getParameter("name"));//获取请求单值参数
System.out.println("获取多值请求参数:"+Arrays.toString(req.getParameterValues("enjoy")));//获取请求多值参数
Enumeration<String> paramNames=req.getParameterNames();//获取所有的参数名对应的集合
while(paramNames.hasMoreElements()){
String paramName=paramNames.nextElement();
System.out.println("请求参数::::"+paramName+"="+Arrays.toString(req.getParameterValues(paramName)));
}
Map<String, String[]> paramMap=req.getParameterMap();//获取所有参数对应的map
Set<Entry<String, String[]>> entrys=paramMap.entrySet();
for (Entry<String, String[]> entry : entrys) {
System.out.println("请求参数:::::::"+entry.getKey()+"="+Arrays.toString(entry.getValue()));
}
2.2 功能2:与请求头相关的方法: Header
//HttpServletRequest对象功能2:获取请求头 header
//请求头:http请求协议的组成
System.out.println("获取请求头值:Host="+req.getHeader("Host"));//获取请求头的值
System.out.println("获取请求头值:User-Agent="+req.getHeader("User-Agent"));
Enumeration<String> headerNames=req.getHeaderNames();//获取所有请求头名对应的集合
while(headerNames.hasMoreElements()){
String headerName=headerNames.nextElement();
System.out.println("请求头::::"+headerName+"="+req.getHeader(headerName));
}
2.3 功能3:作为Request域对象:Attribute
//HttpServletRequest对象功能4: 请求域对象---Attribute
//域对象:在指定范围内实现数据共享的对象::装共享数据的对象
//servlet有三大域:request域对象 session域对象 servletContext域对象
req.setAttribute("aa", new Date());//添加request域属性
req.setAttribute("bb", "bb_value");//添加request域属性
req.setAttribute("cc", "cc_value");//添加request域属性
req.removeAttribute("bb");//删除request域属性
System.out.println("获取request域属性aa="+req.getAttribute("aa"));
Enumeration<String> attrNames=req.getAttributeNames();
while(attrNames.hasMoreElements()){
String attrName=attrNames.nextElement();
System.out.println("域属性:"+attrName+"="+req.getAttribute(attrName));
}
2.4 功能4: 请求转发和请求包含
//请求转发和请求包含:实现一个请求被两个servlet处理:::目的实现代码的服用
RequestDispatcher rq= req.getRequestDispatcher("/day03/s022.do");//获取请求的调度器对象:把当前servlet接受的请求移交给另外一个servlet
rq.forward(req, resp);//请求转发
rq.include(req, resp);//请求包含
- 测试请求转发和请求包含的servlet完整代码:/day03/s021.do 直接接受请求的servlet
package com.zhiyou100_03.servlet;
public class Day03Demo021ForwardInclude extends HttpServlet {
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
int n=Integer.parseInt(req.getParameter("n"));//获取请求参数n
System.out.println("/day03/s021.do:::执行了:::n"+n);
resp.setCharacterEncoding("utf-8");//设置编码集
resp.setContentType("text/html;charset=utf-8");//设置响应的文件格式
if(n%3==0){
System.out.println("当前servlet完成整个功能:接受请求 处理数据 给与响应");
resp.getWriter().print("/day03/s021.do直接响应 不跳转:n="+n);
return;
}
if(n%3==1){
System.out.println("/day03/s021.do不能完成整个功能 需要/day03/s022.do的帮助::请求转发");
RequestDispatcher rq= req.getRequestDispatcher("/day03/s022.do");//获取请求的调度器对象:把当前servlet接受的请求移交给另外一个servlet
rq.forward(req, resp);//请求转发
return;
}
if(n%3==2){
System.out.println("/day03/s021.do不能完成整个功能 需要/day03/s022.do的帮助::请求包含");
RequestDispatcher rq= req.getRequestDispatcher("/day03/s022.do");//获取请求的调度器对象:把当前servlet接受的请求移交给另外一个servlet
rq.include(req, resp);//请求包含
return;
}
}
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req, resp);
}
}
- 试请求转发和请求包含的servlet完整代码:/day03/s022.do 被跳转帮助处理请求的servlet
public class Day03Demo022ForwardInclude extends HttpServlet {
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("/day03/s022.do:::::::执行了!!!!");
resp.getWriter().print("/day03/s022.do接替/day03/s021.do给与响应!!!!");
}
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req, resp);
}
}
2.5 功能5:其他方法
//HttpServletRequest对象功能3:其他方法
System.out.println("获取请求资源的类型:"+req.getContentType());
System.out.println("*获取回话对象:"+req.getSession());
System.out.println("*获取上下文对象:"+req.getServletContext());
System.out.println("获取服务器:LocalAddr:"+req.getLocalAddr());
System.out.println("获取服务器:LocalPort:"+req.getLocalPort());
System.out.println("获取客户端:RemoteAddr:"+req.getRemoteAddr());
System.out.println("获取客户端:RemotePort:"+req.getRemotePort());
System.out.println("*获取项目路径:"+req.getContextPath());
System.out.println("获取请求参数字符串:"+req.getQueryString());
System.out.println("获取指定资源的位置:"+req.getRealPath("1.html"));
System.out.println("*获取servlet的url:"+req.getServletPath());
System.out.println("获取服务器名字:"+req.getServerName());
System.out.println("获取服务器端口:"+req.getServerPort());
System.out.println("*获取所有的cookie:"+req.getCookies());
- 创建页面
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<h1>request对象的功能1:请求参数相关的方法</h1>
<form action="http://localhost:8080/java43_01_web/day03/s1.do" method="get">
名字:<input type="text" name="name" value="韩梅梅"/><br/>
年龄:<input type="text" name="age" value="11"/><br/>
性别: 男<input type="radio" name="sex" value="男"/> |
女<input type="radio" name="sex" value="女"/><br/>
爱好: 篮球<input type="checkbox" name="enjoy" value="lq"/> |
足球<input type="checkbox" name="enjoy" value="zq"/> |
排球<input type="checkbox" name="enjoy" value="pq"/> |
台球<input type="checkbox" name="enjoy" value="tq"/> <br/>
<input type="submit" value="get请求/day03/s1.do"/>
</form>
</body>
</html>
3 get和post的区别
- 测试的servlet
public class Day03Demo03GetPost extends HttpServlet {
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
resp.setCharacterEncoding("utf-8");//设置编码集
resp.setContentType("text/html;charset=utf-8");//设置响应的文件格式
resp.getWriter().print("doGet方法被请求方式是:"+req.getMethod()+",name="+req.getParameter("name")+",age="+req.getParameter("age"));
}
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
resp.setCharacterEncoding("utf-8");//设置编码集
resp.setContentType("text/html;charset=utf-8");//设置响应的文件格式
resp.getWriter().print("doPost方法被请求方式是:"+req.getMethod()+",name="+req.getParameter("name")+",age="+req.getParameter("age"));
}
}
- 测试的页面
<h1>请求方式1:地址栏输入</h1>
<h1>请求方式2:通过超链接发出去请求</h1>
<a href="http://localhost:8080/java43_01_web/day03/s03.do?age=1&name=hmm">超链接请求:/day03/s03.do</a><br/>
<h1>请求方式3:表单:method=get</h1>
<form method="get" action="http://localhost:8080/java43_01_web/day03/s03.do">
名字:<input type="text" name="name" value="hmm"/><br/>
年龄:<input type="text" name="age" value="12"/><br/>
<input type="submit" value="get请求/day03/s03.do"/>
</form>
<h1>请求方式4:表单:method=post</h1>
<form method="post" action="http://localhost:8080/java43_01_web/day03/s03.do">
名字:<input type="text" name="name" value="hmm"/><br/>
年龄:<input type="text" name="age" value="12"/><br/>
<input type="submit" value="get请求/day03/s03.do"/>
</form>
- 总结
get和post都是http请求的常用的两种方式
以下情况下是get请求: 1 地址栏输入URl
2 a标签超链接
3 form method=get
post请求只有一种情况: form method=post
不同之处 1: get请求在地址栏中显示请求参数 :不安全
post请求在地址栏中不显示请求参数 :安全
2: get请求的请求体是空的 请求参数在请求首行:http协议规定 请求首行不能大于1024b 只能传输小量的信息
post请求的请求体是请求参数:http协议 没有对请求体大小限制 可以用于传输文件和大量的数据
4 Response对象的功能
tomcat接收到请求时 会为本次请求创建一个request对象和response请求 分别装本次请求相关信息和响应相关信息
并传递给service方法 用来接受请求 处理数据 给与响应
4.1 设置响应头
//研究resposne对象的功能
//1:设置响应头:Header::服务器对客户端的介绍
resp.setHeader("aa", "aa_value1");
resp.setHeader("aa", "aa_value2");
resp.addCookie(new Cookie("c11", "c1_value1"));//添加cookie:::对应的是请求头:Set-Cookie
resp.addCookie(new Cookie("c12", "c1_value2"));
resp.addCookie(new Cookie("c13", "c1_value3"));
resp.getWriter().print("success!!!!");
4.2 设置响应体
//2:设置响应体:
//resp.getOutputStream();//获取resposne的字节流:一般用于响应字节信息:图片 音乐 视频
// File file=new File("C:\\Users\\Administrator\\Desktop\\1.jpeg");
// FileInputStream fin=new FileInputStream(file);
// byte[] arr=new byte[(int)file.length()];
// fin.read(arr);
// resp.getOutputStream().write(arr);
resp.setCharacterEncoding("utf-8");//设置响应体的编码集:设置服务器端的编码格式是utf-8
resp.setContentType("text/html;charset=utf-8"); //响应文件格式:告诉客户端响应的是html
//告诉客户端解码格式是utf-8
//服务器自己设置响应体时编码格式是utf-8
PrintWriter w=resp.getWriter();//获取response的字符流
w.print("success!!!!成功了");
//注意:不能同时获取getOutputStream和getWriter
4.3 重定向
//3 重定向:实现资源跳转的方式::
resp.sendRedirect("http://localhost:8080/java43_01_web/test.do");
//模拟重定向
//resp.setStatus(302);//设置响应状态码
//<meta http-equiv="refresh" content="3;url=http://www.baidu.com" />
//resp.setHeader("refresh", "4;url=http://localhost:8080/java43_01_web/test.do");//设置响应头:refresh 重设浏览器的url
4.4 其他功能
//4:其他功能
//resp.setStatus(302);//设置响应状态码:200
resp.sendError(3006, "错了 错了!!!!");//设置错误信息和状态码
5 所有路径的写法
5.1 分类
把页面需要输入路径 称为客户端路径:a的href+form的action+js中的路径+response的重定向(等价于设置location的href)
servlet中需要输入路径 称为服务器端路径:请求转发+请求包含
5.2 客户端路径: /html/1.html 请求/day04/s2.do
-
绝对路径:带请求协议:::http://lcoalhost:8080/java43_01_web/day04/s2.do
-
相当于当前主机:省略了当前主机的路径 :::/java43_01_web/day04/s2.do
-
相当于当前资源:省略了当前资源所在目录 ::: …/day04/s2.do
5.3 服务器端路径:day05/s1.do 请求/day04/s2.do
- 相当于当前项目:省略了当前项目的路径 :::/day04/s2.do
- 相当于当前资源:省略了当前资源所在目录 ::: …/day04/s2.do
5.4 测试的页面:::http://localhost:8080/java43_01_web/day042.html
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<h1>测试url路径的所有写法</h1>
<h2>页面1:地址栏直接输入</h2>
<h2>页面2:超链接的href</h2>
<a href="http://localhost:8080/java43_01_web/test/test1.do?num=11">超链接:test.do:::绝对路径:http://localhost:8080/java43_01_web/test/test1.do</a> 成功<br/>
<a href="/java43_01_web/test/test1.do?num=12">超链接:test.do:::相当于当前主机:/java43_01_web/test/test1.do</a> 成功<br/>
<a href="/test/test1.do?num=13">超链接:test.do:::相当于当前项目:/test/test1.do</a> 失败<br/>
<a href="test/test1.do?num=14">超链接:test.do:::相当于当前当前资源:test/test1.do</a> 成功<br/>
<h2>页面3:img的src和a的href</h2>
<h2>页面4:表单的action</h2>
<form action="http://localhost:8080/java43_01_web/test/test1.do" method="post">
num:<input type="text" name="num"/><br/> 成功<br/>
<input type="submit" value="绝对路径:http://localhost:8080/java43_01_web/test/test1.do"/><br/>
</form>
<form action="/java43_01_web/test/test1.do" method="post">
num:<input type="text" name="num"/><br/> 成功<br/>
<input type="submit" value="相当于当前主机:/java43_01_web/test/test1.do"/><br/>
</form>
<form action="/test/test1.do" method="post">
num:<input type="text" name="num"/><br/> 失败<br/>
<input type="submit" value="绝对于当前项目:/test/test1.do"/><br/>
</form>
<form action="test/test1.do" method="post">
num:<input type="text" name="num"/><br/> 成功<br/>
<input type="submit" value="相当于当前资源:test/test1.do"/><br/>
</form>
<h2>页面5:js中设置location的href</h2>
<input type="button" value="绝对路径:http://localhost:8080/java43_01_web/test/test1.do" onclick="f11();"/> 成功<br/>
<input type="button" value="相当于当前主机:/java43_01_web/test/test1.do" onclick="f12();"/> 成功<br/>
<input type="button" value="绝对于当前项目:/test/test1.do" onclick="f13();"/> 失败<br/>
<input type="button" value="相当于当前资源:test/test1.do" onclick="f14();"/> 成功<br/>
<script type="text/javascript">
function f11(){
location.href="http://localhost:8080/java43_01_web/test/test1.do?num=1";
}
function f12(){
location.href="/java43_01_web/test/test1.do?num=1";
}
function f13(){
location.href="/test/test1.do?num=1";
}
function f14(){
location.href="test/test1.do?num=1";
}
</script>
<h1>测试servlet的跳转的时候使用的路径</h1>
<a href="/java43_01_web/day04/s02.do?num=11">请求/day04/s01.do::请求转发到/test/test1.do::使用绝对路径</a> 失败<br/>
<a href="/java43_01_web/day04/s02.do?num=12">请求/day04/s01.do::请求转发到/test/test1.do::使用相当于当前主机</a> 失败<br/>
<a href="/java43_01_web/day04/s02.do?num=13">请求/day04/s01.do::请求转发到/test/test1.do::使用相当于当前项目</a> 成功<br/>
<a href="/java43_01_web/day04/s02.do?num=14">请求/day04/s01.do::请求转发到/test/test1.do::使用相当于当前资源</a> 成功<br/>
<a href="/java43_01_web/day04/s02.do?num=21">请求/day04/s01.do::请求包含到/test/test1.do::使用绝对路径</a> 失败<br/>
<a href="/java43_01_web/day04/s02.do?num=22">请求/day04/s01.do::请求包含到/test/test1.do::使用相当于当前主机</a> 失败<br/>
<a href="/java43_01_web/day04/s02.do?num=23">请求/day04/s01.do::请求包含到/test/test1.do::使用相当于当前项目</a> 成功<br/>
<a href="/java43_01_web/day04/s02.do?num=24">请求/day04/s01.do::请求包含到/test/test1.do::使用相当于当前资源</a> 成功<br/>
<a href="/java43_01_web/day04/s02.do?num=31">请求/day04/s01.do::重定向到/test/test1.do::使用绝对路径</a> 成功<br/>
<a href="/java43_01_web/day04/s02.do?num=32">请求/day04/s01.do::重定向到/test/test1.do::使用相当于当前主机</a> 成功<br/>
<a href="/java43_01_web/day04/s02.do?num=33">请求/day04/s01.do::重定向到/test/test1.do::使用相当于当前项目</a> 失败<br/>
<a href="/java43_01_web/day04/s02.do?num=34">请求/day04/s01.do::重定向到/test/test1.do::使用相当于当前资源</a> 成功<br/>
</body>
</html>
5.5 测试的servlet
- /test/test1.do
package com.zhiyou100_03.servlet;
import java.io.IOException;
import java.util.function.DoubleToIntFunction;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class Test extends HttpServlet {
/*
java43:天道酬勤 不忘初衷!
宝哥:2022年10月24日 上午10:04:37
*/
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
String num=req.getParameter("num");
resp.setCharacterEncoding("utf-8");
resp.setContentType("text/html;charset=utf-8");
resp.getWriter().print("test::::success! 请求参数num="+num);
}
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req, resp);
}
}
- /day04/s2.do
package com.zhiyou100_03.servlet;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class Day04Demo02TestPath extends HttpServlet {
/*
java43:天道酬勤 不忘初衷!
宝哥:2022年10月24日 下午2:44:13
*/
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
String num=req.getParameter("num");
String url="";
if(num.endsWith("1")){
url="http://localhost:8080/java43_01_web/test/test1.do?num="+num;
System.out.println("请求路径是:绝对路径:http://localhost:8080/java43_01_web/test/test1.do?num="+num);
}else if(num.endsWith("2")){
url="/java43_01_web/test/test1.do?num="+num;
System.out.println("请求路径是:相当于当前主机:/java43_01_web/test/test1.do?num="+num);
}else if(num.endsWith("3")){
url="/test/test1.do?num="+num;
System.out.println("请求路径是:相当于当前项目:/test/test1.do?num="+num);
}else{//请求路径是:绝对路径:http://localhost:8080/java43_01_web/day04/s02.do
url="../test/test1.do?num="+num;
System.out.println("请求路径是:相当于资源:../test/test1.do?num="+num);
}
if(num.startsWith("1")){
System.out.println("请求方式是:请求转发");
req.getRequestDispatcher(url).forward(req, resp);
}else if(num.startsWith("2")){
System.out.println("请求方式是:请求包含");
req.getRequestDispatcher(url).include(req, resp);
}else{
System.out.println("请求方式是:重定向");
resp.sendRedirect(url);
}
}
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req, resp);
}
}
总结
客户端路径:绝对路径+相当于当前主机+相当于当前资源
服务器端路径:相当于当前项目+相当于当前资源
推荐:不要使用相当于当前资源
6 请求转发+请求包含+重定向区别
6.1 画图分析
6.2 代码测试
测试内容:三种方式:请求头+域属性+响应体+请求方式+地址栏显示
- 发出请求的页面:day051.html
<h1>测试请求转发+请求包含+重定向的特点</h1>
<a href="/java43_01_web/day05/s01.do?n=1">请求day05/s01.do::s01请求转发到day05/s02.do</a><br/>
<form action="/java43_01_web/day05/s01.do" method="post">
n:<input type="text" name="n" value="1"/><br/>
<input type="submit" value="请求转发 请求方式post"/><br/>
</form>
<hr/>
<a href="/java43_01_web/day05/s01.do?n=-1">请求day05/s01.do::s01请求包含到day05/s02.do</a><br/>
<form action="/java43_01_web/day05/s01.do" method="post">
n:<input type="text" name="n" value="-1"/><br/>
<input type="submit" value="请求包含 请求方式post"/><br/>
</form>
<hr/>
<a href="/java43_01_web/day05/s01.do?n=0">请求day05/s01.do::s01重定向到day05/s02.do</a><br/>
<form action="/java43_01_web/day05/s01.do" method="post">
n:<input type="text" name="n" value="0"/><br/>
<input type="submit" value="重定向 请求方式post"/><br/>
</form>
- 前面的资源:A
//获取请求参数n
int n=Integer.parseInt(req.getParameter("n"));
System.out.println("day05/s01执行了!");
if(n==1){
System.out.println("s01请求转发到s02!!! 请求方式:"+req.getMethod());
//设置响应头
resp.setHeader("h11", "h11_value");
//设置request域属性:在指定范围内实现数据共享 上游存 下游取
req.setAttribute("a1", "a11_value_请求转发");
//获取响应体
resp.setCharacterEncoding("utf-8");
resp.setContentType("text/html;cahrset=utf-8");
resp.getWriter().print("请求转发时::s01给出的响应<br/>");
req.getRequestDispatcher("/day05/s02.do").forward(req, resp);
return;
}
if(n==-1){
System.out.println("s01请求包含到s02!!! 请求方式:"+req.getMethod());
//设置响应头
resp.setHeader("h12", "h12_value");
//设置request域属性:在指定范围内实现数据共享 上游存 下游取
req.setAttribute("a1", "a1_value_请求包含");
//获取响应体
resp.setCharacterEncoding("utf-8");
resp.setContentType("text/html;cahrset=utf-8");
resp.getWriter().print("请求包含时::s01给出的响应<br/>");
req.getRequestDispatcher("/day05/s02.do").include(req, resp);
return;
}
{
System.out.println("s01重定向到s02!!! 请求方式:"+req.getMethod());
//设置响应头
resp.setHeader("h13", "h13_value");
//设置request域属性:在指定范围内实现数据共享 上游存 下游取
req.setAttribute("a1", "a1_value_重定向");
//获取响应体
resp.setCharacterEncoding("utf-8");
resp.setContentType("text/html;cahrset=utf-8");
resp.getWriter().print("重定向时::s01给出的响应<br/>");
//resp.sendRedirect("/java43_01_web/day05/s02.do");
resp.sendRedirect("http://www.baidu.com");
return;
}
- 后面的资源:B
System.out.println("s02接受到请求::::: 请求方式:"+req.getMethod());
//设置响应头
resp.setHeader("h20", "h20_value");
//获取request域属性:在指定范围内实现数据共享 上游存 下游取
System.out.println("获取request域属性:::::a1="+req.getAttribute("a1"));
//设置响应体
resp.setCharacterEncoding("utf-8");
resp.setContentType("text/html;cahrset=utf-8");
resp.getWriter().print("第二个资源:::::s02给出的响应<br/>");
6.3 总结
请求转发:A请求转发到B
-
A 不能设置响应体 :B设置响应体
-
A和B的请求方式相同
-
request域对象可以使用:实现A到B的数据共享
-
A和B都可以设置响应头
-
请求次数 1
-
地址栏显示:A
请求包含:A请求包含到B
- A 可以设置响应体 :B可以设置响应体
- A和B的请求方式相同
- request域对象可以使用:实现A到B的数据共享
- A可以设置响应头 B不能设置响应头
- 请求次数 1
- 地址栏显示:A
重定向:A重定向到B
- A 不能设置响应体 :B设置响应体
- B的方式永远是get
- request域对象不能使用
- A设置的响应头只在第一次请求中有效 B设置的响应头只在第二次中有效
- 请求次数 2
- 地址栏显示:B
6.4 请求转发和请求包含的区别:A请求转发/请求包含到B
相同之处:都是请求调度器RequestDispatcher的方法
请求次数都是1
都可以通过request域对象实现数据共享
地址栏显示的都是A
都是一个请求被多个资源处理
不同之处:1:代码不同 请求转发是RequestDispatcher的forward方法 请求包含是RequestDispatcher的include方法
2:响应体的设置不同:请求转发 A不能设置响应体 B设置响应体 请求包含 AB都可以设置响应体
3:响应头的设置不同:请求转发 AB都可以设置响应头 请求包含 A能设置响应头 B不能设置响应头
6.5 请求转发和重定向的区别:A请求转发/重定向到B
相同之处:都能实现资源跳转
不同之处:1 代码不同:请求转发是RequestDispatcher的forward方法 重定向是response的sendRedirect方法
2 请求次数不同:请求转发是1次请求被两个资源处理 重定向是两次请求被两个资源处理
3 地址显示不同:请求转发 地址栏显示的是A 重定向地址栏显示的是B
4 是否可以使用request域对象:请求转发是一次请求被两个资源处理 可以使用request域对象实现数共享
重定向是两个资源分别处理各自的请求 不能通过request域对象实现数据共享
5 B的请求方式不同:请求转发 AB处理的是一个请求 请求方式相同
重定向:B的请求方式一定是get请求
6 可以跳转的资源不同:请求转发只能转发到当前项目的资源
重定向可以为任意资源(可以是其他项目的资源)