Java-会话跟踪

一、会话跟踪概述

(一)预备知识

  • http协议无状态:它不记忆谁访问了它

  

(二)知识点1:会话的概念与作用

1.什么是会话

  • 浏览器和服务器之间的一次连续的通讯过程叫做会话.

  

  

2.会话的作用

会话跟踪技术就能够实现这样的功能:

  • 能够跟踪客户端与服务器端的交互,
  • 保存和记忆相关的信息,
  • 保存请求的状态信息。
  • 解决HTTP协议的无状态的弊端

核心:为了记住你是谁

(三)知识点2:现行常用的会话跟踪技术

  1. URL方式:需要保存的信息直接追加到URL后,例如:http://127.0.0.1:8080/chapter03/viewList?pageNo=12
  2. 隐藏域方式:可以使用表单中的隐藏域保存相关信息, 例如:<input type="hidden" name=“status" value=“true">
  3. Cookie方式:将状态信息保存到客户端,服务器能够获得相关信息进行分析,从而生成对客户端的响应;例如简化登录功能就可以使用Cookie实现;
  4. 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的域及最大生命时间

  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将失效,不再被发送到相应的域地址;

(三)知识点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
Served at: /20220609

(七)浏览器查看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. 最大生命时间

       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的区别:

  1. ServletConfig是针对只有一个特定的servlet的局部变量,
  2. ServletContext是整个web application的全局变量ServletContext存放在ServletConfig中

五、总结

(一)Web应用有几个作用域?

4个

pageContext页面  只在当前页面有效,不能跨页面

request请求 能跨页面

会话  能跨页面 跨请求

上下文 能跨页面 跨请求 跨会话

从小到大:页面 请求 会话 上下文

(二)不同作用域共享数据的方法是什么?

作用域对象.setAttribute(name,value)

请求转发(request) 重定向(session,上下文)

(三)什么是上下文对象

上下文是一个全局对象,由服务器创建,一个应用只有唯一的一个;

(四)上下文对象的作用

可以用上下文对象存储全局共享数据;

(五)上下文的方法

ServletContext接口中定义了相关方法,可以用来获取初始化参数、输入流、请求转发器等,也可以用来操作上下文范围的属性;

  1. getInitParameter(name)
  2. setAttribute(name,value)
  3. getAttribute(name)
  4. removeAttribute(name)
  5. getRealPath()
  6. getResourceAsStream(path)
  7. 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的初始化参数

 

posted @   carat9588  阅读(150094)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!
点击右上角即可分享
微信分享提示