标题request和response主要区别:
1、 请求转发使用 request对象,重定向使用 response 对象
2、 请求转发使用服务器端路径,重定向使用客户端路径
3、 请求转发不能跳转外网,重定向可以跳转外网
4、 请求转发是服务器内部的跳转,不依赖网速,跳转速度极快
——重定向是依赖浏览器的跳转,严重依赖网速,跳转速度略慢
5、 请求转发:请求一次,响应一次, 占用资源少
——重定向:重定向 N 次,响应 n+1 次,占用大量资源
6、 请求转发可以访问受保护目录资源WEB-INF,重定向不能访问受保护目录
7、 请求转发不会改变地址栏路径,重定向会改变路径。
——安全:请求转发。会隐藏后面转发程序的访问路径。
——程序 BUG:由于请求转发不会更改地址,会导致用户重复访问某个 Servlet程序。解决方案:建议改为重定向
8、 请求转发可以使用 request 作用域,重定向不能使用request作用域
何时使用request和response
何时使用请求转发。
1、 为了安全,隐藏某些程序的访问路径
2、 为了效率
3、 为了内存占用率低
4、 访问受保护目录资源
5、 使用 request 作用域
何时使用重定向:
1、 跳转外网路径
2、 改变地址栏访问路径
除了以上 7 种情况外,两种跳转方式可以相互替代使用
请求转发&重定向图示
请求外网,用重定向,其他所有使用请求转发即可
request原理简述&继承树&行头体操作
原理
继承树
行
public void t2(){
//http://localhost:8080/day05/d1?method=t2
//操作请求行
System.out.println(getRequest().getRemoteAddr());//0:0:0:0:0:0:0:1 因为是服务器自己开浏览器访问自己,所以客户端地址仍然是服务器的
System.out.println(getRequest().getContextPath());// /day05
System.out.println(getRequest().getMethod());//GET
System.out.println(getRequest().getRequestURI());// /day05/d1
System.out.println(getRequest().getQueryString());// method=t2
System.out.println(getRequest().getProtocol());// HTTP/1.1
System.out.println(getRequest().getServletPath());// /d1
System.out.println(getRequest().getRemoteHost());// 0:0:0:0:0:0:0:1 因为是服务器自己开浏览器访问自己,所以客户端主机仍然是服务器的
System.out.println(getRequest().getRemotePort());// 51088
System.out.println(getRequest().getLocalAddr());// 0:0:0:0:0:0:0:1
头
public void t3(){
HttpServletRequest request = getRequest();
System.out.println(request.getHeader("Accept"));
System.out.println(request.getHeader("User-Agent"));
System.out.println(request.getHeader("aa"));//null
}
体
public void t1(){
//后台进行数据获取时,get遇到中文或特殊符号,会导致乱码问题
//1、写过滤器
//2、使用tomcat8.5或以上版本
Person person = toBean(Person.class);
System.out.println(person);
//原生获取方式
System.out.println("----------");
String username = getRequest().getParameter("username");
String aaa = getRequest().getParameter("aaa");
String hobbyStr = getRequest().getParameter("hobby");
System.out.println(username);
System.out.println(aaa);
System.out.println(hobbyStr);
System.out.println("----------");
String[] hobbies = getRequest().getParameterValues("hobby");
System.out.println(Arrays.toString(hobbies));
String[] bbb = getRequest().getParameterValues("bbb");
System.out.println(bbb);
System.out.println("----------");
Map<String, String[]> map = getRequest().getParameterMap();
System.out.println(map);
}
response原理简述&继承树&行头体操作
原理概述
继承树
行
头
public void t6(){
HttpServletResponse response = getResponse();
//追加
response.addHeader("aa","a1");
response.addHeader("aa","a2");
//覆盖
response.setHeader("bb","b1");
response.setHeader("bb","b2");
//如果响应体中,包含中文
//response.setCharacterEncoding("utf-8");//设置响应体的编码为utf-8
response.setContentType("text/html;charset=utf-8");//设置响应体里是html文本,编码是Utf-8
}
体
响应体信息无限,所以一般用来传递大量数据。
字节流:” getOutputStream()
向响应体输出二进制字节流信息。【文件下载】
字符流:”getWriter()
向响应体输出字符流信息。【字符串及前端代码输出,Ajax,axios】
若输出前端代码,则会被浏览器解析执行
两个方法我们都使用其 write()方法进行数据输出。
<------------------------------------------------------->
public void t7() throws IOException {
//注意:两个流不能同时调用, 否则出现异常:IllegalStateException
HttpServletResponse response = getResponse();
//字节流
// ServletOutputStream os = response.getOutputStream();
// os.write(" 今天天气好晴朗 ".getBytes("utf-8"));
//字符流
PrintWriter writer = response.getWriter();
writer.write("<h1>今天天气好晴朗</h1>");
writer.flush();//建议刷流操作在请求转发中不要使用
writer.write("<h1>处处好风光</h1>");
//writer.close();//建议:不建议手动关流,因为该流是由服务器创建,服务器会对该流进行close()操作
}