Serlvet学习笔记之二—不同页面共享数据
一共有四种方法实现共享页面共享数据
1.cookie
2.sendRedirect
3.session
4.隐藏表单提交(form)
5.ServletContex
1.cookie:服务器在客户端保存用户信息,比如登录名,密码等,实现网页个性化。
2.sendRedirect:通过该方法将信息传送给下一个页面。
优点:传送的信息比较快
缺点:它只能传送字符串,不能传送对象。
形式:sendRedirect("welcome"?uanme=admin&pwd=123")
传递
res.sendRedirect("welcome?uName="+u+"&uPass="+p); //传递给welcome页面
接收
String u=req.getParameter("uname"); //welcome界面接收
3.session
用户访问网站时,服务器在服务器的内存为该浏览器分配一个空间,该空间是被这个浏览器独占的,tomcat中默认存在30min,session的时间可以在tomcat中的web.xml中修改,也可以在程序中修改。
服务器会给浏览器分配一个唯一的session id借此区分不同的客户端。
session占用服务器的内存,所以在迫不得已才使用。
功能: 1.网上商城的购物车
2.保存登陆的用户信息
3.将一些数据放在session中,提供给同一个用户的不同页面使用。
4.防止用户非法登陆某个页面。
用法:
HttpSession hs=req.getSession(true); //得到session hs.setAttribute("pass","ok"); //向session添加属性 String name=hs.getAttribute(String name); //得到session的某一个属性 hs.removeAttribute(arg0); //删除某一个属性
实现功能4
在logincl页面创建session
//将验证成功的信息写入session HttpSession hs=req.getSession(true); //得到session hs.setAttribute("pass","ok"); //向session添加属性 hs.setMaxInactiveInterval(20); //修改session的存在时间,秒为单位 res.sendRedirect("welcome?uName="+u+"&uPass="+p);
在welcome读取session
String u=req.getParameter("uName"); //得到sendRedirect传递过来的值
HttpSession hs=req.getSession(true); //得到session
String val=(String)hs.getAttribute("pass"); //得到session的某一个属性
try {
if(val==null){
res.sendRedirect("login");
}
4..隐藏表单:这是最常见的一种方式,也是最简单的。
在login界面创建
pw.println("<input type=hidden name=sex value=man><br>");
5.ServletContext
保存在服务器端,共享给所有用户。
生命周期是从创建开始到服务器关闭。
如果想共享给所有用户,而又不希望保存在数据库中,数据量也不大,可以考虑使用ServletContex实现。
下面用一个网站计数器来做案列
package com.demo; import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.FileReader; import java.io.FileWriter; import java.io.PrintWriter; import javax.servlet.http.*; public class ServletFileTest1 extends HttpServlet { public void init(){ try { //创建一个FileReader FileReader fr=new FileReader("D:\\myCount.txt"); BufferedReader br=new BufferedReader(fr); String numVal=br.readLine(); br.close(); this.getServletContext().setAttribute("vistTimes",numVal); } catch (Exception e1) { e1.printStackTrace(); } } public void destroy(){ try { //创建一个FileWriter FileWriter fw=new FileWriter("D:\\myCount.txt"); BufferedWriter bw=new BufferedWriter(fw); bw.write(this.getServletContext().getAttribute("vistTimes").toString()); bw.close(); } catch (Exception e2) { e2.printStackTrace(); } } public void doGet(HttpServletRequest req,HttpServletResponse res){ try { System.out.println("doget..."); req.setCharacterEncoding("gb2312"); res.setContentType("text/html;charset=gb2312"); //在ServletContex中进行++操作 String times=this.getServletContext().getAttribute("vistTimes").toString(); this.getServletContext().setAttribute("vistTimes",(Integer.valueOf(times).intValue()+1)+""); PrintWriter pw=res.getWriter(); pw.println("访问次数:"+this.getServletContext().getAttribute("vistTimes").toString());
pw.println("您的IP地址是: "+req.getRemoteAddr()+"<br>");
pw.println("您的机器名是: "+req.getRemoteHost()+"<br>"); } catch (Exception e3) { e3.printStackTrace(); } } public void doPost(HttpServletRequest req,HttpServletResponse res){ this.doGet(req, res); } }