zoukankan      html  css  js  c++  java
  • JavaWeb学习笔记(11)

    显示书的浏览记录

    Session

    session概述

    • 在WEB开发中,服务器可以为每个用户浏览器创建一个会话对象(session对象),注意:一个浏览器独占一个session对象(默认情况下)。因此,在需要保存用户数据时,服务器程序可以把用户数据写到用户浏览器独占的session中,当用户使用浏览器访问其它程序时,其它程序可以从用户的session中取出该用户的数据,为用户服务。
    • Session和Cookie的主要区别在于:

    l  Cookie是把用户的数据写给用户的浏览器。

    l  Session技术把用户的数据写到用户独占的session中。存在服务器,也存在tomcat中

    Session对象由服务器创建,开发人员可以调用request对象的getSession方法得到session对象。

    • 每个浏览器存储自己的数据到Session中
    • Session的数据是不能被其它浏览器共享的
    • Session一般可用于判断用户是否登录
    package com.zx.web.servlet.lesson04;
    
    import java.io.IOException;
    
    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;
    
    @WebServlet("/Lesson04Servlet1")
    public class Lesson04Servlet1 extends HttpServlet{
    
        @Override
        protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
            // TODO Auto-generated method stub
            
            //通过request来获取Session对象
            HttpSession session= req.getSession();
            //存数据到Session
            session.setAttribute("name", "zx");
        }
    }
    package com.zx.web.servlet.lesson04;
    
    import java.io.IOException;
    
    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;
    
    @WebServlet("/Lesson04Servlet2")
    public class Lesson04Servlet2 extends HttpServlet{
    
        @Override
        protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
            // TODO Auto-generated method stub
            
            //通过request来获取Session对象
            HttpSession session= req.getSession();
            //获取Session的值
            String name= (String) session.getAttribute("name");
            //响应给客户端
            resp.getWriter().write(name);
        }
    }

    一个浏览器获取到值之后,其他的浏览器就获取不到了

    关闭浏览器之后,重新打开,就是一个新的会话了,所以session也变化了。

    会话可简单理解为:用户开一个浏览器,点击多个超链接,访问服务器多个web资源,然后关闭浏览器,整个过程称之为一个会话。

    Session的疑问

    疑问:服务器是如何实现一个session为一个用户浏览器服务的?

    v  服务器会为每个浏览器分配一个session ID,然后把Session ID通过Cookie的形式存储在客户端

    Session的实现原理:

    1. 浏览器访问后台时,后台会创建一个Session对象,并分配一个id
    2. 把这个Session Id 通过响应头的Cookie形式返回给客户端
    3. 客户端ji就会把Cookie存在本地(浏览器)
    4. 当下次再访问这个站点时,会把session id 通过请求头cookie的形式传回给后台
    package com.zx.web.servlet.lesson07;
    
    import java.io.IOException;
    
    import javax.servlet.ServletException;
    import javax.servlet.annotation.WebServlet;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    
    /**
     * Servlet implementation class LoginServlet
     */
    @WebServlet("/LoginServlet")
    public class LoginServlet extends HttpServlet {
        private static final long serialVersionUID = 1L;
        @Override
        protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
            // TODO Auto-generated method stub
            
            resp.setHeader("content-type", "text/html;charset=utf-8");
            //1.获取请求参数
            String username=req.getParameter("username");
            String password=req.getParameter("password");
            String client_code=req.getParameter("code");
            
            //2.获取服务端的code
            String server_code=(String) req.getSession().getAttribute("code");
            
            if (server_code==null) {
                resp.getWriter().write("清刷新上一个页面");
            }
            
            //3.验证码对比
            if (!server_code.equalsIgnoreCase(client_code)) {
                resp.getWriter().write("验证码不一致");
            }else {
                //resp.getWriter().write("验证码不一致");
                if ("zx".equals(username)&&"123".equals(password)) {
                    resp.getWriter().write("登录成功");
                }else {
                    resp.getWriter().write("登录失败");
                }
            }
            
            //4.把验证码从服务器删除
            //req.getSession().removeAttribute("code");
            req.getSession().invalidate();//让Session的所有数据都删除
            
        }
    }
    package com.zx.web.servlet.lesson07;
    
    import java.io.IOException;
    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 cn.dsna.util.images.ValidateCode;
    
    /**
     * Servlet implementation class ValidateCodeServlet
     * 验证码的Servlet
     */
    @WebServlet("/ValidateCodeServlet")
    public class ValidateCodeServlet extends HttpServlet {
        
    
        /**
         * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
         */
        protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
            // TODO Auto-generated method stub
            ValidateCode vc=new ValidateCode(100, 30, 4, 6);
            
            System.out.println("生成的验证码:"+vc.getCode());
            
            //把验证码存在session
            request.getSession().setAttribute("code", vc.getCode());
            
            vc.write(response.getOutputStream());
        }
    
    }

    HttpSession常用方法

    • 把数据保存在HttpSession对象中,该对象也是一个域对象。
    • void setAttribute(String name,Object value);存数据
    • Object getAttribute(String name);取数据
    • void removeAttribute(String name);删除一个key的数据
    • HttpSession.getId()
    • setMaxInactiveInterval(int interval)  设置session的存活时间
    • invalidate() 使此会话无效

    getSession():内部执行原理

    HttpSession request.getSession():内部执行原理

    1、获取名称为JSESSIONID的cookie的值。

    2、没有这样的cookie,创建一个新的HttpSession对象,分配一个唯一的SessionID,并且向客户端写了一个名字为JSESSIONID=sessionID的cookie

    3、有这样的Cookie,获取cookie的值(即HttpSession对象的值),从服务器的内存中根据ID找那个HttpSession对象:

    找到了:取出继续为你服务。

    找不到:从2开始。

    HttpSession request.getSession(boolean create)

    参数:

    true:和getSession()功能一样。

    false:根据客户端JSESSIONID的cookie的值,找对应的HttpSession对象,找不到返回null(不会创建新的,只是查询)。

    浏览器传了Sessionid,但是服务器没有这个id对应的对象,服务器返回null

    Session的状态三种:

    创建:当浏览器第一次访问服务器动态资源就创建

    活着:服务器应用运行时

    死亡:

    Session.invalidate();强制销毁

    超时:默认30分钟

    setMaxInactiveInterval(int )单位秒

    Session的持久化

    节约内存空间;

    确保在服务器重启或单个Web应用重启后,能回复重启前的会话;

    方法:需要的类上面实现Serializable接口(session存储对象实现)

    JSP:

    当访问lesson1.jsp时,会先将其编译lession1_jsp.java,然后再编译成lession1_jsp.class

    • JSP全称是Java Server Pages,它和servle技术一样,都是SUN公司定义的一种用于开发动态web资源的技术。JSP/Servlet规范。JSP实际上就是Servlet。 
    • JSP这门技术的最大的特点在于,写jsp就像在写html,但它相比html而言,html只能为用户提供静态数据,而Jsp技术允许在页面中嵌套java代码,为用户提供动态数据。

    jsp的最佳实践

    • Servlet:控制器。重点编写java代码逻辑 (获取表单数据、处理业务逻辑、分发转向)
    • JSP:代码显示模板。重点在于显示数据

    演示:JSP也可以处理表单请求,但一般不用这么用,由Servlet去处理表单

    注:request,out,response称为JSP的内置对象,不需要声明直接使用

    两种指定.jsp的方式都可以:

    1.加项目名

    2.直接写.jsp文件名

    1. 小脚本 <% java代码 %>
    2. 表达式 <%= 2+3 %> 等价于out.print(2+3);
    3. 声明   <%! %> 表示在类中定义全局成员,和静态块。

    JSP注释:<%-- 被注释的内容 --%> 特点:安全,省流量

    网页注释:<!-- 网页注释 -->    特点:不安全,费流量

    Page

    属性:

    少用:自学

    session: 是否会自动创建session对象。默认值是true;

    buffer: JSP中有javax.servlet.jsp.JspWriter输出字符流。设置。输出数据的缓存大小,默认是8kb

    isErrorPage: 是否创建throwable对象。默认是false;

    常用:演示

    import 和java代码中的import是一样的

    <%@ page import="java.util.Date,java.util.List"%>

    或者:

    <%@ page import="java.util.Date"%>

    <%@ page import="java.util.List"%>

    注:JSP会自动导入以下的包:

    import java.lang.*;

    import javax.servlet.*;

    import javax.servlet.http.*;

    import javax.servlet.jsp.*;

    errorPage: 如果页面中有错误,则跳转到指定的资源

    errorPage="/uri" 如果写“/”则代表当前应用的目录下,绝对路径。

    如果不写“/”则代表相对路径。

     有/就是从WebContent路径下寻找

    contextType: 等同于response.setContextType("text/html;charset=utf-8");

    pageEncoding: 告诉JSP引擎要翻译的文件使用的编码。

    isELIgnored: 是否支持EL表达式。 默认是false

    include

    静态包含:把其它资源包含到当前页面中。

    <%@ include file="/include/header.jsp" %>

    动态包含:

    <jsp:include page="/include/header.jsp"></jsp:include>

    两者的区别:翻译的时间段不同

    前者:在翻译时就把两个文件合并

    后者:不会合并文件,当代码执行到include时,才包含另一个文件的内容。

     jsp翻译过程是指:访问.jsp文件时,h会把.jsp转成.java再转成.class

    原则:能用静的就不用动的。

    JSP的6个常用动作:

    JSP的6个常用动作

    • <jsp:include > 动态包含  另一个jsp内容进入当前的jsp页面
    • <jsp:forward> 请求转发        (相当于request的转发)
    • <jsp:param> 设置请求参数           
    • <jsp:useBean> 创建一个对象
    • <jsp:setProperty> 给指定的对象属性赋值
    • <jsp:getProperty> 取出指定对象的属性值

     对象的id与下面的name是相关联的

  • 相关阅读:
    前端开发聚合
    6. webRTC
    14.移动端图片浏览组件 react-wx-images-viewer
    windows下怎样使用md命令一次建立多级子目录
    mysql打印输出转csv格式
    Java Stream简介, 流的基本概念
    Linux使用Shell脚本实现ftp的自动上传下载
    在Linux中设置UMASK值
    SFTP+OpenSSH+ChrootDirectory设置
    导出php5.4支持的数组格式,即以[]为标识符而不是以array()标识
  • 原文地址:https://www.cnblogs.com/zhangwugai/p/11390882.html
Copyright © 2011-2022 走看看