cookie:是指存储在客户端上的信息,浏览器一旦关闭cookie就被清除。每个用户都有独立的存储cookie的空间,互相独立,只能自己访问自己的cookie
session:是指存储在服务器端的信息。每个用户都有独立的存储session的空间,互相独立,只能自己访问自己的session
servletContext:servletContext接口是Servlet中最大的一个接口,呈现了web应用的Servlet视图。ServletContext实例是通过 getServletContext()方法获得的,由于HttpServlet继承GenericServlet的关系,GenericServlet类和HttpServlet类同时具有该方法。所有用户都可以访问servletContext,比如说我用谷歌给ServletContext
传递了信息,不仅在谷歌页面能获得ServletContext中的信息,在IE浏览器输入正确的网址也能得到ServletContext中的信息。
ServleContext使用方法
(1)得到ServletContext实例:this.getServletContext();
(2)添加属性: setAttribute(String name,Object ob);
(3)获得信息: getAttribute(String name); 返回Object
(4)删除属性: removeAttribute(String name);
(5)生命周期: ServletContext中的属性的生命周期从创建开始,一直到服务器关闭的时候结束。
(6)因为存在ServletContext中的数据会长时间的保存在服务器,会占用内存,因此不建议往ServletContext中添加过大的数据。
(7)在ServletContext中操作文件的过程和 .java 文件一样,因为ServletContext本来就是 .java 文件
————————————————————————————————————————
例子:在页面往ServletContext中添加信息,在另外一个页面取出信息,程序如下:
/**
* 向ServletContext添加属性
*/
package com.weiya;
import javax.servlet.http.*;
import javax.servlet.*;
import java.io.*;
public class ServletContext1 extends HttpServlet{
public void doGet(HttpServletRequest req,HttpServletResponse res){
try{
res.setContentType("text/html;charset=UTF-8");
PrintWriter pw = res.getWriter();
//得到ServletContext
ServletContext sc = this.getServletContext();
//添加属性
sc.setAttribute("myInfo","weiya");
pw.println("给ServletContext添加一个属性");
}catch(Exception e){
e.printStackTrace();
}
}
public void doPost(HttpServletRequest req,HttpServletResponse res){
this.doGet(req,res);
}
}
————————————————————————————————————————
/**
* 从ServletContext中得到属性
*/
package com.weiya;
import javax.servlet.http.*;
import javax.servlet.*;
import java.io.*;
public class ServletContext2 extends HttpServlet{
public void doGet(HttpServletRequest req,HttpServletResponse res){
try{
res.setContentType("text/html;charset=UTF-8");
PrintWriter pw = res.getWriter();
//得到ServletContext
ServletContext sc = this.getServletContext();
//得到属性
String info = (String)sc.getAttribute("myInfo" );
pw.println("从ServletContext得到一个属性"+info);
}catch(Exception e){
e.printStackTrace();
}
}
public void doPost(HttpServletRequest req,HttpServletResponse res){
this.doGet(req,res);
}
}
————————————————————————————————————————
部署文件如下:
<!--ServletContext1开始-->
<servlet>
<servlet-name>ServletContext1</servlet-name> <!--给你的servlet取名字,名字是任意的,且不是必须的-->
<servlet-class>com.weiya.ServletContext1</servlet-class> <!-- 指明servlet路径,即包名+类名-->
</servlet>
<servlet-mapping>
<servlet-name>ServletContext1</servlet-name> <!-- 与上边的映射,复制下来-->
<url-pattern>/servletcontext1</url-pattern> <!-- 这是在浏览器中输入的访问该servlet的URL-->
</servlet-mapping>
<servlet>
<servlet-name>ServletContext2</servlet-name> <!--给你的servlet取名字,名字是任意的,且不是必须的-->
<servlet-class>com.weiya.ServletContext2</servlet-class> <!-- 指明servlet路径,即包名+类名-->
</servlet>
<servlet-mapping>
<servlet-name>ServletContext2</servlet-name> <!-- 与上边的映射,复制下来-->
<url-pattern>/servletcontext2</url-pattern> <!-- 这是在浏览器中输入的访问该servlet的URL-->
</servlet-mapping>
<!--ServletContext2结束-->
————————————————————————————————————————
结果是:
在浏览器中输入:http://localhost:8080/myWebSite/servletcontext1,可以看到:
给ServletContext添加一个属性
在浏览器中输入:http://localhost:8080/myWebSite/servletcontext2,可以看到:
从ServletContext得到一个属性weiya用Servlet写网络计数器
方法1:每次访问都加1,然后写入到一个文件中,但是效率太低
方法2:在Servlet的生命周期中,init函数中初始化;在destroy函数中写入文件,这样就比上边的效率高
public void init( ) {
try{
//创建一个fileReader
FileReader f = new FileReader("D:\\test\\a.txt");
BufferedReader br = new BufferedReader(f);
String num = br.readLine();
br.close();
this.getServletContext().setAttribute("visitTimes",num+"");
}catch(Exception e){
e.printStackTrace();
}
}
public void destroy() {
try{
FileWriter f = new FileWriter("D:\\test\\a.txt");
BufferedWriter bf = new BufferedWriter(f);
bf.write(this.getServletContext().getAttribute("visitTimes").toString() );
bf.close();
}catch(Exception e){
e.printStackTrace();
}
}