一。session对象
功能 :有页面保持的功能 ,当访问网站 时,服务 器端已经给他分配 了一个session对象 ,对于这个用户,不管在那么页面,只要他访问 session 对象 ,都是同一个。我们也可以用数据库(购物功能),但是对服务器的消耗会很大
1. 如何使用 session 开发购物车
将内容放入购物车
void session.setAttribute (String name ,Object obj );
如果 name相同 ,就会覆盖之前的内容。集合,数据结构对象都可以放入session 中。
读取购物车中的内容
Object session.getAttribute(String name);
如果 session 里面放了很多内容 ,怎么取出呢?我们可以用
Enumeration session.getAttributeNames( );
得到session 中所有 的属性的名称 ,再由名称得到内容 。
例子:
<% ArrayList books = new ArrayList(); books.add("大学物理"); books.add("语言"); books.add("数学"); session.setAttribute("books", books); %> <a href="MyJsp1.jsp">查看购物车</a>
MyJsp1.jsp中
<% ArrayList books = (ArrayList) session.getAttribute("books"); for (int i = 0; i < books.size(); i++) { String book = (String) books.get(i); out.println(book + "<br>"); } %>
2.session进阶
移除 session 中的内容
void session.removeAttribute (String name);
移除 session 中的全部内容
void session.invalidate();
问题,从session中得到一个集合,从集合中删除 一个数据 ,但是这个集合没有放回到session 中,那session 中的内容 会发生变化 吗?
会,因为集合ArrayList 是一个引用对象 ,和books指的是同一个内存。
session 内容初始化的技巧
例如,用一个表单提交书本放入购物车中,
<form action="MyJsp2.jsp" method="post"> 请您输入书本名:<input name="book" type="text"> <input type="submit" value="添加到购物车"> </form> <hr> <% //向session 中存放 一个集合 ArrayList books = new ArrayList(); session.setAttribute("books", books); //获得书名 String book = request.getParameter("book"); if (book != null) { book = new String(book.getBytes("ISO-8859-1")); //将book加入 到集合中 books.add(book); } %> 购物车中的内容是: <br> <% for (int i = 0; i < books.size(); i++) { out.println(books.get(i) + "<br>"); } %>
每次我们输入 点击 后,会发现之前 的记录没有了,这是因为,每次页面运行都 会有一个新的实例 化的ArrayList 放在 session 里面。解决办法
//向session 中存放 一个集合 ArrayList books = (ArrayList) session.getAttribute("books"); if (books == null) { books = new ArrayList(); session.setAttribute("books", books); }
sessionId
当一个客户访问不同的页面时,他都有一样的sessionId ,原理是:
当第一次访问的时候 ,服务器就给session分配 了一个 sessionId ,并且让客户端用 Cookie 保存了这个 sessionId ,客户端访问下一个页面时,又将
这个 sessionId传送 给服务 器,服务 器由这个 sessionId 找到前一个页面用的 session 的对象 。
我们可以用下面的方法得到现在的 sessionId :
String session.getId();
3. session的其它 应用
利用session保存登录信息
我们在登录后,会访问很多页面,在访问这些页面的过程 中,别的页面怎么知道我们的帐号呢,我们可以把信息保存在session 中。
<form action ="MyJsp2.jsp" method ="post"> 请输入您的帐号:<input name ="account" type ="text"><br> 请输入您的密码 : <input name ="password" type ="password"> <br> <input type="submit" value="登录"> </form> <% //获得帐号和密码 String account = request.getParameter("account"); String password = request.getParameter("password"); if (account != null) { if (account.equals(password)) { //如果 帐号与密码 一样,表示成功 //将account 放入 session 转入另外 一个页面 session.setAttribute("account", account); response.sendRedirect("MyJsp1.jsp"); } } %>
jsp1 中的代码 是
<body> 欢迎<%= session.getAttribute("account") %>来到系统 <hr> 请进行下面的操作:。。。
但是,如果我们直接 访问第二个页面,就会出现 欢迎null访问的情况 ,不对,我们应该在第二个页面中加入 session 的检查。如果 session 中的account 为 null,
则跳转到第一个界面 。
<% if (session.getAttribute("account")==null){ response.sendRedirect("MyJsp2.jsp"); } %>
由于 在很多页面中都 要有这个功能 ,我们可以用include 。其实还可以使用 过虑器。
利用session传值
几种传值方法对比
URL | 简单,配合链接使用 | 内容显示示浏览器地址栏 |
隐藏表单 | 简单,配合表单使用 | 内容显示于客户端源码 |
Cookie | 保存于硬盘 ,信息能够持久化 | 内容显示于Cookie文件 |
session | 安全 | 服务 器任务重 |
将要保存的变量值保存在服务 端的session 内,在客户端访问面面 2 的时候 ,只要从服务 器中读取 session 就可以了。在客户端看不到的传递值 相关的信息。
二。application 对象
application 对象 ,对于不同的客户端来说,服务 器端的对象是相同的。
实际中要用到的地方 :
在一个系统中,显示当前在线的用户名单 ,在所有 的客户端上都能显示 ,也可以说,对所有 客户都是共享 的,这个 时候 ,我们可以将当前 在线的名单 存在application 对象 中。
当一个服务 器启动后,就会自动 创建 一个application 对象 ,直到服务 器关闭时为止。
1 。将内容放到 application 中
void application.setAttribute ( String name ,Object obj) ;
2. 读取一个application 中的内容
Object application.getAttribute (String name );
3. 将内容 从application 中移除
void application.removeAttribute (String name );
4. application 可以直接获得当前 工程资源 在服务 器硬盘 上的物理路径
方法为
application,getRealPath("资源在项目中的虚拟路径 ");
下面的例子得到项目根目录 在服务 器硬盘上的物理路径
<% String realPath = application.getRealPath("/"); out.println(realPath); %>
输出为
D:\Program Files\tomcat\webapps\proj02\
这个 功能 在文件上传 等时候会用到。