ServletContext结合Servlet接口中的init()方法和destroy()方法的运用----网站计数器
我们一般知道Servlet接口中的init()方法在tomcat启动时调用,destroy()方法在tomcat关闭时调用。那么这两个方法到底在实际开发中有什么作用呢?这就是这个随笔主要讲的内容。
思路:网站计数器,如果想在服务器关闭时,保留以前的访问量,最简单的方式是把访问数据放在数据库中,但这样会增加服务器的压力。所以ServletContext结合Servlet接口中的init()方法和destroy()方法的一起使用便可以做一个网站计数器。
把数据写在一个.txt文件中,在init()方法中把文件的数据读取出来,并添加到ServletContext中。在destroy()方法,把ServletContext中的数据取出来写入到文件中。
具体代码如下:本代码共包括的类,以及文件的位置见下图中的红色矩形框:
web.xml中的代码如下:
<servlet>
<description>This is the description of my J2EE component</description>
<display-name>This is the display name of my J2EE component</display-name>
<servlet-name>InitServlet2</servlet-name>
<servlet-class>com.qls.counter2.InitServlet2</servlet-class>
<load-on-startup>1</load-on-startup>//this is very important .you cannot ignore it .
</servlet>
<servlet>
<description>This is the description of my J2EE component</description>
<display-name>This is the display name of my J2EE component</display-name>
<servlet-name>Login2</servlet-name>
<servlet-class>com.qls.counter2.Login2</servlet-class>
</servlet>
<servlet>
<description>This is the description of my J2EE component</description>
<display-name>This is the display name of my J2EE component</display-name>
<servlet-name>LoginOperation2</servlet-name>
<servlet-class>com.qls.counter2.LoginOperation2</servlet-class>
</servlet>
<servlet>
<description>This is the description of my J2EE component</description>
<display-name>This is the display name of my J2EE component</display-name>
<servlet-name>Ok2</servlet-name>
<servlet-class>com.qls.counter2.Ok2</servlet-class>
</servlet>
//InitServlet2的代码如下:
package com.qls.counter2; import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.io.PrintWriter; import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
* 利用tomcat启动时调用init()方法,和关闭时调用destroy()方法的特点
* 把上次tomcat关闭时的数目写入到文件recordnum.txt中。
* 启动tomcat时从该文件recordnum.txt中读取数据。
* 这样就避免了把这些数据不停保留在数据库中了,增加服务器的运行压力。
* 其实数据库的本质也是文件。
* @author 秦林森
*
*/
public class InitServlet2 extends HttpServlet { public void destroy() {
/**
* 利用tomcat关闭时调用该方法的特性
* 把ServletContext的属性值的写入文件recordnum.txt。
*/
/**
* 获取文件recordnum.txt的全路径
*/
System.out.println("destory被调用了");
String path = this.getServletContext().getRealPath("recordnum.txt");
try {
BufferedWriter out=new BufferedWriter(new FileWriter(path));
/**
* 把ServletContext中的数据写入到文件recordnum.txt中。
*/
String num = (String) this.getServletConfig().getServletContext().getAttribute("pengta");
out.write(num);
out.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} } public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException { response.setContentType("text/html;charset=utf-8");
PrintWriter out = response.getWriter(); } public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException { response.setContentType("text/html;charset=utf-8");
PrintWriter out = response.getWriter();
this.doGet(request, response);
} public void init() throws ServletException {
System.out.println("init()被调用了");
/**
* 利用启动Tomcat时调用该方法的特性。
*/
/**
* 获得recordnum.txt的全路径
*/
String path = this.getServletConfig().getServletContext().getRealPath("recordnum.txt");
/**
* 从recordnum.txt中读取数据
*/
try {
BufferedReader in = new BufferedReader(new FileReader(path));
String num = in.readLine();
this.getServletConfig().getServletContext().setAttribute("pengta", num);
in.close();//关流。
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
} }
//Login2 的代码如下:
package com.qls.counter2; import java.io.IOException;
import java.io.PrintWriter; import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse; public class Login2 extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException { response.setContentType("text/html;charset=utf-8");
PrintWriter out = response.getWriter();
out.println("<h1>统计网站浏览的次数的登录界面</h1>");
out.println("<br/>");
out.println("<form action='/servletContext/LoginOperation2' method='post'>");
out.println("<br/>");
out.println("用户名:<input type='text' name='username'/>");
out.println("<br/>");
out.println("密码:<input type='password' name='password'/>");
out.println("<br/>");
out.println("<input type='submit' value='登录'/>");
out.println("</form>");
} public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException { response.setContentType("text/html;charset=utf-8");
PrintWriter out = response.getWriter();
this.doGet(request, response);
} }
//LoginOperation2的代码如下:
package com.qls.counter2; import java.io.IOException;
import java.io.PrintWriter; import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse; public class LoginOperation2 extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException { response.setContentType("text/html;charset=utf-8");
PrintWriter out = response.getWriter();
/**
* 获取在登录界面输入的密码:
*/
String password = request.getParameter("password");
//获取ServletContext中的数目
String ouyangfeng = (String) this.getServletConfig().getServletContext().getAttribute("pengta");
/**
* 由于每个用户访问该网站都有一个唯一的密码和用户名,现假设该用户的密码是123,只要密码是123就能登录进去。
*/
if (password.equals("123")) { this.getServletConfig().getServletContext().setAttribute("pengta", (Integer.parseInt(ouyangfeng)+1)+""); response.sendRedirect("/servletContext/Ok2");
}else{
request.getRequestDispatcher("/Login2").forward(request, response);
}
} public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException { response.setContentType("text/html;charset=utf-8");
PrintWriter out = response.getWriter();
this.doGet(request, response);
} }
//Ok2 的代码如下:
package com.qls.counter2; import java.io.IOException;
import java.io.PrintWriter; import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse; public class Ok2 extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException { response.setContentType("text/html;charset=utf-8");
PrintWriter out = response.getWriter();
out.println("访问该网站的次数是:"+this.getServletContext().getAttribute("pengta"));
} public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException { response.setContentType("text/html;charset=utf-8");
PrintWriter out = response.getWriter();
this.doGet(request, response);
} }
//recordnum.txt的代码如下:
recordnum.txt的内容只有一个0.如下图所示:
ServletContext结合Servlet接口中的init()方法和destroy()方法的运用----网站计数器的更多相关文章
- 关于Cocos2d-x中init方法和onEnter方法的区别
init()和onEnter()这两个方法都是写实例化对象的类(比如继承自Node的一些类等等)的时候用到的方法. 一般都是public类型下面的 bool init(); void onEnter( ...
- golang init方法和main方法初始化顺序
init()和main()方法是golang默认的两个方法,不需要我们调用,程序执行会自动寻找项目中的这俩方法.现在我们就讲一种通用的情况:main 包下 导入了 init2 包而在init2 包下又 ...
- spring bean的init 方法和 destory方法的三种实现方式
1.通过@Bean(initMethod ="initPerson",destroyMethod ="destroyPerson" ) public class ...
- laravel中delete()方法和destroy()方法的区别
delete()方法是实例方法,需要查询到相应的数据并通过模型实例调用 destroy()方法可以直接调用,通过索引删除记录 举个栗子: /*delete()方法删除*/ //先查找记录 $blog ...
- Android HTTP实例 使用GET方法和POST方法发送请求
Android HTTP实例 使用GET方法和POST方法发送请求 Web程序:使用GET和POST方法发送请求 首先利用MyEclispe+Tomcat写好一个Web程序,实现的功能就是提交用户信息 ...
- OC类的本质,深入探讨,load方法和initialize方法
1:类的本质:类也是一种类,可以叫做类类,类对象,类类型: 2:类和对象在内存中分配问题(注意区分类的对象和类对象的概念) 类对象在内存中只有一份,且只加载一次,类对象中存放了类中定义的方法: 而成员 ...
- Java8新特性(一)_interface中的static方法和default方法
什么要单独写个Java8新特性,一个原因是我目前所在的公司用的是jdk8,并且框架中用了大量的Java8的新特性,如上篇文章写到的stream方法进行过滤map集合.stream方法就是接口Colle ...
- java8新特性:interface中的static方法和default方法
java8中接口有两个新特性,一个是静态方法,一个是默认方法. static方法 java8中为接口新增了一项功能:定义一个或者多个静态方法. 定义用法和普通的static方法一样: public i ...
- Java8新特性interface中的static方法和default方法
static方法 java8中为接口新增了一项功能:定义一个或者更多个静态方法.用法和普通的static方法一样. 代码示例 public interface InterfaceA { /** * 静 ...
随机推荐
- 想学习一下node.js,重新安装配置了node
根据这个网站上的教程安装配置的,还不错一次就成功了.觉得安装没什么,就是配置路径的时候容易错. http://www.runoob.com/nodejs/nodejs-install-setup.ht ...
- Java中的二进制运算出错问题
问题: 最近在做Java web项目中需要计算金额总和,在这里出现了一个问题是我以前没有关注到的: System.out.println(2.0-1.1); 执行时候的console中打印输出的是 0 ...
- Mysql:case when then end 的用法
0.创建一张数据表 表名为 test_when_case CREATE TABLE `test_when_case` ( `id` int(11) unsigned NOT NULL AUTO_INC ...
- order-by-offset-fetch
- 不同级域名中的 Cookie 共享
HTTP 响应头中 Set-Cookie 行未指定 domain 时则设置访问的域名 seliote.com 可以设置 seliote.com(也可以写成 .seliote.com 意思一样) 与 w ...
- dubbo的rpc异常
Exception in thread "main" com.alibaba.dubbo.rpc.RpcException: Failed to invoke the method ...
- PHP.35-TP框架商城应用实例-后台11-商品分类-删除分类(2种方法)、添加、修改
删除分类 删除一个分类的同时,其所有子分类都删除 在控制器CategoryCtroller.class.php中添加删除函数(delete) 在分类模型中添加钩子函数_before_delete()[ ...
- CF6C Alice, Bob and Chocolate
CF6C Alice, Bob and Chocolate 题目链接 写了一天搜索写的有点累了,就顺手水了一道CF的模拟题 这道题就是简单的模拟整个题的过程,注意最后输出的形式就好了QWQ AC代码如 ...
- Windows环境下svn服务器的安装步骤
做为一个程序开发人员,就算自己一个人写程序,也应该有一个SVN版本控制系统,以便对开发代码进行有效的管理. 下载SVN服务器 下载地址是:http://subversion.apache.org/pa ...
- swoole创建websocket服务器
目录 1 安装准备 1.1 安装swoole前必须保证系统已经安装了下列软件 1.2 下载并解压 1.3 编译安装成功后,修改php.ini 2 构建Swoole基本实例 2.1 tcp服务器实例 2 ...