有时候希望在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被调用时才会被执行!