今日内容
1. 会话技术
1. Cookie
2. Session
2. JSP:入门学习
1、会话技术
会话技术的相关介绍如下:(见视频2解析,理解会话技术的原理。主要是会话能干什么)
1. 会话:一次会话中包含多次请求和响应。
* 一次会话:浏览器第一次给服务器资源发送请求,会话建立,直到有一方断开为止
2. 功能:在一次会话的范围内的多次请求间,共享数据
之前提到HTTP协议是无状态的,它的多次请求之间不能进行数据的交互。如果我们想在一次会话中,在多次请求之间进行数据的交互共享,必须使用到会话技术。
3. 方式:
1. 客户端会话技术:Cookie
2. 服务器端会话技术:Session
2、Cookie
概念:客户端会话技术,将数据保存到客户端。(Cookie是怎么操作的?视频3解析,很重要)
Cookie使用过程的说明:第一次请求服务器会发送一些数据回浏览器,浏览器将这些数据保存在浏览器本地。第二次请求,浏览器又会将第一次请求服务器发回的数据带在第二次请求之上发回给服务器,这样就实现了2次请求响应之间进行了数据的共享。最终这些数据是存储在客户端浏览器的。
快速入门:
* 使用步骤:
1. 创建Cookie对象,绑定数据(服务器会返回给客户端的一些数据,这时要共享的数据已经存储到Cookie。不需要在多次请求间共享的数据不会绑定到Cookie)
* new Cookie(String name, String value)
2. 发送Cookie对象(服务端Response在发送相应回客户端的时候,会使用addCookie将Cookie发送回客户端)
* response.addCookie(Cookie cookie)
当客户端接收到服务器端返回的Cookie的时候,会将Cookie的数据保存到本地。当客户端第二次向服务器发送请求的时候,会自动将Cookie携带在第二次请求上发送回服务器(只要2次请求在同一次会话中)。这时服务器就可以通过 request.getCookies方法获取Cookie,这样就可以知道上一次请求服务器端返回给客户端的数据(这些数据保存在Cookie中)
3. 获取Cookie,拿到数据
* Cookie[] request.getCookies()
注意,当第3(4,5,...n)次客户端给服务器发送请求的时候,之前多次服务器响应回给客户端浏览器的所有Cookie都会携带在这次请求之上,当这次会话结束后,所有的Cookie也会被清除。
注意,Cookie对象的一系列操作都是在服务器代码层面进行操作的,包括new Cookie、addCookie、getCookies。 浏览器2次请求访问的资源可能不同。
实现代码如下:(注意。视频3-6.50介绍怎么修改IDEA中创建Servlet的模板,方便)
/cookieTest1
package lkj.test.cookie;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
@WebServlet("/cookieTest1")
public class CookieTest1 extends HttpServlet
{
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
{
/*
首先客户端发送第一次请求给服务器端,服务器要发送一些数据给客户端。
我们先创建Cookie对象,将服务器发回数据中想在多次请求间共享的数据封装到Cookie(不是所有数据都想在多次请求间共享)
*/
//这里name和value之间不要使用空格,由于tomcat的版本比较高,所以在addCookie时name与value是不能使用空格的 ,否则报错
Cookie c = new Cookie("msg" , "hellocookie");
//我们将Cookie加到Response对象,这样Response对象返回数据的时候也会将Cookie返回给客户端
response.addCookie(c);
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
{
this.doPost(request, response);
}
}
/cookieTest2
package lkj.test.cookie;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
@WebServlet("/cookieTest2")
public class CookieTest2 extends HttpServlet
{
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
{
/*
客户端接收到服务器针对第一次请求所返回的数据(包括Cookie),会将Cookie数据保存在本地(其他数据可能不会保存在本地)
然后客户端发送第二次请求会自动带上Cookie,第二次请求可能访问服务器不同的资源(比如访问第二次这个CookieTest2,第一次访问CookieTest1)
服务器接收到第二次请求后,可以从第二次请求中取出上一次请求服务器发送给客户端的cookie数据,这样便实现Cookie数据在多次请求之间共享。
*/
//使用Request对象获取Cookie
Cookie[] cs = request.getCookies();//可能有多个Cookie,因此这里返回的是Cookie的数组
//获取的Cookie可能为null(上一次请求没有返回响应的时候没有设置Cookie),判断一下
if(cs != null)
{
for (Cookie cookie : cs)
{
String name = cookie.getName();
String value = cookie.getValue();
System.out.println(name+":"+value);
}
}
}
protected void doGet(HttpServletRequest request, HttpServletR