热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

java实现System.Web.UI.ICallbackEventandler

早在ASP.NET2.0beta1时.NET就已经包含了一个异步技术叫Callback。本文将使用JavaJSP+JavaScript实现ASP.NET的C

                早在ASP.NET 2.0 beta1时.NET就已经包含了一个异步技术叫Callback。本文将使用Java/JSP+Javascript实现ASP.NET的Callback技术。

 
1.ASP.NET 2.0的Callback技术
  
ASP网页必须实现ICallbackEventHandler的RaiseCallbackEvent方法和GetCallbackResult方法
RaiseCallbackEvent方法负责接收Client端Javascript所送进来的参数。GetCallbackResult负责返回结果传给Client段。
例如
Public partial class ClientCallbackSimple:System.Web.UI.page, System.Web.UI.ICallbackEventHandler
{
              Public void RaiseCallbackEvent(string arg){
                            //do something.
}
 
              Public sting GetCallbackResult(){
                            //do someting
}
}
 
ASP
< title > Callback Test title >
< script type = "text/Javascript" >
        function OnCallback(data)
        {
                Results.innerText=data;
        }
script >
head >
< body >
        < div >
        < form id = "form1" action = "#" >
                < input type = "text" id = "arg" value = "0" />
                type = button value = Callback onclick = <%=ClientScript.GetCallbackEventReference(this, document.form1.arg.value , OnCallback ,null) %> />
                < div ID = "Results" > div >
        form >
        div >
body >
html >
其中ClientScript类负责注册Callback Javascript函数。当按钮被点击后,程序会调用Server的RaiseCallbackEvent 方法和GetCallbackResult 方法,之后返回Client段,并调用OnCallback函数。
 
2.Callback的java实现
 
1.ICallbackEventHandler接口
接口定义为:
package org.colimas.callback;
 
public interface ICallbackEventHandler {
 
        public Object RaiseCallbackEvent(String arg);
}
 
本文删掉GetCallbackResult方法,RaiseCallbackEvent方法直接返回一个结果。
 
2.EventHandler工厂
CallbackEventFactory类负责生成EventHandler实例。
package org.colimas.callback;
 
import java.util.HashMap;
 
public class CallbackEventFactory {
       
        private static HashMap handlers ;
        //singleton
        private CallbackEventFactory(){
               
        }
       
        /**
          * init
          * @param path
          */
        public static void init(String path){
               
                handlers = new HashMap();
                Object value;
                try {
                        //put all handles into handlers;
                        //following is a sample by only one handle.
                        value = Class.forName( "org.colimas.handlers.ReadData" ).newInstance();
                        handlers .put( "read_data" , value);
                } catch (InstantiationException e) {
                        // TODO 自動生成された catch ブロック
                        e.printStackTrace();
                } catch (IllegalAccessException e) {
                        // TODO 自動生成された catch ブロック
                        e.printStackTrace();
                } catch (ClassNotFoundException e) {
                        // TODO 自動生成された catch ブロック
                        e.printStackTrace();
                }
 
        }
        /**
          * get event handler by handle name
          * @param handlerName
          * @return
          */
        public static ICallbackEventHandler getEventHandler(String handlerName){
                return (ICallbackEventHandler) handlers .get(handlerName);
        }
}
 
3.Callback Servlet
初始化CallbackEventFactory
获得Request参数,并根据参数获得EventHandler实例,调用RaiseCallbackEvent并返回结果给客户端。
 
package org.colimas.callback;
 
import java.io.IOException;
 
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
 
/**
 * Servlet implementation class for Servlet: CallbackServlet
 * call event handler.
 * return result.
 *
 */
 public class CallbackServlet extends javax.servlet.http.HttpServlet implements javax.servlet.Servlet {
   
              private static final long serialVersiOnUID= 1L;
 
              /**
               * init CallbackEventFactory
               */
              public void init() throws ServletException {
                            super.init();
                            CallbackEventFactory.init(this.getInitParameter("handler_path"));
              }
             
              /**
               * process request
               * get event handle by name
               * call event handle
               * return result to resposne.
               */
             protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
                            String handlerName=(String)request.getParameter("handle");
                            String arg=(String)request.getParameter("arg");
                            if(arg==null)
                                          arg="";
                            ICallbackEventHandler eventHandler=CallbackEventFactory.getEventHandler(handlerName);
                            String result=(String)eventHandler.RaiseCallbackEvent(arg);
                            response.getWriter().print(result);
              }        
             
              protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
                            doGet(request,response);
              }
 
}
 
部署Servlet
 
        < servlet >
                < servlet-name > CallbackServlet servlet-name >
                < display-name > CallbackServlet display-name >
                < description > description >
                < servlet-class >
                        org.colimas.callback.CallbackServlet
                servlet-class >
                < init-param >
                        < param-name > handler_path param-name >
                        < param-value > conf/handlers.properties param-value >
                init-param >
        servlet >
        < servlet-mapping >
                < servlet-name > CallbackServlet servlet-name >
                < url-pattern > /callback url-pattern >
        servlet-mapping >
 
4.ClientScript的实现
 
生成下面Javascript代码
createXMLHttpRequest('/callback','handle=value&arg=value');
 
package org.colimas.callback;
 
 
/**
  * register callback event.
  * @author tyrone
  *
  */
public class ClientScript {
 
        public static String GetCallbackEventReference(String arg,String handle){
               
                StringBuffer js= new StringBuffer();
                js.append( "createXMLHttpRequest('/callback" );
                js.append( "','handle=" );
                js.append(handle);
                js.append( "&arg='+" );
                js.append(arg+ ")" );
                return js.toString();
        }
 
}
 
5.Common JSP
Common.jsp负责公用代码实现。包括,XmlHttp的实例化,发送URL请求,Server端返回后的Client端OnCallback调用。
<%@ page import = "org.colimas.callback.ClientScript" %>
< script type = "text/Javascript" >
var xmlHttp;
function createXMLHttpRequest(url,query) {
        if (window.ActiveXObject) {
                xmlHttp= new ActiveXObject( "Microsoft.XMLHTTP" );
        }else if (window.XMLHttpRequest) {
                xmlHttp= new XMLHttpRequest();
        }
        var path= " <%= request.getContextPath() %> " +url+ "?" +query;
        xmlHttp.Onreadystatechange=callback;
        xmlHttp.open( "GET" ,path, true );
        xmlHttp.send( null );
       
}
 
function callback() {
        if (xmlHttp.readyState==4) {
                if (xmlHttp.status==200) {
                        var data=xmlHttp.responseText;
                        OnCallback(data);
                }
        }
}
 
script >
6.测试
创建CallbackEventHandler类,自定义ICallbackEventHandler接口实现,根据Client段传送的参数,计算一个随机数。
package org.colimas.handlers;
 
import org.colimas.callback.ICallbackEventHandler;
import java.util.Random;
public class ReadData implements ICallbackEventHandler {
 
              public Object RaiseCallbackEvent(String arg) {
 
                            if(arg!=null){
                                          String data="";                               
                                          Random r=new Random();
                                          float f=r.nextFloat()* Float.valueOf(arg).floatValue();
                                          data=new Float(f).toString();
                                          return data;
                            }
                            return null;
              }
 
}
 
创建JSP页面,每个1秒钟,向服务器段请求一次。:
DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd" >
<%@ page language = "java" contentType = "text/html; charset=UTF-8" %>
< html >
< meta http-equiv = "Pragma" content = "no-cache" >
 
< head >
 
< title > Callback Test title >
<%@ include file = "/jsp/common.jsp" %>
< script type = "text/Javascript" >
        function DoGet()
        {
                //Register callbackevent
                //createXMLHttpRequest('/callback','handle=read_data&arg='+form1.arg.value);
// 注册 CallbackEventhandle                <%= ClientScript.GetCallbackEventReference( "form1.arg.value" , "read_data" ) %> ;
               
        }
//OnCallback 函数定义。
        function OnCallback(data)
        {
                Results.innerText=data;
        }
script >
head >
< body onload = "setInterval('DoGet()',1000)" >
        < div >
        < form id = "form1" action = "#" >
                < input type = "text" id = "arg" value = "0" />
                < div ID = "Results" > div >
        form >
        div >
body >
html >
运行结果:
每次修改输入框内的值,下面的Text值都回动态改变。

推荐阅读
  • JavaScript概述1.JavaScript定义JavaScript是Netscape公司开发的一种基于对象和事件驱动的脚本语言。它是弱类型语言,只能由浏览器解释执行。其中:脚本语言:解释运行( ... [详细]
  • 但有时候,需要当某事件触发时,我们先做一些操作,然后再跳转,这时,就要用JAVASCRIPT来实现这一跳转功能。下面是具体的做法:一:跳转到新页面,并且是在新窗口中打开时:复制代码代码如下:fu ... [详细]
  • 1,关于死锁的理解死锁,我们可以简单的理解为是两个线程同时使用同一资源,两个线程又得不到相应的资源而造成永无相互等待的情况。 2,模拟死锁背景介绍:我们创建一个朋友 ... [详细]
  • springmvc学习笔记(十):控制器业务方法中通过注解实现封装Javabean接收表单提交的数据
    本文介绍了在springmvc学习笔记系列的第十篇中,控制器的业务方法中如何通过注解实现封装Javabean来接收表单提交的数据。同时还讨论了当有多个注册表单且字段完全相同时,如何将其交给同一个控制器处理。 ... [详细]
  • 猜字母游戏
    猜字母游戏猜字母游戏——设计数据结构猜字母游戏——设计程序结构猜字母游戏——实现字母生成方法猜字母游戏——实现字母检测方法猜字母游戏——实现主方法1猜字母游戏——设计数据结构1.1 ... [详细]
  • 深入理解CSS中的margin属性及其应用场景
    本文主要介绍了CSS中的margin属性及其应用场景,包括垂直外边距合并、padding的使用时机、行内替换元素与费替换元素的区别、margin的基线、盒子的物理大小、显示大小、逻辑大小等知识点。通过深入理解这些概念,读者可以更好地掌握margin的用法和原理。同时,文中提供了一些相关的文档和规范供读者参考。 ... [详细]
  • Ihavethefollowingonhtml我在html上有以下内容<html><head><scriptsrc..3003_Tes ... [详细]
  • JavaScript和HTML之间的交互是经由过程事宜完成的。事宜:文档或浏览器窗口中发作的一些特定的交互霎时。能够运用侦听器(或处置惩罚递次来预订事宜),以便事宜发作时实行相应的 ... [详细]
  • ①页面初始化----------收到客户端的请求,产生相应页面的Page对象,通过Page_Init事件进行page对象及其控件的初始化.②加载视图状态-------ViewSta ... [详细]
  • React提供三种方式创建Refs:字符串Refs(将被废弃)回调函数RefsReact.createRef(从React16.3开始)第一种方式不推荐使用,原因在此,并且可能会在之后的版本移除。classMyComponentextendsReact.Component{constructor(props){sup ... [详细]
  • java多线程获取线程返回结果
    我们在使用java多线程编写相关业务代码时,往往有这样一种情况,某个线程依赖于其他线程执行结果。也就是说,我们需要在一个线程中获取另一个线程的信息。可以分为两种情况,一种是轮询,一 ... [详细]
  • 表单提交前的最后验证:通常在表单提交前,我们必须确认用户是否都把必须填选的做了,如果没有,就不能被提交到服务器,这里我们用到表单的formname.submit()看演示,其实这个对于我们修炼道 ... [详细]
  • JavaScript在常人看来都是门出不了厅堂的小语言,仅管它没有明星语言的闪耀,但至少网页的闪耀还是需要它的,同时它是一门很实用的语言,本人平时就喜欢拿它来写点实用工具或应用,本文演示用JavaSc ... [详细]
  • 本文介绍了南邮ctf-web的writeup,包括签到题和md5 collision。在CTF比赛和渗透测试中,可以通过查看源代码、代码注释、页面隐藏元素、超链接和HTTP响应头部来寻找flag或提示信息。利用PHP弱类型,可以发现md5('QNKCDZO')='0e830400451993494058024219903391'和md5('240610708')='0e462097431906509019562988736854'。 ... [详细]
  • 前景:当UI一个查询条件为多项选择,或录入多个条件的时候,比如查询所有名称里面包含以下动态条件,需要模糊查询里面每一项时比如是这样一个数组条件:newstring[]{兴业银行, ... [详细]
author-avatar
郭彦伶克瑞雅书
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有