07_servlet02

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 {

	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 {

	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 可以跳转的资源不同:请求转发只能转发到当前项目的资源
                          重定向可以为任意资源(可以是其他项目的资源)

7 域对象

8 回话跟踪技术:cookie

9 回话跟踪技术:session

10 文件上传

11 文件下载

12 面试重点

  • servlet的生命周期

  • 请求转发和重定向的区别

  • session和cookie的概念和区别

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值