Java Web学习笔记05:状态管理

文章目录

一、Cookie

1、Cookie作用

2、Cookie安全性能

3、Cookie语法

(1)导入包

(2)创建Cookie

(3)写入Cookie

4、Cookie对象常用方法

5、案例演示:利用Cookie保存登录用户名信息

(1)创建Web项目CookieDemo

(2)修改web目录里的首页文件index.jsp

(3)在web目录里创建登录页面login.jsp

(4)在web目录里创建登录处理页面do_login.jsp

(5)在web目录里创建登录成功页面success.jsp

(6)启动tomcat服务器,查看运行效果

二、session对象

1、什么是会话

2、利用会话机制实现访问控制

3、session对象常用方法

4、session与窗口的关系

5、案例演示:使用session实现访问控制

(1)创建Web项目SessionDemo

(2)在src目录里创建net.hw.bean包,在包里创建User实体类

(3)在web目录里修改首页文件index.jsp

(4)在web目录里创建登录页面login.jsp

(5)在web目录里创建登录处理页面do_login.jsp

(6)在web目录里创建添加新闻页面,增加登录验证

(7)启动服务器,查看运行效果

6、Cookie与session的比较

三、application对象

1、application对象的作用

2、application对象的常用方法

3、案例演示:统计网站访问人数

(1)创建Web项目ApplicationDemo

(2)在WEB-INF目录里创建lib目录,添加数据库驱动程序jar包

(3)在web目录里修改首页index.jsp内容

(4)在web目录里创建登录页面login.jsp

(5)在src里创建net.hw.bean包,创建用户实体类User

(6)在src里创建net.hw.dbutil包,在里面创建ConnectionManager类

(7)在src里创建net.hw.dao包,在里面创建用户数据访问接口UserDao

(8)在user.hw.dao里创建impl子包,在里面创建用户数据访问接口实现类UserDaoImpl

(9)在web目录里创建登录处理页面do_login.jsp

(10)在web目录里创建登录成功页面success.jsp

(11)启动服务器,查看运行效果

四、JSP隐含对象的范围

五、小结

六、课后作业

练习1、使用Cookie简化用户登录

练习2、使用session实现访问控制

练习3、网页计数器

练习4、新闻栏目的读取

练习5、添加新闻主题

练习6、主题动态显示


Java Web学习笔记05:状态管理_第1张图片

一、Cookie

浏览购物网站查看不同商品时,系统会自动记录已经浏览过的商品。Cookie是Web服务器保存在客户端的一系列文本信息。

1、Cookie作用

  • 会话状态管理(如用户登录状态、购物车、游戏分数或其它需要记录的信息)
  • 个性化设置(如用户自定义设置、主题等)
  • 浏览器行为跟踪(如跟踪分析用户行为等)

2、Cookie安全性能

使用Cookie,容易信息泄露。

3、Cookie语法

(1)导入包

import="javax.servlet.http.Cookie"

(2)创建Cookie

Cookie newCookie=new Cookie("parameter", "value");

parameter:用于代表cookie的名称(key)

value:用于表示当前key名称所对应的值

(3)写入Cookie

response.addCookie(newCookie)

4、Cookie对象常用方法

Java Web学习笔记05:状态管理_第2张图片

5、案例演示:利用Cookie保存登录用户名信息

(1)创建Web项目CookieDemo

Java Web学习笔记05:状态管理_第3张图片

采用自动方式创建的Web项目,需要在两处做一些修改:

Java Web学习笔记05:状态管理_第4张图片

Java Web学习笔记05:状态管理_第5张图片

Java Web学习笔记05:状态管理_第6张图片

(2)修改web目录里的首页文件index.jsp

Java Web学习笔记05:状态管理_第7张图片

(3)在web目录里创建登录页面login.jsp

Java Web学习笔记05:状态管理_第8张图片

(4)在web目录里创建登录处理页面do_login.jsp

Java Web学习笔记05:状态管理_第9张图片

(5)在web目录里创建登录成功页面success.jsp

Java Web学习笔记05:状态管理_第10张图片

(6)启动tomcat服务器,查看运行效果

Java Web学习笔记05:状态管理_第11张图片

输入正确的用户名和密码,单击【登录】按钮:

Java Web学习笔记05:状态管理_第12张图片

任务1、无须用户设置,登录时会在用户名框里显示上次登录成功的用户名。

修改一下登录页面login.jsp。要做两件事情:

(1)从Cookie里获取上次登录成功的用户名

Java Web学习笔记05:状态管理_第13张图片

(2)用登录成功的用户名自动填充用户名文本框

首先得设置用户名文本框的id属性,然后通过JavaScript获取用户名文本框元素,用登录成功的用户名去设置该元素的value属性值。

Java Web学习笔记05:状态管理_第14张图片

Java Web学习笔记05:状态管理_第15张图片

(3)启动tomcat服务器,查看运行效果

Java Web学习笔记05:状态管理_第16张图片

课堂练习:无须用户设置,登录时在用户名框里显示上次登录成功的用户名,在密码框里显示上次登录成功的密码。

Java Web学习笔记05:状态管理_第17张图片

注意:如果浏览器禁用Cookie,那么上述功能就无法实现了。

课堂练习:让用户来决定是否要记住用户名或密码。

Java Web学习笔记05:状态管理_第18张图片

(1)在登录页面login.jsp添加两个复选框

Java Web学习笔记05:状态管理_第19张图片

(2)在登录处理页面do_login.jsp根据用户的设置来决定是否记住用户名或密码

Java Web学习笔记05:状态管理_第20张图片

登录处理页面do_login.jsp完整代码如下:

<%
    // 获取表单提交的数据
    String username = request.getParameter("username");
    String password = request.getParameter("password");
    String[] choice = request.getParameterValues("save");

    // 判断用户是否登录成功
    if (username.equals("无心剑") && password.equals("903213")) {
        // 创建Cookie对象
        Cookie uname = new Cookie("uname", username);
        Cookie upwd = new Cookie("upwd", password);
        Cookie saveuname = new Cookie("saveuname", "no");
        Cookie saveupwd = new Cookie("saveupwd", "no");
        if (choice != null) {
            if (choice.length == 2) {
                saveuname.setValue("yes");
                saveupwd.setValue("yes");
            } else {
                saveuname.setValue("yes");
            }
        }
        // 将Cookie对象写入客户端
        response.addCookie(uname);
        response.addCookie(upwd);
        response.addCookie(saveuname);
        response.addCookie(saveupwd);
        // 采用重定向,跳转到登录成功页面
        response.sendRedirect("success.jsp");
    } else {
        // 采用重定向,跳转到登录页面
        response.sendRedirect("login.jsp");
    }
%>

(3)修改登录页面login.jsp

给密码元素添加id属性:upwd

Java Web学习笔记05:状态管理_第21张图片

从Cookie里读取用户的选择,是否记住用户名或密码:

Java Web学习笔记05:状态管理_第22张图片

根据从Cookie里读取的用户选择,设置两个复选框的值:

Java Web学习笔记05:状态管理_第23张图片

根据用户做出的选择,决定是否自动填充用户名或密码框:

Java Web学习笔记05:状态管理_第24张图片

编写密码框的单击事件方法setchkuname(),一旦用户选择了记住密码,那么自动就会选择记住用户名:

Java Web学习笔记05:状态管理_第25张图片

登录页面login.jsp完整代码如下:

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8" %>



    用户登录


用户登录

用户名
密 码
记住用户名 记住密码
<% String uname = ""; String upwd = ""; String saveuname = ""; String saveupwd = ""; Cookie[] cookies = request.getCookies(); for (Cookie cookie: cookies) { if (cookie.getName().equals("uname")) { uname = cookie.getValue(); } if (cookie.getName().equals("upwd")) { upwd = cookie.getValue(); } if (cookie.getName().equals("saveuname")) { saveuname = cookie.getValue(); } if (cookie.getName().equals("saveupwd")) { saveupwd = cookie.getValue(); } } %>

(4)重启服务器,查看运行效果

Java Web学习笔记05:状态管理_第26张图片

课堂练习:如果登录失败,返回登录页面,首先要弹出一个消息框,提示用户用户名或密码错误,要重新登录,并且要清空表单的所有元素。

Java Web学习笔记05:状态管理_第27张图片

Java Web学习笔记05:状态管理_第28张图片

重启服务器,查看运行效果:

Java Web学习笔记05:状态管理_第29张图片

项目下载链接:https://pan.baidu.com/s/1Nf0eANvuoFoN8uAmoKfP2Q    提取码:tdnk 

二、session对象

1、什么是会话

一个会话就是浏览器与服务器之间的一次通话,包含浏览器与服务器之间的多次请求、响应过程。session对象用来存储有关用户会话的所有信息。

2、利用会话机制实现访问控制

访问控制实例:下载电子书时,系统会提示用户登录网站。

Java Web学习笔记05:状态管理_第30张图片

使用JSP会话跟踪机制,可以维持每个用户的会话信息,也就是为不同的用户保存不同的数据。

3、session对象常用方法

Java Web学习笔记05:状态管理_第31张图片

4、session与窗口的关系

每个session对象都与浏览器一一对应,重新开启一个浏览器,相当于重新创建一个session对象;通过超链接打开的新窗口,新窗口的session与其父窗口的session相同。

5、案例演示:使用session实现访问控制

(1)创建Web项目SessionDemo

Java Web学习笔记05:状态管理_第32张图片

(2)在src目录里创建net.hw.bean包,在包里创建User实体类

Java Web学习笔记05:状态管理_第33张图片

(3)在web目录里修改首页文件index.jsp

Java Web学习笔记05:状态管理_第34张图片

(4)在web目录里创建登录页面login.jsp

Java Web学习笔记05:状态管理_第35张图片

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8" %>



    用户登录


用户登录

用户名
密 码
<% String errMsg = (String) session.getAttribute("errMsg"); if (errMsg != null) { errMsg = new String(errMsg.getBytes("ISO-8859-1"), "utf-8"); out.println(""); } %>

(5)在web目录里创建登录处理页面do_login.jsp

Java Web学习笔记05:状态管理_第36张图片

(6)在web目录里创建添加新闻页面,增加登录验证

Java Web学习笔记05:状态管理_第37张图片

(7)启动服务器,查看运行效果

Java Web学习笔记05:状态管理_第38张图片

访问登录页面:http://localhost:8080/SessionDemo/login.jsp

Java Web学习笔记05:状态管理_第39张图片

输入正确的用户名与密码:

Java Web学习笔记05:状态管理_第40张图片

单击登录按钮,跳转到首页:

Java Web学习笔记05:状态管理_第41张图片

此时,访问添加新闻页面add_news.jsp:

Java Web学习笔记05:状态管理_第42张图片

重启服务器:

Java Web学习笔记05:状态管理_第43张图片

在浏览器地址栏里输入添加新闻页面网址,然后敲回车确认:

Java Web学习笔记05:状态管理_第44张图片

由于此时session里没有LOGINED_USER的信息,因此,登录验证失败,会跳转到登录页面,同时会弹出消息框提示用户:

Java Web学习笔记05:状态管理_第45张图片

Java Web学习笔记05:状态管理_第46张图片

操作录屏GIF:

Java Web学习笔记05:状态管理_第47张图片

现在出现这样一个问题:登录成功之后,访问添加新闻页面,页面会出现乱码,应该添加页面指令,告诉浏览器采用utf-8字符编码,代码修改如下:

Java Web学习笔记05:状态管理_第48张图片

检验一下,登录成功之后,访问添加新闻页面:

Java Web学习笔记05:状态管理_第49张图片

虽然解决了添加新闻页面出现乱码的问题,但是另外一处也会出现乱码:没有登录成功时,直接访问添加新闻页面,就会跳转到登录页面,并且要弹出消息框告诉用户需要登录才能访问添加新闻页面,消息框内容出现乱码:

Java Web学习笔记05:状态管理_第50张图片

这个消息框乱码怎么解决呢?其实很简单,只需要注释掉登录页面里的转码语句。

Java Web学习笔记05:状态管理_第51张图片

重启服务器,验证一下是否正确:

Java Web学习笔记05:状态管理_第52张图片

但是,登录失败时,跳转到登录页面时弹出的消息框内容又出现乱码:

Java Web学习笔记05:状态管理_第53张图片

不能在登录页面里添加那条转码语句,而只能在登录处理页面do_login.jsp里添加页面指令,指定浏览器采用utf-8字符编码:

Java Web学习笔记05:状态管理_第54张图片

重启服务器,测试一下登录失败时跳转到登录页面弹出的消息框内容是否有乱码:

Java Web学习笔记05:状态管理_第55张图片

完整的操作录屏GIF:

Java Web学习笔记05:状态管理_第56张图片

6、Cookie与session的比较

  • session是在服务器端保存用户信息,Cookie是在客户端保存用户信息
  • session中保存的是对象,Cookie保存的是字符串
  • session随会话结束而关闭,Cookie可以长期保存在客户端
  • Cookie通常用于保存不重要的用户信息,重要的信息使用session保存

SessionDemo下载链接:https://pan.baidu.com/s/1bArPf115YsSXz-KSUs9NoA   提取码:6h0b 


同学遇到的问题:登录处理页面do_login.jsp里用户名是中文。

Java Web学习笔记05:状态管理_第57张图片

Java Web学习笔记05:状态管理_第58张图片

此时,哪怕输入正确的用户名(中文)和密码,都会弹出错误消息框:

Java Web学习笔记05:状态管理_第59张图片

在登录处理页面里加一条调试语句:

Java Web学习笔记05:状态管理_第60张图片

重启服务器,让“无心剑”登录:

Java Web学习笔记05:状态管理_第61张图片

怎么才能让服务器端获取的表单数据的中文不是乱码呢?

Java Web学习笔记05:状态管理_第62张图片

再重启服务器,让“无心剑”登录:

Java Web学习笔记05:状态管理_第63张图片


三、application对象

1、application对象的作用

application类似于系统的“全局变量”,用于实现用户之间的数据共享。

2、application对象的常用方法

  • void setAttribute(String key, Object value):以键/值的方式,将一个对象的值存放到application中
  • Object getAttribute(String key):根据键去获取application中存放对象的值

3、案例演示:统计网站访问人数

(1)创建Web项目ApplicationDemo

Java Web学习笔记05:状态管理_第64张图片

在项目结构窗口里修改Artifacts的名称:

Java Web学习笔记05:状态管理_第65张图片

在服务器配置窗口里做一些修改:

Java Web学习笔记05:状态管理_第66张图片

Java Web学习笔记05:状态管理_第67张图片

(2)在WEB-INF目录里创建lib目录,添加数据库驱动程序jar包

Java Web学习笔记05:状态管理_第68张图片

(3)在web目录里修改首页index.jsp内容

Java Web学习笔记05:状态管理_第69张图片

(4)在web目录里创建登录页面login.jsp

Java Web学习笔记05:状态管理_第70张图片

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8" %>



    用户登录


用户登录

用户名
密 码
<% String errMsg = (String) session.getAttribute("errMsg"); if (errMsg != null) { out.println(""); } %>

Java Web学习笔记05:状态管理_第71张图片

/*
 Navicat Premium Data Transfer

 Source Server         : java_mysql
 Source Server Type    : MySQL
 Source Server Version : 50562
 Source Host           : localhost:3306
 Source Schema         : hwdb

 Target Server Type    : MySQL
 Target Server Version : 50562
 File Encoding         : 65001

 Date: 23/10/2019 10:24:35
*/

SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 0;

-- ----------------------------
-- Table structure for t_user
-- ----------------------------
DROP TABLE IF EXISTS `t_user`;
CREATE TABLE `t_user`  (
  `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '编号',
  `username` varchar(20) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '用户名',
  `password` varchar(20) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '密码',
  PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 5 CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Compact;

-- ----------------------------
-- Records of t_user
-- ----------------------------
INSERT INTO `t_user` VALUES (1, 'admin', 'admin');
INSERT INTO `t_user` VALUES (2, '无心剑', '903213');
INSERT INTO `t_user` VALUES (3, '陈雨欣', '111111');
INSERT INTO `t_user` VALUES (4, '李云剑', '123456');

SET FOREIGN_KEY_CHECKS = 1;

(5)在src里创建net.hw.bean包,创建用户实体类User

Java Web学习笔记05:状态管理_第72张图片

package net.hw.bean;

/**
 * 功能:用户实体类
 * 作者:华卫
 * 日期:2019年10月24日
 */
public class User {
    private int id;
    private String username;
    private String password;

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    @Override
    public String toString() {
        return "User{" +
                "id=" + id +
                ", username='" + username + '\'' +
                ", password='" + password + '\'' +
                '}';
    }
}

(6)在src里创建net.hw.dbutil包,在里面创建ConnectionManager类

Java Web学习笔记05:状态管理_第73张图片

package net.hw.dbutil;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;

/**
 * 功能:数据库连接管理类
 * 作者:华卫
 * 日期:2019年10月24日
 */
public class ConnectionManager {
    // 定义连接数据库的参数值
    private static final String DRIVER = "com.mysql.jdbc.Driver";
    private static final String URL = "jdbc:mysql://localhost:3306/hwdb";
    private static final String USER = "root";
    private static final String PASSWORD = "root";

    /**
     * 私有化构造方法,拒绝实例化
     */
    private ConnectionManager() {
    }

    /**
     * 获取数据库连接静态方法
     *
     * @return 数据库连接
     */
    public static Connection getConnection() {
        // 声明数据库连接
        Connection conn = null;

        try {
            // 安装数据库驱动程序
            Class.forName(DRIVER);
            // 获取数据库连接
            conn = DriverManager.getConnection(URL, USER, PASSWORD);
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        } catch (SQLException e) {
            e.printStackTrace();
        }

        // 返回数据库连接
        return conn;
    }

    /**
     * 关闭数据库连接静态方法
     *
     * @param conn 数据库连接
     */
    public static void closeConn(Connection conn) {
        if (conn != null) {
            try {
                if (!conn.isClosed()) {
                    conn.close();
                }
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
    }
}

(7)在src里创建net.hw.dao包,在里面创建用户数据访问接口UserDao

Java Web学习笔记05:状态管理_第74张图片

(8)在user.hw.dao里创建impl子包,在里面创建用户数据访问接口实现类UserDaoImpl

Java Web学习笔记05:状态管理_第75张图片

package net.hw.dao.impl;

import net.hw.dao.UserDao;
import net.hw.dbutil.ConnectionManager;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;

/**
 * 功能:用户数据访问接口实现类
 * 作者:华卫
 * 日期:2019年10月24日
 */
public class UserDaoImpl implements UserDao {
    @Override
    public boolean login(String username, String password) {
        // 定义标识变量
        boolean flag = false;

        // 获取数据库连接
        Connection conn = ConnectionManager.getConnection();
        // 定义SQL字符串
        String strSQL = "select * from t_user where username = ? and password = ?";
        try {
            // 创建预备语句对象
            PreparedStatement pstmt = conn.prepareStatement(strSQL);
            // 设置占位符的值
            pstmt.setString(1, username);
            pstmt.setString(2, password);
            // 执行SQL查询,返回结果集
            ResultSet rs = pstmt.executeQuery();
            // 判断结果集里是否有记录
            if (rs.next()) {
                flag = true;
            }
        } catch (SQLException e) {
            e.printStackTrace();
        } finally {
            // 关闭数据库连接
            ConnectionManager.closeConn(conn);
        }

        // 返回标识变量
        return flag;
    }
}

(9)在web目录里创建登录处理页面do_login.jsp

Java Web学习笔记05:状态管理_第76张图片

 

<%@ page import="net.hw.dao.UserDao" %>
<%@ page import="net.hw.dao.impl.UserDaoImpl" %>
<%@ page import="net.hw.bean.User" %>
<%@ page import="java.util.List" %>
<%@ page import="java.util.ArrayList" %>
<%@ page import="java.net.URLEncoder" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%
    // 设置请求对象字符编码
    request.setCharacterEncoding("utf-8");
    // 获取登录表单提交的数据
    String username = request.getParameter("username");
    String password = request.getParameter("password");

    // 创建用户数据访问对象
    UserDao userDao = new UserDaoImpl();
    // 判断用户是否登录成功
    if (userDao.login(username, password)) {
        // 创建登录用户对象
        User loginedUser = new User();
        // 设置用户对象属性
        loginedUser.setUsername(username);
        loginedUser.setPassword(password);
        // 创建登录用户列表对象
        List loginedUsers = new ArrayList<>();
        // 判断application里是否有登录用户列表属性
        if (application.getAttribute("LOGINED_USERS") == null) {
            // 在application里添加登录用户列表属性
            application.setAttribute("LOGINED_USERS", loginedUsers);
        }  else {
            // 从application里获取登录用户列表
            loginedUsers = (List) application.getAttribute("LOGINED_USERS");            
        }
        // 将当前登录成功的用户添加到登录用户列表里
        loginedUsers.add(loginedUser);
        // 更新application里登录用户列表属性值
        application.setAttribute("LOGINED_USERS", loginedUsers);
        // 清除session里errMsg属性
        if (session.getAttribute("errMsg") != null) {
            session.removeAttribute("errMsg");
        }
        // 采用重定向,跳转到登录成功页面
        response.sendRedirect("success.jsp?username=" + URLEncoder.encode(username, "utf-8"));
    } else {
        // 创建session属性errMsg
        session.setAttribute("errMsg", "用户名或密码错误,请重新登录!");
        // 采用重定向,跳转到登录页面
        response.sendRedirect("login.jsp");
    }
%>

(10)在web目录里创建登录成功页面success.jsp

Java Web学习笔记05:状态管理_第77张图片

(11)启动服务器,查看运行效果

Java Web学习笔记05:状态管理_第78张图片

Java Web学习笔记05:状态管理_第79张图片

Java Web学习笔记05:状态管理_第80张图片

输出正确的用户名:无心剑 - 903213,但是却无法登录成功,什么原因呢?

Java Web学习笔记05:状态管理_第81张图片

在登录处理页面里添加一个输出用户名的调试语句:

Java Web学习笔记05:状态管理_第82张图片

重启服务器,再用“无心剑”登录:

Java Web学习笔记05:状态管理_第83张图片

在UserDaoImpl的登录方法里添加一条输出用户名的调试信息:

Java Web学习笔记05:状态管理_第84张图片

Java Web学习笔记05:状态管理_第85张图片

继续在UserDaoImpl里调试:

Java Web学习笔记05:状态管理_第86张图片

运行程序,结果如下:

Java Web学习笔记05:状态管理_第87张图片

由此可见,是数据库连接的代码存在问题。

Java Web学习笔记05:状态管理_第88张图片

修改代码如下:

Java Web学习笔记05:状态管理_第89张图片

再来测试UserDaoImpl:

Java Web学习笔记05:状态管理_第90张图片

问题终于搞定!!!

再次启动tomcat服务器,查看运行效果:

Java Web学习笔记05:状态管理_第91张图片

程序有一个BUG:admin登录成功2次、无心剑登录成功1次、陈雨欣登录成功1次,按理说,只有3个用户访问过本网站,但结果是有4个用户访问过本网站,大家思考一下,如何Kill掉这个Bug?

解决问题有两个不同的思路:提前预防或善后补救。

(1)提前预防:在添加登录用户到列表时,首先判断列表里是否有该登录用户,如果有了就不再添加。

Java Web学习笔记05:状态管理_第92张图片

重启服务器,检测一下效果:

Java Web学习笔记05:状态管理_第93张图片

我们用admin登录成功两次,按理说,应该是已有1人访问过本网站,但是结果并不是如此,原因何在?

Java Web学习笔记05:状态管理_第94张图片

为什么u1和u2内容完全相同,但是却不相等呢?因为“==”不仅要看内容是否相同,还要看地址是否相同。

为什么u1.equals(u2)也返回false呢?equals方法不是只管内容不管地址吗?

Java Web学习笔记05:状态管理_第95张图片

如果改写User实体类的equals方法,只要用户名和密码是equal的,那么就认为对象是equal的。

Java Web学习笔记05:状态管理_第96张图片

此时,再运行测试Test程序:

Java Web学习笔记05:状态管理_第97张图片

重启服务器,测试运行效果:

Java Web学习笔记05:状态管理_第98张图片

admin登录成功2次,无心剑登录成功1次,结果是已有2人访问过本网站,达到预期目的。OK!

(2)善后补救:将有重复的登录用户列表的用户名取出来放进集合(Set)对象里,自然就会去重,集合的元素个数就是访问过本网站的不同用户数。


课堂练习:在登录成功页面,显示所有已登录用户。


ApplicationDemo下载链接:https://pan.baidu.com/s/1QjGzyxvpy9aqpSfZmpezMQ  提取码:rr0i 
 

四、JSP隐含对象的范围

范围决定了JSP是否可以进行对象访问。

Java Web学习笔记05:状态管理_第99张图片

五、小结

1、请简要描述Cookie与session有哪些区别

2、请简要描述实现页面访问控制的流程

3、请简要描述session与application的区别

六、课后作业

练习1、使用Cookie简化用户登录

需求说明:
用户首次登录时要求输入用户名和密码
登录成功后保存用户的登录状态
设置cookie的有效期为5分钟
在cookie有效期内,可无需登录直接进入欢迎页面
提示:
如果用户名和密码正确,创建Cookie保存信息
使用setMaxAge()方法设置Cookie的有效期
页面访问时首先读取Cookie进行用户信息判断

练习2、使用session实现访问控制

需求说明:
新闻发布必须是管理员登录后才能发布
业务处理页面
获取用户登录信息
访问数据库进行登录验证
验证成功后将信息保存到session
在新闻发布页面添加访问控制
提示:
session中保存的数据类型是Object类型

练习3、网页计数器

需求说明:
统计网页访问次数
业务处理页面
设置网页访问计数器初始值
使用application保存计数器
页面加载时首先取出application中原始计数器的值
在原始计数器值基础上执行+1操作,然后在保存到application中

练习4、新闻栏目的读取

需求说明:
将新闻主题以列表方式显示
显示新闻主题的名称

练习5、添加新闻主题

需求说明:
从数据库中读取出新闻栏目
按照页面布局实现新闻栏目的显示

练习6、主题动态显示

需求说明:
按照页面设计显示新闻主题列表

你可能感兴趣的:(Java,Web开发)