在开发中,我们经常需要一些周期性的操作,例如每隔几分钟就进行某一项操作。这时候我们就要去设置个定时,
接下来就去开发我的第一个java定时器吧,Java计时器实用程序允许您执行线程或任务在一个预先确定的将来的时间,并根据一组这些任务可以重复频率。 设计和实现一个计时器,会用到model-control-view(MVC)设计模式。
开始:
首先来构w建一个最简单的java web 项目吧。这里我用的是最myeclipse,好处自然不必多说,谁用谁知道,当然如果
你要用其他IDE也可以。
在myeclipse中创建一个新的web应用程序很简单,点击File-new-WebProject,输入我们的项目名就可以了。
这个时候会系统会生成很多东西,我们找到WebRoot 下面的index.jsp页面,输入
Hello World!
表示层(View)
MyTimer
和
Display
(其目的是报告的状态计时器,它可以显示).
Display
类有三个方法和构造函数。 在构造函数中Display()
,display
属性初始化为一个空字符串。
getDisplay()
返回属性的内容display
。 最后,该方法insert(value)
接受一个字符串作为参数,
display;
public void insert(String value) {
Calendar now = Calendar.getInstance();
String stamp = now.get(Calendar.HOUR_OF_DAY)+":"+now.get(Calendar.MINUTE)+
":"+now.get(Calendar.SECOND)+" - ";
display+=stamp+value+"\n<br>";
}
类MyTimer
直接与JSP页面交互。MyTimer
可以执行各种操作,包括启动一个计时器(timerStarted()
),停止计时器(timerStopped()
),并在屏幕上显示事件通知(getDisplay()
)。 它包含两个属性:对象display
和timer
。
当对象myTimer
被创建时,构造函数传递一个参数叫什么seconds
,它的类型为Integer
(该参数定义了定时器的时期,这是转换为毫秒。Timer
是一个具体的类,属于Java实用程序包和允许一个线程操作任务,可以在需要时启动在未来某个时间和停止。 它的scheduleAtFixedRate()
方法是用来计划任务重复固定利率执行。 这需要三个参数:任务执行(MyTask
),延迟计时器开始前(设置为0),和时间转换为毫秒。 创建并启动一个计时器,就创建一个新的对象myTimer
public MyTimer(Integer seconds) {
timer = new Timer();
long msec = 1000;
display = new Display();
timer.scheduleAtFixedRate(new MyTask(), 0*msec,
seconds.intValue()*msec);
display.insert("Timer is started.");
}
计时器的任务时间表是定义为
MyTask类
,此类继承自TimeTask,并扩展了TimerTask
——另一个类的Java实用程序包。MyT
ask
作为MyTimer的一个私人内部类,允许操作对象display
。 因此,MyTask
作用是为了在一个时间段显示的去调用执行
display
对象的insert方法.
public class MyTimer {
private Timer timer;
private Display display;
private String snapshot;
public MyTimer(Integer timeSecond) {
}
private class MyTask extends TimerTask {
@Override
public void run() {
// task to do
display.insert("New event.");
}
timerStopped()
方法停止计时器,它的实现非常简单。 它调用timer对象的cancel()方法,然后创建一个事件通知,显示在屏幕上的web应用程序。
public void timerStopped() {
timer.cancel();
display.insert("Timer has stopped.");
}
最后一个方法
getSnapshot()
将作为一个字符串返回的结果的方法getDisplay()
从对象display中提取getDisplay();
。 该方法用于更新web应用程序的屏幕。
public String getSnapshot() {
snapshot=display.getDisplay();
return snapshot;
}
创建接口引入JSTL
<%@page contentType="text/html" pageEncoding="UTF-8" %>由于,我们的秒数是1-9,所以可以利用JSTL,循环出来一个简易的下拉式列表框,供我们选择
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<%
Integer seconds[] = {new Integer(1),new Integer(2),new Integer(3),
new Integer(4),new Integer(5),new Integer(6),
new Integer(7),new Integer(8),new Integer(9)};
request.setAttribute("seconds", seconds);
Integer second=(Integer) session.getAttribute("second");
if(second==null) {
session.setAttribute("second", seconds[0]);
}
%>
</pre><strong></strong><div><strong></strong></div><div><strong>完善视图层</strong></div><div><strong></strong><pre name="code" class="html"><html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>JSP Page</title> <style type="text/css"> #foo { overflow-y: hidden; } .bar { float: left; margin:5px 5px 5px 5px; } .screen {border:solid 4px;width:500px;height:300px; background-color:beige; padding: 5px 5px 5px 5px; overflow:scroll} </style> </head> <body> <h1>Hello World!</h1> <div id="foo"> <div class="bar"> <form method="post" action="start.action"> 间隔 (秒) <select name="second"> <c:forEach items="${seconds}" var="row"> <c:if test="${row != second}"> <option>${row}</option> </c:if> <c:if test="${row == second}"> <option selected="">${row}</option> </c:if> </c:forEach> </select> <input type="submit" value="开始 计时"> </form> </div> <div class="bar"> <form method="post" action="stop.action"> <input type="submit" value="停止 计时"> </form> </div> <div class="bar"> <form method="post" action="control/doRefresh.jsp"> <input type="submit" value="刷新"> </form> </div> </div> <c:if test="${mytimer == null}"> <div class="screen" style="border-color:red"> ${display} </div> </c:if> <c:if test="${mytimer != null}"> <div class="screen" style="border-color:green"> ${display} </div> </c:if> </body></html>
<servlet>
<servlet-name>StratServlet</servlet-name>
<servlet-class>servlet.StartServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>StratServlet</servlet-name>
<url-pattern>/start.action</url-pattern>
</servlet-mapping>
<servlet>
<servlet-name>StopServlet</servlet-name>
<servlet-class>servlet.StopServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>StopServlet</servlet-name>
<url-pattern>/stop.action</url-pattern>
</servlet-mapping>
这里控制层,我用了两种不同的方法,一种是使用在JSP页面引入JSTL,进行判断,跳转。还有一种是使用Servlet,进行控制跳转。其实一个JSP也就是一个简易的Servlet,在JSP页面进行流程控制有一个好处,就是不用到Web.xml里面去配置,比较简单,方便。这里我两种方式都采用了。
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
try {
//得到间隔秒数
Integer second = new Integer(req.getParameter("second"));
//得到对象
MyTimer mytimer = (MyTimer) req.getSession()
.getAttribute("mytimer");
//判断对象是否存在,如果存在,就表明重复点击了开始按钮,这里先结束一下,当前的线程,再开始新的;
if (mytimer != null) {
// stop timer
mytimer.timerStopped();
}
//新对象,新方法,新线程
mytimer = new MyTimer(second);
req.getSession().setAttribute("mytimer", mytimer);
req.getSession().setAttribute("display", mytimer.getSnapshot());
req.getSession().setAttribute("second", second);
resp.sendRedirect("\\index.jsp");
} catch (Exception e) {
e.printStackTrace();
}
}
如果我们去JSP页面去控制的话,那么首先先去创建一个文件夹,我这里取名叫control,接着在里面写方法.
<%@page contentType="text/html" pageEncoding="UTF-8" import="data.*" %>好了到这里一个简易的Java计时器就完成了,接下来看一看运行效果吧;
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<%
Integer second= new Integer(request.getParameter("second"));
MyTimer mytimer = (MyTimer) session.getAttribute("mytimer");
if(mytimer!=null) {
// stop timer
mytimer.timerStopped();
}
mytimer = new MyTimer(second);
session.setAttribute("mytimer", mytimer);
session.setAttribute("display", mytimer.getSnapshot());
session.setAttribute("second", second);
%>
<c:redirect url="/index.jsp"/>
源代码已上传,想看看的可以去下载http://download.csdn.net/detail/liaodehong/9052595