servlet学习笔记8——ServletContext的讲解和使用

转载 2016年08月28日 17:09:31

(转载)http://blog.csdn.net/jiben071/article/details/6024655

servlet第六讲


(一)ServletContext的讲解和使用
什么是ServletContex?
可以想象其为一个公用空间,可以被所有的客户访问


如何使用ServletContext?
1.得到ServletContext
this.getServletContext();
2.可将其看做一张表,其与sesseion相似:每一行就为一个属性
----------------------------------------
|   名字(String)|   值(Object)|
----------------------------------------
|                          |                        |-------->属性1
----------------------------------------
|                          |                        |
----------------------------------------
|                          |                        |
----------------------------------------
操作
添加属性:setAttribute(String name,Object ob);
得到值:   getAttribute(String)返回Object
删除属性:removeAttribute(String name)

 

 

示例——添加servletContext属性

[java] view plain copy
  1. public void process(HttpServletRequest req,HttpServletResponse res)  
  2.     throws ServletException,IOException{  
  3.  //业务逻辑  
  4.  try{  
  5.      //中文乱码  
  6.      res.setContentType("text/html;charset=UTF-8");  
  7.      PrintWriter pw=res.getWriter();  
  8.      //1.得到ServletContext  
  9.      ServletContext sc=this.getServletContext();  
  10.      //2.添加属性  
  11.      sc.setAttribute("myInfo","我是邓龙");  
  12.      pw.println("给servletContext中添加一个属性MyInfo<br>");  
  13.        
  14.      //比较session,添加属性  
  15.      HttpSession hs=req.getSession(true);  
  16.      hs.setAttribute("test","中国人");  
  17.      hs.setMaxInactiveInterval(60*3);  
  18.      pw.println("向session中添加一个test属性 他的值是中国人");  
  19.        
  20.        
  21.  }catch(Exception ex){  
  22.      ex.printStackTrace();  
  23.  }  
  24. }  

示例——从servletContext中得到属性

[java] view plain copy
  1. public class ServletContextTest2 extends HttpServlet {  
  2.     public void process(HttpServletRequest req,HttpServletResponse res)  
  3.     throws ServletException,IOException{  
  4.      //业务逻辑  
  5.      try{  
  6.          //中文乱码  
  7.          res.setContentType("text/html;charset=UTF-8");  
  8.          PrintWriter pw=res.getWriter();  
  9.          //1.得到servletContext  
  10.          ServletContext sc=this.getServletContext();  
  11.          //2.得到属性和它对应的值  
  12.          String info=(String)sc.getAttribute("myInfo");  
  13.          pw.println("从servletContext中得到属性myInfo对应的值为我是邓龙<br>");  
  14.            
  15.          //比较sesseion,取出属性值  
  16.          HttpSession hs=req.getSession(true);  
  17.          String val=(String)hs.getAttribute("test");  
  18.          pw.println("session中的test="+val+"<br>");  
  19.            
  20.      }catch(Exception ex){  
  21.          ex.printStackTrace();  
  22.      }  
  23. }  

3.生命周期
ServletContext中的属性的生命周期从创建开始,到服务器关闭而

结束

注意事项:
因为存在ServletContext中的数据会长时间的保存在服务器,会占

用内存,因此我们建议不要想serveltContext中添加过大的数据

 

(二)servlet中如何操作文件
因为serlvet本来就是一个.java文件,因此,其同普通java文件操作

文件是一样的

示例——读取文件内容

[java] view plain copy
  1. public class ServletFileTest1 extends HttpServlet {  
  2.          public void process(HttpServletRequest req,HttpServletResponse res)  
  3.              throws ServletException,IOException{  
  4.              //业务逻辑  
  5.              try{  
  6.                  //中文乱码  
  7.                  res.setContentType("text/html;charset=UTF-8");  
  8.                  PrintWriter pw=res.getWriter();        
  9.                    
  10.                  //创建一个FileReader  
  11.                  FileReader fr=new FileReader("D://myCounter.txt");  
  12.                  BufferedReader br=new BufferedReader(fr);  
  13.                  //读出一行数据   
  14.                  String numVal=br.readLine();  
  15.                  br.close();//一定关闭文件流  
  16.                  pw.println("从文件中取出的数据是:"+numVal);  
  17.                    
  18.              }catch(Exception ex){  
  19.                  ex.printStackTrace();  
  20.              }  
  21.          }  

示例——把内容写入文件

[java] view plain copy
  1. public void process(HttpServletRequest req,HttpServletResponse res)  
  2.     throws ServletException,IOException{  
  3.  //业务逻辑  
  4.  try{  
  5.      //中文乱码  
  6.      res.setContentType("text/html;charset=UTF-8");  
  7.      PrintWriter pw=res.getWriter();        
  8.        
  9.      //创建一个FileWriter,看 内存数据 ——>磁盘文件(称之为写入,也即输出流)  
  10.      //看 磁盘文件 ——>内存数据(称之为读入,也即输入流)  
  11.      FileWriter fw=new FileWriter("D://myCounter.txt");  
  12.      BufferedWriter bw=new BufferedWriter(fw);  
  13.      //在文件写入数据  
  14.      bw.write("我写东西");  
  15.      bw.close();//关闭文件流  
  16.      pw.println("在文件中写入了数据");  
  17.        
  18.  }catch(Exception ex){  
  19.      ex.printStackTrace();  
  20.  }  
  21. }  


(三)增加网站计数器
在网站开发中,有很多功能需要使用ServletContext,比如:
1.网站计数器
2.网站在线用户的显示
3.简单的聊天系统
··················
总之,如果是涉及到不用用户共享数据,而这些数据量不大,同时

又不希望写入数据库中,我们就可以考虑使用ServletContext来实

有效点击:
1.只要访问过该网页就算一次,刷新也算一次,有点假
2.不同的ip访问,算一次;如果同一个ip在一定时间(如一天),

不管浏览该网页多少次都算一次
3.用户推出网站,再次访问页算一次

实现方案:
1.当某个用户访问该网页时,就在该数据库中增加一次(比如有一

张统计表)
缺点:对数据库访问太频繁,服务器压力太大
优点:很好理解,也好实现
2.设置一个静态变量,当服务器启动时,可以通过文件或表初始化

该变量;当服务器关闭时,再将变量的值写入到文件或是数据库中
缺点:实现复杂,要求对文件操作
优点:效率高,不会频繁的访问文件或数据库
3.使用ServletContext,它的实现与第二种相似

实现网站计数器:
1.在Wel.java中操作ServletContext,每刷新一次算一次
2.在LoginCl.java中操作ServletContext,用户每成功登陆一次算

一次
3.对2方法的优化改进(减少对文件的操作)
各个用户每登陆一次,就要去操作一个文件,这样效率低下,可不

可以减少对文件的操作次数:
在Servlet的生命周期中——
可以在init()方法中初始化servletContext中属性times对应的初始

可以在destroy()方法中,一次性的将serveletcontext中属性times

对应的值写入文件中

 

代码实现:

在LoginCl.java中:

1.重写init()方法

[java] view plain copy
  1. //重写init()函数  
  2. public void init() throws ServletException{  
  3.     try{  
  4.         //只会被调用一次  
  5.         System.out.println("init被调用");  
  6.           
  7.         //========添加网页访问次数的功能(读取部分)===========  
  8.         //用户成功登陆一次就计算一次  
  9.         FileReader fr=new FileReader("D://myCounter.txt");  
  10.         BufferedReader br=new BufferedReader(fr);  
  11.         String numVal=br.readLine();  
  12.         br.close();  
  13.           
  14.         //将times值放入到servletContext中  
  15.         this.getServletContext().setAttribute("visitTimes",numVal);  
  16.         //========添加网页访问次数的功能(读取部分)===========  
  17.           
  18.     }catch(Exception ex){  
  19.         ex.printStackTrace();  
  20.     }  
  21. }  

2.在process()方法中添加计数功能

[java] view plain copy
  1. //========添加网页访问次数功能(计算部分)=========  
  2. //将ServletContext中的visitTime所对应的值++  
  3. String times=this.getServletContext().getAttribute("visitTimes").toString();  
  4. //对times的值++再重新写回servletContext  
  5. this.getServletContext().setAttribute("visitTimes",(Integer.parseInt(times)+1));  
  6. //========添加网页访问次数功能(计算部分)=========  

3.重写destroy()方法

[java] view plain copy
  1. public void destroy() {  
  2.     try{  
  3.         System.out.println("destroy被调用");  
  4.           
  5.         //========添加网页访问次数的功能(写入部分)===========            
  6.         //再将新的次数写回文件  
  7.         FileWriter fw=new FileWriter("D://myCounter.txt");  
  8.         BufferedWriter bw=new BufferedWriter(fw);  
  9.         bw.write(this.getServletContext().getAttribute("visitTimes").toString());  
  10.         bw.close();//关闭文件流  
  11.         //========添加网页访问次数的功能(写入部分)===========  
  12.     }catch(Exception ex){  
  13.         ex.printStackTrace();  
  14.     }  
  15. }  

4.在页面显示(Wel.java)

[java] view plain copy
  1. //显示网页访问次数  
  2. pw.println("该网页被访问了"+this.getServletContext().getAttribute("visitTimes").toString()+"次<br>");  
  3. //显示主机IP地址  
  4. pw.println("您的IP地址="+req.getRemoteAddr()+"<br>");  
  5. //显示主机名  
  6. pw.println("你的主机名="+req.getRemoteHost()+"<br>");  
  7. pw.println("</center></body>");  

 


相关文章推荐

Servlet中ServletContext的用法

ServletContext可以想象为服务器中的一个公用空间,可以被所有的客户访问 ServletContext也是以“名-值”的形式保存数据,其用法有: 得到ServletContext:th...

JAVA笔记一:FUNDAMENTAL

FUNDAMENTAL一、概述1.Linux操作系统 开源的操作系统、免费,主要作为服务器操作系统, 而Java主要是服务器端开发,所以部署环境都是Linux Linux与Windows目录结构的区...

WEB基础:HTML

WEB三要素 浏览器 服务器 HTTP协议 HTML HyperText Markup Language可以理解为标签固定的XML. 学习HTML就是学习各种标签,本章介绍一些常用的标签。...

OpenLayers学习笔记8——使用servlet从mysql获取数据并标注

这两天在图书馆边看jsp边查边写代码,改完了老板交给的任务,也顺带实现了查询的效果,先来看下最终实现的效果图: 整个实现思路是:服务器端采用servlet+mysql模糊查询,servlet返回j...

Servlet学习笔记(五):ServletConfig和ServletContext详解

ServletConfig: 当servlet配置了初始化参数后,web容器在创建servlet实例对象时,会自动将这些初始化参数封装到ServletConfig对象中,并在调用servlet的ini...

servlet学习笔记---servletContext

servletContext域,容器的作用范围为应用程序范围,共用一个数据域,可以实现数据共享 在继承HttpServlet的类中,只需调用this.getServletContext();便可得到s...

Servlet技术之ServletContext接口(学习笔记)

ServletContext接口定义了一系列的与容器通信的方法,例如,得到文件的MIME类型,转发请求,或是写日志文件。每一个Web应用程序(一个Web应用程序是servlet和内容的集合,以.WAR...
  • chlstar
  • chlstar
  • 2012年09月14日 19:58
  • 594

Servlet学习笔记(二)之Servlet路径映射配置、Servlet接口、ServletConfig、ServletContext

Servlet路径映射配置 要使Servlet对象正常的运行,需要进行适当的配置,以告诉Web容器哪个请求调用哪个Servlet对象处理,对Servlet起到一个注册的作用。Servlet的配置信息...

OpenLayers学习笔记9——使用servlet与jquery-ui实现自动提示输入

做软件都要从用户的角度来做,怎么样让用户输入的更少,体验更好,我们就应该怎么来做,也就是需求驱动,客户都是大爷!题外话说完了,步入正题,本文实现在查询时输入查询条件时,自动提示数据库中包含改值所有记录...

JSP Servlet学习笔记——使用fileupload上传文件

关键代码如下: index.jsp [html] view plaincopyprint? body>   center>     h3>文件上传h3>     fo...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:servlet学习笔记8——ServletContext的讲解和使用
举报原因:
原因补充:

(最多只允许输入30个字)