文章目录
请求转发和重定向
- 重定向
//之前的写法
response.setStatus(302);
response.setHeader("Location","login_successs.html");
//重定向写法:重新定位方向
response.sendRedirect("login_success.html");
1.地址上显示的是最后的那个资源的地址
2.请求次数最少有两次,服务器在第一次请求后,会返回302以及一个地址,浏览器会根据这个地址执行第二次代码
3.可以跳转到任意路径,不是自己的工程也可以跳
4.效率稍微低一点,执行两次请求
5.后续的请求,没法使用上一次request存储的数据,或者没有办法用上一次的request对象,因为这是两次不同的请求
- 请求转发
请求转发的写法:参数即跳转位置
request.getRequestDispatcher("login_success.html").forward(request,response);
1.地址上显示的是请求servlet的地址
2.请求次数只有一次,因为是服务器内部帮客户端执行了后续的工作
3. 只能跳转自己项目的资源路径
4. .效率上稍微高一点,因为只执行一次请求
5. 可以使用上一次的request对象
Cookie
- 其实是一份小数据,是服务器给客户端,并且存储在客户端上的一份小数据
- 应用场景:自动登陆,浏览记录,购物车
- 为什么要有这个Cookie:http的请求是无状态的。客户端与服务器在通讯的时候,是无状态的,其实就是客户端在第二次来访的时候,服务器根本就不知道这个客户端以前有没有来访过。为了更好的用户习惯,更好的交互[自动登陆],其实从公司层面上讲,就是为了更好的手机用户习惯【大数据】
Cookie有什么用
- 在响应的时候,添加cookie
package com.java.servlet;
import java.io.IOException;
public class Demo01 extends HttpServlet {
protected void doGet(HttpServletRequest request,HttpServletResponse response) throws ServletException,IOException {
response.setContentType("text/html;charset=UTF-8");
Cookie cookie = new Cookie("aa","bb");
response.addCookie(cookie);
response.getWriter().write("发送了一个请求,而且有一个cookie");
}
protected void doPost(HttpServletRequest request,HttpServletResponse response) throws ServletException,IOException {
doGet(request,response);
}
}
- 客户端收到的信息里面,响应头中多了一个字段Set-Cookie
- 创建对象的几种方法
- 直接new
- 单例模式 | 提供静态方法
- 工厂模式构建stu(StuFactory StuBuilder)
获取Cookie
//获取客户端带过来的cookie
Cookie[] cookies = request.getCookies();
if(cookies != null) {
for(Cookie c : cookies) {
String cookieName = c.getName();
String cookieValue = c.getValue();
System.out.println(cookieName+"="+cookieValue);
}
}
Cookie常用方法
关闭浏览器后,cookie就没有了。--->针对没有设置cookie的有效期
//正值:表示在这个数字过后,cookie将会失效
//负值:关闭浏览器,那么cookie就失效,默认值为-1
cookie.setMaxAge(60 * 60 * 24 * 7);
//赋新的值
cookie.setValue(newValue);
//用于指定只有请求了指定的域名,才会带上该cookie
cookie.setDomin(".java.com");
//只有访问该域名下的cookieDemo的这个路径地址才会带cookie
cookie.setPath("/CookieDemo");
例子1(显示最近访问的时间)
分析:
- 判断账号是否正确
- 如果正确,则获取cookie,但是得到的是一个数组,我们要从数组里面找到我们想要的对象
- 如果找到对象为空,表明是第一次登陆,那么需要添加cookie
- 如果找到对象不为空,表明不是第一次登陆
- login.html
<h2>填写信息进行登陆</h2>
<form action="Demo03" method="get">
账号:<input type="text" name="username" /><br/>
密码:<input type="password" name="password" /><br />
<input type="submit" value="登陆">
</form>
- 处理login.html页面发来的请求的servlet
response.setContentType("text/html;charset=UTF-8");
String username = request.getParameter("username");
username = new String(username.getBytes("ISO-8859-1"),"UTF-8");
String password = request.getParameter("password");
if("admin".equals(username) && "123".equals(password)) {
//通过request获取cookie,不过是一个数组
Cookie[] cookies = request.getCookies();
//通过一个工具类中的findCookie()方法找到所需要的cookie
Cookie cookie = CookieUtil.findCookie(cookies,"last");
if(null == cookie) {
//如果cookie为空,设置一个cookie,并返回给客户端
Cookie cookie2 = new Cookie("last",System.currentTimeMillis()+"");
cookie2.setMaxAge(cookie2);
response.addCookie(cookie2);
response.getWriter().write("欢迎您"+username);
} else {
long lastVisitTime = Long.parseInt(cookie.getValue());
response.getWriter().write("欢迎您"+username+" 上次来访时间为:"+new Date(lastVisitTime));
cookie.setValue(System.currentTimeMillis()+"");
response.addCookie(cookie);
}
} else {
response.getWriter().write("登陆失败!");
}
- 工具类
public class CookieUtil {
public staic Cookie findCookie(Cookie[] cookies,String name) {
if(null != cookies) {
for(Cookie cookie : cookies) {
if(name.equals(cookie.getName()))
return cookie;
}
}
return null;
}
}
Jsp里面使用java代码
//定义局部变量
<% int a = 99; %><br />
//定义全局变量
<%! int b = 999;%><br />
<%=a %><br />
<%=b %><br />
由于cookie会保存在客户端上,所以有安全隐患问题,还有一个问题,Cookie的大小和个数有限制。为了解决这个问题,就有了Session
Session
Session介绍
会话,Session是基于Cookie的一种会话机制。Cookie是服务器返回一小份数据给客户端,并且存放在客户端上,Session是数据存放在服务器端
Session常用API
- 得到会话ID
String id = session.getId();
- 存值
session.setAttribute(name,value);
- 取值
session.getAttribute(name);
- 移除值
session.removeAttribute(name);
session生存周期
- 创建:如果有在servlet里面调用了request.getSession()
- 销毁:seesion是存放在服务器内存中的一份数据。可以持久化,即便关掉了浏览器,session也不会销毁
- 关闭服务器
- session会话时间过期。默认有效期:30分钟
简单购物车例子
- product_list.jsp
- CarServlet.java
- cart.jsp
- clearCartServlet.java