`
touchinsert
  • 浏览: 1329125 次
  • 性别: Icon_minigender_1
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论

java实现System.Web.UI.ICallbackEventandler

阅读更多

早在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"/>
<input type=buttonvalue=Callbackonclick=<%=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;
publicinterface ICallbackEventHandler {
public Object RaiseCallbackEvent(String arg);
}
本文删掉GetCallbackResult方法,RaiseCallbackEvent方法直接返回一个结果。
2.EventHandler工厂
CallbackEventFactory类负责生成EventHandler实例。
package org.colimas.callback;
import java.util.HashMap;
publicclass CallbackEventFactory {
privatestatic HashMap handlers;
//singleton
private CallbackEventFactory(){
}
/**
*init
*@parampath
*/
publicstaticvoid 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();
}
}
/**
*geteventhandlerbyhandlename
*@paramhandlerName
*@return
*/
publicstatic ICallbackEventHandlergetEventHandler(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;
/**
*registercallbackevent.
*@authortyrone
*
*/
publicclass ClientScript {
publicstatic 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值都回动态改变。
分享到:
评论

相关推荐

    System.web.dll下载

    System.web.dll中的FormsAuthentication类和Membership类是ASP.NET实现用户身份验证和授权的主要工具。FormsAuthentication支持基于表单的身份验证,而Membership则提供了用户注册、验证、密码重置等功能。 8. **...

    System.Web.Http.dll,System.Web.Http.WebHost.dll

    `System.Web.Http.WebHost`命名空间包含了实现IIS集成的关键类,如`HttpSelfHostServer`和`HttpSelfHostConfiguration`,它们负责启动和配置Web API服务。`HttpSelfHostServer`允许在非IIS环境中自托管Web API,而`...

    System.Web.Extensions.dll

    Parser Error Message: Could not load file or assembly 'System.Web.Extensions, Version=1.0.61025.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35' or one of its dependencies. 系统找不到指定的文件。 ...

    System.Web.WebPages.dll

    System.Web.WebPages

    System.Web.WebPages.Deployment.dll

    System.Web.WebPages.Deployment

    System.Web.Http.zip

    开发者可以通过解压并引用合适的DLL(根据他们的系统架构选择X86或X64),结合System.Web.Http命名空间中的类来处理HTTP请求和响应,实现Web服务的功能。同时,提供的DLL工具.exe可能有助于开发者在开发过程中对DLL...

    System.Web.Extensions

    总的来说,System.Web.Extensions是.NET Framework为C#开发者提供的强大工具,它通过dll文件实现了AJAX功能,使得Web应用程序能够实现更加流畅和高效的用户交互。jb51.net提供的资源可以帮助开发者更好地理解和使用...

    System.Web.Script.Serialization.7z

    .net2.0版本的json操作类 ...System.Web.Script.Serialization的json操作类,位于3.0以上的System.Web.Extensions类库中. 本项目是从System.Web.Extensions中剥离出System.Web.Script.Serialization的完整项目

    System.Web.Extensions, Version=1.0.61025.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35

    &lt;add tagPrefix="asp" namespace="System.Web.UI" assembly="System.Web.Extensions, Version=1.0.61025.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" /&gt; &lt;/system.web&gt; ``` ##### 4. 检查程序集...

    System.Web.Extensions.dll System.Web.Extensions.Design.dll 下载

    System.Web.Extensions.dll 和 System.Web.Extensions.Design.dll 是两个关键的组件,它们在ASP.NET框架中扮演着重要的角色,特别是在实现AJAX(Asynchronous JavaScript and XML)功能时。这两个DLL文件是ASP.NET ...

    System.Web.Helpers.dll

    System.Web.Helpers.dll

    System.Web.Services.dll

    System.Web.Services.dll

    System.Web.Extensions.dll和System.Web.Extensions.Design.dll

    System.Web.Extensions.dll和System.Web.Extensions.Design.dll是ASP.NET框架中两个至关重要的组件,主要用于支持AJAX(Asynchronous JavaScript and XML)技术。在ASP.NET应用程序中,这些DLL文件提供了丰富的功能...

    ASP.NET System.Web.Http.dll

    System.Web.Http.dll 5.2

    System.web.silverlight.dll

    System.web.silverlight.dll则是Silverlight在ASP.NET环境中的桥梁,它允许开发者无缝集成Silverlight组件到ASP.NET页面中,从而实现Web应用程序的动态化和交互性。 集成过程主要涉及以下步骤: 1. **安装和引用**...

    Microsoft.Web.UI.WebControls.rar

    "Microsoft.Web.UI.WebControls.rar" 是一个压缩包,包含有 "Microsoft.Web.UI.WebControls.dll" 这个文件,这是微软(Microsoft)开发的一个特定版本的控件库,主要用于ASP.NET web应用程序的开发。该版本号为1.0.2...

    System.Web.DataVisualization 4.0

    1. 引用所需的命名空间:在代码文件顶部,需要包含`using System.Web.UI.DataVisualization.Charting;`,这将提供对图表类和方法的访问。 2. 创建图表对象:通过`new Chart()`创建一个新的图表实例,然后可以设置其...

    System.Web.DataVisualization.dll

    分析器错误消息: 未能加载文件或程序集“System.WEB.DataVisualization, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35”或它的某一个依赖项。系统找不到指定的文件。 那么把这个文件放到bin...

    System.Web.Http.WebHost

    `System.Web` 是 .NET Framework 中的一个命名空间,包含了大量与 ASP.NET Web 应用程序开发相关的类和接口。这个命名空间包括了处理 HTTP 请求、身份验证、状态管理、页面生命周期等核心功能。ASP.NET 是微软推出的...

Global site tag (gtag.js) - Google Analytics