Servlet实现计数器之ServletContext方法
昨天贴了一个实现计数器的方法,但显然每次用户登录时都去读写文件的方法是不明智的,效率不高,并发性也是问题。。。
于是乎,有了用ServletContext解决之的办法:
关于ServletContext:它是保存在服务器端,可以被所有用户访问的数据。
Cookie是保存在客户端的,Session是保存在服务器上的,但Session又不是多个客户端共用的。
因此,还需要提供一个多个客户端在服务器上的共享区。------ServletContext
它也是一张表,由名字和值构成。
1.得到ServletContext实例:
this.getServletContext();
2.添加属性:
setAttribute(String name,Object ob);
getAttribute(String name); return Object
3.删除
removeAttribute(String name)
生命周期:从创建开始,到服务器关闭时结束。
示例:存放
public class StudyServletContext extends HttpServlet{
@Override
public void doGet(HttpServletRequest req,HttpServletResponse res){
res.setContentType("text/html;charset=gbk");
PrintWriter pw = null;
try {
pw = res.getWriter();
} catch (IOException e) {
e.printStackTrace();
}
ServletContext sc = this.getServletContext();
sc.setAttribute("myInfo", "他是顺平");
pw.println("给ServletContext赋值");
}
@Override
public void doPost(HttpServletRequest req,HttpServletResponse res){
this.doGet(req,res);
}
}
读取:
public class StudyServletContext2 extends HttpServlet{
@Override
public void doGet(HttpServletRequest req,HttpServletResponse res){
PrintWriter pw = null;
res.setContentType("text/html;charset=gbk");
try {
pw = res.getWriter();
} catch (IOException e) {
e.printStackTrace();
}
ServletContext sc = this.getServletContext();
String s = (String)sc.getAttribute("myInfo");
pw.println("得到ServletContext的值为:" + s);
}
@Override
public void doPost(HttpServletRequest req,HttpServletResponse res){
this.doGet(req,res);
}
再配置好web.xml,直接访问就可以了。
注意:由于它会长时间的保存在服务器,会占用内存,因此我们最好不要向ServletContext中添加过大数据。
好,然后说正题:计数的程序:
/**
* 在Counter1中,用户每登录一次,就要操作一个文件,效率太低了
*
* 想到Servlet的生命周期,可以在init()方法中初始化servletcontext中属性times对应的值
* 中途就可以通过不断修改servletcontext就可以 了。
* 在destroy方法中,一次性将context中的值写入文件中
*
*/
@Override
public void init(){
System.out.println("init is running..");
try{
FileReader fr = new FileReader("f:/counter.txt");
BufferedReader br = new BufferedReader(fr);
String tmp = br.readLine();
this.getServletContext().setAttribute("visitTimes", tmp);///后面是对象,把int转化
br.close();
}catch(Exception e){
e.printStackTrace();
}
}
@Override
public void doGet(HttpServletRequest req,HttpServletResponse res){
String times = this.getServletContext().getAttribute("visitTimes").toString();
int iTimes = Integer.parseInt(times) + 1;
////////////对于int类型,没有toString方法,所以用 + ""
this.getServletContext().setAttribute("visitTimes", iTimes + "");
}
////destroy在服务器关闭时执行
@Override
public void destroy(){
System.out.println("destroy....");
try{
FileWriter fw = new FileWriter("f:/counter.txt");
BufferedWriter bw = new BufferedWriter(fw);
String s = (String)this.getServletContext().getAttribute("visitTimes");
bw.write(s);
bw.close();
}catch(Exception e){
e.printStackTrace();
}
}
在页面上:
pw.println("该网页被访问了" + this.getServletContext ().getAttribute("vistiTimes").toString() + "次");
Servlet获得主机名和IP
System.out.println(req.getRemoteAddr());///获得ip
System.out.println(req.getRemoteHost());//获得主机名
posted on 2011-11-03 10:46 java课程设计例子 阅读(333) 评论(0) 编辑 收藏 举报