我的第一个java定时器

在开发中,我们经常需要一些周期性的操作,例如每隔几分钟就进行某一项操作。这时候我们就要去设置个定时,

接下来就去开发我的第一个java定时器吧,Java计时器实用程序允许您执行线程或任务在一个预先确定的将来的时间,并根据一组这些任务可以重复频率。 设计和实现一个计时器,会用到model-control-view(MVC)设计模式。

开始:

首先来构w建一个最简单的java web 项目吧。这里我用的是最myeclipse,好处自然不必多说,谁用谁知道,当然如果

要用其他IDE也可以。

在myeclipse中创建一个新的web应用程序很简单,点击File-new-WebProject,输入我们的项目名就可以了。

这个时候会系统会生成很多东西,我们找到WebRoot 下面的index.jsp页面,输入

Hello World!

启动我 们的tomcat,好了这个时候我们的第一个web项目就构建完成了;

现在我们已经有了自己的第一个 java web 程序了,可以尝试去写一个java web 计时器了;

表示层(View)

我们通常把web应用程序的表示层称为视图展现层, 它将包括一个屏幕显示计时器在任何时候的状态,以及一组按钮控制计时器的激活( 启动计时器 )和失活( 停止计时器 )。 您还可以定义定时器的间隔秒重复一个导演的任务。 最后,一个 刷新屏幕 按钮将更新事件通知显示在屏幕上。

模型层
模型层主要有两个类, 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())。 它包含两个属性:对象displaytimer

当对象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" %>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
由于,我们的秒数是1-9,所以可以利用JSTL,循环出来一个简易的下拉式列表框,供我们选择

<%
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.*" %>
<%@ 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"/>
好了到这里一个简易的Java计时器就完成了,接下来看一看运行效果吧;



源代码已上传,想看看的可以去下载http://download.csdn.net/detail/liaodehong/9052595

©️2020 CSDN 皮肤主题: 成长之路 设计师:Amelia_0503 返回首页