Servlet中的请求转发:【重点】
什么是请求转发:
是服务器请求资源,服务器直接访问目标地址的URL,把那个URL的响应内容读取过来,然后把这些内容再发给浏览器,浏览器根本不知道服务器发送的内容从哪里来的,因为这个跳转过程是在服务器中实现的,并不是在客户端实现的,所有它的地址栏还是原理的地址。
特点:
-
请求转发的地址栏不变,这是一次请求
-
请求转发是服务器内部行为
-
当做域对象使用,即相当于容器,可以转载数据
-
两个servlet中请求域数据在一次请求转发中是共享的
工作原理:
-
用户第一次通过手动方式要求浏览器访问Servlet
-
Servlet工作完成后,通过当前的请求对象代替浏览器向服务器发送请求申请再次调用Servlet1
-
服务器接受请求后,自动调用Servlet1来完成剩余的任务
实现命令:
//通过当前请求对象生成资源文件(路径)申请报告对象 RequestDispathcher requestDispatcher = request.getRequestDispatcher("路径") //将报告对象发给服务器 requestDispatcher.forward(request,response)
优点:
-
无论本次请求涉及到多少Servlet,浏览器只是发送一次请求
-
Servlet之间调用发生在服务器计算机上,节省服务器与浏览器之间往返次数增加处理服务速度
重定向:(Redirect)
是服务端根据逻辑发送一个状态吗,告诉浏览器重新取去请求那个地址,所以地址栏显示的是新的URL
工作原理:
-
用户第一次通过手动方式通过浏览器访问服务器中的Servlet
-
Servlet工作完毕后,将Servlet1写入到响应头localhost属性中,导致服务器将302状态码写入到状态行
实现命令:
response.sengRedirect("请求地址")
特点:
-
重定向是浏览器行为
-
浏览器的根路径是端口,即 http://localhost:8080/
-
请求如果从” / “开始,就会从8080开始访问,就会丢失项目名,报错404
-
重定向是两次请求
缺点:
重定向需要在浏览器与服务器之间惊醒多次往返,大量时间消耗在往返上,增加用户等待服务时间
会话技术-状态保存:
Cookie[熟悉]
-
创建
-
响应到浏览器
// 在服务器中 Cookie cookie = new Cookie(key,value); resp.addCookie(cookie)
-
获取cookie
// 从请求中获得cookie.一次获得全部的cookie对象 // 但是一次获得当前站点所有cookie对象,没有获得单独某一个cookie Cookie[] cookies = req.getCookies(); for (int i = 0; cookies != null && i < cookies.length; i++) { Cookie ck = cookies[i]; String name = ck.getName( ); String value = ck.getValue( ); System.out.println(name+"="+value ); }
-
删除cookie
-
没有删除的方法
-
主要靠最大生命值来确定
-
默认保存至会话结束(浏览器关闭)
-
也可以通过在创建时指定生命周期时间
-
setMaxAge
-
大于0,存在指定的秒
-
等于0,直接删除
-
小于0,一般是-1 ,保存至浏览器关闭
-
// 创建cookie Cookie cookie = new Cookie("username","admin");// 中文会乱码 // 创建的cookie,默认存储到浏览器关闭. // 可以设置时间,单位是秒!! // cookie.setMaxAge(30); // cookie.setMaxAge(0); // 直接删除该cookie cookie.setMaxAge(-1); // 保存至浏览器关闭
-
-
设置cookie的路径:cookie设置路径,其实就是设置cookie的读取范围
// 设置cookie路径 cookie.setPath("/day40/user");
// 中文编码 URLEncoded.encoded("value","UTF-8") // 将乱码解码成中文 URLDecode.decode(value,"UTF-8")
Session[重点]
-
是什么
-
会话技术,是将数据保存在服务器
-
session基于cookie
-
浏览器会利用cookie存储一个叫做JSESSIONID的值
-
-
创建:
-
//从请求中获得session对象 HttpSession session = request.getSession() //session像请求域一样,被叫做session域 session.setAttribute("name","xiaohua"); //销毁session // session.invalidate(); //请求转发 RequestDispatcher requestDispatcher = req.getRequestDispatcher("/se2"); requestDispatcher.forward(req,resp); /获得session HttpSession session = req.getSession(); //取值 String username = (String)req.getAttribute("name");
-
存储数据
-
一般用在登录成功后,将用户信息存储到session
-
-
获取数据[重点]
-
请求转发后从另外一个Servlet取值,可以取出session的值
-
重定向后从另外一个Servlet取值,可以取出session的值
-
因为session域是在整个会话有效,只要会话不结束,当前服务器中的请求都可以获得session域的数据
-
-
删除
// 销毁session session.invalidate();
删除session一般用在注销登录
-