`
lixucheng
  • 浏览: 79809 次
  • 性别: Icon_minigender_1
  • 来自: 大连
社区版块
存档分类
最新评论

网页之间共享值

阅读更多
Web应用是由大量的网页组成的,运行的基本原理是:用户通过客户端浏览器发送向服务器的请求,服务器接收到客户端的请求,根据客户端的请求进行处理,把处理后的结果返回给客户端。在这个过程中,使用的是HTTP协议,是无状态的请求应答模式,也就是说在多次请求之间不会保存状态信息,用户每次提交的信息仅仅在当前请求处理过程有用,例如用户在登陆时候提交的信息只能在第一次处理的时候有用,以后就不能用了。但是有时候程序需要在多个页面或者多次请求之间共享信息,只时候就需要系统提供的其他方式了。
1、在同一次请求的多个页面之间进行共享
这种情况经常出现,尤其是我们采用MVC模式的时候,只要涉及动态信息的显示就需要解决这个问题,因为数据的获取本身是通过模型层的业务逻辑来获取的,业务逻辑是由控制层来调用的,而数据的显示是通过视图层完成的,也就是说需要把控制层得到的数据(通过调用业务逻辑层)通过显示层显示,这样就需要在控制层和视图层之间传递数据,可以把它们看作同一次请求的不同的页面。
如果想在同一次请求之间共享信息,可以通过request完成,涉及两个方面:在第一个地方存储,在第二个地方获取。
1.1 信息的存储
信息的存储是通过request对象的setAttribute方法完成的。方法的完整定义如下:
public void setAttribute(Object name,Object o)第一个参数的格式
第一个参数是要存储的对象的名字,第二个参数是要存储的对象本身,可以是各种数据类型的对象,但不能是基本数据类型,如果要保存基本数据类型的数据,可以使用基本数据类型的封装类。
该方法的作用是在request对象中存储一个对象,第二个参数就是要存储的对象,第一个参数是要存储的对象的名字,如果该名字在request范围内已经使用过,该方法的作用就是替换该对象的值。
例1:
在第一个页面有一个String类型的变量str,需要在第二个页面中使用,怎样保存?
答案:
request.setAttribute(“str”,str);
注意:第一个参数是要保存的变量的名字,可以自己定义。
例2:把计算的结果int类型的变量result保存到request对象中。
答案:
request.setAttibute(“re”,new Integer(result));
注意:new Integer(result)是把整形变量result封装成Integer类型的对象。
1.2 信息的获取
信息的获取是通过getAttribute方法完成的,方法的完整定义如下:
public Object getAttribute(String name)
方法的返回值类型是Object,参数是要获取的对象。需要注意两个问题:第一,如果要获取的信息不存在,返回值是null;第二,我们存储在request中的对象可以是各种类型,但是返回值类型是Object,需要把request中获取的信息进行强制类型转换,看下面的例子。
例1:把上面存储在request中的str对象显示,假设是在JSP页面中显示。
<%
String str;
Object o = request.getAttribute("str");
if(o!=null)
str = (String)o;
out.print(str);
%>
例2:把上面存储的结果显示在JSP页面中。
<%
Integer result;
Object o = request.getAttribute("re");
if(o!=null)
result = (Integer)o;
out.print(result.toString());
%>
2、在相邻页面之间共享信息
想象这样一个功能,要修改用户的信息,我们需要先把用户的信息显示在页面上,然后用户在这个页面上修改,然后把修改后的结果提交给服务器,服务器再把修改后的结果更新到数据库中。
在这个过程中,用户编号(我们假设编号是主键)是不能修改的,但是在服务器端进行处理的时候,需要根据编号进行修改,这个编号在修改界面中是可以获取的,但是在处理界面中不能获取,这样就需要在这个页面之间来共享这个信息。
页面之间共享信息可以通过两种方式完成:第一种,通过表单提交完成,使用隐藏域;第二种,通过请求字符串完成,在请求的地址后面通过“?”号传递参数。
2.1 使用隐藏域传递参数
隐藏域的基本语法格式:
<input type=”hidden” name=”valuename” value=”value”>
和普通的输入框基本相同,只是用户看不到,name是要传递的变量的名字,value是要传递的值本身。
注意:如果要使用隐藏域,必须使用表单提交,如果不使用表单提交,隐藏域的值不会传递到服务器。
例:修改用户基本信息。
这里只给出修改界面和处理界面的代码,假设要修改的信息已经存储在request中,名字是“u”,是User的对象,有uid,uname,uage 3个属性。
修改界面:
<%@ page import="usermanager.User"%>
<html>
<head>
<title>
用户信息修改
</title>
</head>
<body>
<%
Object o = request.getAttribute("u");
if(o==null)
{
out.println("修改的用户不存在!");
return;
}
User u = (user)o;
%>
<form action="process.jsp" mothed="post">
<table>
<tr>用户信息修改</tr>
<tr>
<td>用户编号 </td>
<td><%=u.getUid()%>
<input type="hidden" name="uid" value=<%=u.getUid()%></td>
</tr>
<tr>
<td>用户姓名 </td>
<td><input type="text" name="uname" value="<%=u.getUname()%>"></td>
</tr>
<tr>
<td>用户年龄 </td>
<td><input type="text" name="uname" value="<%=u.getUage()%>"></td>
</tr>
<tr>
<td><input type="submit" value="submit"></td>
<td><input type="reset" value="reset"></td>
</tr>
</table>
</form>
</body>
</html>
处理文件(部分代码):
<%@ page contentType="text/html;charset=gb2312%>
<%
//处理文件
request.setCharacterEncoding("gb2312");
String uid=request.getParameter("uid");
String uname=request.getParameter("uname");
String uage=request.getParameter("uage");
...
%>
2.2 使用请求字符串传递信息
如果使用隐藏域,必须使用表单,但是有时候我们不需要表单,所以我们仍然需要在相邻两个页面之间传递信息,例如,我们在使用分页显示的时候,在显示上一页或者下一页的时候需要知道是第几页,这时候就需要把第几页传递到下一个页面。
使用请求串传递信息的基本格式:
requesturl?pname=”pvalue”
其中requesturl是请求的文件或者服务,pname是要传递的信息的名字,pvalue是要传递的信息的值,通常在超链接中使用。下面通过一个例子介绍具体用法。
例:实现分页显示中上一页、下一页、第一页、最后页等功能。
答案:这里不关心内容,第一页回显示“第1页”,第二页会显示“第二页”,等等,假设最后页是第10页。
参考代码:
<%@ page contentType="text/html;charset=gb2312"%>
<%
String page=request.getParameter("page");
//获取要显示第几页
int iPage=1;
//默认显示第一页
if(page!=null)
{
try
{
iPage = Integer.parseInt(page);
//转换成数字
}catch(Exception e){}
}
%>
<br>
<a href="list.jsp?page=1">第一页</a>&nbsp;&nbsp;
<% if(iPage>1){%>
<a href="list.jsp?page=<%=iPage-1%>">上一页&nbsp;&nbsp;
<% }if(iPage<10){%>
<a href="list.jsp?page=<%=iPage+1%>">下一页&nbsp;&nbsp;
<%}%>
<a href="list.jsp?page="10">最后一页<br>
现在是第<%=iPaeg%>页
其中if语句的作用:如果当前页是第一页,则不显示上一页,如果当前页是最后一页,则不显示下一页。
3、在多个页面之间共享信息
前面介绍的是在相邻页面之间共享信息,在实际应用中有些信息需要在多个页面之间共享,这时候应该使用session。session中保存的信息在用户的整个访问过程中都可以使用。
session中存储信息的过程与request对象中存储信息的使用基本相同,下面介绍一个经典的功能。
通常情况下,用户登陆之后的整个访问过程都会用到用户登陆信息,所以通常会在用户登陆之后,把用户信息保存在session中,而在其他页面中访问session中的用户信息,如果用户不再访问session,可以使session无效。
3.1 在session中存储信息
假设在session中保存的用户名为uid,用户权限为ugrade,分别在字符串uid和ugrade中保存。
session.setAttribute(“uid”,uid);
session.setAttribute(“ugrade”,ugrade);
3.2 获取session中的信息
从session中获取信息的格式与从request中获取信息的格式相同:
String uid=(String)request.getAttribute(“uid”);
String ugrade=(String)request.getAttribute(“ugrade”);
3.3 删除session中信息
如果不需要session中的信息了,可以使用removeAttribute方法,如果用户要退出就可以删除session中的信息了,使用:
session.removeAttribute(“uid”);
或者也可以使session无效:
session.invalidate();
当然在request中的信息也可以通过removeAttribute方法删除,但是通常不需要这样做,因为request的作用范围本身就小,请求结束就没有了,而session则不一样,如果用户不关闭浏览器,则整个生命周期都会有,如果某个信息不用了,不删除会占用空间。另外,如果我们能够使用request进行信息共享,最后不要使用session,因为占用资源的时间比较长。
4、在多个用户之间共享信息
前面介绍的共享信息都是在同一个用户的多个页面之间共享信息,有时候我们需要在多个用户之间共享信息,一个经典的例子就是聊天室,只要登陆这个聊天室,就能看到该聊天室中的聊天信息,聊天信息是所有人共享的。
要想在多个用户之间共享信息,可以使用application对象,该对象的作用范围是整个Web应用运行的过程,只要是访问这个应用的用户都能访问这个信息。在application中存储信息和获取信息的过程同session相同。下面使用一个简单的实例来说明这个过程,实例完成的功能是显示网站的访问量,这里仅仅是介绍信息共享,实际应用中访问量的信息应该存储到数据库中。
4.1 在application中存储信息
存储信息使用application的setAttribute方法。
假设application中存储访问量的变量是count,当前页面中的变量是iCount。存储代码如下:
application.setAttribute(“count”,new Integer(iCount));
//其中,iCount是整数
4.2 从application中获取信息
获取信息使用application的getAttribute方法。如果我们要获取并显示计数器的值,可以使用下面的代码:
Object o=application.getAttribute("count");
这个计数器比较完整的代码如下:
<%@ page contentType="text/html;charset=gb2312"%>
<%
int iCount=0;
//默认值,第一次访问的时候会用到
Object o=application.getAttribute("count");
if(o!=null)
{
iCount=((Integer)o).intValue();
}
iCount++;
//修改访问量
application.setAttribute("count",new Integer(iCount));
out.println("您是第"+iCount+"个访问者");
%>
如果application中保存的信息不再需要,可以通过application的removeAttribute方法删除。用法与session基本相同。
5、一个用户多次访问之间信息共享
你可能有这样的经历,第一天访问了一个网站,注册然后登陆,然后退出。第二天有打开这个网站,这时候系统提示欢迎“张三”,系统记录了你的信息。这种情况就是在多次访问之间共享了信息。
request是在同一次请求之间共享,session是一次访问过程中共享。如果你关闭网站,从新打开,这些信息就不存在了。要想在多次访问之间共享信息,需要使用Cookie。request和session都是服务器端创建和存储的对象,request是每次请求时就会创建这样一个对象,而session是为每个用户创建的,在用户的一次访问之间有效,访问结束,session就被删除了。Cookie是存储在客户端机器上的,服务器在对用户进行响应的时候,写在客户端,但前提是客户端支持Cookie,如果客户端禁用Cookie,就不能完成这个功能了。每次客户端向服务器端发送请求的时候,会从新把这个Cookie发送到服务器。服务器会根据Cookie信息进行相应的处理。
信息的保存
如果想在客户端保存Cookie信息,首先应该创建Cookie对象,然后通过response对象把Cookie添加到客户端浏览器。
创建Cookie对象,可以使用下面的构造函数
public Cookie(String name,String value);
第一个参数是创建的Cookie的名字,第二个参数是创建的Cookie的值。
Cookie对象创建完之后,需要把Cookie添加到响应中,通过response对象的addCookie方法完成,方法的定义如下:
public void addCookie(Cookie c);
参数要添加的Cookie对象。
上面提到的记录登陆用户的信息的功能如下:
Cookie c = new Cookie(“username”,”zhangsan”);
response.addCookie(c);
这样在响应用户的时候就把用户名添加到了客户端浏览器。
信息的获取
用户向服务器发送请求的时候,会把Cookie信息发送到服务器上,服务器把Cookie保存在request中,所以要想获取Cookie,需要通过request对象的getCookies方法。方法的声明如下:
public Cookie[] getCookies();
上面自动识别用户的代码如下:
<%@ page contentType="text/html;charset=gb2312"%>
<%
String username;
Cookie[] cookies = request.getCookies();
for(int i=0;i<cookies.length;i++)
{
if(cookies[i].getName().equals("username"))
{
username=cookies[i].getValue();
break;
}
}
if(username==null)
{
response.sendRedirect("login.jsp");
}
else
{
out.println("欢迎"+username+"访问我们的网站");
}
%>
分享到:
评论

相关推荐

    Coupe:网页间通信的工具

    这些框架使用localStorage在它们之间共享值。 您可以设置和清除值,并绑定到更改这些值时触发的事件。用法build/index.html文件和随附的build/iframe.js文件必须部署在某个地方。 如果您希望支持 HTTPS 页面之间的...

    XML轻松学习手册--XML肯定是未来的发展趋势,不论是网页设计师还是网络程序员,都应该及时学习和了解

    我的理解是它满足了网络共享和数据交互,使用DTD最大的好处在于DTD文件的共享。(就是上文DTD说明语句中的PUBLIC属性)。比如,两个相同行业不同地区的人使用同一个DTD文件来作为文档创建规范,那么他们的数据就很容易...

    JavaScript基础教程第8版

    5.6 在文档之间共享函数 90 5.7 打开新窗口 92 5.8 为窗口加载不同的内容 96 第6章 表单处理 98 6.1 选择并转移导航菜单 99 6.2 动态地改变菜单 102 6.3 建立必须填写的字段 104 6.4 根据其他字段对...

    Colour Contrast Checker-crx插件

    ========全新v2.1 =========您现在可以通过单击App右上角的共享按钮共享您所采用的颜色。==============================.======== v2 ========的全新在您所在的页面上挑选颜色。您现在可以使用Little EyeDropper...

    Silverlight2.0功能展示Demo源码

    DoubleAnimation - 在两个 Double 值之间做线性内插动画处理 PointAnimation - 在两个 Point 值之间做线性内插动画处理 内插关键帧动画 - 在 Color 或 Double 或 Point 动画中内插关键帧,以做线性, 离散, 三次...

    基于lucene的搜索引擎总结

    TermQuery:最基本的查询类型,用来匹配特定Field中包含特定值的文档 Hits:存放有序搜索结果指针的简单容器 全文索引/搜索 Lucene搜索代码示例: IndexSearcher searcher = new IndexSearcher(directory); Term t =...

    北语20春《计算机基础》作业1满分答案.docx

    A 求括号中指定的各参数的总和 B 找出括号中指定的各参数中的最大值 C 求括号中指定的各参数的平均值 D 求括号中指定的各参数中具有数值类型数据的个数 答案:A 4 在Excel工作表A4单元格中,如要将原来的日期型数据...

    工程硕士学位论文 基于Android+HTML5的移动Web项目高效开发探究

    不同的Webview之间无法共享数据。(3)页面自适应问题。页面难以兼容适应不同分辨率的设备和浏览器。 本文研究并设计了基于Android+HTML5的在线认证检测系统,主要工作包括以下四个方面: (1)针对多窗口类浏览器...

    Excel使用技巧大全(超全).

    一、 基本方法 7 1. 快速选中全部工作表 7 2. 快速启动EXCEL 7 3. 快速删除选定区域数据 7 4. 给单元格重新命名 7 ...4. 共享自定义工具栏 44 5. 使用单文档界面快速切换工作簿 44 6. 自定义工具栏按钮 44

    电子表格Excel使用技巧163种使用技巧大全

    目 录 一、 基本方法 7 1. 快速选中全部工作表 7 2. 快速启动EXCEL 7 3. 快速删除选定区域数据 8 4. 给单元格重新命名 8 ...161. 共享自定义工具栏 94 162. 使用单文档界面快速切换工作簿 94 163. 自定义工具栏按钮 95

    Excel使用技巧大全(超全)

    Excel使用技巧大全 一、 基本方法 7 1. 快速选中全部工作表 7 2. 快速启动EXCEL 7 3. 快速删除选定区域数据 7 ...4. 共享自定义工具栏 44 5. 使用单文档界面快速切换工作簿 44 6. 自定义工具栏按钮 44

    Excel新手完全教程

    Very nice。目 录 一、 基本方法 9 1. 快速选中全部工作表 9 2. 快速启动EXCEL 9 3. 快速删除选定区域数据 9 ...161. 共享自定义工具栏 65 162. 使用单文档界面快速切换工作簿 65 163. 自定义工具栏按钮 65

    Excel使用技巧大全(超全).doc

    Excel 使用技巧集锦——163种技巧 目 录 一、 基本方法 7 1. 快速选中全部工作表 7 2. 快速启动EXCEL 7 3. 快速删除选定区域...4. 共享自定义工具栏 44 5. 使用单文档界面快速切换工作簿 44 6. 自定义工具栏按钮 44

    Excel使用技巧集锦—163种使用技巧大全(超全).doc

    Excel 使用技巧集锦—— 163种技巧 目 录 一、 基本方法 7 1. 快速选中全部工作表 7 2. 快速启动EXCEL 7 ...161. 共享自定义工具栏 94 162. 使用单文档界面快速切换工作簿 94 163. 自定义工具栏按钮 95

    Excel技巧大全

    Excel 使用技巧集锦——163种技巧 目 录 一、 基本方法 7 1. 快速选中全部工作表 7 2. 快速启动Excel 7 3. 快速删除选定区域...4. 共享自定义工具栏 44 5. 使用单文档界面快速切换工作簿 44 6. 自定义工具栏按钮 44

    Excel使用技巧大全

    Excel 使用技巧集锦——163种技巧 目 录 一、 基本方法 8 1. 快速选中全部工作表 8 2. 快速启动EXCEL 8 3. 快速删除选定区域...4. 共享自定义工具栏 54 5. 使用单文档界面快速切换工作簿 54 6. 自定义工具栏按钮 54

    java源码包2

    2个目标文件,FTP的目标是:(1)提高文件的共享性(计算机程序和/或数据),(2)鼓励间接地(通过程序)使用远程计算机,(3)保护用户因主机之间的文件存储系统导致的变化,(4)为了可靠和高效地传输,虽然用户...

    mywaterpi:Raspberry Pi家庭实用程序监视

    这是我在开发机和Pi之间传输文件的工作空间。 目的是让我有一些水,盐用量以及最终的房屋温度和HVAC用量监视器,并能够在网页上显示它们,并预测销售量并提醒我何时需要进行销售。重新装满。 在这个仓库中 共享文件 ...

    URULE是一款基于RETE算法的纯Java规则引擎.zip

    提供规则集、决策表、决策树、评分卡,规则流等各种规则表现工具及基于网页的可视化设计器,可快速开发出各种复杂业务规则。 开发工具在软件开发生命周期中扮演着至关重要的角色,它们旨在简化和加速从概念设计到...

Global site tag (gtag.js) - Google Analytics