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是相关联的

猜你喜欢

转载自www.cnblogs.com/zhangwugai/p/11390882.html