• Cookie &Session & JSP


    1 Cookie

    1.1 会话介绍

    • 会话:浏览器和服务器之间的多次请求和响应
    • 会话过程中所产生的一些数据,可以通过会话技术(Cookie 和 Session)保存

    1.2 Cookie 介绍

    • Cookie:客户端会话管理技术
      把要贡献的数据保存到客户端中
      每次请求时,把会话信息带到服务器端,从而实现多次请求的数据共享
    • 作用:可以保存客户端访问网站的相关内容,从而保证每次访问时先从本地缓存中获取,以此提高效率

    1.3 Cookie 属性

    在这里插入图片描述

    1.4 Cookie 方法

    在这里插入图片描述

    1.4.1 Cookie 添加和获取

    • 添加:HttpServletResponse
      在这里插入图片描述
    • 获取:HttpServletRequest
      在这里插入图片描述

    1.5 Cookie 的使用

    • 需求说明
      通过 Cookie 记录最后访问时间,并在浏览器上显示出来
    • 最终目的
      掌握 Cookie 的基本使用,从创建到添加客户端,再到从服务器获取
    • 代码演示:
    package com.txt.servlet;
    
    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;
    import java.io.PrintWriter;
    import java.text.SimpleDateFormat;
    import java.util.Date;
    
    @WebServlet("/servletDemo01")
    public class ServletDemo01 extends HttpServlet {
        @Override
        protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
            resp.setContentType("text/html;charset=UTF-8");
            PrintWriter pw = resp.getWriter();
            pw.write("欢迎访问本网站,您的最后访问时间为:
    "
    ); Cookie cookie = new Cookie("time", System.currentTimeMillis() + ""); cookie.setMaxAge(3600); resp.addCookie(cookie); Cookie[] cookies = req.getCookies(); for (Cookie c : cookies){ if ("time".equals(c.getName())){ String value = c.getValue(); SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH-mm-ss"); pw.write(sdf.format(new Date(Long.parseLong(value)))); } } } @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { doGet(req, resp); } }
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 效果如下

    在这里插入图片描述

    1.6 Cookie 的细节

    • 数量限制
      每个网站最多有20和 Cookie, 且大小不能超过 4KB。所有网站的 Cookie 总数不能超过 300个
    • 名称限制
      Cookie 的名称只能包含 ASCCI 码表中的字母、数字字符。不能包含逗号、分号、空格,不能以 $ 开头
      Cookie 的值不支持中文
    • 存货时间限制 setMaxAge() 方法接收数字
      负整数:当前会话有效,浏览器关闭则清除
      0:立刻清除
      正整数:以秒为单位设置存活时间
    • 访问路径限制
      默认路径:取自第一次访问的资源路径前缀,只要以这个前缀为开头(包括子级路径),就能访问到
      设置路径:setPath() 方法设置指定路径

    2 Session

    2.1 HttpSession 介绍

    • HttpSession:服务器会话管理技术
      本质也是采用客户端会话管理技术
      只不过客户端保存的是一个特殊表示,而共享的数据保存到了服务器的内存对象中
      每次请求时,会将特殊标识带到服务器端,根据这个标识来找到对应的内存空间,从而实现数据共享
      是 Servlet 规范中四大域对象之一的会话域对象
    • 作用:可以实现数据共享
      在这里插入图片描述

    2.2 HttpSession 常用方法

    2.3 HttpSession 获取

    • HttpSession 实现类对象是通过 HttpSevletRequest 对象来获取
      在这里插入图片描述

    2.4 HttpSession 的使用

    • 需求说明
      通过第一个 Servlet 设置共享数据用户名,并在第二个 Servlet 获取到
    • 最终目的
      掌握 HttpSession 的基本使用,如何获取和使用
    • 代码演示
    package com.txt.servlet;
    
    import javax.servlet.ServletException;
    import javax.servlet.annotation.WebServlet;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    import javax.servlet.http.HttpSession;
    import java.io.IOException;
    
    @WebServlet("/servletDemo01")
    public class ServletDemo01 extends HttpServlet {
        @Override
        protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
            //1. 获取请求的用户名
            String username = req.getParameter("username");
    
            //2. 获取 HTTPSession 的对象
            HttpSession session = req.getSession();
    
            //3. 将用户名信息添加到共享数据中
            session.setAttribute("username",username);
        }
    
        @Override
        protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
            doGet(req, resp);
        }
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    package com.txt.servlet;
    
    import javax.servlet.ServletException;
    import javax.servlet.annotation.WebServlet;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    import javax.servlet.http.HttpSession;
    import java.io.IOException;
    
    @WebServlet("/servletDemo02")
    public class ServletDemo02 extends HttpServlet {
        @Override
        protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
            //1. 获取 HTTPSession 对象
            HttpSession session = req.getSession();
    
            //获取共享数据
            Object username = session.getAttribute("username");
    
            //将数据响应给浏览器
            resp.getWriter().write(username +"");
        }
    
        @Override
        protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
            doGet(req, resp);
        }
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30

    2.5 HttpSession 的细节

    • 唯一标识的查看
      在这里插入图片描述
      在这里插入图片描述
    • 浏览器禁用 Cookie
      方式一:通过提示信息告知用户,大部分网站采用的解决方式
      方式二:访问时拼接 jsessionid 标识,通过 encodeURL() 方法重写地址
    • 钝化和活化
      • 什么是钝化和活化
        钝化:序列化。把长时间不用,但还不到过期时间的 HttpSession 进行序列化,写到磁盘上
        活化:相反的状态
      • 何时钝化
        第一种情况:当访问量很大是,服务器会根据 getLastAccessTime 来进行排序
        对长时间不用,但是还没有到过期时间的 HttpSession 进行序列化
        第二种情况:当服务器进行重启的时候,为了保持客户 HttpSession 中的数据,也要对其进行序列化
    • 注意:
      HttpSession 的序列化由服务器自动完成,我们无需关心

    3 JSP

    3.1 JSP 介绍

    • JSP(Java Servlet Page):是一种动态网页技术标准
    • JSP 部署在服务器上,可以处理客户端发送的请求,并根据请求内容动态的生成 HTML、XML 或其他格式文档的 Web 网页,然后再响应给客户端
    • JSP 是基于Java 语言的,它的本质就是 Servlet
      在这里插入图片描述

    3.2 JSP 快速入门

    1. 创建一个web项目
    2. 在 web 目录下创建一个 index.jsp 文件
    3. 在文件中写一句内容为:这是我的第一个jsp
    4. 部署并启动项目
    5. 通过浏览器测试
    • 代码演示
    <%@ page contentType="text/html;charset=UTF-8" language="java" %>
    <html>
      <head>
        <title>JSP</title>
      </head>
      <body>
        这是我的第一个JSP
      </body>
    </html>
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    3.3 JSP 执行过程

    在这里插入图片描述

    3.4 JSP 语法

    • JSP 注释
      <%--注释的内容-->

    • Java 代码块
      <% Java 代码块%>
      <%
      System.out.println("Hello JSP");
      out.print("Hello JSP");
      %>

      注意:
      System.out.println(“Hello JSP”); 普通输出语句,输出在控制台
      out.print(“Hello JSP”); out是 JSPWriter 对象,输出在页面

    • JSP 表达式
      <%=表达式%>
      <%="hello"%>

      相当于 out.print(“hello”); 的简化

    • JSP 声明
      <%! 声明变量或方法 %>
      <%! String s = "abc"; %>
      <%=s%>

      如果加!代表的是声明的是成员变量
      如果不加!代表的是声明的是局部变量

    3.5 JSP 指令

    • page 指令
      <%@ page 属性名 = 属性值 属性名 = 属性值 … %>
      在这里插入图片描述
    • include 指令:可以包含其他页面
      <%@ include file=包含的页面 %>
    • taglib 指令:可以引入外部标签库
      <%@ taglib uri=标签库的地址 prefix=前缀名称%>

    3.6 JSP 细节

    • 九大隐式对象
      在这里插入图片描述
    • PageContext 对象
      是 JSP 独有的,Servlet 中没有
      是四大域对象之一的页面域对象,还可以操作其他三个域对象中的属性
      还可以获取其他八个隐式对象
      生命周期是随着 JSP 的创建而存在,随着 JSP 的结束而小旺旺,每个 JSP 页面都有一个 PageContext 对象
      在这里插入图片描述

    3.7 四大域对象

    在这里插入图片描述

    3.8 MVC 模型

    • M(Model):模型。 用与封装数据,封装的是数据模型
    • V(View):视图。 用于显示数据,动态资源用 JSP 页面,静态资源用 HTML 页面
    • C(Controller):控制器。 用于处理请求和响应,例如 Servlet
      在这里插入图片描述
  • 相关阅读:
    【SNUT集训1】排序 二分 前缀和 差分(6 / 16)
    兄弟组件通信context
    mybatis判断是否存在参数
    GCC:编译时库路径和运行时库路径
    Jenkins 添加 Slave Agent 节点时报类文件不匹配错误
    ofxTimeMeasurements——OpenFrameworks插件,可以轻松测量C++代码任何部分的执行时间
    Linux——文件描述符(fd)与重定向、dup/dup2
    我的毕业设计思路
    一文带你了解Spring中的事务管理
    第二十章·中介者模式
  • 原文地址:https://blog.csdn.net/m0_59620032/article/details/128116720