云自无心水自闲

天平山上白云泉,云自无心水自闲。何必奔冲山下去,更添波浪向人间!
posts - 288, comments - 524, trackbacks - 0, articles - 6
  BlogJava :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理

新的Flex.org把内容分成5大部分
左边4个,分别是:Flex实例,Flex下载、Flex社区、帮助
右边一个大块是:Flex介绍和Flex盛会。

整体感觉比以前要清新爽洁。

最上面的一排菜单项好像比以前要多。
有博客、社区、文档、下载、工作、演示、支持。

posted @ 2007-04-04 18:59 云自无心水自闲 阅读(697) | 评论 (0)编辑 收藏

Flexlib 1.5
下载地址:
http://flexlib.googlecode.com/files/flexlib-.1.5.zip

里面有4个目录:
bin
src
docs
examples

包含:
AdvancedForm
ConvertibleTreeList
DragCanvas
DraggableSlider
HAccordion
ImageMap
PromptingTextinput
ScrollableMenus
SuperTabNavigator
TreeGrid
VerticalMenuBar
这些内容

posted @ 2007-03-30 13:23 云自无心水自闲 阅读(1043) | 评论 (0)编辑 收藏

怎样才能开发出一个好的软件系统呢?分成3个步骤:
1、首先确定用户需求,确保最后出口的软件确实是用户需要的东西。这是最重要的一步。
2、应用基本的OO原则来给系统添加可扩展性。
3、尽量使用系统易维护、可重用。

对象专注于自己要做的事情,而且只是自己份内的事情。
1. 对象应该做对象名所表明的事情
2. 每个对象应该表现出单一的一致性的概念。比如:鸭子这个抽象对象就不能表现得象一个真实的会叫的鸭子,或者象一只黄色的塑料鸭子。
3. 如果你的对象中的一个属性经常没有具体的值或者经常是Null,那么你的对象就可能承担了多余的职责。就需要考虑一下,这个属性确实是这个对象的一部分吗?

灵活性:这是用户满意所必需的。
封装:帮助你将代码组装成逻辑模块。任何时候看到了重复的代码,请想办法把它们封装起来。
功能:功能改变最好将影响局限在功能本身,不要影响其他的代码。

posted @ 2007-03-29 15:42 云自无心水自闲 阅读(444) | 评论 (0)编辑 收藏

Caringen是一个Eric Feminella自己开发的一个小工具. 现在他把这个工具共享出来.
Cairngen并不能让所有的人解决所有的问题, 它只是简单地加快开发的过程.

Cairngen是一个Caringorm的代码生成器, 它使得开发者可以很方便地生成Cairngorm项目的结构框架, 包括: Cairngorm项目的目录结构, 一个缺省的ModelLocator, Controller, ServiceLocator. Cairngen也可以生成Event, Command, Delegate类.

Cairngen使用Flex2和PHP5.2.0开发, 利用了AMFPHP. 安装过程十分方便. 你可以在Flex Builder的浏览器中直接运行Cairngen来快速方便地生成Cairngorm的类.

Cairngen使用'步骤(Sequence)'来描述Event, Command, Delegate类之间的关系.
在Cairngen中只要命名一个'步骤',点击一下生成按钮就可以生成一个'步骤'. 然后刷新一下Flex项目, 生成的类就OK了. 在一些特殊的情况下, 你不希望添加Delegate类, 那么你可以选择排除Delegate类的生成, 这样的话, Cairngen只生成Event和Command.
生成的Command类实现Cairngorm的Command接口, 但不实现IResponder接口. Cairngen还能够正确地将事件强制性转化(casting)为Coand中的类型, 并import所有相关的类.

系统需求:
1. 了解AMFPHP, Apache2.0.59和PHP5.2.0, 在使用Cairngen之前要求先安装AMFPHP, 而且gateway.php的访问虚拟目录应该如下设置: http://localhost/amfphp/gateway.php. 在1.0版正式发布后, 这个URL可以自由配置.
2. 还需要安装Flex2, PHP, 你可以用WAMP5来集成安装Apache5.5和PHP. 安装好PHP和AMFPHP后, 就可以解压缩Cairngen Alpha 1. 把services目录复制到amfphp的根目录下. 然后复制cairgen-ui目录到apache的www根目录下.

使用:
安装好PHP和AMFPHP后, 就可以开始使用Cairngen了. 打开浏览器输入http://localhost/cairngen-ui/Cairngen.html打开生成器的图形界面. 创建Cairgen项目:
点击 begin
给你的Cairngen项目命名. 这个名称与Flex项目的名称相同, 选择你的Cairngorm的版本, 选择Flex项目的路径. 设置项目中包路径(比如: com.domain.projectname). 最后, 检验一下输入内容, 点击"Create Project". 刷新Flex项目查看缺省的Cairngorm项目结构, ModelLocator, Service和Controller类.

创建"步骤":

首先是给步骤命名, 然后选择是否要生成Delegate类, 点击生成, 并刷新Flex项目. 可以发现需要的类已经生成完毕了. 现在需要把它们添加到Controller中.
接下来编辑模板文件: 你可以修改模板文件(.tpl)来实现你的特定的Cairngorm需求; 模板文件在 amfphp\services\com\ericfeminella\cairngen\templates目录下.

生成器下载地址: http://code.ericfeminella.com/cairngen/Cairngen%20Alpha%201%20PreRelease.zip

posted @ 2007-03-24 00:13 云自无心水自闲 阅读(2073) | 评论 (0)编辑 收藏

AppGen
1、在AppGen中没有能够生成Struts的Form
在gen的target的中,添加生成Struts Form的子任务
        <!-- generate struts forms -->
        <xdoclet destdir="${build.dir}/${gen.dir}/web" excludedtags="@version,@author"
            addedtags="@xdoclet-generated at ${TODAY}" force="${xdoclet.force}"
            mergedir="metadata/web">
            <fileset dir="F:\\Java\\Eclipse\\Space\\appfuse\\WEB-INF\\src"/>

            <configParam name="basePackageName" value="org.appfuse"/>

            <!-- generate struts forms -->
            <actionform templateFile="${template.dir}/generic/struts_form.xdt">
                <packageSubstitution packages="model" substituteWith="webapp.form"/>
            </actionform>
        </xdoclet>

2、在AppGen中没有能够生成struts-config.xml
在gen的target中添加生成Struts-config.xml的子任务。
        <taskdef name="webdoclet" classname="xdoclet.modules.web.WebDocletTask">
            <classpath>
                <path refid="xdoclet.classpath"/>
                <path refid="web.libs.classpath"/>
            </classpath>
        </taskdef>
        <webdoclet destdir="build/gen/web/WEB-INF" force="true"
            mergedir="metadata/web" excludedtags="@version,@author" verbose="true">
            <fileset dir="${model.src.dir}"/>
            <strutsconfigxml validateXML="true" version="1.2"/>
            <strutsvalidationxml version="1.1.3"/>
        </webdoclet>
其中需要注意的是web.libs.classpath,一开始我没有添加这些库,结果无法正确生成配置文件。
在Appfuse中,大多数的Action是继承BaseAction的,只有UploadAction是直接继承Struts的Action;在没有添加库文件时,生成的struts-config.xml只包含一个UploadAction的映射。
添加完整的库文件后,才能生成正确的配置文件。

最后整理一下,使用AppGen生成的文件:

1、ApplicationContext-hibernate.xml中添加personDao的配置,ApplicationContext-service.xml中添加personManager的配置
2、PersonDaoHibernate.java,PersonManager.java,PersonManagerImpl.java,PersonAction.java,PersonForm.java,PersonAction.java
3、PersonForm.jsp,PersonList.jsp
4、struts-config.xml覆盖
5、menu-config-Person.xml合并到menu-config.xml中,menu-Person.jsp添加到common\menu.jsp中
6、sample-data-Person.xml,用于测试的数据

posted @ 2007-03-19 12:10 云自无心水自闲 阅读(1464) | 评论 (0)编辑 收藏

Appfuse中与数据库有关的有用的脚本只有少数的几个,其他还有一些新建、编译、打包、部署、安装等等,由于我是在Eclipse环境下,使用Tomcat插件进行开发,对于这些其实不需要特别的关心。
列举一下我认为有用的:
1、hibernatedoclet
使用xdoclet生成Hibernate的映射文件hbm.xml。
2、db-prepare
使用hbm2ddl使用并执行create-table.sql,根据hbm在数据库中建立数据表。要注意的是,生成过程还需要POJO的class。
3、db-load
使用dbunit将Xml格式的数据insert到数据库中。

目前我的build.xml中只包含这几个target。

另外,AppGen的build.xml中,我认为有用的也主要是init和gen这两个target。
其中init用于交互输入参数,而gen是使用xdoclet根据模板生成Actions/Controllers, Action/Controller Tests, test data, i18n keys and JSPs。

posted @ 2007-03-15 23:23 云自无心水自闲 阅读(638) | 评论 (0)编辑 收藏

这几天在作Raible的Tutorial,前两天做了Create Dao & POJO, 今天做Create Manager。
中间有一些过程与大家分享一下:
在PersonManagerTest的单元测试中,在Raible的教程中,说需要在applicationContext-service.xml中添加PersonManager这个bean的配置,但是实际上我没有添加配置,单元测试就成功了,为什么?
原因:在教程中的Test使用了Mock,好像并没有真正的使用其他关联的类,现在采用真正的测试类,下面注释掉的是教程中的测试类。:

package  org.appfuse.service;

// import java.util.List;

import  org.appfuse.model.Person;
import  org.springframework.context.support.ClassPathXmlApplicationContext;
import  org.springframework.dao.DataAccessException;
import  org.springframework.context.ApplicationContext;

public   class  PersonManagerTest  extends  BaseManagerTestCase  {

    
private  Person person  =   null ;
    
private  PersonManager mgr  =   null ;

    
protected   void  setUp()  throws  Exception  {
        
super .setUp();
        ApplicationContext ctx 
=   new  ClassPathXmlApplicationContext( " org/appfuse/service/applicationContext-*.xml " );
        mgr 
=  (PersonManager) ctx.getBean( " personManager " );
    }


    
protected   void  tearDown()  throws  Exception  {
        
super .tearDown();
        mgr 
=   null ;
    }

    
    
public   void  testGetPerson()  throws  Exception  {
        person 
=  mgr.getPerson( " 1 " );

        assertNotNull(person.getFirstName());
    }


    
public   void  testSavePerson()  throws  Exception  {
        person 
=  mgr.getPerson( " 1 " );
        person.setFirstName(
" test " );

        mgr.savePerson(person);
        assertEquals(person.getFirstName(), 
" test " );
    }


    
public   void  testAddAndRemovePerson()  throws  Exception  {
        person 
=   new  Person();
        person 
=  (Person) populate(person);

        mgr.savePerson(person);
        assertEquals(person.getFirstName(), 
" Bill " );
        assertNotNull(person.getId());

        log.debug(
" removing person, personId:  "   +  person.getId());

        mgr.removePerson(person.getId().toString());

        
try   {
            person 
=  mgr.getPerson(person.getId().toString());
            fail(
" Person found in database " );
        }
  catch  (DataAccessException dae)  {
            log.debug(
" Expected exception:  "   +  dae.getMessage());
            assertNotNull(dae);
        }

    }

}



现在如果不在applicationContext-service.xml中添加bean的配置后,JUnit报错说找不到personManager。另外还需要把applicationContext-hibernate.xml和applicationContext-resources.xml也拷贝到WEB-INF/src/org/appfuse/service目录下,这样Context才能Load成功。
现在运行Test,GetPerson和SavePerson都测试通过,而AddAndRemovePerson报了一个NullPointerExceptoin错误。原来缺少了PersonManagerTest.properties这个文件,这个文件是用于populate初始化Person实例的。

posted @ 2007-03-14 15:09 云自无心水自闲 阅读(767) | 评论 (0)编辑 收藏

ASAP是一个开源的RIA应用库,主要面向可维护的、多视频的、基于事件互动的应用开发。提供实用的、可重用的、基于模式的解决方案。
目前版本是0.9.4,从他们的网站上看,好像已经不少公司已经采用了他们的框架。

主页:http://asapframework.org/wiki/bin/view/ASAP/

posted @ 2007-03-13 09:01 云自无心水自闲 阅读(932) | 评论 (0)编辑 收藏


最近Adobe公司的一批人在Google的Code Project上发布了FlexLib,一个开源的Flex2组件库。
现有的组件包括:
   ConvertibleTreeList, 
   Draggable Slider, 
   PromptingTextInput, 
   Scrollable Menu Controls, 
   SuperTabNavigator, 
   Alternative Scrolling Canvases, 
   Horizontal Accordion

大家可以去看看。

另外,还有个人也发布了一个Flex2 组件目录: FlexBox。这个网站

posted @ 2007-03-09 11:46 云自无心水自闲 阅读(1702) | 评论 (0)编辑 收藏

 

现在有一个方便的做法来根据选择Enable/Disable控件。比如:有一个DataGrid和数个操作数据的按钮,当选中某行是激活其中一个按钮,选中另一行时,激活其中另一个按钮,等等。

通常的做法是写一大堆的if else语句,或者是设置一堆变量绑定到按钮上,然后在代码中设置这些变量的值,比如:

[Bindable] private var somethingSelected:Boolean = false;
<mx:Button label="Publish" click="publishItem()" enabled="{somethingSelected}" />

这是一个有益的尝试。所有的依赖于DataGrid状态的控件都绑定一个变量。改变变量的值就改变控件的enabled状态。但是你还需要确定改变变量值的时机。比如:

private function publishItem() : void {
     // get the selected item
     // publish it
     grid.selectedItem = -1; // clear the selection
     somethingSelected = false;
}

在复杂的情况下,假设有另一个按钮需要在选中某个特定值时被激活。那么你不仅需要考虑选中对应的那个变量,还需要考虑其他按钮的情况。也就是说,在publishItem函数中你还需要设置其他变量的值。

一个更方便的做法是这样的。现在我们Publish按钮和somethingSelected变量进行绑定。我们还需要做的是把somethingSelected变量与DataGrid的选中状态进行关联。对此,我们可以使用<mx:Binding>标签。

<mx:Binding source="grid.selectedIndex >= 0" destination="somethingSelected" />

这样somethingSelected的值与DataGrid的选中状态就紧密地联系起来了。当选中了DataGrid中的某条数据时,所有进行enabled="{somethingSelected}"绑定的按钮就被激活。<mx:Binding>标签的source属性不需要一定是一个变量,完全可以是一个表达式。

比如稍微复杂一点的一个例子:

<mx:Binding source="grid.selectedItem.code == 1" destination="codeOnePicked" />

这样,当DataGrid选中行的code字段的值为1时,变量codeOnePicked的值被设置为true。
mxml中可以如下定义:

<mx:CheckBox label="Code One?" selected="{codeOnePicked}" />
<mx:Button label="Publish" enabled="{somethingSelected && !codeOnePicked}" />

这样,当选中行的code字段值为1时,上面的复选框被激活,而下面的按钮无效。

posted @ 2007-03-08 22:58 云自无心水自闲 阅读(3597) | 评论 (0)编辑 收藏

仅列出标题
共29页: First 上一页 17 18 19 20 21 22 23 24 25 下一页 Last