(第7讲)session、cookie、servletContext区别联系

来源:互联网 发布:江苏省软件考试 编辑:程序博客网 时间:2024/06/14 15:28

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();
         }
    }


0 0