Cookie && Session 03 JSP与Session

## JSP:入门学习


    1. 概念:
        * Java Server Pages: java服务器端页面(千万不要误以为JavaScript就是jsp)
            * 可以理解为:一个特殊的页面,其中既可以指定定义html标签,又可以定义java代码
            * 用于简化书写!!!

         

         

<%--
  Created by IntelliJ IDEA.
  User: mac
  Date: 2020/3/29
  Time: 9:49
  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>
      <%
          /*打印在控制台*/
          System.out.println("hello jsp!");
      %>
      <%--显示在浏览器--%>
      <h3>hi~ jsp!</h3>
  </body>
</html>

         

          (可以不输入index.jsp。默认访问首页)

          按下回车之后可以在idea控制台看见打印结果:

          


    2. 原理
        * JSP本质上就是一个Servlet(只有Servlet才能被外界访问到)

        jsp原理图解:

        

    3. JSP的脚本:JSP定义Java代码的方式
        1. <%  代码 %>:定义的java代码在service方法中。service方法中可以定义什么,该脚本中就可以定义什么。
        2. <%! 代码 %>:定义的java代码在jsp转换后,会在java类的成员位置。(不常用)
        3. <%= 代码 %>:定义的java代码会被输出到页面上。输出语句中可以定义什么,该脚本中就可以定义什么。


    4. JSP的内置对象:
        * 在jsp页面中不需要获取和创建,可以直接使用的对象
        * jsp一共有9个内置对象。
               以下是其中的3个:
               * request   :请求
               * response:响应
               * out:       :字符输出流对象。可以将数据输出到页面上。和response.getWriter()类似
                     * response.getWriter()和out.write()的区别:
                                   * 在tomcat服务器真正给客户端做出响应之前,会先找response缓冲区数据,再找out缓冲区数据。
                                   * response.getWriter()数据输出永远在out.write()之前


## Session:主菜


    1. 概念:服务器端会话技术,在一次会话的多次请求间共享数据,将数据保存在服务器端的对象中。HttpSession
    2. 快速入门:
        1. 获取HttpSession对象:
            HttpSession session = request.getSession();
        2. 使用HttpSession对象:
            Object getAttribute(String name)  
            void setAttribute(String name, Object value)
            void removeAttribute(String name)  

session共享数据代码实现:

package hb.univer.session;

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("/sessionDemo1")
public class SessionDemo1 extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //使用session共享数据
        //获取session
        HttpSession session = request.getSession();
        //共享数据
        session.setAttribute("msg","hello session");
    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        this.doPost(request,response);
    }
}
package hb.univer.session;

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("/sessionDemo2")
public class SessionDemo2 extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //使用session共享数据
        //获取session
        HttpSession session = request.getSession();
        //获取数据
        Object msg = session.getAttribute("msg");
        System.out.println(msg);
    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        this.doPost(request,response);
    }
}

先启动服务器,使用session Demo1发送数据
    

再访问sessionDemo2

在控制台上即可打印hello session


    3. 原理


        * Session的实现是依赖于Cookie的

    
    4. 细节:
        1. 当客户端关闭后,服务器不关闭,两次获取session是否为同一个?
            * 默认情况下不是,因为客户端关闭之后,这次会话就结束了。
            * 如果需要相同,则可以创建Cookie,键为JSESSIONID,设置最大存活时间,让cookie持久化保存。
            代码演示如下:

    

package hb.univer.session;

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

@WebServlet("/sessionDemo3")
public class SessionDemo3 extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //使用session共享数据
        //获取session
        HttpSession session = request.getSession();

        //期望客户端关闭后,session也能相同
        //创建Cookie
        Cookie c = new Cookie("JSESSION","session.getId");
        //存活一小时
        c.setMaxAge(60 * 60);
        response.addCookie(c);

        System.out.println(session);
    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        this.doPost(request,response);
    }
}

        2. 客户端不关闭,服务器关闭后,两次获取的session是同一个吗?

            服务器关闭之后session对象会被销毁,因此就算session相同也是巧合
            * session不是同一个,但是要确保数据不丢失。tomcat自动完成以下工作
                * session的钝化(序列化):
                    * 在服务器正常关闭之前,将session对象序列化到硬盘上
                * session的活化(反序列化):
                    * 在服务器启动后,将session文件转化为内存中的session对象即可。
                
        3. session什么时候被销毁?
            1. 服务器关闭
            2. session对象调用invalidate() 。
            3. session默认失效时间 30分钟
                选择性配置修改    
                <session-config>
                    <session-timeout>30</session-timeout>
                </session-config>

     5. session的特点
         1. session用于存储一次会话的多次请求的数据,存在服务器端
         2. session可以存储任意类型,任意大小的数据

        * session与Cookie的区别:
            1. session存储数据在服务器端,Cookie在客户端
            2. session没有数据大小限制,Cookie有
            3. session数据安全,Cookie相对不安全

 

发布了66 篇原创文章 · 获赞 0 · 访问量 1085

猜你喜欢

转载自blog.csdn.net/smallrain6/article/details/105175012