会话、Cookie、Session、JSP
会话技术
1、什么是会话
一个用户,打开浏览器,浏览多个页面,在这个多个页面中进行切换,最后关闭浏览器,这个过程,这个过程中,其实是在访问同一个web应用.点击了多个超链接,发送了多个请求
2、什么是会话技术
实现会话过程中数据的共享
3、作用
保存用户在会话过程中产生的数据
让用户在同一个会话过程中实现数据的共享
4、分类
(1)浏览器(cookie)
不太安全,可能会被清掉,服务器怎么知道浏览器里面有数据 —每次访问服务器的时候把数据带过去
(2)服务器(session)
占用空间,容易弄混,需要解决服务器如何识别这个数据是哪一个用户的
(3)总结
存在浏览器,主要是带来带去,存在服务器,我要识别这个数据是谁的
Cookie
相关概念
客户端的会话技术.把数据保存在客户的浏览器上
快速入门
服务器上怎么创建一个cookie Cookie c = new Cookie(“msg”,“liuyan”);
服务器怎么把cookie传给浏览器 response.addCookie©;
服务器怎么获取浏览器带过来的cookie Cookie[] cookies = request.getCookies();
CookieDemo01
//设置数据
//创建一个cookie对象
Cookie c = new Cookie("msg","jiege");
//发送cookie到浏览器
response.addCookie(c);
CookieDemo02
//获取数据
//获取请求中的cookie数据
Cookie[] cookies = request.getCookies();
//遍历数据,打印cookie
if (cookies != null){
for (Cookie cookie : cookies) {
//获取cook的名字
String name = cookie.getName();
//获取cookie里面的值
String value = cookie.getValue();
//打印
System.out.println(name + "..." + value);
}
}
执行原理
服务器端创建,传给浏览器,浏览器再保存到本地文件,以后每次访问这个项目的时候带过去
第一次;响应对象:Set-Cookie: msg=xxx
第二次:请求对象:Cookie: msg=xxx
属性方法
1、常用属性
属性 | 备注 |
---|---|
name | cookie的名称 |
value | cookie的值 |
path | cookie的路径 |
domain | cookie的域名 |
maxAge | cookie的存活时间 |
2、常用方法
方法 | 备注 |
---|---|
getName() | 获取cookie的名称 |
getValue() | 获取cookie的值 |
response.addCookie( c ) | 将cookie传给浏览器 |
request.getCookies() | 获取浏览器传过来的cookie |
使用细节
1、一次可以发送多个cookie
2、存活时间
默认一次会话有效,可以通过setMaxAge()设置它的存活时间
0:立即删除(浏览器收到响应消息之后,才会删除本地的cookie文件)
负数:会话结束之后删除(默认)
正数:设置存活时间,以秒为单位
3、存储中文
如果有特殊字符,存储的时候就会报错(比如空格等)
先编码存进去:URLEncoder.encode()
取出来之后再解码:URLDecoder.decode()
4、共享问题
通过setPath来设置cookie多个项目下共享
通过setDomain(“baidu.com”)可以设置cookie在多个服务器下共享
http://news.baidu.com http://tieba.baidu.com baidu.com就是一级域名
5、应用场景
定制页面 天气预报 记住上一次的访问地点
记住用户名 显示用户上一次访问时间
Session
相关概念
服务器端技术,可以实现一次会话的多个请求中数据的共享,数据存在session域对象中
快速入门
SessionDemo01
//设置数据
//获取session对象
HttpSession session = request.getSession();
//存数据
session.setAttribute("msg","倩倩 栋栋");
SessionDemo02
//获取数据
//获取session对象
HttpSession session = request.getSession();
//取数据
Object msg = session.getAttribute("msg");
System.out.println(msg);
执行原理
1、存取数据用的是session对象,因为session对象是域对象,在一次会话中有效
2、识别每个用户的session,使用的JSessionid,其实就是基于cookie
第一次访问:服务器给浏览器:Set-Cookie: JSESSIONID=996C56A63EE717B3EA74C8AA932058AD;
第二次访问:浏览器给服务器:Cookie: JSESSIONID=996C56A63EE717B3EA74C8AA932058AD
常用方法
setAttribute()
getAttribute()
removeAttribute()
getId()
invalidate()
使用细节
1、session基于cookie,尽量不要禁用cookie.可以给出提示或者通过encodeURL方法重写地址,推荐给出提示
2、当客户端关闭,服务器不关闭,两次获取的session不是同一个了,因为客户端打开再关闭,Jsessionid已经被销毁了(Jsessionid在一次会话结束之后就没有了);当客户端不关闭,服务器关闭在重启,两次获取的session不是同一个了,服务器在关闭的时候会对里面的session做一个钝化(存到本地),重启的时候做一个活化(从本地读取,重新创建一个session对象,数据还是在里面)
3、session域对象范围
(1)时间范围
创建:第一次调用request.getSession()的时候,就会创建session对象
销毁:
a) 超时,默认30分钟(从最后一次请求算起)
b) 手动调用invalidate()方法,销毁session
c) 非正常关闭服务器(如果是正常关闭,会有钝化和活化)
(2)空间范围
同一个会话中所有的请求资源都可以访问
JSP
相关概念
java的服务器页面,很类似html页面,但是他是一个动态的页面,可以在html页面插入java代码;本质是一个servlet,执行的时候会把jsp翻译成servlet,然后在编译成class文件
基础语法
1、代码块
<% 代码块 %>
将来会被翻译到servlet的service方法中
2、声明
<%! 代码块 %>
将来会被翻译到servlet的service方法外面,用于定义成员变量或者成员方法
3、表达式
<%= 代码 %>
将来会被翻译到servlet的service方法里面的out.print()里面(也就是输出到页面)
4、注释
<%-- 注释内容 --%>
三大指令
1、Page指令
(1)作用:
设置页面的属性和行为
(2)格式:
<%@ page 属性名=属性值>
(3)常见属性:
import:用于导入java包或者类
content-type:解决向浏览器输入中文的乱码问题
2、include指令
(1)作用:
包含其他页面
(2)格式:
<%@ include 属性名=属性值>
(3)常见属性:
file:指定jsp页面包含文件的路径
3、taglib指令
(1)作用:
引入标签库
(2)格式:
<%@ taglib 属性名=属性值>
(3)常见属性:
uri:引入标签库的路径
prefix:引入标签库的别名
九大内置对象
内置对象:就是jsp给我们开发人员预定义好的,我们不需要自己创建,直接拿过来用就可以了
名 | 备注 |
---|---|
pageContext | 页面的上下文对象 |
request | 请求对象 |
response | 响应对象 |
session | 会话对象 |
application | 项目的上下文对象,类似servletContext |
out | 输出对象,将数据输出到页面 |
page | 当前jsp翻译成servlet之后对象的引用 |
config | servlet的配置对象类似servletConfig |
exception | 异常对象 |
四大域对象
名 | 备注 |
---|---|
pageContext | 页面的上下文对象 范围是当前页面 |
request | 请求对象 ,范围是当前请求 |
session | 会话对象 范围是当前会话 |
application | 项目的上下文对象, 范围是当前应用 |
pageContext 页面的上下文对象
作用:
1,可以获取其他八个内置对象,但是我们很少这么使用 EL表达式中会用到
2,他也是一个域对象,可以用来临时存储数据,范围是当前的页面