频 道 直 达 - 新闻 - 培训 - 软件 - 教程 - 前沿 - 组网 - 系统应用 - 安全 - 编程 - 存储 - 操作系统 - 数据库 - 服务器 - 专题 - 产品 - 案例库 - 读书 - 博客 - BBS
51CTO.COM_中国最大的网络技术网站
找资料:

10.1.1 在不同页面之间共享数据

作者: 刘晓华/张健/周慧贞 出处:电子工业出版社  (  ) 砖  (  ) 好  评论 ( ) 条  进入论坛
更新时间:2007-04-24 16:54
关 键 词:页面  数据  JSP  Java  JSP应用开发详解(第三版)
阅读提示:本节将讨论JSP开发经常要使用的技术和技巧。通过学习本章,读者不仅可以掌握一些技巧,也可以巩固JSP、Servlet的基础语法知识。本章的主要内容有:①在不同页面或者用户之间共享数据;②创建错误处理页面;③国际化问题的解决;④在JSP中操作文件;⑤在JSP中上传文件。

1.使用Session共享数据

用户在浏览网页时,由于HTTP协议是一种无状态的协议,往往在不同的页面之间存在数据交换的问题,这就需要在这些不同的页面之间共享数据。在编程实现中,我们最常见的实现方法是把要共享的数据保存到Session中。比如在用户登录的页面中把一些用户的信息保存到Session之中,然后在其他的页面中读取用户的信息。

这些共享的数据可以是字符串或者与Java的原始数据类型相关的对象,也可以是一个Java对象。

下面来看一个实际的例子。用户登录时,如果验证成功,就把登录的信息保存在一个userSession的类中,在其他的页面可以读取这个值。

下面我们来看userSession的具体代码,如例程10-1所示。

例程10-1  userSession的具体代码

package com.jspdev.ch10;
import java.util.Date;

public class UserSession
{
private boolean isLogin=false;
private String userId;
private Date lastLoginTime;
private int logCount;

public void setIsLogin(boolean l)
{
this.isLogin=l;
}
public void setUserId(String userId)
{
this.userId=userId;
}
public void setLastLoginTime(Date l)
{
this.lastLoginTime=l;
}
public void setLogCount(int logCount)
{
this.logCount=logCount;
}
public boolean isLogin()
{
return this.isLogin;
}
public String getUserId()
{
return this.userId;
}
public Date getLastLoginTime()
{
return this.lastLoginTime;
}
public int getLogCount()
{
return this.logCount;
}
}

这里只是简单地列出了一些必要的信息,可能还有更多的信息需要保存在userSession中。下面我们来看怎么使用这个类,假设有一个登录验证页面,它的代码如例程10-2所示。

例程10-2  login.jsp

<%@ page contentType="text/html; charset=gb2312"
language="java" import="java.sql.*,com.jspdev.ch10.*" errorPage="" %>
<html>
<head>
<title>Untitled Document</title>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
</head>
<body>
<%
String name=request.getParameter("name");
String password=request.getParameter("password");
//连接数据库,进行登录
//int logCount=resultSet.getInt("count");
//java.util.Date lastLoginTime=resultSet.getDate("lastLogintime");
//这里简单设置logCount和lastLoginTime的值
UserSession user=new UserSession();
user.setUserId(name);
user.setIsLogin(true);
user.setLastLoginTime(new java.util.Date());
user.setLogCount(10);
session.setAttribute("userSession",user);
response.sendRedirect("welcome.jsp");
%>
</body>
</html>

这个登录页面的假想处理过程是这样的:

(1)获得用户登录信息。
(2)连接数据库,进行权限验证。
(3)如果验证通过,那么读取用户的注册信息。
(4)把用户的注册信息保存到一个userSession对象中。
(5)把userSession对象保存到Session内建对象中。
(6)把视图派发到下一个显示页面。

需要注意的是,session.setAttribute("userSession",user)把userSession的一个对象设置到Session中,Session只能保存对象,不能保存原生类型(即原始数据类型),比如:

session.setAttribute("count",10)

是非法的语句。如果要把值为10的整数保存到Session中,需要使用以下的方法:

session.setAttribute("count",new Integer(10));

然后在另一个页面中使用:

(Integer)session.getAttribute("count")

把这个整数读取出来。

下面我们看怎么在另一个页面中把userSession对象读取出来,如例程10-3所示。

例程10-3  在另一个页面中读取userSession中的对象(welcome.jsp)

<%@ page contentType="text/html; charset=gb2312"
language="java" import="java.sql.*,com.jspdev.ch10.*" errorPage="" %>

<%

UserSession user=(UserSession)session.getAttribute("userSession");
try
{
if(user.isLogin())
{
out.print("欢迎您,你的登录ID是:"+user.getUserId());
out.print("你的上次登录的时间是:"+user.getLastLoginTime());
out.print("现在是你第:"+user.getLogCount()+"次登录此网站");
}
else
response.sendRedirect("login.html");
}
catch(Exception e)
{
response.sendRedirect("login.html");
}
%>
</body>
</html>

可以看出,通过:

UserSession user=(UserSession)session.getAttribute("userSession");

代码来读取在前一个页面中设置的对象,然后再从这个对象中读取一些相关的值。

当然,也可以使用JavaBean的形式,如例程10-4所示,可以在login.jsp中这样使用JavaBean。

例程10-4  使用JavaBean共享数据

<%@ page contentType="text/html; charset=gb2312"
language="java" import="java.sql.*,com.jspdev.ch10.*" errorPage="" %>
<jsp:useBean id="user" class="com.jspdev.ch10.UserSession" scope="session"/>
<%
String name=request.getParameter("name");
String password=request.getParameter("password");

user.setUserId(name);
user.setIsLogin(true);
user.setLastLoginTime(new java.util.Date());
user.setLogCount(10);
response.sendRedirect("welcome.jsp");
%>

注意,这里的JavaBean的范围是Session。同样,在另一个页面中也可以使用<jsp:useBean>指令获得前面的JavaBean,如例程10-5所示。

例程10-5  在另一页面中使用JavaBean

<jsp:useBean id="user" class="com.jspdev.ch10.UserSession" scope="session"/>
<%
try
{
if(user.isLogin())
{
out.print("欢迎您,你的登录ID是:"+user.getUserId());

%>

在<jsp:useBean>指令中,由于指定了它的scope为Session,如果在Session中已经有一个userSession的JavaBean,那么就直接使用它;如果还没有这个JavaBean,就创建一个新的JavaBean。由于在前面的页面中已经创建了JavaBean,这里简单地读取它的值就可以了。

其实这种共享数据的方式和session.setAttribute("name","value")的本质是一样的。

在浏览器里输入:http://127.0.0.1:8080/ch10/login.html,在表单中填写任意的值提交即可看到运行的结果。

2.使用Cookie

和Session不同的是,Cookie是放在客户端的。由于客户端可能考虑安全等因素会禁止使用Cookie,这样在使用Cookie时可能会遇到一些麻烦。

下面我们来看一个使用Cookie的例子,如例程10-6所示。

例程10-6  在客户端设置Cookie(setCookie.jsp)

<%@ page contentType="text/html; charset=gb2312"
language="java" import="java.sql.*,javax.servlet.*,javax.servlet.http.*,
com.jspdev.ch10.*" errorPage="" %>
<%
Cookie cookie=new Cookie("lastLoginTime",new java.util.Date().toLocaleString());
response.addCookie(cookie);
%>
//已经在客户端设置了Cookie,你可以在<a href="getCookie.jsp">这个</a>页面中读取这个Cookie

在这种方式中,首先创建Cookie,然后通过response.addCookie()方法把Cookie添加到客户端。

下面我们看怎么在另一个页面中读取这个Cookie,如例程10-7所示。

例程10-7  在另一个页面中读取Cookie(getCookie.jsp)

<%@ page contentType="text/html; charset=gb2312"
language="java" import="java.sql.*,javax.servlet.*,javax.servlet.http.*,
com.jspdev.ch10.*" errorPage="" %>
<%
Cookie[] cookies = request.getCookies();
for (int i = 0; i < cookies.length; i++) {
Cookie c = cookies[i];
String name = c.getName();
if(name.equals("lastLoginTime"))
out.println("你上次登录的时间是:" + c.getValue());
}
%>

在这个页面中,首先获得客户端的所有Cookie,然后从这些Cookie中获得目标的Cookie以读取它的值。

3.使用隐含的表单

这种方式通过隐含表单的形式把数据传递到下一个页面,它有两个局限性:

◆只能在相邻的两个页面之间传递数据。
◆客户端可以通过查看网页源代码的方法获得表单中的数据,安全性不好。

简单地看一下它的使用方法:

<form action="target.jsp">
<input type=hidden name="test" value="test">
<input type=hidden name="test2" value="test2">
</form>

在另一个页面中,通过以下的方式获得这些数据:

String test=request.getParameter("test");
String test2=request.getParameter("test2");

【责任编辑:火凤凰 TEL:(010)68476606-8007】

回书目   上一节   下一节
发表
查看
我也说两句

匿名发表

(如果看不清请点击图片进行更换)


中 国 最 大 的 网 络 技 术 网 站 ·
技 术 成 就 梦 想
订阅技术快讯
电子杂志下载
名称:网络安全精品应用黄皮书
简介:《2007精品网络安全黄皮书》包括了9个大类24个小类, 800余篇文章,内容包含了熊猫烧香病毒、DDOS攻击、ARP病等热点问题的介绍及解决方案。从病毒查杀、防范、系统、数据等各方面的安全设置到黑客技术的了解、防范,涉及到了安全应用的全部领域, 由浅至深内容全面。
名称:Vista精品应用黄皮书
简介:《Vista精品应用黄皮书》囊括了Vista的各方面内容。此次的精简版,是将里面的内容做了提取,便于用户下载和使用。内容包含了各种Vista的安装与实施、技巧与解析以及各种Vista相关学习文档和相关软件的安全下载。该电子书是了解和应用Vista人员必备的工具手册,并且也是第一本
名称:2006中国IT论坛精品集合
简介:本书由“51CTO论坛推广联盟”制作完成。书中所有内容均来自各联盟成员的论坛(网站)。制作本书的目的是为了集中大家的优势资源,将更多更精彩的内容带给广大技术爱好者。本书是联盟成立以来制作的第一本书。
关键字阅读
频道精选
主编信箱 热线:010-66476606 告诉我们您想看的:专题 文章
关于我们 | 诚聘英才 | 联系我们 | 网站大事 | 意见反馈 | 网站地图
Copyright©2005-2007 51CTO.COM 版权所有