- 请求对象,一次请求
- response:响应对象
- session :会话对象,一个浏览器对应一个 session
- application:整个项目全局对象,所有用户共享
- pageContext:页面上下文,能获取其他所有对象
- out:页面输出流,向页面写内容
- page:当前 JSP 实例(this)
- config:Servlet 配置
- exception:异常对象(错误页面用)
四个域对象(存数据用)
从小到大:
- pageContext:仅当前页面
- request:一次请求内有效(转发有效,重定向失效)
- session:一个浏览器会话有效
- application:整个项目全局有效
存 / 取:setAttribute / getAttribute
五、EL 表达式 ${}
- 作用:简化取值,代替 JSP 脚本
- 用法:
- 取域中数据:
${register_msg} - 取对象属性:
${user.username}
- 取域中数据:
- 注意:
- 要开启
isELIgnored="false" - 只能取域对象里存的数据
- 要开启
六、JSTL 标签库
配合 EL 使用,代替 JSP 脚本,页面不写 Java 代码常用核心标签:
<c:if>:条件判断<c:forEach>:循环遍历列表、数组
使用步骤:
- 导入依赖
- 页面
taglib引入 - 直接用标签
七、转发 和 重定向(JSP/Servlet 必考点)
1. 转发(服务器内部跳转)
java
运行
req.getRequestDispatcher("/xxx.jsp").forward(req,resp);
- 地址栏不变
- 一次请求,request 数据共享
- 可以访问 WEB-INF 资源
2. 重定向(浏览器重新请求)
java
运行
resp.sendRedirect("xxx.jsp");
- 地址栏变
- 两次请求,request 数据丢失
- 不能访问 WEB-INF
八、JSP 和 Servlet 分工
- Servlet :后台干活(接收请求、处理业务、操作数据库、存数据到域)
- JSP :前台展示(取域中数据、页面渲染、循环、判断)
MVC 思想:Servlet 做控制器,JSP 做视图
九、Session 重点(你刚做的验证码项目)
- 一个浏览器 = 一个 Session
- 存在服务器端 ,靠
JSESSIONID标识 - 跨页面、跨 Servlet 共享数据
- 验证码原理:
- 生成验证码 → 存入 Session
- 注册页面提交 → 从 Session 取值对比
Cookie
学习Cookie,我们主要解决下面几个问题:
-
什么是Cookie?
-
Cookie如何来使用?
-
Cookie是如何实现的?
-
Cookie的使用注意事项有哪些?
2.1 Cookie的基本使用
1.概念
==Cookie==:客户端会话技术,将数据保存到客户端,以后每次请求都携带Cookie数据进行访问。
2.Cookie的工作流程

3.Cookie的基本使用
对于Cookie的使用,我们更关注的应该是后台代码如何操作Cookie,对于Cookie的操作主要分两大类,本别是==发送Cookie==和==获取Cookie==,对于上面这两块内容,分别该如何实现呢?
3.1 发送Cookie
- 创建Cookie对象,并设置数据
Cookie cookie = new Cookie("key","value");
- 发送Cookie到客户端:使用==response==对象
response.addCookie(cookie);
介绍完发送Cookie对应的步骤后,接下面通过一个案例来完成Cookie的发送,具体实现步骤为:
需求:在Servlet中生成Cookie对象并存入数据,然后将数据发送给浏览器
1.创建Maven项目,项目名称为cookie-demo,并在pom.xml添加依赖
2.编写Servlet类,名称为AServlet
3.在AServlet中创建Cookie对象,存入数据,发送给前端
4.启动测试,在浏览器查看Cookie对象中的值
(1)创建Maven项目cookie-demo,并在pom.xml添加依赖
<properties>
<maven.compiler.source>8</maven.compiler.source>
<maven.compiler.target>8</maven.compiler.target>
</properties>
<dependencies>
<!--servlet-->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>3.1.0</version>
<scope>provided</scope>
</dependency>
<!--jsp-->
<dependency>
<groupId>javax.servlet.jsp</groupId>
<artifactId>jsp-api</artifactId>
<version>2.2</version>
<scope>provided</scope>
</dependency>
<!--jstl-->
<dependency>
<groupId>jstl</groupId>
<artifactId>jstl</artifactId>
<version>1.2</version>
</dependency>
<dependency>
<groupId>taglibs</groupId>
<artifactId>standard</artifactId>
<version>1.1.2</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.apache.tomcat.maven</groupId>
<artifactId>tomcat7-maven-plugin</artifactId>
<version>2.2</version>
</plugin>
</plugins>
</build>
(2)编写Servlet类,名称为AServlet
@WebServlet("/aServlet")
public class AServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//发送Cookie
//1. 创建Cookie对象
Cookie cookie = new Cookie("username","zs");
//2. 发送Cookie,response
response.addCookie(cookie);
}
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doGet(request, response);
}
}
3.2 获取Cookie
- 获取客户端携带的所有Cookie,使用==request==对象
Cookie\[\] cookies = request.getCookies();
-
遍历数组,获取每一个Cookie对象:for
-
使用Cookie对象方法获取数据
cookie.getName();
cookie.getValue();
)在BServlet中使用request对象获取Cookie数组,遍历数组,从数据中获取指定名称对应的值
@WebServlet("/bServlet")
public class BServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//获取Cookie
//1. 获取Cookie数组
Cookie\[\] cookies = request.getCookies();
//2. 遍历数组
for (Cookie cookie : cookies) {
//3. 获取数据
String name = cookie.getName();
if("username".equals(name)){
String value = cookie.getValue();
System.out.println(name+":"+value);
break;
}
}
}
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doGet(request, response);
}
}
2.2 Cookie的原理分析

-
前面的案例中已经能够实现,AServlet给前端发送Cookie,BServlet从request中获取Cookie的功能
-
对于AServlet响应数据的时候,Tomcat服务器都是基于HTTP协议来响应数据
-
当Tomcat发现后端要返回的是一个Cookie对象之后,Tomcat就会在响应头中添加一行数据==
Set-Cookie:username=zs== -
浏览器获取到响应结果后,从响应头中就可以获取到
Set-Cookie对应值username=zs,并将数据存储在浏览器的内存中 -
浏览器再次发送请求给BServlet的时候,浏览器会自动在请求头中添加==
Cookie: username=zs==发送给服务端BServlet -
Request对象会把请求头中cookie对应的值封装成一个个Cookie对象,最终形成一个数组
-
BServlet通过Request对象获取到Cookie[]后,就可以从中获取自己需要的数据
2.3.1 Cookie的存活时间
- 设置Cookie存活时间
setMaxAge(int seconds)
参数值为:
1.正数:将Cookie写入浏览器所在电脑的硬盘,持久化存储。到时间自动删除
2.负数:默认值,Cookie在当前浏览器内存中,当浏览器关闭,则Cookie被销毁
3.零:删除对应Cookie

2.3.2 Cookie存储中文
(1)在AServlet中对中文进行URL编码
@WebServlet("/aServlet")
public class AServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//发送Cookie
String value = "张三";
//对中文进行URL编码
value = URLEncoder.encode(value, "UTF-8");
System.out.println("存储数据:"+value);
//将编码后的值存入Cookie中
Cookie cookie = new Cookie("username",value);
//设置存活时间 ,1周 7天
cookie.setMaxAge(60*60*24*7);
//2. 发送Cookie,response
response.addCookie(cookie);
}
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doGet(request, response);
}
}
(2)在BServlet中获取值,并对值进行解码
@WebServlet("/bServlet")
public class BServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//获取Cookie
//1. 获取Cookie数组
Cookie[] cookies = request.getCookies();
//2. 遍历数组
for (Cookie cookie : cookies) {
//3. 获取数据
String name = cookie.getName();
if("username".equals(name)){
String value = cookie.getValue();//获取的是URL编码后的值 %E5%BC%A0%E4%B8%89
//URL解码
value = URLDecoder.decode(value,"UTF-8");
System.out.println(name+":"+value);//value解码后为 张三
break;
}
}
}
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doGet(request, response);
}
}
3,Session
1.概念
==Session==:服务端会话跟踪技术:将数据保存到服务端。
-
Session是存储在服务端而Cookie是存储在客户端
-
存储在客户端的数据容易被窃取和截获,存在很多不安全的因素
-
存储在服务端的数据相比于客户端来说就更安全
2.Session的工作流程

Session的基本使用
在JavaEE中提供了HttpSession接口,来实现一次会话的多次请求之间数据共享功能。
具体的使用步骤为:
- 获取Session对象,使用的是request对象
HttpSession session = request.getSession();
-
Session对象提供的功能:
-
存储数据到 session 域中
void setAttribute(String name, Object o) -
根据 key,获取值
Object getAttribute(String name) -
根据 key,删除该键值对
void removeAttribute(String name)
-
介绍完Session相关的API后,接下来通过一个案例来完成
SessionDemo1:获取Session对象、存储数据
@WebServlet("/demo1")
public class SessionDemo1 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//存储到Session中
//1. 获取Session对象
HttpSession session = request.getSession();
//2. 存储数据
session.setAttribute("username","zs");
}
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doGet(request, response);
}
}
SessionDemo2:获取Session对象、获取数据
@WebServlet("/demo2")
public class SessionDemo2 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//获取数据,从session中
//1. 获取Session对象
HttpSession session = request.getSession();
//2. 获取数据
Object username = session.getAttribute("username");
System.out.println(username);
}
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doGet(request, response);
}
}
-
Cookie :真实数据放浏览器,浏览器每次把数据直接发给服务器。
-
Session :真实数据放服务器,浏览器只带一个编号 ,服务器靠编号找到你专属的 Session。
Cookie:服务器给浏览器一张小纸条,浏览器存着,每次访问把纸条带回去,服务器用 getName、getValue 读内容。
Session:服务器存好数据,只给浏览器一个编号;浏览器每次把编号发回来,服务器根据编号,在服务器内部找到你的 Session 和里面的数据。
3.2 Session的原理分析

Session要想实现一次会话多次请求之间的数据共享,就必须要保证多次请求获取Session的对象是同一个。
(1)demo1在第一次获取session对象的时候,session对象会有一个唯一的标识,假如是id:10
(2)demo1在session中存入其他数据并处理完成所有业务后,需要通过Tomcat服务器响应结果给浏览器
(3)Tomcat服务器发现业务处理中使用了session对象,就会把session的唯一标识id:10当做一个cookie,添加Set-Cookie:JESSIONID=10到响应头中,并响应给浏览器
(4)浏览器接收到响应结果后,会把响应头中的coookie数据存储到浏览器的内存中
(5)浏览器在同一会话中访问demo2的时候,会把cookie中的数据按照cookie: JESSIONID=10的格式添加到请求头中并发送给服务器Tomcat
(6)demo2获取到请求后,从请求头中就读取cookie中的JSESSIONID值为10,然后就会到服务器内存中寻找id:10的session对象,如果找到了,就直接返回该对象,如果没有则新创建一个session对象
(7)关闭打开浏览器后,因为浏览器的cookie已被销毁,所以就没有JESSIONID的数据,服务端获取到的session就是一个全新的session对象
Session的钝化和活化: (场景在服务器的正常关闭)
-
钝化:在服务器正常关闭后,Tomcat会自动将Session数据写入硬盘的文件中
-
钝化的数据路径为:
项目目录\target\tomcat\work\Tomcat\localhost\项目名称\SESSIONS.ser -

-
-
活化:再次启动服务器后,从文件中加载数据到Session中
- 数据加载到Session中后,路径中的
SESSIONS.ser文件会被删除掉
- 数据加载到Session中后,路径中的
Session销毁
session的销毁会有两种方式:
-
默认情况下,无操作,30分钟自动销毁
-
对于这个失效时间,是可以通过配置进行修改的
-
在项目的web.xml中配置
-

如果没有配置,默认是30分钟,默认值是在Tomcat的web.xml配置文件中写死的

调用Session对象的**invalidate()**进行销毁
在SessionDemo2类中添加session销毁的方法

Cookie和Session小结
- Cookie 和 Session 都是来完成一次会话内多次请求间==数据共享==的。
所需两个对象放在一块,就需要思考:
Cookie和Session的区别是什么?
Cookie和Session的应用场景分别是什么?
-
区别:
-
存储位置:Cookie 是将数据存储在客户端,Session 将数据存储在服务端
-
安全性:Cookie不安全,Session安全
-
数据大小:Cookie最大3KB,Session无大小限制
-
存储时间:Cookie可以通过setMaxAge()长期存储,Session默认30分钟
-
服务器性能:Cookie不占服务器资源,Session占用服务器资源
-
-
应用场景:
-
购物车:使用Cookie来存储
-
以登录用户的名称展示:使用Session来存储
-
记住我功能:使用Cookie来存储
-
验证码:使用session来存储
-
-
结论
-
Cookie是用来保证用户在未登录情况下的身份识别
-
Session是用来保存用户登录后的数据
-
介绍完Cookie和Session以后,具体用哪个还是需要根据具体的业务进行具体分析。