现在的位置: 首页 > 综合 > 正文

网页之间共享值

2013年09月15日 ⁄ 综合 ⁄ 共 7019字 ⁄ 字号 评论关闭
 

    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+"访问我们的网站");
   }
%>

 

抱歉!评论已关闭.