Java中的call-back机制.(100分)

  • 主题发起人 主题发起人 曹晓钢
  • 开始时间 开始时间

曹晓钢

Unregistered / Unconfirmed
GUEST, unregistred user!
和C++中相似,有没有可以把一个函数传入另一个函数,用来实现call-back的机制?
我需要的是,在完成一个功能后,回调另一个函数来通知主程序。
 
用观察器范式解决
(当某个对象的状态发生了改变,所有需要知道其变化的一组对象都会接到通知)
 
来个例子吧,或者告诉我到sun去找什么关键词.
中文看不明白到底是什么呀.
 
其实我也不太明白大侠说的意思,。:)所以下面抄点关于观察器范式的形容。不知是否
适合你的情况。
In our new, more sophisticated windowing world, we often would
like to display data in more than one form at the same time and have all of the
displays reflect any changes in that data. For example, you might represent
stock price changes both as a graph and as a table or list box. Each time the
price changes, we’d expect both representations to change at once without
any action on our part.
We expect this sort of behavior because there are any number of
Windows applications, like Excel, where we see that behavior. Now there is
nothing inherent in Windows to allow this activity and, as you may know,
programming directly in Windows in C or C++ is pretty complicated. In Java,
however, we can easily make use of the Observer Design Pattern to cause our
program to behave in this way.
The Observer pattern assumes that the object containing the data is
separate from the objects that display the data, and that these display objects
observe changes in that data.
 
eguy:你的理解相当正确。告诉你我想获得什么效果吧。
在一个jsp里面,我调用一个class来处理一个操作,这个操作很耗时间,所以我用一个progress bar
在叶面上告诉用户当前进行到哪一步了,用一个text area告诉细节。
我可以这么做:
for a class :
public method LongProcess(HttpServletResponse response,params p1,...)
{
// out got by the response;
out.println("<script>progressbar.progress++;logarea.value+='something'");
...
}
我当然期望这种编程能够成为一种模型,
不想把script和html里的script内容放到java class里来。
我现在是这么做的: 把要写到html里去的内容在jsp里面定义,再传送到class里去。
这样:
in jsp:
Stirng setTotal = "<script>progressbar.total=%TOTAL%</scroipt>";
String setProgress = "<script>progressbar.progress = %PROGRESS%</script>";
in java class:
{
int iTotal = 10;
int iProgress = 5;
out.println(replaceString(setTotal,"%TOTAL%",iTotal+""));
out.println(replaceString(setTotal,"%TOTAL%",iTotal+""));
out.flush();
}
是不是很不爽?
如果用observer,应该就是把LongProcess作为observable,每当有需要通知jsp的,就去
notifyObservers('progress++').
notifyObservers('something').
然后jsp自己去解释,写<script>到out去。
不过用observe模型有个问题,就是你不能把jsp的那个class作为Observer,对不对?
jsp里面也不能再定义另外一个class 来extend Observer.
所以....还有什么办法?
 
另外,请问你访问firstbyte.com.cn,速度如何?
还有www.jsinfo.net速度?
www.redian.com的速度?
我准备要去放一台主机,想看看各个地方你访问的速度。
firstbyte.com.cn是我现在的主机,jsinfo.net是在南京电信局,redian.com放在南京数据局。
 
在JSP里实现call-back是有点困难。其实JSP也是可以extends其它超类的,只不过
麻烦一点而已。我想了一下,要实现这想的功能,换成servlet可以。将这个servlet
实现HttpSessionBindingListener接口,在valueBound方法里对progress和textarea进行
修改。将session和servlet本身作为参数传到做很耗时间的操作的那个工具类里,
当操作到一定程度时,工具类便往session里传入当前的状态,从而让container调用servlet
的valueBound方法。实现call-back。这各方案的缺点是:用servlet作复杂的HTML输出
不太方便。
或者,定义一个抽象超类,实现HttpSessionBindingListener接口,在JSP里用extends进行
继承。其它的和上面的类似。
另外:我访问了一下你列的几个地方。firstbyte.com.cn速度还可以,只不cover.jsp的
banner出来得慢一点。再往里我就没进去了。界面倒不错,清爽宜人。只不过,为什么是英文的呢?
还有,www.jsinfo.net速度和www.redian.com的速度相比,好象www.jsinfo.net快些,但从绝对速度来说
两个都比较慢,正常情况下,我是不会去访问的,基本到了不可忍受的地步:(
也许是因为我在cernet的原因。一家之言,谨供参考。
 
不希望用servlet实现。jsp要比servlet容易修改。
"在JSP里用extends进行继承".
关键就是这个 :)
不把jsp变成servlet,看来是不可能实现extend的。
firstbyte.com.cn,在江苏宽带网里。
你觉得速度快,可能是因为负荷太轻。IBM 的server, + 512M RAM,就是名单上列出的不到10个人用
.你看到的是我们自己的bug trace系统,暂时还没有中文界面。这也是我操作中的练功场的一个组成
部分。 :)
cernet这是个问题.delphibbs迟迟不搬,主要就是因为有时间,有精力的很多都是在校学生。
我现在每天要工作,实在没有时间在bbs里泡。想当年小茶毕业前两个月每天早上带两个面包进
实验室,两个月在delphibbs的积分比我一年都高 .... ai ..往事呀~~
cernet何时才能和chinanet互连呢?jsinfo和redian其实都是在chinanet骨干网上的,教育网访问
都这么慢...不过话又说回来,我来delphibbs估计就和你上jsinfo差不多的速度吧! :)
 
>>不把jsp变成servlet,看来是不可能实现extend的。
好象JSP是可以指定超类的,它extends指令的作用就是用来干这个的。只不过我
刚才试了一下,没成功。我现在也很忙了,所以也不常到大富翁,来也是报个到而已。
如果你有时间的话,可以试试用JSP的extends指令。我有时间也试试,成功了再通知你。
据说大富翁搬家了,yysun说过年时就搬家,好象是搬到位于Chinanet主节点北京电报大楼机房内,
100M高速带宽。你用www.delphibbs.com访问试试。当然cernet的还在。
 
两位虾,好。不知道我的理解对不对,不过,
1。是不是在jsp中也不想使用任何代码?我觉得在jsp中定义一个class,
然后再把它的实例当成Observer传入也未尝不可。
2。既然是要call-back,就是要关心一些事件,用Listener不可以么?
 
to JJams_King:是个好主意,昨天只想到去将JSP 类extends了。
to 曹晓钢: 值得一试,比直接将JSP类extends的方案好。
 
对啦,to jjams_king:
1.这个类也是要用java写的对不对?这样如果jsp要修改的话,还要去改class.
2.listener到是不错。
我学java是新手,listener还没用过呢!说实话我用java现在还停留在初级阶段 :)
看来要声明一个新的modle 实例,然后addChangeListener.
我在java.sun.com找了半天没找到应该用哪个model类. :(
 
to 曹晓钢:
1。不用找了:),就用HttpSessionBindingListener吧。
2。或者:
JSP里用来修改progress的类实现Observer接口,进行操作的工具类继承Observable。这样更清楚一些。
 
to 曹晓钢:
Listener没那么难吧?!
1。在需要事件通知的class中定义一个javax.swing.event.EventListenerList
2。定义新的事件和相应的Listener,如果不帕修改jsp时麻烦(其实也不麻烦,
见后面),那么就用javax.swing.event.ChangeEvent和
javax.swing.event.ChangeListener
3。在需要通知事件的class中增加方法
addProgressBarEventListener(ChangeListener listener);
4。在jsp中适当的地方注册listener
longTimeObject.addProgressBarListener(new ChangeListener{
public void stateChanged(ChangeEvent e)
{
//Do whatever you want. e.g.
out.print("<script>progressbar.progress++;logarea.value+=e");
out.flush();
}
});
5。定义自己的Event和EventListener。如果觉得这种事件用的比较多,不凡建立自
己的Event和EventListener,这样用起来会更舒服些。
6。更详细的信息可以从JavaDoc上得到。
 
>对啦,to jjams_king:
>1.这个类也是要用java写的对不对?这样如果jsp要修改的话,还要去改class.
jsp本身就是java源程序,所以只能有一个public的class。为了在一个java原文件
中定义多各class,有两种方法:1。不要public它,不过这种办法在jsp中好像行
不通,反正我没试过。2。生成Inner class。我上面的方法就是生成一个匿名的
Inner class。不过这种方法我也没试过,你去试一下吧。按照我对jsp的理解,这
种方法应该是没有问题的。
 
多人接受答案了。
 
后退
顶部