Java-会话跟踪
一、会话跟踪概述
(一)预备知识
- http协议无状态:它不记忆谁访问了它
(二)知识点1:会话的概念与作用
1.什么是会话
- 浏览器和服务器之间的一次连续的通讯过程叫做会话.
2.会话的作用
会话跟踪技术就能够实现这样的功能:
- 能够跟踪客户端与服务器端的交互,
- 保存和记忆相关的信息,
- 保存请求的状态信息。
- 解决HTTP协议的无状态的弊端
核心:为了记住你是谁
(三)知识点2:现行常用的会话跟踪技术
- URL方式:需要保存的信息直接追加到URL后,例如:http://127.0.0.1:8080/chapter03/viewList?pageNo=12
- 隐藏域方式:可以使用表单中的隐藏域保存相关信息, 例如:<input type="hidden" name=“status" value=“true">
- Cookie方式:将状态信息保存到客户端,服务器能够获得相关信息进行分析,从而生成对客户端的响应;例如简化登录功能就可以使用Cookie实现;
- Session方式:将状态信息保存到服务器的会话对象中,通过唯一标记的ID值与客户端进行绑定使用;例如访问控制功能就可以使用Session实现.
(四)阶段总结
1.什么是会话?
浏览器和服务器的一次连续的通讯过程
2.会话的作用?
1.跟踪客户端和服务器的交互
2.保存记忆相关的信息
3.保存请求的状态信息
4,解决HTTP协议的无状态的弊端
3.常见的会话跟踪技术
1.url
2,隐藏域
3.cookie
4.session
二、Cookie
(一)知识点1: Cookie的功能与特点
1.什么是Cookie
- Cookie是保存在客户端(浏览器)的小文本
2.Cookie的功能
- 将用户活动过程中 的状态信息保存在客户端
3.Cookie的特点
- Cookie在客户端保存用户的信息
- 服务器可以得到用户的信息进行处理,跟踪用户的状态
(二)知识点2: Cookie的域及最大生命时间
- name:cookie的名字,每个cookie都有一个名字;
- content:cookie的值,与名字一起作为键值对形式存在;
- domain:域,该cookie的域名,例如左图中是163.com,说明当前cookie来自163.com;
- path:路径,访问163.com下该路径时,当前cookie将被发送;
- Created:cookie被创建的时间;
- Expired:cookie失效的时间;
- 最大生命时间:失效时间和创建时间的时间差,就是cookie的最大生命时间,超过该时间,cookie将失效,不再被发送到相应的域地址;
(三)知识点3:在Servlet中创建Cookie、设置Cookie属性
(四)知识点4:在响应中设置Cookie信息
如何将创建好的cookie对象保存到客户端?
response.addCookie(cookie);
作用:
- 将Servlet创建好的Cookie对象放到response对象中
- 在没有设置最大生命时间的情况下.浏览器接收到Cookie对象后存储到浏览器的本地cookie缓存中,关闭浏览器缓存就没有了,cookie也没有了.
- 如果设置了最大生命时间(如:7*24*3600)的情况下,浏览器接收到Cookie对象后存储到浏览器的本地cookie缓存和硬盘中,关闭浏览器缓存就没有了,cookie还存在,下次开启浏览器访问网站时cookie还能使用.
1.第一次请求:服务器将cookie放到response对象中,让浏览器保存cookie对象
2.第二次请求:浏览器会自动带Cookie对象一并发送到服务器
(五)知识点5:获取请求中的Cookie信息
当访问相同域及路径时,没有超过有效时间的cookie将自动通过请求被发送到服务器端
(六)课堂练习
1.目标
- 使用Cookie(name,value)创建cookie
- 将创建好的cookie对象保存到客户端
2.步骤
(1)新建web工程
(2)新建CookieServlet
(3)创建cookie
(4)将cookie保存到客户端
(5)在servlet得到cookie
(6)运行CookieServlet
(7)浏览器再次访问
package com.tjetc;
import javax.servlet.ServletException;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;
public class CookieAddServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doPost(req, resp);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// 创建Cookie
Cookie cookie = new Cookie("username", "zhangsan");
//设置cookie生命周期为七天
cookie.setMaxAge(3600 * 24 * 7);
//将cookie保存到客户端
resp.addCookie(cookie);
//得到浏览器发送过来的cookie
Cookie[] cookies = req.getCookies();
PrintWriter writer = resp.getWriter();
//遍历数组
if (cookie != null) {
for (Cookie cookie2 : cookies) {
System.out.println(cookie2.getName() + ":" + cookie2.getValue());
writer.println(cookie2.getName()+"="+cookie2.getValue());
}
}
writer.append("Served at: ").append(req.getContextPath());
}
}
username=zhangsan |
(七)浏览器查看cookie的方法
1.FireFox浏览器:
(1)菜单
- 菜单
- 工具
- 页面信息
- 安全
- 查看cookie`zzz
(2)开发者工具
2.Chrome浏览器
(1)设置
- 右上角的3个点
- 设置
- 搜索cookie或者点击隐私设置和安全性
- 网站设置
- 权限
- cookie和网站数据
- 查看索引Cookie和网站数据
- localhost
- 查看cookie
(2)开发者工具
(八)Cookie的最大生命时间
1.在没有设置最大生命时间的情况下
浏览器接收到Cookie对象后存储到浏览器的本地cookie缓存中,关闭浏览器缓存就没有了,cookie也没有了.
关闭浏览器,关闭服务器重启
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //得到浏览器发送过来的cookie Cookie[] cookies = request.getCookies(); //遍历数组 if (cookies==null) { // 创建Cookie Cookie cookie = new Cookie("username", "zhangsan"); //将cookie保存到客户端 response.addCookie(cookie); }else { for (Cookie cookie2 : cookies) { System.out.println(cookie2.getName()+":"+cookie2.getValue()); } } response.getWriter().append("Served at: ").append(request.getContextPath()); } |
![]() |
![]() |
![]() |
![]() |
username:zhangsan |
2.如果设置了最大生命时间(如:7*24*3600)的情况下
浏览器接收到Cookie对象后存储到浏览器的本地cookie缓存和硬盘中,关闭浏览器缓存就没有了,cookie还存在,下次开启浏览器访问网站时cookie还能使用.
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //得到浏览器发送过来的cookie Cookie[] cookies = request.getCookies(); //遍历数组 if (cookies==null) { // 创建Cookie Cookie cookie = new Cookie("username", "zhangsan"); cookie.setMaxAge(7*24*3600);//设置cookie的最大生命时间为7天 //将cookie保存到客户端 response.addCookie(cookie); }else { for (Cookie cookie2 : cookies) { System.out.println(cookie2.getName()+":"+cookie2.getValue()); } } response.getWriter().append("Served at: ").append(request.getContextPath()); } |
![]() |
![]() |
关闭浏览器,重新打开浏览器,cookie依然存在. |
这时我们发请求,cookie会自动发送 |
修改系统时间7天以后,关闭浏览器,重新启动,重新访问servlet,会重新生成Cookie对象 |
(九)阶段总结
1.Cookie有什么作用?
保存在客户端的小文本,用来跟踪用户的状态信息
2.Servlet规范中的Cookie类有哪些方法?
- new Cookie(name,value) 创建cookie对象
- setMaxAge(多少秒) 设置cookie的最大生命时间
- setValue(name) 设置cookie的值
- setDomain(name) 设置域名
3.如何将Cookie保存到客户端?
response.addCookie(cookie);
4.如何获取Cookie?
Cookie[] cookies=request.getCookies();
总结:
1.什么是会话?
浏览器和服务器的一次连续的通讯过程
2.会话的作用?
1.跟踪客户端和服务器的交互
2.保存记忆先关的信息
3.保存请求的专挑信息
4,解决HTTP协议的无状态的弊端
3.常见的会话跟踪技术
1.url
2,隐藏域
3.cookie
4.session
4.什么是Cookie?
保存在客户端的小文本
5.Cookie的功能?
将用户活动过程中的状态信息保存在客户端
6.Cookie的特点
1.Cookie在客户端保存用户的信息
2.服务器可以得到cookie保存的用户信息进行处理,跟踪用户的状态
7.Cookie的域
1.name:名字
2.content:值
3.domain:域
4.path:路径
5.Created:创建时间
6.Expired:失效时间
7.最大生命时间:失效时间-创建时间之差
8.Servlet创建Cookie使用的方法
Cookie cookie=new Cookie(name,value);
9.Servlet中设置Cookie的属性
1.setMaxAge(多少秒):设置最大生命时间
2.setValue(name):设置cookie的值
3.setDomain(name):设置域
10.响应添加Cookie,让浏览器保存Cookie
response.addCookie(cookie);
11.servlet如何得到cookie
Cookie[] cookies=request.getCookies();
12.浏览器如何查看cookie
1.Chrome
2.Firefox
- 最大生命时间
1.不设置 保存在浏览器缓存中,浏览器关闭后缓存没有了cookie也没有
2.设置 保存在浏览器缓存和磁盘中,浏览器关闭后缓存没有了,但是cookie还有,下次启动浏览器能看到cookie.
三、Session
(一)知识点1:Session简介
1.什么是session
Session是存储在服务器上的对象,该对象由服务器创建并维护,是会话跟踪的另一种实现手段
2.Session的特点
- 服务器为客户端与服务器的每一次会话过程都创建并维护一个Session对象;
- 每个服务器对Session的创建和维护的底层实现有所区别
3.Tomcat如何维护session对象的id
Tomcat使用Cookie来维护Session对象的ID值;该Cookie名字为JSESSIONID ;
4.客户端开始一次会话过程的步骤(会话跟踪的原理)(重要)
(二)知识点2:Session使用方法
- session能保存任何对象
- session保存的是状态信息,如:登录信息(用户信息),其他的状态信息.
- session可以跨页面,跨请求访问,session可以使用重定向的方式带数据
- 不能无限制的存储,随着越来越多用户登录,Session 所需要的服务器内存量也会不断增加
- 每个 Session 对象的持续时间是用户访问的时间加上不活动的时间
- 实现自定义session的基本步骤
- Session的实现仍然依靠临时态的Cookie,因此需要定义一个属于自定义session体系的Cookie名称(如JavaEE应用服务器中常用的JSESSIONID)
- 在服务端创建一个Map,用于存放所有的用户会话
- 当用户访问系统时,检查请求中是否存在以自定义session体系Cookie名称命名的Cookie信息
- 如果没有,说明是一个新用户,则为该用户生成一个唯一的sessionId字符串,并在响应中添加该Cookie值(注意不要提供Cookie的生效时间,那么该Cookie即为瞬态的,只在浏览器当前进程中生效)
- 如果有则查看Map中是否存在该会话,有即获取会话信息,没有说明该会话已经超时,为用户构建一个新的会话
- 一个用户的会话对象实质上也是一个Map,可以通过键值对的形式存放、获取会话变量
(三)知识点3:HttpSession对象的获取
1.request接口提供的方法
2.用法
request.getSession()
获取与当前请求相关的session对象,如果session对象不存在,创建一个新的session对象
3.课堂练习
(1)目标
Servlet中得到session对象,并且输出的它的id的值
(2)步骤
①创建一个Servlet
②在servlet中调用request.getSession()的方法得到session对象
③测试
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //在servlet中调用request.getSession()的方法得到session对象 HttpSession session = request.getSession(); //id String id = session.getId(); //out response.getWriter().append("sessionId: ").append(id); } |
![]() |
④服务器给浏览器发送的cookie
(四)剖析session的执行过程
1.第一次访问Servlet请求
客户端浏览器的cookie缓存中并没有存储sessionid的cookie,不会发送JSESSIONID的cookie
2.第一次访问Servlet响应
向浏览器发送JSESSIONID的cookie,让浏览器保存该cookie
3.第二次及以后访问servlet请求
第二次及以后请求浏览器就会服务器发送JSESSIONID的cookie
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //在servlet中调用request.getSession()的方法得到session对象 HttpSession session = request.getSession(); //id String id = session.getId(); //得到cookie Cookie[] cookies = request.getCookies(); if (cookies!=null) { for (Cookie cookie : cookies) { String name = cookie.getName(); if (name.equals("JSESSIONID")) { System.out.println("JSESSIONID="+cookie.getValue()); } } } //out response.getWriter().append("Served at: ").append(id); } |
JSESSIONID=292F1BA11B293DC711B5261B04415034 |
(五)知识点4:Session常用方法
1.添加属性
session.setAttribute(name,value);
2.获得属性
session.getAttribute(name);
3.删除属性
session.removeAttribute(name);
4.课堂练习
(1)目标
在Servlet中添加Session的属性,响应重定向到JSP进行显示
(2)步骤
①新建Servlet
②向session添加属性和值
③将响应重定向到jsp页面显示session的属性的值
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // 得到session HttpSession session = request.getSession(); //向session对象添加属性值 session.setAttribute("username", "zhangsan"); //响应重定向到jsp response.sendRedirect(request.getContextPath()+"/welcome.jsp"); } |
<body> <%=request.getSession().getAttribute("username")%> </body> |
![]() |
5.session失效的方法
(1)为什么要让Session失效
1.会话对象是存储在服务器端的对象,一直存在需要占用一定的服务器资源;
2.会话中往往保存着用户的一些数据,如果一直有效,存在一定安全隐患。
(2)Session失效的方法
1.服务器都有默认的会话失效时间,Tomcat默认是30分钟;
2.可以在web.xml中配置失效时间,例如:配置失效时间是50分钟;
<session-config> <session-timeout>50</session-timeout> </session-config> |
- 调用HttpSession接口中的两个方法,可以对指定的会话对象进行销毁
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // 得到session HttpSession session = request.getSession(); //向session对象添加属性值 session.setAttribute("username", "zhangsan"); session.invalidate(); //响应重定向到jsp response.sendRedirect(request.getContextPath()+"/welcome.jsp"); }
|
![]() |
(六)阶段总结
1.HttpSession对象如何获取?
request.getSession();
2.HttpSession如何存取属性?和请求属性有什么区别?
session.setAttribute(name,value)
session.getAttribute(name)
session:跨页面,跨请求,通过重定向带数据
request:不能跨请求,不能通过重定向带数据,只能请求转发带数据
3.会话失效有几种方式?
- 默认30分钟
- xml配置 <session-config>
- 调用方法 invalidate() setMaxInactiveInterval(时间)
四、总结
1.会话跟踪技术是实际Web应用开发中常用到的技术,主要包括URL、隐藏域、Cookie、Session;
2.Cookie用来把简单信息保存到客户端,以便跟踪用户状态;Servlet规范中定义了Cookie类,实现Cookie技术;
3.Session是存储在服务器端的对象,一次会话过程中有一个唯一的Session对象;
4.Servlet规范中定义了HttpSession接口,能够实现Session技术;
5.HttpSession对象中可以添加属性,用来在会话范围共享数据;
一、ServletContext接口
(一)知识点1:上下文对象的概念、作用
1.什么是上下文对象
用来存储全局范围信息的对象,一个web应用只有唯一的一个上下文对象.
2.上下文对象的作用
存储全局共享的数据
3.上下文对象的创建时机
服务器启动的时候,为每一个web应用创建一个上下文对象
4.上下文对象的销毁时机
服务器关闭的时候,上下文对象就销毁了.
5.上下文对象的接口
ServletContext接口
6.上下文接口 的方法
(二)知识点2:上下文获取方法
1.getServletContext()就能获取上下文对象
实际上调用的是GenericServlet的getServletContext()方法
得到的对象是:org.apache.catalina.core.ApplicationContextFacade@4b6a780f
2.课堂练习
(1)目标
通过2个servlet得到上下文对象,看是否唯一
(2)步骤
①创建Dynamic Web Project
②创建2个Servlet
③分别在2个Servlet中获得上下文对象,在控制台打印,比较是否是同一个对象
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // 获取上下文对象 ServletContext servletContext = getServletContext(); //打印 System.out.println(servletContext); } |
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // 获取上下文对象 ServletContext servletContext = getServletContext(); //打印 System.out.println(servletContext); } |
org.apache.catalina.core.ApplicationContextFacade@4b6a780f org.apache.catalina.core.ApplicationContextFacade@4b6a780f |
(三)知识点3:上下文参数
1.上下文参数的配置
web.xml的<context-param>配置 上下文参数
<context-param> <param-name>company</param-name> <param-value>公司</param-value> </context-param> |
2.如何得到上下文参数的值
上下文对象.getInitParameter(name)
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // 获取上下文对象 ServletContext servletContext = getServletContext(); //打印 System.out.println(servletContext); //得到上下文参数的值 String company = servletContext.getInitParameter("company"); //打印上下文参数的值 System.out.println(company); } |
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // 获取上下文对象 ServletContext servletContext = getServletContext(); //打印 System.out.println(servletContext); //得到上下文参数的值 String company = servletContext.getInitParameter("company"); //打印上下文参数的值 System.out.println(company); } |
org.apache.catalina.core.ApplicationContextFacade@29ae61dd 公司 org.apache.catalina.core.ApplicationContextFacade@29ae61dd 公司 |
(四)阶段总结
1.什么是上下文对象
用来存储全局范围信息的对象,一个web应用只有一个上下文对象
2.上下文对象的作用
用来存储全局共享的数据
3.上下文对象的创建时机
服务器启动
4.上下文对象的销毁时机
服务器关闭
5.上下文对象的接口
ServletContext
6.上下文对象接口 的方法
getResourceAsStream(path)
getRequestDispatcher(path)
7.上下文对象的获取方法
getServletContext()获取上下文对象
实际上调用的是GenericServlet.getServletContext()方法
返回的是ApplicationContextFacade
8.上下文参数的配置
web.xml配置
<context-param>
<param-name>company</param-name>
<param-value>中软国际</param-value>
</context-param>
9上下文参数的获取
String company=servletContext.getInitParameter("company");
sout(company);
上下文对象是如何创建的?有什么作用?
服务器创建的,存储全局范围的信息可以共享
上下文对象如何获取?
String company=servletContext.getInitParameter("company");
sout(company);
什么是上下文参数?
上下文配置的参数
二、数据作用域
(一)知识点1:利用ServletContext在应用中共享数据
与属性相关的方法
上下文的属性可以在整个应用中共享
(二)知识点2:四大作用域范围
在Web应用中,有四大作用域范围
1.页面范围(pageContext):一个页面,不能跨页面;
2.请求范围(request):一次请求中可以访问多个Servlet或JSP; 访问的Servlet或JSP能够包含其他资源;可以跨页面,必须使用请求转发带数据
3.会话范围:一次会话中可以包含多个请求;可以跨请求跨页面,使用请求转发和重定向都能带数据
4.上下文范围:上下文包含所有会话;可以跨会话跨请求跨页面,使用请求转发和重定向都能带数据
作用域范围由小到大:页面<请求<会话<上下文
(三)知识点3:请求、会话、上下文中存放、修改、删除数据方法
请求接口、会话接口、上下文接口中都定义相同的方法,可以对数据进行存放、修改、删除
多数服务器中,都是使用Map对象来实现不同范围的属性
(四)课堂练习(5分钟)
1.目标
向上下文对象存储属性,在2个servlet中分别获取上下文对象的属性的值
2.步骤
(1)在servlet中调用上下文对象.setAttribute(name,value);向上下文对象添加属性
(2)在2个servlet中分别获取上下文对象的属性的值,比较看是否相同
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // 获取上下文对象 ServletContext servletContext = getServletContext(); //打印 System.out.println(servletContext); /*//得到上下文参数的值 String company = servletContext.getInitParameter("company"); //打印上下文参数的值 System.out.println(company);*/ //向上下文对象添加属性和值 servletContext.setAttribute("name", "张三"); //取得上下文对象的属性的值 String name = (String) servletContext.getAttribute("name"); //打印 System.out.println(name); response.getWriter().append("Served at: ").append(request.getContextPath()); } |
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // 获取上下文对象 ServletContext servletContext = getServletContext(); // 打印 System.out.println(servletContext); /* * // 得到上下文参数的值 String company = * servletContext.getInitParameter("company"); // 打印上下文参数的值 * System.out.println(company); */ // 取得上下文对象的属性的值 String name = (String) servletContext.getAttribute("name"); // 打印 System.out.println(name); response.getWriter().append("Served at: ").append(request.getContextPath()); } |
org.apache.catalina.core.ApplicationContextFacade@6ee1943a 张三 org.apache.catalina.core.ApplicationContextFacade@6ee1943a 张三 |
(五)课堂练习
1.目标
测试页面作用域范围,只能在当前页面有效,不能跨页面
2.步骤
(1)page1.jsp
(2)pageContext.setAttribute(name,value)
(3)当前页面pageContext.getAttribute(name)
(4)请求转发到page2.jsp,pageContext.getAttribute(name)
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
<base href="<%=request.getContextPath()%>/">
</head>
<body>
<%
//向页面作用域添加属性和值
pageContext.setAttribute("name", "kelly");
request.getRequestDispatcher("/page2.jsp").forward(request, response);
%>
username=<%=pageContext.getAttribute("name")%>
</body>
</html>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
<base href="<%=request.getContextPath()%>/">
</head>
<body>
<h1>我是page2</h1>
username=<%=pageContext.getAttribute("name")%>
</body>
</html>
(六)课堂练习
1.目标
测试请求作用域范围,能跨页面,请求转发带数据
2.步骤
(1)page1.jsp
(2)request.setAttribute(age,value)
(3)当前页面request.getAttribute(age)
(4)请求转发到page2.jsp,request.getAttribute(age)
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
<base href="<%=request.getContextPath()%>/">
</head>
<body>
<%
request.setAttribute("age",21);
request.getRequestDispatcher("/page2.jsp").forward(request, response);
%>
</body>
</html>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
<base href="<%=request.getContextPath()%>/">
</head>
<body>
<h1>我是page2</h1>
age=<%=request.getAttribute("age")%>
</body>
</html>
(七)课堂练习
1.目标
测试会话作用域范围,能跨请求跨页面,请求转发和重定向带数据
2.步骤
(1)page1.jsp
(2)session.setAttribute(name,value)或者request.getSession().setAttribute(
name,value);
(3)当前页面session.getAttribute(name)或者request.getSession().getAttribute(
name)
(4)请求转发或者重定向到page2.jsp,session.getAttribute(name)
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
<base href="<%=request.getContextPath()%>/">
</head>
<body>
<%
request.getSession().setAttribute("phone","18882222222");
session.setAttribute("email","swfyijing@163.com");
request.getRequestDispatcher("/page2.jsp").forward(request, response);
%>
</body>
</html>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
<base href="<%=request.getContextPath()%>/">
</head>
<body>
<h1>我是page2</h1>
phone=<%=request.getSession().getAttribute("phone")%>
email=<%=session.getAttribute("email")%>
</body>
</html>
(八)课堂练习
1.目标
测试上下文作用域范围,能跨会话跨请求跨页面,请求转发和重定向带数据
2.步骤
(1)page1.jsp
(2)application.setAttribute(name,value)
(3)当前页面application.getAttribute(name)
(4)请求转发或者重定向到page2.jsp,application.getAttribute(name)
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
<base href="<%=request.getContextPath()%>/">
</head>
<body>
<%
request.getRequestDispatcher("/page2.jsp").forward(request, response);
application.setAttribute("sex", "woman");
%>
</body>
</html>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
<base href="<%=request.getContextPath()%>/">
</head>
<body>
<h1>我是page2</h1>
sex=<%=application.getAttribute("sex")%>
</body>
</html>
三、ServletConfig接口
(一)getServletConfig()得到servletConfig对象
(二)servletConfig对象.getServletName()得到Servlet的名称
(三)getServletContext()得到ServletContext对象
(四)getInitParameter(name)得到servlet的初始化参数
web.xml配置
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
version="4.0">
<servlet>
<servlet-name>Test3Servlet</servlet-name>
<servlet-class>com.tjetc.Test3Servlet</servlet-class>
<init-param>
<param-name>name</param-name>
<param-value>Kelly</param-value>
</init-param>
<init-param>
<param-name>age</param-name>
<param-value>21</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>Test3Servlet</servlet-name>
<url-pattern>/test3</url-pattern>
</servlet-mapping>
</web-app>
package com.tjetc;
import javax.servlet.ServletConfig;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
public class Test3Servlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//获取ServletConfig 对象
ServletConfig servletConfig = getServletConfig();
/*通过ServletConfig对象
1、获取servlet名称
2、获取ServletContext(上下文)对象
3、获取servlet的初始化参数
*/
String servletName = servletConfig.getServletName();
ServletContext servletContext = servletConfig.getServletContext();
String initParameterName = servletConfig.getInitParameter("name");
String initParameterAge = servletConfig.getInitParameter("age");
System.out.println("servlet名称:" + servletName);
System.out.println("上下文对象:" + servletContext);
System.out.println("servlet的初始化参数:"+initParameterName + initParameterAge);
}
}
四、ServletConfig与ServletContext的区别:
- ServletConfig是针对只有一个特定的servlet的局部变量,
- ServletContext是整个web application的全局变量ServletContext存放在ServletConfig中
五、总结
(一)Web应用有几个作用域?
4个
pageContext页面 只在当前页面有效,不能跨页面
request请求 能跨页面
会话 能跨页面 跨请求
上下文 能跨页面 跨请求 跨会话
从小到大:页面 请求 会话 上下文
(二)不同作用域共享数据的方法是什么?
作用域对象.setAttribute(name,value)
请求转发(request) 重定向(session,上下文)
(三)什么是上下文对象
上下文是一个全局对象,由服务器创建,一个应用只有唯一的一个;
(四)上下文对象的作用
可以用上下文对象存储全局共享数据;
(五)上下文的方法
ServletContext接口中定义了相关方法,可以用来获取初始化参数、输入流、请求转发器等,也可以用来操作上下文范围的属性;
- getInitParameter(name)
- setAttribute(name,value)
- getAttribute(name)
- removeAttribute(name)
- getRealPath()
- getResourceAsStream(path)
- getRequestDispatcher(url)
(六)4大作用域
Web应用中,有页面、请求、会话、上下文四大作用域;
(七)ServletConfig接口的方法
1.getServletName() 得到servlet实例的名字
2.getServletContext()得到ServletContext对象
3.getInitParameter(name)得到servlet的初始化参数
六、总结
1.什么是会话?
浏览器和服务器的一次连续的通讯过程
2.会话的作用?
1.跟踪客户端和服务器的交互
2.保存记忆相关的信息
3.保存请求的状态信息
4,解决HTTP协议的无状态的弊端
3.常见的会话跟踪技术
1.url
2,隐藏域
3.cookie
4.session
4.1.什么是Cookie
Cookie是保存在客户端(浏览器)的小文本
2.Cookie的功能
将用户活动过程中 的状态信息保存在客户端
3.Cookie的特点
1.Cookie在客户端保存用户的信息
服务器可以得到用户的信息进行处理,跟踪用户的状态
4.1.name:cookie的名字,每个cookie都有一个名字;
2.content:cookie的值,与名字一起作为键值对形式存在;
3.domain:域,该cookie的域名,例如左图中是163.com,说明当前cookie来自163.com;
4.path:路径,访问163.com下该路径时,当前cookie将被发送;
5.Created:cookie被创建的时间;
6.Expired:cookie失效的时间;
7.最大生命时间:失效时间和创建时间的时间差,就是cookie的最大生命时间,超过该时间,cookie将失效,不再被发送到相应的域地址
5.servlet中如何创建cookie
Cookie cookie=new Cookie(name,value);
6.如何将创建好的cookie保存到客户端浏览器
response.addCookie(cookie);
7.在servlet如何得到浏览器发送给服务器的cookie
Cookie[] cookies=request.getCookies();
for(Cookie cookie:cookies){
System.out.println(cookie.getName()+"="+cookie.getValue());
}
8.在没有设置最大生命时间的情况下:因为cookie保存在浏览器的缓存中,如果我们关闭浏览器,则浏览器的缓存也没了,我们的cookie也没有了,当我们重新开启服务器,重新访问网址的时候,是没有我们设置的cookie的,只有第一次访问后,cookie保存在浏览器的缓存中.
9.什么是上下文对象
上下文是一个全局对象,由服务器创建,一个应用只有唯一的一个;
10.上下文对象的作用
可以用上下文对象存储全局共享数据;
11.上下文的方法
ServletContext接口中定义了相关方法,可以用来获取初始化参数、输入流、请求转发器等,也可以用来操作上下文范围的属性;
12.4大作用域 Web应用中,有页面、请求、会话、上下文四大作用域
13.ServletConfig接口的方法
1.getServletName() 得到servlet实例的名字
2.getServletContext()得到ServletContext对象
3.getInitParameter(name)得到servlet的初始化参数
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!