javaWeb(三)

cookie、session

7.1 会话

会话:

用户打开一个浏览器,点击了很多超链接,访问许多web资源,关闭浏览器,这个过程就叫一次会话

有状态会话:

你能怎么证明你是本校的学生? 发票、学校登记

在这里插入图片描述

7.2 保存会话的两种技术

cookie

  • 客户端技术(响应、请求)

session

  • 服务器技术、利用这个技术,可以保存用户的会话信息,我们可以把信息或者数据放在session中!

常见场景:网站登录之后,你下次就不用登录了,直接可以进入

7.3 cookie

package com.kuang.servlet;

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;
import java.util.Date;

//保存用户上一次访问的时间
public class CookieDemo01 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //服务器,告诉你,你来的时间,把这个时间封装为一个信件,你下次来,我就知道你来了

//        解决中文乱码
        req.setCharacterEncoding("utf-8");
        resp.setCharacterEncoding("utf-8");
        resp.setContentType("text/html; charset=utf-8");

        PrintWriter out = resp.getWriter();
        //cookie,服务器从客户端获取
        Cookie[] cookies = req.getCookies();//这里返回数组,说明cookie可能存在多个

//        判断cookie是否存在
        if(cookies!=null){
            //如果存在怎么办
            out.write("你上次访问的时间是:");
            for (int i = 0; i <cookies.length ; i++) {
                Cookie cookie = cookies[i];
                //获取cookie的名字
                String name = cookie.getName();
                if(name.equals("lastLoginTime")){
                    //获取cookie中的值
                    String value = cookie.getValue();
                    long l = Long.parseLong(value);
                    Date date = new Date(l);
                    out.write(date.toLocaleString());
                }
            }
        }else{
            out.write("这是您第一次访问本站");
        }
        //服务器给客户端响应一个cookie
        Cookie cookie = new Cookie("lastLoginTime",System.currentTimeMillis()+"");
//        Cookie cookie = new Cookie("name","111");
        cookie.setMaxAge(24*60*60);//cookie有效期为1天
        resp.addCookie(cookie);
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        doGet(req, resp);
    }
}

1、从请求中拿到cookie信息
2、服务器响应给客户端cookie

Cookie[] cookies = req.getCookies();//获得cookie
cookie.getName();//获得cookie中的key              
cookie.getValue();//获取cookie中的值value
Cookie cookie = new Cookie("lastLoginTime",System.currentTimeMillis()+"");//新建一个cookie
cookie.setMaxAge(24*60*60);//设置cookie有效期
resp.addCookie(cookie);//响应给客户端一个cookie     

cookie:一般会保存在本地的 用户目录下 appdata

一个网站的cookie是否存在上限?细节?

  • 一个cookie只能保存一个信息
  • 一个web站点可以给浏览器发送多个cookie,最多存放20个cookie
  • cookie大小有限制4kb
  • 300个cookie浏览器上限

删除cookie:

  • 不设置有效期,关闭浏览器,自动失效
  • 设置有效期时间为0

删除cookie

package com.kuang.servlet;

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;
import java.util.Date;

//保存用户上一次访问的时间
public class CookieDemo01 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //服务器,告诉你,你来的时间,把这个时间封装为一个信件,你下次来,我就知道你来了

//        解决中文乱码
        req.setCharacterEncoding("utf-8");
        resp.setCharacterEncoding("utf-8");
        resp.setContentType("text/html; charset=utf-8");

        PrintWriter out = resp.getWriter();
        //cookie,服务器从客户端获取
        Cookie[] cookies = req.getCookies();//这里返回数组,说明cookie可能存在多个

//        判断cookie是否存在
        if(cookies!=null){
            //如果存在怎么办
            out.write("你上次访问的时间是:");
            for (int i = 0; i <cookies.length ; i++) {
                Cookie cookie = cookies[i];
                //获取cookie的名字
                String name = cookie.getName();
                if(name.equals("lastLoginTime")){
                    //获取cookie中的值
                    String value = cookie.getValue();
                    long l = Long.parseLong(value);
                    Date date = new Date(l);
                    out.write(date.toLocaleString());
                }
            }
        }else{
            out.write("这是您第一次访问本站");
        }
        //服务器给客户端响应一个cookie
        Cookie cookie = new Cookie("lastLoginTime",System.currentTimeMillis()+"");
//        Cookie cookie = new Cookie("name","111");
        cookie.setMaxAge(24*60*60);//cookie有效期为1天
        resp.addCookie(cookie);
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        doGet(req, resp);
    }
}

中文数据怎么传递

package com.kuang.servlet;

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;
import java.net.URLDecoder;
import java.net.URLEncoder;
import java.util.Date;

//中文数据怎么传递
public class CookieDemo03 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//        解决中文乱码
        req.setCharacterEncoding("utf-8");
        resp.setCharacterEncoding("utf-8");
        resp.setContentType("text/html; charset=utf-8");

        PrintWriter out = resp.getWriter();
        //cookie,服务器从客户端获取
        Cookie[] cookies = req.getCookies();//这里返回数组,说明cookie可能存在多个

//        判断cookie是否存在
        if(cookies!=null){
            //如果存在怎么办
            out.write("你上次访问的时间是:");
            for (int i = 0; i <cookies.length ; i++) {
                Cookie cookie = cookies[i];
                //获取cookie的名字
                String name = cookie.getName();
                if(name.equals("name")){
                    //获取cookie中的值
                    System.out.println(cookie.getValue());
                    out.write(cookie.getValue());
                }
            }
        }else{
            out.write("这是您第一次访问本站");
        }
        //创建一个cookie,这个是可以的,但是有时为了安全,可以这样写
//        URLEncoder.encode("一一一","utf-8")
//        URLDecoder.decode(cookie.getValue(),"utf-8")
        Cookie cookie = new Cookie("name","一一一");

        resp.addCookie(cookie);
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        doGet(req, resp);
    }
}



在这里插入图片描述

7.4 session(重点)

什么是session:

  • 服务器会给每一用户(每个浏览器是不同的用户)创建一个session对象
  • 一个session独占一个浏览器,只要浏览器没有关闭,这个session就存在
  • 用户登录之后,整个网站都可以访问–》保存用户的信息;保存购物车的信息

在这里插入图片描述

session和cookie的区别:

  • cookie是把用户的数据写给用户的浏览器,浏览器保存(可以保存多个)
  • session把用户的数据写到用户独占session中,服务器端保存(保存重要的信息,减少服务器资源的浪费)
  • session对象由服务创建

session测试:

package com.kuang.servlet;

import com.kuang.servlet.pojo.Person;

import javax.servlet.ServletException;
import javax.servlet.http.*;
import java.io.IOException;

public class SessionDemo01 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //解决乱码问题
        resp.setCharacterEncoding("utf-8");
        req.setCharacterEncoding("utf-8");
        resp.setContentType("text/html;charset='utf-8'");

        //得到session
        HttpSession session = req.getSession();

        //给session中存东西
//        session.setAttribute("name","一一一");
        session.setAttribute("name",new Person("qin",111));

        //获取session的id
        String id = session.getId();

        //判断session是不是新的
        if(session.isNew()){
            resp.getWriter().write("session 创建成功,ID"+id);
        }else{
            resp.getWriter().write("session 已存在,ID"+id);
        }

        /**
         * session创建的时候做了什么?(猜想)
         * Cookie cookie = new Cookie("JSESSIONID", id);
         * resp.addCookie(cookie);
         */

    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        doGet(req, resp);
    }
}

package com.kuang.servlet;

import com.kuang.servlet.pojo.Person;

import javax.servlet.ServletException;
import javax.servlet.http.*;
import java.io.IOException;

public class SessionDemo02 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //解决乱码问题
        resp.setCharacterEncoding("utf-8");
        req.setCharacterEncoding("utf-8");
        resp.setContentType("text/html;charset='utf-8'");

        //得到session
        HttpSession session = req.getSession();

        //给session中存东西
        Person name =(Person) session.getAttribute("name");

        System.out.println(name.toString());
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        doGet(req, resp);
    }
}

在这里插入图片描述

package com.kuang.servlet;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;

public class SessionDemo03 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        HttpSession session = req.getSession();
        session.removeAttribute("name");
        //手动注销session
        session.invalidate();
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        doGet(req, resp);
    }
}

会话自动过期:web.xml

<!--  设置session默认的失效时间-->
  <session-config>
<!--    15分钟后session自动失效,以分钟为单位-->
    <session-timeout>15</session-timeout>
  </session-config>

使用场景:

  • 保存一个登录用户的信息
  • 购物车信息
  • 在整个网站中经常使用的数据,我们将它保存在session中

cookie:
在这里插入图片描述
session:
在这里插入图片描述

在这里插入图片描述

8、JSP

8.1 什么是jsp

java server pages:java服务器端页面,也和servlet一样,用于动态web技术

最大的特点:

  • 写jsp就像在写html
  • 区别:
    • html只给用户提供静态的数据
    • jsp页面中可以嵌入java代码,为用户提供动态数据

8.2 jsp原理

思路:jsp怎么执行的?

  • 代码层面没有任何问题
  • 服务器内部工作:
    tomact中由一个work目录
    idea中使用tomcat的会在idea的tomcat中生成生产一个work目录在这里插入图片描述
    在这里插入图片描述
    浏览器向服务器发送请求,不管访问什么资源,其实都是在访问servlet!

jsp最终会被转换为一个java类

jsp本质上就是一个servlet!

在这里插入图片描述
在这里插入图片描述
1、判断请求
2、内置了一些对象
在这里插入图片描述
3、输出页面前增加的代码
在这里插入图片描述
4、以上的这些个对象我们可以在jsp页面中直接使用!

在这里插入图片描述

在jsp页面中:

  • 只要是java代码就会原封不动的输出
  • 如果是html代码,就会被转化为:
    在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

8.3 JSP基础语法

任何语言都有自己的语法,java中有。jsp作为java技术中的一种应用,它拥有一些自己扩充的语法(了解即可),java所有的语法都支持!

1、jsp表达式

<%--  jsp表达式
作用:用来将程序的输出到客户端
   <%= 变量或者表达式%>
--%>
<%--原封不动的输出--%>
  <%= new java.util.Date()%>

2、jsp脚本片段

<%--  jsp脚本片段--%>
<%
  int sum=0;
  for (int i = 0; i < 10; i++) {
    sum+=i;
  }
  out.println("<h1>Sum="+sum+"</h1>");
%>

脚本片段的再实现:


  <%
    int x=10;
    out.println(x);
  %>
  <p>这是一个jsp文件</p>
  <%
//    int x=0;
    int y=2;
    out.println(y);
  %>

<%--  在代码中嵌入html元素--%>
  <%
    for (int i = 0; i < 5; i++) {
      %>
<h1>hello  <%=i%> </h1>
<%
    }
  %>

在这里插入图片描述

3、jsp声明

<%! %>

  <%!
  static{
    System.out.println("loading servlet!");
  }
  private int globaleVar=0;
  public void kuang(){
    System.out.println("kuang()");
  }
%>

在这里插入图片描述

<%--EL表达式--%>
  <%
    for (int i = 0; i < 5; i++) {%>
<h1>hello,world${i}</h1>
<%
    }
  %>

jsp声明:会被编译到jsp的生成的java类中!
其他的,就会被生成到_jspService方法中!

在jsp中,嵌入java代码即可!

<% %>   片段
<%=%>   表达式或者值
<%!%>   全局
<%--注释--%>
html的注释:
<!--   -->

jsp的注释,不会在客户端显示,html就会!

8.4 jsp指令

在这里插入图片描述

  <error-page>
        <error-code>404</error-code>
        <location>/error/404.jsp</location>
    </error-page>

    <error-page>
        <error-code>500</error-code>
        <location>/error/500.jsp</location>
    </error-page>
<%--定制错误页面--%>
<%--<%@ page errorPage="error/500.jsp" %>--%>

<%--显式的声明这是一个错误页面--%>
<%--<%@ page isErrorPage="true" %>--%>

<%--<%@ page pageEncoding="utf-8" %>--%>

<%--@include这个会将两个页面合二为一--%>
<%@ include file="common/header.jsp"%>
<h1>body</h1>

<%--jsp标签
jsp:include:拼接页面,本质还是2--%>
<jsp:include page="/common/header.jsp"/>
<h1>body</h1>

在这里插入图片描述

8.5 9大内置对象

  • pageContext 存东西
  • Request 存东西
  • Response
  • Session 存东西
  • Application(ServletContext) 存东西
  • config(ServletConfig)
  • out
  • page
  • exception
<%--
  Created by IntelliJ IDEA.
  User: Yoyo
  Date: 2021/12/1
  Time: 21:12
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>

<%--内置对象--%>

<%
    pageContext.setAttribute("name1","111");//保存的数据只在一个页面中有效
    request.setAttribute("name2","222");//保存的数据只在一次请求中有效,请求转发会携带这个数据
    session.setAttribute("name3","333");//保存的数据只在一次会话中有效,从打开浏览器到关闭浏览器
    application.setAttribute("name4","444");//保存的数据只在服务器中有效,从打开服务器到关闭服务器
%>
<%--脚本片段中的代码,会被原封不动生成到.jsp.java--%>
<%--要求:这里面的代码,必须要保证java语法的正确性--%>
<%
//    通过pageContext取出我们需要的值
    //从pageContext取出,我们通过寻找的方式来取
//    从底层到高层(作用域):
    String name1=(String)pageContext.findAttribute("name1");
    String name2=(String)pageContext.findAttribute("name2");
    String name3=(String)pageContext.findAttribute("name3");
    String name4=(String)pageContext.findAttribute("name4");
    String name5=(String)pageContext.findAttribute("name5");//不存在
%>


<h1>取出的值</h1>
<h3>${name1}</h3>
<h3>${name2}</h3>
<h3>${name3}</h3>
<h3>${name4}</h3>
<h3>${name5}</h3>
<%--没有--%>

<h3> <%=name5%> </h3>
<%--null--%>

</body>
</html>

<%--
  Created by IntelliJ IDEA.
  User: Yoyo
  Date: 2021/12/1
  Time: 21:23
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>

<%
    //    通过pageContext取出我们需要的值
    //从pageContext取出,我们通过寻找的方式来取
//    从底层到高层(作用域):
    String name1=(String)pageContext.findAttribute("name1");
    String name2=(String)pageContext.findAttribute("name2");
    String name3=(String)pageContext.findAttribute("name3");
    String name4=(String)pageContext.findAttribute("name4");
    String name5=(String)pageContext.findAttribute("name5");//不存在
%>


<h1>取出的值</h1>
<h3>${name1}</h3>
<h3>${name2}</h3>
<h3>${name3}</h3>
<h3>${name4}</h3>
<h3>${name5}</h3>
<%--没有--%>

<h3> <%=name5%> </h3>
<%--null--%>

</body>
</html>

在这里插入图片描述
jvm双亲委派机制

<%--
  Created by IntelliJ IDEA.
  User: Yoyo
  Date: 2021/12/1
  Time: 21:29
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
<%
    pageContext.forward("/index.jsp");
//    request.getRequestDispatcher("/index/jsp").forward(request,response);
%>

</body>
</html>

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值