Java_Web之状态管理
回顾及作业点评:
(1)JSP如何处理客户端的请求?
使用response对象处理响应
(2)请描述转发与重定向有何区别?
转发是在服务器端发挥作用,通过forward方法将提交信息在多个页面间进行传递。客户端浏览器的地址栏不会显示出转向后的地址
重定向是在客户端发挥作用,通过请求新的地址实现页面转向,在地址栏中可以显示转向后的地址
(3)JSP如何实现数据库访问?
使用JDBC访问数据库
预习检查:
(1)除了request对象和response对象,JSP还包括哪些内置对象?
1、Cookie 2、session是JSP内置对象 3、application对象
(2)Cookie的作用?
1、对特定对象的追踪 2、统计网页浏览次数 3、简化登录
(3)请说明session对象与application对象的区别?
在一次会话范围内容有效,在会话期间与session绑定的对象皆属于该范围
在一个应用服务器范围内有效,当应用服务启动后即创建该对象,并向所有用户所共享
本章目标
掌握Cookie的原理及应用
掌握session的原理及应用
掌握application的原理及应用
本章任务
一、使用Cookie实现保存已访问的信息
(1)什么是Cookie?
Cookie是Web服务器保存在客户端的一系列文本信息
Cookie的作用
对特定对象的追踪
统计网页浏览次数
简化登录
安全性能 容易信息泄露
(2)Cookie的语法
第一步:导入包
import="javax.servlet.http.Cookie" 第二步:创建Cookie
Cookie newCookie=new Cookie("parameter", "value");
parameter:用于代表cookie的名称(key)
value:用于表示当前key名称所对应的值 第三步:写入Cookie
response.addCookie(newCookie)
(3)设置Cookie属性的常用方法
类型 方法名称 说 明
void setMaxAge(int expiry) 设置Cookie的有效期,以秒为单位 void setValue(String value) 在Cookie创建后,对Cookie进行赋值 String getName() 获取Cookie的名称 String getValue() 获取Cookie的值 String getMaxAge() 获取Cookie的有效时间,以秒为单位
案例:
------从登录验证页面表单中获取用户名------
<%
String username=reqeust.getParameter("username");
//以key/value的形式创建Cookie
创建Cookie,使用response的addCookie方法保存Cookie Cookie uname=new Cookie("uname", username);
response.addCookie(uname);
... ...
%>
-----在显示页面显示用户名---------------
<%//获取请求中的Cookie,以数组方式保存
使用reqeust获取Cookie数组,通过cookie的名称获取对应的内容 Cookie cookies[ ]=request.getCookies();
//循环遍历数组,得到key=uname的Cookie
for(int i=0;i<cookies.length;i++){
Cookie ucookie=cookies[i];
if(ucookie.getName().equals("uname”));//判断Cookie的名称
%>
欢迎你:<%=ucookie.getValue() %>//获取key对应的value,输出显示
<% } %>
二、使用session对象实现页面访问控制
(1)如图:

(2)什么是会话?
一个会话就是浏览器与服务器之间的一次通话,包含浏览器与服务器之间的多次请求、响应过程
(3)JSP内置对象session

(4)session与窗口的关系
一个session对应一个窗口,那么通过超链接打开的窗口是否也是新的session呢?
答案:不是
每个session对象都与浏览器一一对应 重新开启一个浏览器,相当于重新创建一个session对象重新开启一个IE窗口,直接访问系统首页面
通过超链接打开的新窗口,新窗口的session与其父窗口的session相同
(5)使用session实现访问控制

在控制页面获取用户请求的登录信息进行验证
------登录处理页面的代码片断------
<%
if (rs.next()) { //如果是已注册用户
在session中存放用户登录信息 session.setAttribute("LOGINED_USER", loginedUser);
response.sendRedirect("index.jsp");
} else {
response.sendRedirect("login.html");
}
%> --如果session中不存在该用户的登录信息,转入登录页面-- <%
User user = (User) session.getAttribute("LOGINED_USER");
if (user == null) {
response.sendRedirect("login.jsp");
}
%>
(6)include指令
除了首页面,其它页面中同样需要加入登录验证, 有没有办法避免冗余代码的出现?
可以将一些共性的内容写入一个单独的文件中,然后通过include指令引用该文件,从而降低代码的冗余问题,也便于修改共性内容
案例:创建登录验证文件 loginControl.jsp
<%@ page import="org.jbit.bean.User"%>
<%
User user = (User) session.getAttribute("LOGINED_USER");
if (user == null) {
response.sendRedirect("login.html");
}
%>
在后台首页面中使用include指令引用登录验证文件
<%@ include file="loginControl.jsp" %>
(7)Cookie与session的比较
session是在服务器端保存用户信息,Cookie是在客户端保存用户信息
session中保存的是对象,Cookie保存的是字符串
session随会话结束而关闭,Cookie可以长期保存在客户端
Cookie通常用于保存不重要的用户信息,重要的信息使用session保存
三、使用application对象实现统计在线人数
(1)JSP内置对象application
application类似于系统的“全局变量”,用于实现用户之间的数据共享 application对象的常用方法:
void setAttribute(String key, Object value):以键/值的方式,将一个对象的值存放到application中 application.setAttribute("LOGINED_USER", new ArrayList());
Object getAttribute(String key):根据键去获取application中存放对象的值
if (application.getAttribute("LOGINED_USER") != null) { List loginedUsers = (List) application.getAttribute("LOGINED_USER"); }
(2)application对象

(3)实现访问人数统计2-1
创建登录处理页面
------登录处理页面代码片断------
if (rs.next()) {
User logineduser = new User(name, pass);
session.setAttribute("LOGINED_USER", logineduser);
List loginedUsers = new ArrayList(); //访问者列表
if (application.getAttribute("LOGINED_USER") != null)
loginedUsers = (List) application.getAttribute("LOGINED_USER");
loginedUsers.add(logineduser); //把新登录用户的信息存入访问者列表中
application.setAttribute("LOGINED_USER", loginedUsers);
response.sendRedirect("index.jsp");
}
创建已访问人数统计页面 ------已访问人数统计页面代码片断------
<% List loginedUsers = new ArrayList(); //访问者列表
if (application.getAttribute("LOGINED_USER") != null)
loginedUsers = (List) application.getAttribute("LOGINED_USER");
%>
目前,有<%=loginedUsers.size()%>人已经访问过本网站!<br><br>
(4)JSP内置对象的范围

Java_Web之状态管理的更多相关文章
- Redux状态管理方法与实例
状态管理是目前构建单页应用中不可或缺的一环,也是值得花时间学习的知识点.React官方推荐我们使用Redux来管理我们的React应用,同时也提供了Redux的文档来供我们学习,中文版地址为http: ...
- 表格搞定 Asp.net Web 状态管理
最近在网上搜罗了 ASP.NET WEB 状态管理方面的一些内容,终于把这些内容整合总结了一下. 1. 希望自己通过整理,能够掌握一些,为自己投资. 2. 以便自己忘记,又要浪费时间搜罗. 3. 希望 ...
- [译]面向初学者的Asp.Net状态管理技术
介绍 本文主要讲解Asp.Net应用程序中的状态管理技术(Asp.Net中有多种状态管理技术),并批判性地分析所有状态管理技术的优缺点. 背景 HTTP是无状态的协议.客户端发起一个请求,服务器响应完 ...
- [Asp.Net]状态管理(Session、Application、Cache)
上篇博文介绍了在客户端状态管理的两种方式:http://www.cnblogs.com/wolf-sun/p/3329773.html.除了在客户端上保存状态外,还可以在服务器上保存状态.使用客户端的 ...
- [Asp.Net]状态管理(ViewState、Cookie)
简介 HTTP协议是无状态的.从客户端到服务器的连接可以在每个请求之后关闭.但是一般需要把一些客户端信息从一个页面传送给另一个页面. 无状态的根本原因是:浏览器和服务器使用Socket通信,服务器将请 ...
- HttpClient_HttpClient 4.3.6 HTTP状态管理
HTTP状态管理 最初的HTTP被设计成以状态.请求/应答为导向的协议,它被制作成是没有特殊条款的,以便在状态会话中能交换逻辑关系请求/应答.HTTP协议越来越受欢迎和被采用,越来越多的系统会在应用程 ...
- Ansible状态管理
转载自:http://xdays.me/ansible状态管理.html 简介 就像所有服务器批量管理工具(puppet有DSL,salt有state)一样,ansible也有自己的状态管理组件 ...
- ASP.NET状态管理详解,让你明明白白
开发WinFrom的程序员可能不会在意维护应用程序的状态,因为WinFrom本身就在客户端运行,可以直接在内存中维护其应用程序状态.但ASP.NET应用程序在服务器端运行,客户端使用无状态的http协 ...
- 状态管理cookie 案例
1状态管理:服务器为了追踪同一个客户端发出的请求,将多次交互看成一个整体看待 2:cookie的生存时间,默认情况下,cookie保存在浏览器内存中,只要不关闭浏览器,cookie就一直存在 如果希望 ...
随机推荐
- Flask - 请求处理流程和上下文源码分析
目录 Flask - 请求处理流程和上下文 WSGI Flask的上下文对象及源码解析 0. 请求入口 1.请求上下文对象的创建 2. 将请求上下文和应用上下文入栈 3.根据请求的URl执行响应的视图 ...
- 8 pandas模块,多层索引
1 创建多层索引 1)隐式构造 最常见的方法是给DataFrame构造函数的index参数传递两个或更多的数组 · Series也可以创建多层索引 ...
- IE7浏览器下去除flash动画边框问题
<object width="100%" height="100%" data="/templates/default/swf/guide.sw ...
- Contest Round #451 (Div. 2)F/Problemset 898F Restoring the Expression
题意: 有一个a+b=c的等式,去掉两个符号,把三个数连在一起得到一个数 给出这个数,要求还原等式,length <= 1e6 三个数不能含有前导0,保证有解 解法: 铁头过题法,分类然后各种判 ...
- log4net的相关使用笔记
1, XmlConfigurator 创建添加一个Tracer project,引用nuget上最新的log4net 在Tracer里新增一个AppLog类: public static class ...
- iOS学习笔记17-FMDB你好!
上一节我已经介绍了SQLite的简单使用,不了解的可以提前去看一下iOS学习笔记16-数据库SQLite,这节我们来讲下FMDB. 一.FMDB介绍 FMDB是一种第三方的开源库,FMDB就是对SQL ...
- 【学QT】2 - QT/E环境的建立
Arm-Linux嵌入式QT/E环境的建立(qt/e 3.x系列) QT/E 3.x系列比QT/E 2.x系列有非常大的改进,大大提高了开发进度,不再使用tmake,安装也更简单.但 ...
- nyoj_33_蛇形填数_201308221636
蛇形填数时间限制:3000 ms | 内存限制:65535 KB 难度:3描述 在n*n方陈里填入1,2,...,n*n,要求填成蛇形.例如n=4时方陈为:10 11 12 19 16 13 28 ...
- 洛谷—— P2015 二叉苹果树
https://www.luogu.org/problem/show?pid=2015 题目描述 有一棵苹果树,如果树枝有分叉,一定是分2叉(就是说没有只有1个儿子的结点) 这棵树共有N个结点(叶子点 ...
- 一次MySQL(INNODB存储引擎) 死锁捉虫记
前言 任何系统不管在什么阶段都需要关注生产环境错误日志,最近几个月内,发现偶尔会出现数据库死锁情况.以前碰到的数据库类错误大部分是SQL语法造成的错误,来到新东家之后才第一次碰到死锁情况,以前是搞游戏 ...