《网页之间共享数据》由会员分享,可在线阅读,更多相关《网页之间共享数据(9页珍藏版)》请在金锄头文库上搜索。
1、注重基础 注重思想 网页之间共享值网页之间共享值 李绪成 2007-3-16 著作权所有,可以任意传播。 若要传播,需注明出处,但不能以盈利为目的。 欢迎交流:欢迎交流:http:/ Web 应用是由大量的网页组成的,运行的基本原理是:用户通过客户端浏览器发送向 服务器的请求,服务器接收到客户端的请求,根据客户端的请求进行处理,把处理后的结果 返回给客户端。在这个过程中,使用的是 HTTP 协议,是无状态的请求应答模式,也就是说 在多次请求之间不会保存状态信息, 用户每次提交的信息仅仅在当前请求处理过程有用, 例 如用户在登陆时候提交的信息只能在第一次处理的时候有用, 以后就不能用了。 但是有
2、时候 程序需要在多个页面或者多次请求之间共享信息,只时候就需要系统提供的其他方式了。 在同一次请求的多个页面之间进行共享在同一次请求的多个页面之间进行共享 这种情况经常出现,尤其是我们采用 MVC 模式的时候,只要涉及动态信息的显示就需 要解决这个问题, 因为数据的获取本身是通过模型层的业务逻辑来获取的, 业务逻辑是由控 制层来调用的,而数据的显示是通过视图层完成的,也就是说需要把控制层得到的数据(通 过调用业务逻辑层)通过显示层显示,这样就需要在控制层和视图层之间传递数据,可以把 它们看作同一次请求的不同的页面。 如果想在同一次请求之间共享信息,可以通过 request 完成,涉及两个方面:
3、在第一个 地方存储,在第二个地方获取。 信息的存储信息的存储 信息的存储是通过 request 对象的 setAttribute 方法完成的。方法的完整定义如下: public void setAttribute(Object name,Object o) 第一个参数的格式 第一个参数是要存储的对象的名字,第二个参数是要存储的对象本身,可以是各种数 据类型的对象,但不能是基本数据类型,如果要保存基本数据类型的数据,可以使用基本数 据类型的封装类。 该方法的作用是在 request 对象中存储一个对象,第二个参数就是要存储的对象,第一 个参数是要存储的对象的名字,如果该名字在 request 范
4、围内已经使用过,该方法的作用就 是替换该对象的值。 例 1: 在第一个页面有一个 String 类型的变量 str,需要在第二个页面中使用,怎样保存? 答案: request.setAttribute(“str”,str); 注意:第一个参数是要保存的变量的名字,可以自己定义。 例 2:把计算的结果 int 类型的变量 result 保存到 request 对象中。 答案: request.setAttibute(“re”,new Integer(result); 注意:new Integer(result)是把整形变量 result 封装成 Integer 类型的对象。 信息的获取信息的获取
5、 信息的获取是通过 getAttribute 方法完成的,方法的完整定义如下: public Object getAttribute(String name) 方法的返回值类型是 Object,参数是要获取的对象。需要注意两个问题:第一,如果要 获取的信息不存在,返回值是 null;第二,我们存储在 request 中的对象可以是各种类型, 但是返回值类型是 Object,需要把 request 中获取的信息进行强制类型转换,看下面的例子。 例 1:把上面存储在 request 中的 str 对象显示,假设是在 JSP 页面中显示。 例 2:把上面存储的结果显示在 JSP 页面中。 在相邻页面
6、之间共享信息在相邻页面之间共享信息 想象这样一个功能,要修改用户的信息,我们需要先把用户的信息显示在页面上,然后 用户在这个页面上修改, 然后把修改后的结果提交给服务器, 服务器再把修改后的结果更新 到数据库中。 在这个过程中,用户编号(我们假设编号是主键)是不能修改的,但是在服务器端进行 处理的时候,需要根据编号进行修改,这个编号在修改界面中是可以获取的,但是在处理界 面中不能获取,这样就需要在这个页面之间来共享这个信息。 页面之间共享信息可以通过两种方式完成:第一种,通过表单提交完成,使用隐藏域; 第二种,通过请求字符串完成,在请求的地址后面通过“?”号传递参数。 使用隐藏域传递参数使用隐
7、藏域传递参数 隐藏域的基本语法格式: 和普通的输入框基本相同,只是用户看不到,name 是要传递的变量的名字,value 是要 传递的值本身。 注意:如果要使用隐藏域,必须使用表单提交,如果不使用表单提交,隐藏域的值不会传递到服务器。 例:修改用户基本信息。 这里只给出修改界面和处理界面的代码,假设要修改的信息已经存储在 request 中,名 字是“u” ,是 User 的对象,有 uid,uname,uage 3 个属性。 修改界面: 用户信息修改 用户信息修改 用户编号 用户姓名 “ 用户年龄 “ 处理文件(部分代码) : 使用请求字符串传递信息使用请求字符串传递信息 如果使用隐藏域,必
8、须使用表单,但是有时候我们不需要表单,所以我们仍然需要在相 邻两个页面之间传递信息,例如,我们在使用分页显示的时候,在显示上一页或者下一页的 时候需要知道是第几页,这时候就需要把第几页传递到下一个页面。 使用请求串传递信息的基本格式: requesturl?pname=”pvalue” 其中 requesturl 是请求的文件或者服务,pname 是要传递的信息的名字,pvalue 是要传 递的信息的值,通常在超链接中使用。下面通过一个例子介绍具体用法。 例:实现分页显示中上一页、下一页、第一页、最后页等功能。 答案:这里不关心内容,第一页回显示“第 1 页” ,第二页会显示“第二页” ,等等
9、,假 设最后页是第 10 页。 参考代码: 第一页 1)% “上一页 “下一页 最后一页 现在是第页 其中 if 语句的作用:如果当前页是第一页,则不显示上一页,如果当前页是最后一页, 则不显示下一页。 在多个页面之间共享信息在多个页面之间共享信息 前面介绍的是在相邻页面之间共享信息, 在实际应用中有些信息需要在多个页面之间共 享,这时候应该使用 session。session 中保存的信息在用户的整个访问过程中都可以使用。 session 中存储信息的过程与 request 对象中存储信息的使用基本相同,下面介绍一个经 典的功能。 通常情况下, 用户登陆之后的整个访问过程都会用到用户登陆信息
10、, 所以通常会在用户 登陆之后,把用户信息保存在 session 中,而在其他页面中访问 session 中的用户信息,如果 用户不再访问 session,可以使 session 无效。 在在 session 中存储信息中存储信息 假设在 session 中保存的用户名为 uid,用户权限为 ugrade,分别在字符串 uid 和 ugrade 中保存。 session.setAttribute(“uid”,uid); session.setAttribute(“ugrade”,ugrade); 获取获取 session 中的信息中的信息 从 session 中获取信息的格式与从 reques
11、t 中获取信息的格式相同: String uid=(String)request.getAttribute(“uid”); String ugrade=(String)request.getAttribute(“ugrade”); 删除删除 session 中信息中信息 如果不需要 session 中的信息了,可以使用 removeAttribute 方法,如果用户要退出就可 以删除 session 中的信息了,使用: session.removeAttribute(“uid”); 或者也可以使 session 无效: session.invalidate(); 当然在 request 中的信
12、息也可以通过 removeAttribute 方法删除, 但是通常不需要这样做, 因为 request 的作用范围本身就小,请求结束就没有了,而 session 则不一样,如果用户不关 闭浏览器,则整个生命周期都会有,如果某个信息不用了,不删除会占用空间。另外,如果我们能够使用 request 进行信息共享,最后不要使用 session,因为占用资源的时间比较长。 在多个用户之间共享信息在多个用户之间共享信息 前面介绍的共享信息都是在同一个用户的多个页面之间共享信息,有时候我们需要在 多个用户之间共享信息,一个经典的例子就是聊天室,只要登陆这个聊天室,就能看到该聊 天室中的聊天信息,聊天信息是
13、所有人共享的。 要想在多个用户之间共享信息,可以使用 application 对象,该对象的作用范围是整个 Web 应用运行的过程, 只要是访问这个应用的用户都能访问这个信息。 在 application 中存储 信息和获取信息的过程同 session 相同。下面使用一个简单的实例来说明这个过程,实例完 成的功能是显示网站的访问量, 这里仅仅是介绍信息共享, 实际应用中访问量的信息应该存 储到数据库中。 在在 application 中存储信息中存储信息 存储信息使用 application 的 setAttribute 方法。 假设 application 中存储访问量的变量是 count,
14、当前页面中的变量是 iCount。存储代码 如下: application.setAttribute(“count”,new Integer(iCount); /其中,iCount 是整数 从从 application 中获取信息中获取信息 获取信息使用 application 的 getAttribute 方法。如果我们要获取并显示计数器的值,可 以使用下面的代码: Object o=application.getAttribute(“count“); 这个计数器比较完整的代码如下: 如果 application 中保存的信息不再需要,可以通过 application 的 removeAtt
15、ribute 方法删除。用法与 session 基本相同。 一个用户多次访问之间信息共享一个用户多次访问之间信息共享 你可能有这样的经历,第一天访问了一个网站,注册然后登陆,然后退出。第二天有 打开这个网站,这时候系统提示欢迎“张三” ,系统记录了你的信息。这种情况就是在多次 访问之间共享了信息。 request 是在同一次请求之间共享,session 是一次访问过程中共享。如果你关闭网站, 从新打开,这些信息就不存在了。要想在多次访问之间共享信息,需要使用 Cookie。request 和 session 都是服务器端创建和存储的对象,request 是每次请求时就会创建这样一个对象, 而
16、session 是为每个用户创建的,在用户的一次访问之间有效,访问结束,session 就被删除 了。Cookie 是存储在客户端机器上的,服务器在对用户进行响应的时候,写在客户端,但 前提是客户端支持 Cookie,如果客户端禁用 Cookie,就不能完成这个功能了。每次客户端 向服务器端发送请求的时候,会从新把这个 Cookie 发送到服务器。服务器会根据 Cookie 信 息进行相应的处理。 信息的保存 如果想在客户端保存 Cookie 信息,首先应该创建 Cookie 对象,然后通过 response 对象 把 Cookie 添加到客户端浏览器。 创建 Cookie 对象,可以使用下面的构造函数 public Cookie(String name,String valu