2010年12月31日

java web应用程序的热部署

热部署对于程序开发的好处就不用多说了。

 

这里记录一下自己的使用过程:

1.myeclipse的年代,那时候通过myeclipse新建的web项目,以debug方式启动,可以获得修改java类中的方法体和jsp页面立即生效的功能支持,这是纯eclipse所没有的。

 

2.后来发现了jrebel可以获得新增java类和方法也无需重启应用服务器即可生效的功能,当然这个功能不完善,有缺陷,比如内存占用变大,加载变慢,间或失效等。

 

3.随着eclipse的升级,推出了JEE版本的eclipse,也就逐渐淘汰了myeclipse,但是JEE版本的eclipse和tomcat配合,即便使用debug模式启动,修改java类还是会导致整个应用的重新加载,这是不能忍受的,这时候,发现了jetty配合eclipse可以完美的实现热加载,即改即用,很方便。

 

4.随后又发现了一个叫dcevm的东西,很好的支持了新增java类和方法也无需重启应用服务器即可生效,比jrebel完美。到此,一切都圆满了:)

 

5.或者还有更好的方式我没有发现?

 

ps:发现tomcat 6.20以后的版本机制不一样,修改jsp都被缓存,导致修改刷新不生效,只能用以前的版本,不知为何。。。不过,我现在基本也不用tomcat了

posted @ 2010-12-31 16:03 otto 阅读(200) 评论(0) 编辑

2010年12月16日

合理使用Module分割项目以及对Module的使用

转自:http://bbs.airia.cn/thread-2811-1-1.html

这篇介绍module使用的随笔写得不错。

 

现在说说Module,这篇教程代码不是最重要的,怎么样合理的使用Module以及注意的问题才是关键,所以建议大家注意下面红色语句。Module,可以将我们的项目按需划分为N个模块,在编译时将项目编译为主文件以及N个module的swf。Module基本上可以分为两种:

  1. 完整的Module,可以被外部app所使用 -- 会将所有涉及到的引用编译到module中,主文件的体积得到缩减,但是Module本身的体积可能会很大,比如Module和主程序都应用了对象C,那对象C会被编译到主程序以及Module中,这样Module的体积就会很大。 
  2. 关联到主程序的Module -- 比如Module和主程序都应用了对象C,那对象C会只编译在主程序中,从而减小Module的体积。我今天主要讲这一种Module,也是我们最常用到的。

了解了Module的种类,再简单说说使用Module要注意的地方。

  1. 绝对不能在Module以外的地方直接引用Module中的对象。这样Module会被编译到引用它的模块中去,如果从主程序中引用,那么Module就实际上没有效果了。
  2. 既然不能引用,那么建议对Module对象的使用用接口实现。在Module中实现接口方法,在外部使用这个接口不会导致Module被误编译。
  3. Module可以引用主程序中的东西,但是不要引用其他Module中的东西。

Module可以做什么呢?我主要将Module用于以下下两种情况

  1. 缩减主程序的体积,点击Module功能块时加载Module.
  2. 再入主程序后在用户感觉不到的情况下预加载剩下的Module.

现在讲正题,在demo中我这样表现Module的使用。(为了体现Module的意义,主程序生成的大小是原始flex大小248K, module内嵌了两张图片是674K)

  1. 如何创建Module.
  2. 主程序中点击按钮加载Module PictureWindow.
  3. 加载完毕后将模块添加到Box中,并通过接口调用PictureWindow中的方法setSelectIndex()设置显示的图片。

1. 如何创建Module.

可以通过New --> MXML Module -->Optmize for applicaiton --> OK 或者修改任意的已经创建好的Container组建(比如Canvas, panel)标签为Module,再或者继承Module的As class。

之后确保“鼠标右键项目”--> Property --> Flex Module  中有这个Module,没有的话点Add --> 选择Module的mxml或as文件 -->Optmize for applicaiton -- > OK

2. 主程序中点击按钮加载模块PictureWindow.

这里我使用了ModuleManager来动态加载需要的Module。这比ModuleLoder要灵活的多。

private function loadModule():void{
m
= ModuleManager.getModule("PictureWindow.swf"); //设置Module地址,地址是编译后swf在bin中的位置
//设置事件监听
m.addEventListener(ModuleEvent.READY,loadReady);
m.addEventListener(ModuleEvent.PROGRESS,
loading);
m.addEventListener(ModuleEvent.ERROR,loadError);
m.load();
//加载Module
}

3. 加载完毕后将模块添加到Box中,并通过接口调用PictureWindow中的方法setSelectIndex()设置显示的图片。

PictureWindow实现了PictureWindowInterface接口,其中暴露了setSelectIndex方法。再次强调不要直接使用Module对象,如果我们不注意写成var window:PictureWindow = e.module.factory.create() as PictureWindow,那整个Module就前功尽弃了

 

 //Module加载完成
private function loadReady(e:ModuleEvent):void{
//将Module对象转换为PictureWindowInterface
var window:PictureWindowInterface = e.module.factory.create() as PictureWindowInterface
this.box.addChild(window as DisplayObject);
window.setSelectIndex(
1); //通过Interface调用Module中的方法
}

好了,Module的使用就写这么多,看到这里你应该也可以创建自己的Module了,对于ModuleManager和IModuleInfo 中详细的内容,大家可以查阅Flex帮助。

 

代码下载请看原文。

posted @ 2010-12-16 11:33 otto 阅读(32) 评论(0) 编辑

自定义真正可重用的Flex组件

来源:http://blogs.adobe.com/tomsugden/2009/12/writing_genuinely_reusable_fle.html

在大型企业项目里,经常要为Flex 类库写一系列可重用的组件。理论上来说,相同的组件总可以被Flex 或 AIR客户端的modules 和 sub-applications 复用,带来高度一致性和快速开发的好处。然而在实际中,有一些错误用法限制了组件的重用性。本文阐述了是什么使得组件真正可重用,并强调了一些在Flex SDK 里使用的技术,以此来编写出更具重用性的自定义组件。


什么方法令组件可以真正重用?


组件重用性存在不同等级。一个真正可以重用的组件应该可以接受任何类型的数据进行渲染。完全可以适应数组、动态Object或者是Kangaros(具体对象)的集合。Flex DataGrid 组件有这样一个属性。

<mx:DataGrid dataProvider="{ kangaroos }">
  
<mx:columns>
    
<mx:DataGridColumn headerText="Name" dataField="name"/>
    
<mx:DataGridColumn headerText="Weight" labelFunction="calculateWeight"/>
  
</mx:columns>
</mx:DataGrid>
注意 dataField 和 labelFunction 属性如何通知组件从Kanagroos读取数据,而且对它没有依赖。这两种方法可以使组件重用。即使开发人员不能对Kangaroo 类做修改,比如它在第三方类库,但是他们仍然很容易在DataGrid 中渲染这些对象。


数据接口反模式


一个普遍的错误是把组件渲染的数据,去实现指定接口。例如:一个分布栏组件渲染简单图片,如下图:

分布栏显示不同大小的地区,每个都有个标示,通过使用IRegion 对象数组进行设计。

public interface IRegion{
  function
get label() : String;
  function
get size() : int;
}
这个分类栏会通过IRegion接口提取size 和 label 信息来渲染每个区域。理论上这个接口让组件和实际对象解耦了,任何实现该接口的类都可以被渲染。实际上这是设计上的错误。使用Iregion 接口令重用性有了限制。使用这组件前,一定需要把这接口加载进原有的数据类里。 更坏的情况是,这些数据类可能在另外的类库,或是在另一开发小组。因而不得不把这接口加载进来。导致组件并不是真正的可重用。


可重用的Flex SDK组件

Flex SDK 提供很多可重用的组件,它们的实现有以下一些标准方法:

1.Data Fields
2.Data Functions
3.Data Descriptions、
4.Factory Objects
现在就说明下这些方法。使用这些技术可以令到自定义的组件具有真正的重用性。


Data Fields

Data field 是一个字符型属性。代表另外属性名称。例如:ComboBox 的 labelField 或者DataGridColumn 的dataField 、dataTipField 属性。

<mx:ComboBox dataProvider="{ items }" labelField="name"/>

 

组件的实现是使用 dataField 去读取 items 属性值。如:

for each (var item:Object in dataProvider){
  var value:Object
= item[dataField];
  
// do something with the value
}

这是个很简单的方法,但提供很大灵活性。这组件可以读取任何对象的任何属性。


Data Functions

Data Function 是个函数类型。代表另外函数的引用。如:ComboBox 的 labelFunction 或DataGridColumn 的 dataFunction 属性。

<mx:DataGridColumn headerText="weight" dataFunction="calculateWeight"/>

 

这组件然后调用dataFunction,一般用data 的item 作为参数。如:

for each (var item:Object in dataProvider){
  var value:Object
= dataFunction(item);
  // do something with the value
}
这种方法和 dataField 差不多,但使用更灵活了。因为在组件渲染之前,可以通过函数来计算或格式化返回值。

 

Data Descriptions

Data description 是一个接口,组件可以使用它来分析渲染数据。开发者可以使用自己实现的接口来处理组件的渲染数据。在Tree 组件可以看到

<mx:Tree dataProvider="{ items }">
  <mx:dataDescriptor>
    <
my:MyDataDescriptor/>
  </
mx:dataDescriptor>
</mx:Tree>

 

Tree 可以使用dataDescription 接口分析数据特性。如:

for each (var item:Object in dataProvider){
  var isBranch:Boolean
= dataDescriptor.isBranch(item, dataProvider);
  // do something with the outcome
}
这个方法非常强大,不过一般只用在复杂的组件。如 Tree。开发者如果要在Tree渲染一个新的类,他们要自行实现ITreeDataDescriptor 接口。


Factory Objects

Factory Object 是一个 IFactory 属性,用于动态生成实例。如:List 和DataGrid 的 itemRenderer 和 ComboBox 的dropdownFactory 属性。

<mx:List dataProvider="{ items }" itemRenderer="my.package.MyItemRenderer"/>

 

这个组件使用Flex SDK 的标准IFactory 接口来创建实例。

var itemRenderer:Object = itemRenderer.newInstance();

 

然后把data items 给IDataRenderer 接口创建的实例赋值

if (itemRenderer is IDataRenderer){
  IDataRenderer(itemRenderer).data
= item;
}

 

这种方法提供操作部分组件的视图外观。通过提供自定义的itemRenderer,可以达到完全不同的结果。处理数据的逻辑的复杂程度可以根据需求来决定。而且还可以封装在ItemRenderer 类里面。前面提到,组件使用工厂(Factories)时候,应该定义有意义的默认值。所以组件可以直接使用,不需要设置特别的Factories。所有 的ListBase组件都提供了默认值。如DataGrid 默认是DataGridItemRenderer。
这里值得注意是Flex 编译器和IFactory 有特别关系。当这个属性在MXML 设置了,会自动转换成类名字,然后把ClassFactory 的实例嵌入到组件里。这样使得组件更容易使用,开发者不用手动去实例对象。只需指定类名或定义一个嵌入组件。


总结
当需要重用组件时,要记住这简单的规则:一个可重用的组件应该可以渲染任何类型的数据。最好的实现方法是遵守Flex SDK的约定:data fields, data functions, data descriptors 和 object factories。要注意的是反对使用自定义的接口来限制你的组件重用性。


附言
可重用组件习惯使用动态属性,这里做了些权衡取舍。因为访问动态属性比强类型属性慢。而且没有编译期的类型检测。然而它的好处是使用更灵活,更少依赖。

posted @ 2010-12-16 11:14 otto 阅读(367) 评论(0) 编辑

2009年2月17日

hp的笔记本真垃圾

07年6月买的到dv2530,原来一直散热不好,热的都可以煮鸡蛋了。

这我都忍了,现在毛病越来越多,待机经常待不了,电源一直亮着,cpu根本不停转。

现在机身自带的触摸鼠标又不灵了。

nnd,当初真是瞎了眼了。

我发誓,这是我买的最后一件hp的东西

还是apple的东西好啊,经常让你觉得物有所值。

 

posted @ 2009-02-17 20:00 otto 阅读(30) 评论(0) 编辑

2009年1月11日

关于fusionchart的使用

今天过来,发现居然有网友给我留言,问我怎么在项目中使用fusionchart。

真是意外,我一直都只把这个blog当做自己的网络记事本,有心情的时候才会在上面随手涂鸦,自己都很少看。

至于fusionchart的使用,其实很简单,不过最近比较忙,也没时间去整理一个教程出来。况且,这个东西用的人也不多吧。

posted @ 2009-01-11 23:07 otto 阅读(572) 评论(2) 编辑

RIA 过渡期的选择

虽说flex3很好很强大,但实际的项目是不可能完全更新到flex平台的,这时候,要想取得炫目的富客户端效果,就只有祭出js了!

话说现在的js界,那真是豪强并起,群雄逐鹿

有full stack的extJs,Dojo
有小巧精干的prototype
有简练强大的jquery
有很OO的mootools
还有。。。

extJs提供的功能是很全,但是太重了,虽说可以采用OPOA的做法,然后极尽可能的去压缩它,但我不喜欢,
况且项目的前台效果也不能都是一个模子里出来的吧?要真采用它,那我还不如用flex

所以,在项目中一一使用过后,最后还是jquery成了我的常备js库,够简单,够强大,上手快,效果好,还有很多的插件,足够用了,就算有些不如意,你直接改插件的代码也不难。

posted @ 2009-01-11 11:59 otto 阅读(36) 评论(0) 编辑

2008年9月11日

flex3很强大

说实话,我一直对漂亮的东西很感冒。

n年前就用flash做过留言本之类的小应用。效果很炫,可惜开发起来还是麻烦。

现在再来看flex,发现它已然发展的很强大了!界面的可视化拖拽开发,强大的as3,与后台方便的交互,不愧是RIA的方向啊

恩,很好,花点时间研究一下,先做个crud的demo,把它作为展现层替换掉我脚手架中的struts2。再来弄一些比较炫的玩意。

posted @ 2008-09-11 10:42 otto 阅读(104) 评论(0) 编辑

2008年8月8日

完美封装了fusionchart

摘要: 做了一个demo完全基于对象的操作,完全支持setDataXml,setDataUrl,完全支持中文,完全不带水印的flash,完全简单的java对象和xml数据绑定,完全支持简单和复杂图形的操作。。。怎么这么像广告 ,呵呵阅读全文

posted @ 2008-08-08 09:38 otto 阅读(687) 评论(2) 编辑

2008年7月25日

eclipse 突然不能自动编译了

摘要: 很奇怪,突然不能自动编译了,非得点击手动编译才行。而且肯定不是项目配置问题,原来都是可以自动编译的。现在是所有项目都不能自动编译了。google到网友说的那些,什么jar包引用啊,jdk引用啊都不适用于我的情况。 没有办法了,把eclipse 删掉,把备份的eclipse copy过来,就可以了!!!当然,我的workspace是独立于eclipse的,这是因为eclipse升级太快,我经常更换e...阅读全文

posted @ 2008-07-25 15:06 otto 阅读(955) 评论(0) 编辑

2008年7月24日

FusionCharts 的中文问题

摘要: 最近有个咨询项目使用图表。原本采用IBM的dashboard,无奈IBM的东西众所周知的不好用,让我指导别人,很郁闷的!于是下载了FusionCharts,效果很炫,而且数据采用xml格式,服务器端容易生成,就它了。但我发现new 出FusionCharts对象后,使用setDataURL方法设置xml数据,flash展现的时候居然不支持中文,而且怎么设置编码格式都不行,而用setDataXML就...阅读全文

posted @ 2008-07-24 18:59 otto 阅读(3174) 评论(1) 编辑

导航

<2012年2月>
2930311234
567891011
12131415161718
19202122232425
26272829123
45678910

公告

昵称:otto
园龄:7年7个月
粉丝:0
关注:0

搜索

 

常用链接

我的标签

随笔档案

最新评论

阅读排行榜

评论排行榜

推荐排行榜