有时候希望在servlet首次载入时,执行复杂的初始化任务,但并不想每个请求都重复这些任务。用init()方法能实现在servlet初次创建时被调用,之后处理每个用户的请求时,则不再调用这个方法。因此,它主要用于一次性地初始化,和applet的init方法相同。
比如,我启动Tomcat后,每当我本地的一张表里有条数据符合我设置的要求,我就想把它取出来进行处理。处理完成后,一直等待直到下一条符合我设置要求的数据出现:
public class Lostvoice extends HttpServlet{
@Override
public void init() throws ServletException {
missphone();
}
private void missphone () {
Runnable run = new Runnable() {
public void run() {
while (true) {
SimpleDateFormat sdf = new SimpleDateFormat("yyyyMM");
String date = sdf.format(new Date());
String sql = "select sid, enterID ,caller,called,to_char(opertime,'yyyymmddhh24miss') from db_lost_msg_" + date
+ " where state = 0 or state is null";
try {
Connection conn = ConnUtils.getConn();
Statement stat = conn.createStatement();
ResultSet rs = stat.executeQuery(sql);
while(rs.next()) {
String update = "update db_lost_msg_" + date + " set state = 1 where sid = '"+ rs.getString(1) + "'";
System.out.println("开始更新sid为" + rs.getString(1) + "的数据状态为1");
stat.executeUpdate(update);
System.out.println("更新结束");
}
ConnUtils.close(conn, stat, rs);
} catch (SQLException e) {
e.printStackTrace();
}
try {
Thread.sleep(3000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
};
Thread thread = new Thread(run);
thread.start();
}
}
如果要想让servlet的init()方法在服务器启动时就被执行,还需要在web.xml中相应的servlet下配置:
<servlet> <servlet-name>lostvoice</servlet-name> <servlet-class>com.servlet.Lostvoice</servlet-class> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>lostvoice</servlet-name> <url-pattern>/lostvoice</url-pattern> </servlet-mapping>
即将:<load-on-startup>1</load-on-startup>设置为正整数(包括0)
这样此servlet就会在服务器启动时执行了。(注意:如果设置为负整数,则不会在启动服务器时执行!)
如果不配置,启动服务器时也不会执行,而要等此servlet被调用时才会被执行
!
版权声明:本文为iteye_4348原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。