|
用户名:itecwwj 笔名:itecwwj 地区: 行业:其他 |
| 日 | 一 | 二 | 三 | 四 | 五 | 六 |
比较IBM MQSeries和BEA WebLogic JMS Server(转载)
MyEclipse+Weblogic开发EJB(一)
MyEclipse+Weblogic开发EJB
编写人:邬文俊
编写时间:
联系邮件:wenjunwu430@gmail.com
学习ejb也有段日子了,一直没有找到好的资料指导如何在myeclipse下面开发ejb,令我十分苦恼。经过查阅资料和阅读myeclipse自带帮助,总结出该文档,希望该文档能够让大家迅速上手使用MyEclipse开发EJB组件,做为我们组的培训资料。如果中间有不足或错误请补充纠正,谢谢。
1. 下载安装eclipse 3.0版本,具体版本根据所下载的myeclipse版本要求(www.myeclipsesite.com)
2. 下载myeclipse3.8安装文件,运行安装,需要设置eclipse的安装目录。或者下载解压包,将文件夹解压到eclipse安装文件夹plugins目录,安装方法同普通插件安装相同。
3. 安装Weblogic 8.1.运行安装程序即可。具体配置本文不再描述,认为读者已经配置好weblogic的domain。
配置服务器以后可以通过myeclipse启动停止weblogic。
注:以下资料转自http://dev2dev.bea.com.cn/bbs,作者:newwei
1) 选择菜单Window->Preferences->MyEclipse->Application Servers->Weblogic 8,配置项目如下:
1. BEA home directory: 选择Bea的安装目录
2. Weblogic installation directory:现在BEA下面的weblogic81目录
3. Admin username:输入上面在配置过程中设的用户名
4. Admin password:输入刚才设的密码
5. Execution domain root:选择BEA下user_projects\domains目录下上面第一步创建的目录
6. Execution domain name:输入上面那个目录的名称
7. Execution server name:输入上一步的那个Congfiguration Name
8. Hostname:PortNumber:输入IP地址和监听的端口
9. Security policy file:输入BEA安装目录下的\weblogic81\server\lib\weblogic.policy
2) 在Weblogic 8下面配置JDK,在WLS JDK name那里选择新建,弹出的对话框中选择BEA下面的JDK安装路径,输入一个名字确定就可以;在Optional Java VM arguments对话框里面输入-ms
3) 在Weblogic 8下面配置Paths,加入BEA安装路径下/weblogic81/server/lib中的webservices.jar和weblogic.jar两个包。如果需要其他的包,也在这里加入。
1. File > New > Project.
2. 选择J2EE目录下 EJB Projec
3. 选择 Next >.
选择Finish,目录结构入图。
1. 主界面选择菜单File > New > Other,打开新建向导。
2. 展开J2EE > EJB 文件夹,选择Session EJB。
3. 选择Next>,界面如下。这里要注意,package建议用.ejb后缀,因为XDoclet工具默认ejb bean所在的文件夹以.ejb后缀,接口文件的文件夹以.interface为后缀,为了避免设置上的麻烦,建议按默认情况取名。当然你也可以通过设置XDoclet属性改变,详情请查看帮助文档。
4. 选择Finish
XDoclet可以加速EJB的开发,自动完成一些文件生成工作,这方面和JBuilder是类似的。
我们需要XDoclet生成的文件如下:
接口文件:远程接口、本地接口、Home接口、本地Home接口(文件作用参考《精通EJB》)
部署文件:ejb-jar.xml(标准ejb部署描述文件)、weblogic-ejb-jar.xml文件(weblogic部署ejb描述文件,不同服务器该文件不同,要特别注意,该文件是必需的,通常由工具自动生成)
1. 打开工程的properties窗口。选择菜单Properties > MyEclipse-XDoclet。
2. Add Standard
3. 选择Standard EJB。
4. 去掉没有用的标签,保留需要的如下图(见myeclipse帮助myeclipse application developer guide->ejb development->figure 11)。
5. 在build选项卡中选择 Use dynamic build specification
以上配置就可以生成一个标准stateless bean的所有接口和配置文件,但是要部署该bean,还缺一个服务器部署描述文件weblogic-ejb-jar.xml。
该配置是为了自动生成weblogic-ejb-jar.xml文件。
在工程上右键MyEclipse->Run XDoclet
生成前后工程目录应该类似为:
Jboss.xml应该为weblogic-ejb-jar.xml。
查看weblogic-ejb-jar.xml文件,可以知道Home接口的JNDI名称。
1. MyEclipse >Add and Remove Project Deployments
2. 点击add,添加部署服务器weblogic。
学java大半年了
马上就要毕业了,还没有成为大牛,唉~
看着师兄找工作,心里也不安起来
老婆找工作越来越顺利了,祝福一个:)
明年我也要变大牛,起码是小羊吧。
delphi 缓冲画图(内存画图)解决画图闪烁问题
很多朋友在做绘图程序的时候,往往出现屏幕不停刷新产生闪烁的问题,这里就告诉大家一个解决办法,缓冲绘图。如果有人是用取反画图解决这个问题,那么在画直线的时候容易出现斑点,效果不是很好。如果是图片很大,那么缓冲画图是解决的好办法。
在网上搜索一下内存绘图,或者缓冲绘图,会有很多技术文章,不过都是以vc或者java为主,很少有pascal的代码例子。不过原理都是一样的,大家可以参考他们的文章。我会在最后放上转载的vc缓冲画图的文章。:)感谢原作者。
Delphi中函数调用比较方便。
OldBmp, BufBmp是TbitMap
//画图方法:
procedure TChart.Draw(aCanvas: TCanvas);
begin
{把要画的操作放在这里}
end;
在你要画的地方用如下代码把内存中画好的内容放到你要显示的组件的canvas上,这里就是canvas:
Draw (BufBmp.Canvas);//Draw方法就是上面那段代码 bitblt(self.Canvas.Handle, 0, 0, ClientWidth, ClientHeight, self.BufBmp.Canvas.Handle, 0, 0, SRCCOPY);//拷贝函数
如果要用多个缓冲,用BufBmp.Assign(OldBmp);做内存中图片内容复制,然后在bufbmp中做进一步操作再贴到显示区。
简单吧:)。
怎样在内存缓冲中画图 作者 相生昌 |
document.title="怎样在内存缓冲中画图 "&document.title 关键字 内存缓冲,画图 介绍 正文 |
delphi 中画带箭头的直线(改自网上一位论坛版主的vb代码)
procedure TLineItem.Draw(aCanvas: TCanvas);
var
Xa, Ya, Xb, Yb: real;
D: real;
X1, Y1, X0, Y0: Integer;
begin
aCanvas.Pen.Style := PsSolid;
aCanvas.Pen.Color := clWhite;
//画直线
aCanvas.MoveTo(PtStart.X, PtStart.Y);
aCanvas.LineTo(PtEnd.X, PtEnd.Y);
//画箭头
X0 := PtStart.X;//PtStart是箭头的起点,PtEnd是终点,都是Tpoint型
Y0 := PtStart.Y;
X1 := PtEnd.X;
Y1 := PtEnd.Y;
D := Sqrt((Y1 - Y0) * (Y1 - Y0) + (X1 - X0) * (X1 - X0));
if D > 0 then begin
procedure TLineItem.Draw(aCanvas: TCanvas);
var
Xa, Ya, Xb, Yb: real;
D: real;
X1, Y1, X0, Y0: Integer;
begin
aCanvas.Pen.Style := PsSolid;
aCanvas.Pen.Color := clWhite;
//画直线
aCanvas.MoveTo(PtStart.X, PtStart.Y);
aCanvas.LineTo(PtEnd.X, PtEnd.Y);
//画箭头
X0 := PtStart.X;//PtStart是箭头的起点,PtEnd是终点,都是Tpoint型
Y0 := PtStart.Y;
X1 := PtEnd.X;
Y1 := PtEnd.Y;
D := Sqrt((Y1 - Y0) * (Y1 - Y0) + (X1 - X0) * (X1 - X0));
if D > 0 then begin
Xa := X1 + ARROWLEN * ((X0 - X1) + (Y0 - Y1) / 2) / D;
Ya := Y1 + ARROWLEN * ((Y0 - Y1) - (X0 - X1) / 2) / D;
Xb := X1 + ARROWLEN * ((X0 - X1) - (Y0 - Y1) / 2) / D;
Yb := Y1 + ARROWLEN * ((Y0 - Y1) + (X0 - X1) / 2) / D;
aCanvas.MoveTo(PtEnd.X, PtEnd.Y);
aCanvas.LineTo(Trunc(Xa), Trunc(Ya));
aCanvas.MoveTo(PtEnd.X, PtEnd.Y);
aCanvas.LineTo(Trunc(Xb), Trunc(Yb));
end;
//如果选中画出焦点矩形,可以不要
if FSelected = true then begin
aCanvas.Rectangle((PtStart.X - FORCUSRANGE),
(PtStart.Y - FORCUSRANGE),
(PtStart.X + FORCUSRANGE),
(PtStart.Y + FORCUSRANGE));
aCanvas.Rectangle((PtEnd.X - FORCUSRANGE),
(PtEnd.Y - FORCUSRANGE),
(PtEnd.X + FORCUSRANGE),
(PtEnd.Y + FORCUSRANGE));
end;
end;
canvas是任何一个拥有画笔的组件的canvas都可以。具体几何依据原作者没有讲。但是经过底下验算。有三个特点。
1. 箭头两翼端点连线和直线垂直(斜率之积等于-1)。
2. .箭头两翼长度相同。(等腰三角形)
3. 箭头两翼长度和两翼端点间的距离比值一定。(决定了夹角)
delphi透明组件(控件)开发
网友提供的方法:
/////////////////////////////////////////////
透明的控件, 一般继承自TGraphicControl的
(就是那些没有handle属性, 不能有focus的控件, 如image)
都有Transparent属性. 对TWinControl类的控件, 要实现透明只要完成以下
四步基本上就成了.
1.在Create中设定ControlStyle :=
ControlStyle - [csOpaque];)
2. override 它的CreateParams方法, exstyle 里加上WS_EX_TRANSPARENT.
3. 修改它的parent的window style, 去掉WS_CLIPCHILDREN.
inherited CreateParams(Params);
with Params do
begin
{ 完全重画 }
Style := Style and not WS_CLIPCHILDREN;
Style := Style and not WS_CLIPSIBLINGS;
{ 增加透明 }
ExStyle := ExStyle or WS_EX_TRANSPARENT;
end;
4. 截获WM_ERASEBKGND, 什么都不做直接返回1.(不搽除背景)
一般有上面3步能成. 有些控件比如TPanel, 在它的paint中用了fillrect,
所以要实现透明的话还要override 它的paint方法, 自己画.
按钮透明需要进一步处理.
createparams里加上style := style or BS_OWNERDRAW;
然后在WM_DRAWITEM中自己画吧
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
我的研究发现 Style := Style and not WS_CLIPCHILDREN;
Style := Style and not WS_CLIPSIBLINGS;没有作用。
如果你要改变控件位置和颜色,请拦截WM_MOVE,和CN_CTLCOLOREDIT消息,在里面调用invalidate方法,重绘组件。
阅
读inside vcl 和
飞思的组件开发书籍。了解如何选择适当的基类去继承然后扩展成自己的类。建议写控件的朋友应先了解这方面的知识,不要从tobject开始写起。
ControlStyle :=ControlStyle -
[csOpaque];)很关键,看源代码发现它影响了整个控件的画方法。现在已经实现了透明组件,可是用鼠标移动该组件就出现刷新不够,背景混乱的问
题。现在正在阅读timage源代码,看它是如何实现。想讨论这方面技术的朋友请email:wenjunwu430@163.com
/////////////////////////////////////////////
透明的控件, 一般继承自TGraphicControl的
(就是那些没有handle属性, 不能有focus的控件, 如image)
都有Transparent属性. 对TWinControl类的控件, 要实现透明只要完成以下
四步基本上就成了.
1.在Create中设定ControlStyle :=
ControlStyle - [csOpaque];)
2. override 它的CreateParams方法, exstyle 里加上WS_EX_TRANSPARENT.
3. 修改它的parent的window style, 去掉WS_CLIPCHILDREN.
inherited CreateParams(Params);
with Params do
begin
{ 完全重画 }
Style := Style and not WS_CLIPCHILDREN;
Style := Style and not WS_CLIPSIBLINGS;
{ 增加透明 }
ExStyle := ExStyle or WS_EX_TRANSPARENT;
end;
4. 截获WM_ERASEBKGND, 什么都不做直接返回1.(不搽除背景)
一般有上面3步能成. 有些控件比如TPanel, 在它的paint中用了fillrect,
所以要实现透明的话还要override 它的paint方法, 自己画.
按钮透明需要进一步处理.
createparams里加上style := style or BS_OWNERDRAW;
然后在WM_DRAWITEM中自己画吧
这里有个控件的源代码,非常好用,可惜焦点在这个控件上时不透明,你可以试着改一下。
unit RbsWiredEdit;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls;
const
TWM_RbsInvalidate=WM_USER+1;
type
TRbsWiredEdit = class(TEdit)
private
{ Private declarations }
procedure RbsInvalidate(var Message:TMessage); message
TWM_RbsInvalidate;
procedure CNCTLCOLOREDIT(var Message:TWMCTLCOLOREDIT); message
CN_CTLCOLOREDIT;
procedure WMEraseBkgnd(var Message: TWMEraseBkgnd); message WM_ERASEBKGND;
procedure WMMove(var Message: TMessage); message WM_MOVE;
protected
{ Protected declarations }
FTransparent: boolean;
procedure CreateWnd; override;
procedure CreateParams(var Params: TCreateParams); override;
procedure DoExit; override;
procedure DoEnter; override;
public
{ Public declarations }
constructor Create(AOwner: TComponent); override;
procedure Invalidate; override;
published
{ Published declarations }
end;
procedure Register;
implementation
constructor TRbsWiredEdit.Create(AOwner:TComponent);
begin
inherited create(AOwner);
ftransparent:=true;
end;
procedure TRbsWiredEdit.CreateWnd;
begin
inherited CreateWnd;
if fTransparent then
begin
SetWindowLong(Parent.Handle, GWL_STYLE,
GetWindowLong(Parent.Handle, GWL_STYLE) and not WS_CLIPCHILDREN);
end;
end;
procedure TRbsWiredEdit.RbsInvalidate(var Message:TMessage);
var r:TRect;
begin
if (Parent<>nil) and FTransparent then
begin
r:=ClientRect;
r.TopLeft:=Parent.ScreenToClient(ClientToScreen(r.TopLeft));
r.BottomRight:=Parent.ScreenToClient(ClientToScreen(r.BottomRight));
RedrawWindow(Handle,nil,0,RDW_FRAME+RDW_INVALIDATE);
end;
end;
procedure TRbsWiredEdit.CNCTLCOLOREDIT(var Message:TWMCTLCOLOREDIT);
begin
ifFTransparent then
with Message do
begin
SetBkMode(ChildDC,Windows.TRANSPARENT);
Result:=GetStockObject(HOLLOW_BRUSH)
end
else inherited;
end;
procedure TRbsWiredEdit.WMEraseBkgnd(var Message:TWMERASEBKGND);
begin
if FTransparent and not (csDesigning in ComponentState) then
PostMessage(Handle,TWM_RbsInvalidate,0,0)
else inherited;
end;
procedure TRbsWiredEdit.WMMove(var message:TMessage);
begin
inherited;
if FTransparent then SendMessage(Handle,TWM_RbsInvalidate,0,0)
else Invalidate;
end;
procedure TRbsWiredEdit.CreateParams(var Params:TCreateParams);
begin
inherited CreateParams(Params);
if (CsDesigning in ComponentState) then exit;
with Params do
begin
ExStyle:=ExStyle or WS_EX_TRANSPARENT;
end;
end;
procedure TRbsWiredEdit.DoExit;
begin
inherited;
FTransparent:=true;
SetCursor(0);
RecreateWnd;
end;
procedure TRbsWiredEdit.DoEnter;
var exstyle,stdstyle:longint;
begin
inherited;
Ftransparent:=false;
StdStyle:= Windows.GetWindowLong(handle, GWL_EXSTYLE);
exStyle:= StdStyle and not WS_EX_TRANSPARENT;
Windows.SetWindowLong(handle, GWL_EXSTYLE, exStyle);
invalidate;
end;
procedure TRbsWiredEdit.Invalidate;
begin
if FTransparent then SendMessage(Handle,TWM_RbsInvalidate,0,0)
else inherited;
end;
procedure Register;
begin
RegisterComponents('Rombest', [TRbsWiredEdit]);
end;
end.
delphi的属性property、消息处理特点、事件属性。
适合delphi初学者,有面向对象知识和java或者vc编程经验人士阅读。
适合delphi初学者,有面向对象知识和java或者vc编程经验人士阅读。
我们在delphi的类中常常能看到这样的代码:propert property 属性名 类型名 read 字符串1 write 字符串2
这里属性的名字可能不同。都是这样的格式:property 属性名 read 字符串1 write 字符串2
我以property Left: Integer read FLeft write SetLeft;为例子,它是Tcontrol的属性,你可以在controls文件中找到。Left是一个Integer类型的属性。Read申明了访问该变量要访问的变量或者方法,write申明了修改该变量时访问的变量或者方法。注意:可以是变量,也可以是方法,我在后面告诉大家这是怎么回事。这里它是一个变量,名字叫做FLeft。出于封装的目的,我们一般都会把这样的变量放在private中间去,果然,在private中我们可以找到
FLeft: Integer这段代码(出于命名的习惯,我们把这样的变量取名为属性名前面加一个大写的F)。这样当你read该属性时,实际上你访问的是Fleft的值。所以你可以写些方法来修改fleft,间接修改了left的值。然后我们再看SetLeft,这里它是一个方法(问我怎么知道?还是看命名规则,通常用属性名前面加上Set),通常也会放在private中去,我们来验证一下,我们在private中看到申明:
procedure SetLeft(Value: Integer);
和如下代码实现:
procedure TControl.SetLeft(Value: Integer);
begin
SetBounds(Value, FTop, FWidth, FHeight);
Include(FcalingFlags, sfLeft);
end;
如果你写了如下代码改变left:control1.left:=23,那么程序调用了函数SetLeft(23),SetBounds是改变区域的函数,这里你就明白了它封装了的好处,每次你改变left时它就会根据新的left而改变区域的大小,这个函数同时也改变了Fleft的大小,请查阅SetBounds的源代码。
procedure TControl.SetBounds(ALeft, ATop, AWidth, AHeight: Integer);
begin
if CheckNewSize(AWidth, AHeight) and
((ALeft <> FLeft) or (ATop <> FTop) or
(AWidth <> FWidth) or (AHeight <> FHeight)) then
begin
InvalidateControl(Visible, False);
FLeft := ALeft;
FTop := ATop;
FWidth := AWidth;
FHeight := AHeight;
UpdateAnchorRules;
Invalidate;
Perform(WM_WINDOWPOSCHANGED, 0, 0);
RequestAlign;
if not (csLoading in ComponentState) then Resize;
end;
end;
这样外部就看起来只是通过赋值运算来改变了该属性的值。Read和write可以是变量,或者是函数,取决于你的设计。你当然可以这样写: propert property 属性名 类型名 read 变量1 write 变量2。变量1和变量2可以是相同的。你也可以这样propert property 属性名 类型名 read 方法1 write 方法2。任你组合。但是有2点要注意:
1. 命名规则最好按习惯来,易于阅读。
2. 如果是变量,那么类型要和属性的类型一致,如果是方法,那么入口参数要和属性的类型一致。
我们常常使用组件的事件属性,比方说click事件,可是我们很难从表面看出它是如何调用的呢,如何触发的呢。下面我来给你解答。
我们在属性管理器object inspector中看到event页onclick右边对应了一个方法的名字。我们其实可以这样给一个组件的事件对应上一个出来方法。以一个form为例子Form1. OnMouseDown:=‘你的方法‘。注意方法的入口参数有讲究,这里是(Sender:TObject)
我们还是一tcontrol为例子,我们找到这段代码:
property OnMouseDown: TMouseEvent read FOnMouseDown write FOnMouseDown;跟上面讲的类似,不过这里有个特殊的类型,TNOtifyEvent,是个事件类型,我们找到它的申明:
TMouseEvent = procedure(Sender: TObject; Button: TMouseButton;Shift: TShiftState; X, Y: Integer) of object;
可以看到,它其实就是个函数,但是蓝色部分把入口参数限定了。那么我们通过赋值Form1. OnMouseDown:=‘你的方法‘,就对应了OnMouseDown的方法。然后我们只要写了一段拦截鼠标消息的函数,在里面直接或间接调用FonMouseDown,那么就把消息和处理函数对应上去了。这里它间接调用的层数比较多,讲起来比较费时间,涉及到Message类型,建议大家去看下李维的书。
以下附上间接调用过程,其实还要很多消息发生时也间接调用了,就不一一举出来了:(
procedure WMRButtonDblClk(var Message: TWMRButtonDblClk); message WM_RBUTTONDBLCLK;//拦截消息的函数
procedure TControl.WMRButtonDblClk(var Message: TWMRButtonDblClk);
begin
inherited;
DoMouseDown(Message, mbRight, [ssDouble]);
end;
procedure DoMouseDown(var Message: TWMMouse; Button: TMouseButton;
Shift: TShiftState);
procedure TControl.DoMouseDown(var Message: TWMMouse; Button: TMouseButton;
Shift: TShiftState);
begin
if not (csNoStdEvents in ControlStyle) then
with Message do
if (Width > 32768) or (Height > 32768) then
with CalcCursorPos do
MouseDown(Button, KeysToShiftState(Keys) + Shift, X, Y)
else
MouseDown(Button, KeysToShiftState(Keys) + Shift, Message.XPos, Message.YPos);
end;
procedure MouseDown(Button: TMouseButton; Shift: TShiftState;
X, Y: Integer); dynamic;
procedure TControl.MouseDown(Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
if Assigned(FOnMouseDown) then FOnMouseDown(Self, Button, Shift, X, Y);
end;
如果你多写自己的类,你会发现这样做是多么的方便,而不会像java要写getleft,setleft,然后把text放在private中,访问和修改时要调用不同的方法,而delphi你都只是调用contol1.text来访问,control1.text:='某字符串'来修改它的值。
而在处理消息方面,基类把onclick,onmousedown这样的属性申明为protected,如果你要使用,可以申明为published就可以出现在object inspector里面,然后方便的写处理方法,你也可以不公开,而在ctreate函数中给它赋值,而不用像java那样,写listener那么复杂。
我的研究也不深,有什么不妥请指正:)。欢迎来信wenjunwu430@163.com
华中科技大学,互联网中心实验室(itec.hust.edu.cn)
邬文俊
2004-12-4夜
全球华人大签名反对日本成为安理会常任理事国——新浪留言板转载