爪哇岛的一个山洼。

2006-10-26

【java教程】实践MDA之AndroMDA教程:[第五节] 工程配置

当完成 MagicDraw 建模以后,接下来的事情就是生成代码了,但是此时生成的代码都是按照默认的设置进行的,我们往往需要对工程的配置进行修改和调整来满足各自的需求。
核心配置文件

工程中的 [root]\mda\conf\andromda.xml 文件是此代码生成工具的核心配置文件。它由多个namespace组成,每个namaspace下面包含了每个组件的配置信息。namespace包括default、spring、hibernate、java、bpm4struts等,其中default表示一些默认的全局的属性。在实际的工作中,我们需要根据实际情况对该配置文件进行修改。关于该文件可配置的详细内容,请参考官方网站:http://www.andromda.org 上文档。
举几个通常可能会修改的地方:
1、在default名字空间下面添加
<property name="defaultMultiplicity">0</property>
的属性,这样设计的持久对象属性默认全部可以为空。
2、在Spring名字空间下可以添加下面几个属性:
<property name="hibernateHbm2DDLAuto">update</property>
<property name="hibernateEnableCache">true</property>
<property name="applicationContext">carManagement- applicationContext.xml</property>
<property name="applicationContextDataSource">carManagement-applicationContext- dataSource.xml</property>
<property name="applicationContextLocalDataSource">carManagement- applicationContext- localDataSource.xml</property>
<property name="beanRefFactory">carManagementBeanRefFactory.xml</property>
<property name="beanRefFactoryId">carManagementBeanRefFactory</property>
hibernateHbm2DDLAuto属性表示自动更新数据库表结构,例如程序在执行的过程中,数据库还没有数据表,那么此时hibernate将会根据持久对象自动的构建数据库表;
hibernateEnableCache属性表示将使用hibernate的缓存功能,用来提高运行效率。
applicationContext、applicationContextDataSource、applicationContextLocalDataSource、beanRefFactory、beanRefFactoryId等几个属性表示自动生成的Spring配置文件的名称,具体每个配置文件的作用是什么,看看生成后的源代码就会明白。
3、在bpm4struts名字空间下面添加下面两个属性:
<property name="pageEncoding">gb2312</property>
<property name="mergeLocation">${maven.conf.dir}/cartridge/custom</property>
第一个属性表示生成的页面的默认编码为gb2312;第二个属性只有在需要配置生成模板的情况下才使用,如何修改模板在本节的最后部分会介绍。

数据库信息配置

在工程根目录下的存在一个 project.properties 文件,它用来配置数据库的信息。例如下面是对Mysql数据库的配置信息:
--------------------------------------------------------------------
# set this to true will deploy the war exploded
deployExploded=true


# The datasource for the application
# dataSource.name=DefaultDS
# dataSource=java:/${dataSource.name}


# Properties for management of the database schema,
# ignore if you setup/drop your schema manually
dataSource.driver.jar=D:/Tomcat 5.0/common/lib/mysql-connector-java-3.1.10-bin.jar
dataSource.driver.class=com.mysql.jdbc.Driver
dataSource.url=jdbc:mysql://localhost:3306/carsmanagement
dataSource.user=root
dataSource.password=mysql
dataSource.sql.init=core/target/schema-create.sql
dataSource.sql.drop=core/target/schema-drop.sql
dataSource.sql.load=core/target/db/create-dummy-load.sql
# What schema related goals should do when an error occurs.
dataSource.sql.onError=continue


# Change this to generate to the correct MDA database mappings
# For MySql use: MySQL
# For Hypersonic use: HypersonicSql
# For Oracle9i use: Oracle9i
sql.mappings=MySQL


# For MySql use: org.hibernate.dialect.MySQLDialect
# For Hypersonic use: org.hibernate.dialect.HSQLDialect
# For Oracle9i use: org.hibernate.dialect.Oracle9Dialect
hibernate.db.dialect=org.hibernate.dialect.MySQLDialect
--------------------------------------------------------------------
对于该配置文件,有非常重要的一点需要说明:如果设置了dataSource.name和dataSource两个属性,那么代码生成工具自动生成的Spring配置文件将使用这个数据源名称,而不使用dataSource.driver.jar、dataSource.driver.class、dataSource.url、dataSource.user、dataSource.password属性;如果没有设置dataSource.name和dataSource两个属性,那么代码生成工具自动生成的Spring配置文件将使用dataSource.driver.jar、dataSource.driver.class、dataSource.url、dataSource.user、dataSource.password属性。
如何修改模板

代码生成工具使用了Velocity模板来生成java文件、jsp文件以及相关的配置文件等各种资源。当我们觉得它生成的格式不满足我们的要求时,我们可以修改模板实现,通过我们会修改JSP模板、配置文件模板等。具体步骤如下:
1、编辑/mda/conf/andromda.xml文件,在bpm4struts的名字空间下面的属性列表中添加下面两个属性:
<!-- add by widen -->
<property name="pageEncoding">gb2312</property>
<property name="mergeLocation">${maven.conf.dir}/cartridge/custom</property>
其中mergeLocation属性表示自定义的模板文件的存放位置。
2、如果需要在web.xml文件中生成其他内容,则需要编辑/mda/conf/mappings/WebMergeMappings.xml文件,例如我们需要加入和关于编码的filter,则需要在该文件的filter merge- point的地方添加如下代码:
<filter>
<filter-name>encodingFilter</filter-name>
<filter- class>org.springframework.web.filter.CharacterEncodingFilter</filter- class>
<init-param>
<param-name>encoding</param-name>
<param-value>gb2312</param-value>
</init-param>
<init-param>
<param-name>forceEncoding</param-name>
<param-value>true</param-value>
</init-param>
</filter>


然后在filter-mapping merge-point的地方添加如下代码:
<filter-mapping>
<filter-name>encodingFilter</filter-name>
<url-pattern>*.do</url-pattern>
</filter-mapping>
<filter-mapping>
<filter-name>encodingFilter</filter-name>
<url-pattern>*.jsp</url-pattern>
</filter-mapping>
在我的CarManagement示例工程里面已经对模板的基本修改做好了设置,因此如果你获取到了我的CarManagement示例工程文件夹接下来的几步将帮助你更加快速的进行模板修改。如果需要示例工程,可以用 email (delight.wjk@gmail.com) 给我联系。
3、把CarManagement示例工程中的/mda/conf/下的cartridge文件夹拷贝到当前工程的对应的目录下面,并可以根据实际需要在此基础之上进行修改。
4、把CarManagement示例工程中的/web/src/下的jsp文件夹拷贝到当前工程的对应的目录下面。因为CarManagement示例工程里面已经对模板的基本修改做好了设置,拷贝过来直接使用即可,并可以根据需要在此基础之上进行修改。
5、如果你是使用 maven 的 andromdapp:generate 命令生成工程目录结构的,你会在 /web/maven.xml 文件中发现有一个 war:init 命令的部分被默认的注释起来了,取消这个注释后,代码自动生成工具将自动拷贝 /web/src/jsp 下面的所有文件到自动生成war包中。
6、在拷贝后的cartridge目录中替换字符串:将“CarManagement”替换为当前工程的名称,注意整字匹配,并且匹配大小写。
7、在拷贝后的jsp目录中替换字符串:将“CarManagement”替换为当前工程的名称,注意整字匹配,并且匹配大小写。


到这里,关于工程配置就介绍完了,下一节将介绍生成代码的常用命令,并讲解如何集成到 eclipse 开发环境中。

2006-10-25

【学习心得】JFace和SWT有什么区别呢?

之前做系统的时候没有认真想过这个问题,呵呵,现在我们来搞清楚出它。

JFace:插件的用户界面框架
我们已经见到工作台定义扩展点来为使插件向平台添加用户界面功能。许多这些扩展点,特别是向导扩展,是通过使用 org.eclipse.jface.* 包中的类来实现的。有什么区别?

JFace 是一个用户界面工具箱,它提供很难实现的、用于开发用户界面功能部件的 helper 类。JFace 在原始的窗口小部件系统的级别之上运行。它提供用于处理常见的用户界面编程任务的类:

查看器负责处理填充、排序、过滤和更新窗口小部件等最辛苦的工作。
操作和添加项介绍用于定义用户操作的语义,并指定在何处提供它们。
图像和字体注册表提供用于处理用户界面资源的常见模式。
对话框和向导定义用于构建与用户进行复杂交互的框架。
JFace 使您可以专注于实现特定插件的功能,而不必花费精力来处理底层窗口小部件系统或者解决几乎在任何用户界面应用程序中都很常见的问题。

JFace 和工作台
何处是 JFace 结束而工作台开始的位置?有时候界线并不是这样明显。通常,JFace API(来自于包 org.eclipse.jface.*)独立于工作台扩展点和 API。可以想象,根本不必使用任何工作台代码就可以编写 JFace 程序。

工作台使用 JFace,但是又试图尽可能减少依赖项。例如,工作台部件模型(IWorkbenchPart)被设计为独立于 JFace。我们很早就知道可以直接使用 SWT 窗口小部件来实现视图和编辑器,而不必使用任何 JFace 类。工作台尽可能保持“JFace 中立”,允许程序员使用他们觉得有用的 JFace 的部件。实际上,在工作台的大多数实现中都使用了 JFace,并且在 API 定义中引用了 JFace 类型。(例如,IMenuManager、IToolBarManager 和 IStatusLineManager 的 JFace 接口显示为工作台 IActionBar 方法中的类型。)

JFace 和 SWT
SWT 和 JFace 之间的界线是很明显的。SWT 根本不依赖于任何 JFace 或平台代码。许多 SWT 示例说明可以如何构建独立的应用程序。

JFace 用来在 SWT 库顶部提供常见的应用程序用户界面功能。JFace 并不试图“隐藏”SWT 或者替换它的功能。它提供一些类和接口,以处理与使用 SWT 来对动态用户界面编程相关联的许多常见任务。

通过了解查看器及它们与 SWT 窗口小部件之间的关系,就可以更清楚地了解 JFace 和 SWT 之间的关系。

到这里,我明白了,你明白了吗。

2006-10-24

【必备知识】领带的十种打法

1、平结平结为最多男士选用的领结打法之一,几乎适用于各种材质的领带。要诀:领结下方所形成的凹洞需让两边均匀且对衬。

2、交叉结这是对于单色素雅质料且较薄领带适合选用的领结,对于喜欢展现流行感的男士不妨多加使用“交叉结”。

3、双环结一条质地细致的领带再搭配上双环结颇能营造时尚感,适合年轻的上班族选用。该领结完成的特色就是第一圈会稍露出于第二圈之可别刻意给盖住了。

4、 温莎结温莎结适合用于宽领型的衬衫,该领结应多往横向发展。应避免材质过厚的领带,领结也勿打得过大。

5、双交叉结这样的领结很容易让人有种高雅且隆重的感觉,适合正式之活动场合选用。该领结应多运用在素色且丝质领带上,若搭配大翻领的不但适合且有种尊贵感。

6、亚伯特王子结,适用於浪漫扣领及尖领系列衬衫,搭配浪漫质料柔软的细款领带,正确打法是在宽边先预留较长的空间,并在绕第二圈时尽量贴合在一起,即可完成此一完美结型
7、四手结(单结)是所有领结中最容易上手的,适用於各种款式的浪漫系列衬衫及领带

8、浪漫结,浪漫是一种完美的结型,故适合用於各种浪漫系列的领口及衬衫,完成後将领结下方之宽边压以绉摺可缩小其结型,窄边亦可将它往左右移动使其小部份出现於宽边领带旁
9、简式结(马车夫结),适用於质料较厚的领带,最适合打在标准式及扣式领口之衬衫,将其宽边以180度由上往下翻转,并将折叠处隐藏於後方,待完成後可再调整其领带长度,是最常见的一种结形

10、十字结(半温莎结),此款结型十分优雅及罕见,其打法亦较复杂,使用细款领带较容易上手,最适合搭配在浪漫的尖领及标准式领口系列衬



【技术心得】一个很方便的Java目录拷贝程序

在网上找到了一个比较好用的 Java 目录拷贝程序,自己用了一下很方便。

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;

public class DirCopyUtil
{
public static void copy(File src, File dest)
throws IOException
{
getCopyable(src).copy(dest);
}

// this is the factory pattern.
public static Copyable getCopyable(File src)
{
// if the source if file then return a file copier
if (src.isFile())
{
return new FileCopier(src);
}
/*
* else it has to be a directory copier, we could also enhance it to be
* other type of copier such as httpcopier etc...
*/
return new DirCopier(src);

}

interface Copyable
{
void copy(File dest)
throws IOException;
}

static class DirCopier
implements Copyable
{
File srcDir;

public DirCopier(File srcDir)
{
if (!srcDir.isDirectory())
{
throw new IllegalArgumentException(
"passed in paremter has to be directory" + srcDir);
}
this.srcDir = srcDir;
}

/**
* copy current directory content under 'destRoot' directory
*
* @param destRoot the destination root directory, all the file and sub
* directory will be copied under this destRoot directory, if
* destRoot doesn't exist, this will create the directory.
* @throws IOException
*/
public void copy(File destRoot)
throws IOException
{
// 1) if destRoot is not exist it will create it
if (!destRoot.exists())
{
if (!destRoot.mkdirs())
{
throw new IOException("unable to create dir:" + destRoot);
}
}
if (!destRoot.isDirectory())
{
throw new IllegalArgumentException(
"passed in paremter has to be directory" + destRoot);
}
File[] dirContents = srcDir.listFiles();
// we know dirContents can not be null since only file will return
// null, so no need to check null
for (int i = 0; i < _srcfile =" dirContents[i];" _srcpath =" _srcFile.getCanonicalPath();" _srcpath =" _srcPath.substring(0," dest =" new" src =" src;" in =" new" out =" new" buffer =" new" len =" 0;" len =" in.read(buffer,"> 0)
{
out.write(buffer, 0, len);
}
in.close();
out.close();
}
}
}

2006-10-23

【java教程】实践MDA之AndroMDA教程:[第四节] 系统设计(2)

设计系统类图
用 MagicDraw 进行类图设计和利用Rose等其他建模工具建模具有极大的相同点,但为了使建好的模型能够通过代码生成工具的验证并生成代码,因此在设计时需要遵循一定的规则。常用的规则有如下几点:
1、描述类的常用构造型(Stereotype)有:Entity、Criteria、Service、ValueObject、Enumeration等。
Entity构造型:使用这个构造型的类是用来储存持久数据的类,是持久对象,在代码生成的过程中将生成Hibernate映射文件、相应的DAO的java文件以及对应的数据库表。
Criteria构造型:使用该构造型的类用来储存复杂查询的参数,主要用于复杂的多条件查询中。
Service构造型:使用该构造型的类表示Service层,将生成Spring的Service 的java文件,并自动配置在Spring的配置文件中。
ValueObject构造型:该类型主要用在页面显示方面,当持久对象不能直接显示在页面上的时候,就需要把持久对象转换成ValueObject对象后才在页面上显示,代码生成工具将根据该类以及于持久对象的关联生成ValueObject的java文件以及在DAO中生成ValueObject和持久的对象互相转换的方法。
Enumeration构造型:该类型表示枚举,将生成枚举java文件。
2、持久对象(Entity)的visility要设置为public,这样在生成代码后,持久对象java文件中属性的get/set方法才是public的。
3、在设置属性的时候,属性类型一定要用androMDA提供的类型,即:要使用带有[datatype]后缀的类型(例如:Long [datatype]),其他类型将不会被代码生成工具识别。
4、在持久对象中添加查询方法时,范围(scope)属性有两个值:instance和classifier。如果设置成instance,则查询方法将被生成在持久对象的类里面;如果设置成classifier,则查询方法将被生成在持久对象对应的DAO文件中。应该取何值,取决于使用何种结构来进行设计。
5、持久对象属性的有很多常用的构造型(Stereotype),其中Identifier[Attribute]表示主键,将生成对应数据库的主键,Unique[Attribute]表示该属性取值必须唯一。
以上只是大致列出了一些设计规则,详细内容请参见官方网站。
我们的示例程序才用了Hibernate、Spring、Struts的三层架构,通常在设计类图的时候,首先设计持久对象,也称为数据建模,相当于传统的软件开发过程中的数据库设计。我们的示例程序非常简单,因此持久对象的设计也比较简单,设计图如下:




如图所示,Person和Car具有一对多的关系。
设计完持久对象以后就开始设计Service和Controller了,Controller里面的方法用来在活动图中调用,换句话说,Controller是用来在Struts的Action中调用。之所以将Action和Controller分离出来,主要是让开发者专注于业务逻辑的开发,而避开Action配置的技术细节。
下图是汽车管理的上层设计类图:


上图使用了ValueObject和Enumeration等构造型。
下图是用户管理的上层设计图:

至此,示例程序的设计基本完成,接下来的工作是对AndroMDA进行一些必要的配置,将教程的下一节进行详细描述。

【java教程】实践MDA之AndroMDA教程:[第三节] 系统设计(1)

该小节将详细的分析和描述示例的程序的设计。
设计准备
在工程的\mda\src\uml\目录下面有一个UMI文件,这个文件是在建立工程结构目录时自动生成的,该文件遵循标准UML Model规范,是androMDA代码生成工具的依据,储存了应用程序建模的信息。通常情况下我们只需用MagicDraw打开该文件进行建模,然后就可以利用androMDA进行代码生成了。
MagicDraw编辑后的XMI文件的编码都是UTF-8,为了能够使androMDA解析的XMI的编码为gb2312,并且将注释正确显示成中文,我开发了一个编码转换工具(有需要这个工具的请给我Email联系:delight.wjk@gmail.com)。具体操作过程是:
1、在同目录下创建一个该XMI文件的副本:在示例工程中\mda\src\uml\目录下面的UMI文件为 CarManagementModel.xmi ,在该目录下复制一个文件并命名为CarManagementModel_utf8.xmi。
2、用MagicDraw打开 CarManagementModel_utf8.xmi 文件进行设计,每次修改设计后,用下面的编码转换工具对 CarManagementModel_utf8.xmi 文件进行编码转换,转换后的文件为 CarManagementModel.xmi (覆盖原有XMI文件)。
3、此时就可以用androMDA进行代码生成了。
示例工程设计
关于设计的先后顺序,应该没有一个统一的标准。可以先设计用例图、活动图等,然后设计类图。简单的说,这个代码生成工具会结合用例图和活动图来生成页面,依据类图来生成底层代码。
在设计的过程,需要遵循一些设计的要求,否则在生成代码的过程中会有验证不通过的错误提示。具体的设计规则请参阅官方网站上的文档。
设计系统用例图
首先,设计用例图。在设计模型的时候,需要用Stereotypes(文中称为构造型)来描述模型中每个元素的意义。在用例图中,构造型<>表示该元素是一个用例,而构造型<>表示该元素是整个应用程序的入口,因此在模型中只能有唯一的一个元素能被标识成<>构造型,而且在自动生成的可运行的程序中,访问时会默认的进入执行该用例。另外,在模型中,每个用例必须要用一个单独的包来区分名字空间,这是一个设计规则。下图是示例工程的用例设计图:






设计活动图
活动图用来描述各个用例的具体逻辑细节。在模型中,每个用例必须要和一个活动图一一对应。在活动图中被构造型<>标识的状态元素表示前端获取用户输入的页面(例如Jsp),而图中没有任何构造型的状态元素则表示相应用户输入的服务器端的程序(例如Struts中的Action)。
下图是用户管理的活动图:


从图中,我们应该能大致看出用户管理的逻辑。当用户第一次进入的时候,首先看到的是所有用户的列表,在这个用户列表的界面中,用户可以删除选择的用户,可以修改选择的用户,也可以添加一个新的用户。
下图是汽车管理的活动图:
汽车管理的活动图中也同样实现了增加、删除、修改的功能,在新建汽车的时候,用户可以从列表中选择所有者。

2006-10-20

【java教程】实践MDA之AndroMDA教程:[第二节] 示例工程准备



该小节介绍示例工程的概况,并通过演示一步一步建立工程目录。有关建立 AndroMDA 工程的详细介绍请参见其官方网站的文档:http://team.andromda.org/docs/starting.html#My_first_AndroMDA_project
在执行androMDA的Maven命令时,我强烈推荐你使用UltraEdit编辑工具的内嵌执行DOC命令的功能。因为在UltraEdit中执行DOC命令可以保存所有的DOC输出,方便跟踪和检查错误。操作步骤如下:
1、启动UltraEdit编辑工具。
2、按F9键,出现如下的对话框:



其中“命令”表示要执行的DOC命令,工作目录表示执行DOC的当前目录。
3、按回车键或者点击对话框中的确定按钮,开始执行输入的DOC命令。
自动下载Maven插件
用过 maven 的朋友应该比较清楚它的工作机制,它能根据需要自动下载所需要的第三方jar包。代码生成工具 androMDA 是由 maven 实现的。因此,在使用 androMDA 的时候,需要 androMDA 的 maven 插件,有这个插件,androMDA 就可以利用 maven 命令来完成自己的任务了。因此,我需要用一个命令来下载 androMDA 插件以及其他所需的第三方插件,下载插件的命令如下:
maven plugin:download -DgroupId=andromda -DartifactId=maven-andromdapp-plugin -Dversion=3.1
如果第一次在本机使用androMDA,则可能需要几分钟的时间下载,并且在这个过程中需要保证网络畅通,否则会出现错误。
建立工程目录
该教程中的示例工程将位于我本机的D:\MyProject下面。因此设置该目录为执行DOC命令的当前目录。然后执行如下命令:
maven andromdapp:generate
执行该命令时,命令行要求输入一些工程相关的信息,下图是示例工程的输入:
__ __
\/ __ _Apache__ ___
\/ / _` \ V / -_) ' \ ~ intelligent projects ~
_ _\__,_\_/\_____ v. 1.0.2
Please enter your first and last name (i.e. Chad Brandon):
Wang JiaKuan
Please enter the name of your J2EE project (i.e. Animal Quiz):
Car Management
Please enter the id for your J2EE project (i.e. animalquiz):
CarManagement
Please enter a version for your project (i.e. 1.0- SNAPSHOT):
1.0
Please enter the base package name for your J2EE project (i.e. org.andromda.samples):
com.widen.carmanagement
Would you like an EAR or standalone WAR (enter 'ear' or 'war')?
war
Would you like to use the jBpm workflow engine, it uses Hibernate3 (enter 'yes' or 'no')?
no
Please enter the hibernate version number (enter '2' for 2.1.x or '3' for 3.0.x):
3
Would you like your web tier to use JSF or Struts? (enter 'jsf' or 'struts'):
struts
Would you like to be able to expose your services as web services? (enter 'yes' or 'no'):
no
执行完命令后工程目录就自动的创建好了,在 D:\MyProject 目录下面存在这样的目录结构:

有关详细信息请参见文档:http://team.andromda.org/docs/getting- started/java/index.html
工程相关说明
在工程的根目录下有一个readme.txt(示例工程:D:\MyProject\CarManagement\readme.txt)文件。该文件详细描述了有关androMDA工程目录结构以及常用的Maven命令。下面对工程目录结构和常用Maven命令做详细的说明。
目录结构说明
[root]: 工程根目录下包含几个文件,用来全面的控制构建过程和公共属性
[root]/project.xml: 该文件包含了有关工程的信息,你可以自己添加更多的信息,只要不违反 Maven POM 的Schema定义。参见:http://maven.apache.org/reference/project-descriptor.html
[root]/maven.xml: 该文件定义了可以从工程根目录执行的 Maven 命令(goals),大部分时间你也可以在子模快中调用Maven命令,详情参考示例
[root]/project.properties: 该文件定义了工程的一些公共属性,你可以通过修改这些属性来配置工程
[root]/build.properties: 该属性文件了定义了工程所依赖的第三方库的版本信息,也定义了工程的唯一标识。通常情况下该文件不需要修改(除非将工程升级到 AndroMDA 的其他版本的时候需要修改)
[root]/mda: MDA 模块是工程的核心,AndroMDA通过这里的配置来生成应用程序所需的文件。
[root]/mda/project.xml: 包含了 AndroMDA 依赖的其他工程信息
[root]/mda/project.properties: AndroMDA 的属性可以在这里配置,例如可以配置是否进行错误验证
[root]/mda/maven.xml: 该文件不需要编辑
[root]/mda/src: merge- mappings等额外的配置文件可以存放在该目录下,该目录下的/uml子目录里包含UML模型文件,AndroMDA将根据该文件生成代码
[root]/mda/conf/andromda.xml: 配置 AndroMDA 和它的组建,最终要的是各个 cartridge 设置要放在各自的名字空间下面(namespace),全局设置要放在'default'名字空间下面
[root]/common: COMMON 模块集中存放各个模块共用的资源文件和类文件。
[root]/common/project.xml: 列出该模块依赖的其他工程
[root]/common/target: 存放生成的用来共享的资源文件和Java类文件,例如值对象(value objects)和异常(exceptions)
[root]/core: CORE 模块集中存放使用了Spring框架的资源文件和 Java 类文件,在Spring框架下可能使用 Hibernate 和(或)EJB。
[root]/core/project.xml: 列出 Spring 依赖的其他工程
[root]/core/project.properties: 指明了 Spring 的构建的属性,该文件不需要修改
[root]/core/maven.xml: 定义了一些 Maven 命令,这些命令用来生成建立和删除表的DDL代码,其中使用了 Hibernate 的 SchemaExport 功能
[root]/core/src: 需要手工实现的 Spring 相关的类被生成后存放在这里,重新生成代码时不会被覆盖,它们包括 Service 实现、DAO 实现、Entity 实现
[root]/core/target: 这里存放了 Spring 相关的资源文件和类文件,在每次使用 Spring cartridge 重新生成新的代码的时候它们将被覆盖;包括 Hibernate 实体类和相应的 *.hbm.xml 影射文件,包括 Service 和 DAO 的基类,你也可以在该目录下找到建立和删除表的数据库脚本
[root]/web: WEB 模块集中存放所有用来构建表示层的资源文件和类文件,这里也用来将其他模块打包建立可发布的war文件。
[root]/web/project.xml: 列出 WebApp 依赖的其他工程
[root]/web/project.properties: 指明 Spring 的构建属性,你可以通过设置 precompileJsps=true 使得所有JSP文件进行预编译
[root]/web/maven.xml: 定义 JSP 预编译相关的 Maven 命令,取消 war:init preGoal 的注释,使得 copy-over 的特性可用
[root]/web/src: controller 的实现类和可编辑的资源包生成后将被存放在这里,你可以将你自己的 JSP 文件放在这里,在打包生成war文件的时候将自动拷贝这些JSP文件并覆盖到war包中
[root]/web/target: 一个可以部署的war包将生成并存放在这里
常用命令说明
为了成功的构建你的工程,你需要知道如何调用已有模块的构建过程,以下是一些常用的 Maven 命令
%> maven install
简单的构建所有模块
%> maven deploy
收集所有信息,建立可部署的war包,然后自动部署到设置好的应用服务器,但你需要在这之前构建好所有其他模块
%> maven clean install deploy
删除所有生成的文件,重新构建和部署,/src 目录下的文件不会被删除
%> maven core
只构建 core 模块
%> maven web
只构建 web 模块
%> maven nuke
清除所有 /target 目录,从源代码目录(从 common 模块,core 模块和 web 模块)中删除所有以 'Impl' 结尾的 Java 类文件,该命令(goal)会给出确认提示,但是在使用的时候还是要格外小心,因为它会删除你所有用手工编辑过的文 件
%> maven create-schema
调用生成的DDL代码,并紧接着告诉数据库给相应的实体对象建立(create)数据表
%> maven drop-schema
调用生成的DDL代码,并紧接着告诉数据库给相应的实体对象删除(drop)数据表
%> maven start-andromda-server
启动 AndroMDA 服务器。当这个服务器运行的时候能够很大程度的提高代码生成的效率,而且此时需要在另外一个控制台中执行其他 maven 命令。
%> maven stop-andromda-server
停止 AndroMDA 服务器
%> maven mda
将各个设计模块生成代码。
注意:在执行命令的时候你可以使用 '-o' 选项来避免 maven 下载其他东西,只有在线构建的时候才不需要这个选项。每个模块生成后的jar等将被安装在本地 maven 仓库,可能存在于这个目录下:
(Windows)
C:\Documents and Settings\Administrator\.maven\repository\CarManagement\
(*nix)
/home/Administrator/.maven/repository/CarManagement/
遇到问题请到 http://javava.blogspot.com 提问。

【java教程】实践MDA之AndroMDA教程:[第一节] 开始进入

该小节将简单介绍本教程的内容。

为何使用AndroMDA

你是否曾经开发过杂乱无章的JSP代码?你是否曾经因维护一个庞大复杂的应用而头疼不已?事实上,需求会频繁变更,代码会频繁修改。如果代码的更新没有和设计同步,那么最终的代码可能会变得面目全非,维护起来十分困难。如果手工保持代码和设计的同步,则过程十分繁琐——尤其是在需求频繁变更的时候,好不容易修改好了代码,调通了程序,还要同步的修改设计。这种情形下,即使是个软件开发狂热者,也会被折磨的有些抓狂。
聪明的你可能马上开始思考:有没有一种方法可以通过更加精确的建模来生成可运行的代码呢?答案当然是有。
AndroMDA(发音:andromeda)正是这样一个开源的代码生成工具,它能够根据CASE工具建立的模型生成全部的可配置的应用程序以及其他组件。它使得设计师能够抽出更多的时间专注于高质量的设计,而且维护起来也更加方便,维护时只需修改模型,然后重新自动生成代码即可。
有关AndroMDA的详细介绍请参见:http://team.andromda.org/docs/whatisit.html
本教程通过一个简单的示例详细描述使用AndroMDA开发J2EE应用程序的过程,并重点描述初学者可能遇到的问题及解决方法。

示例工程介绍
该教程要完成的示例程序提供如下功能:
1、用户管理:添加用户、删除单个用户、删除多个用户。
2、车辆管理:添加车辆、删除单个车辆、删除多个车辆。
3、用户和车辆具有一对多的关系。


环境准备
该小节配置必要的软件环境。
Java
你需要至少1.4以上的JDK版本,因为androMDA必需的一些包(例如java.util.regexp)只有1.4版本以上的JDK含有。
你可以从这个网站下载所需JDK:http://java.sun.com/
Maven
虽然androMDA既可以用Maven运行,也可以用Ant运行。但是强烈建立你使用Maven,因为绝大多数androMDA插件都和Maven进行集成。本教程使用的是androMDA 3.1,该版本只支持Maven 1.0.2版本,暂不支持Maven 2.0。

你可以从这个网站下载所需的Maven 1.0.2:http://maven.apache.org

在安装 maven 的时候需要正确的设置 JAVA_HOME 变量。

安装完成 maven 后,进入本地目录(如果你用 Administrator 登录的操作系统,那么本地目录是:C:\Documents and Settings\Administrator),在该文件夹下面建立一个 build.properties 文件,然后在该文件加上下面的一句话: maven.repo.remote=http://www.ibiblio.org/maven,http://team.andromda.org/maven

本教程假设你能够比较熟练的使用Maven,如果没有使用过Maven,请参考Maven官方网站上的相关文档,也可以在 http://javava.blogspot.com 提问,将会得到解答。
Tomcat
AndroMDA不依赖特定的J2EE容器。你可以使用默认的Jboss或者Tomcat,本教程使用的是Tomcat 5.0.18。
你可以从这个网站下载所需的Tomcat:http://jakarta.apache.org/tomcat
MagicDraw
本教程使用MagicDraw进行建模。androMDA不依赖于特定的建模工具,只要是能够导入和导出标准UML模型的XMI文件的建模工具,都可以和androMDA一起工作。但是在使用androMDA时,我强烈推荐你使用MagicDraw。首先MagicDraw运行速度非常快,并且支持几乎所有UML特性。
MagicDraw是一个商业软件,但也提供免费的社区版本。你可以从这里下载MagicDraw:http://www.magicdraw.com 。 AndroMDA 3.1只支持UML1.4,因此要动手实践本教程,则只能使用MagicDraw 9.5或者MagicDraw 9.0版本。

环境变量
可能有些环境变量你已经设置好了,但为了再次确认,这里列出在Windows下设置环境变量的步骤以及需要设置的环境变量列表。
1、如果你是Windows 2000的用户,你可以进入控制面板,双击“系统”。
2、进入“高级”页,点击“环境变量”。
3、从系统变量列表中查看是否已经设置好所需的环境变量。
在对话框中,你可以添加或者编辑环境变量。
运行androMDA所需的环境变量参见下表:


这样,基本的环境设置已经完成,接下来在下一节的教程中将开始讲解如何创建一个MDA的工程。

2006-10-19

【随写】上传图标


2006-10-17

【作品介绍】用 Eclipse Plugin 开发的个人财务管理系统

Prima(Personal Resource Intelligent Management)是我利用业余时间开发的一款基于基本会计原理的个人财务管理软件,主要使用了 Eclipse Plugin 和 JasperReport 报表技术开发表示层,利用Spring和Hibernate3.0开发了业务层和数据层。
该软件通过对日记帐数据的采集,自动生成资产负债表、损益表、科目汇总表、科目变化曲线等等多种有用的报表。软件主界面如下:


2006-10-16

【随写】最进准备深入研究一下OpenLaszlo

用OpenLaszlo做出来的界面真是让人耳目一新,准备抽时间继续深入研究一下开发效率以及运行性能等问题。

2006-10-15

【技术心得】在Eclipse RCP平台中使用Java AWT的部件

在Eclipse RCP中使用Java AWT的部件一般情况下很少会用到。特殊情况下使用也是有必要的,例如我在RCP程序中用JFreeChart显示图表的时候就会用到这种功能。示例代码如下:

public void createPartControl(Composite parent)

{

Composite awtComposite = new Composite(parent, SWT.EMBEDDED SWT.NO_BACKGROUND);

// a M$ Windows specific property that prevents some components from erasing

// their background, thus reducing window flickering (in theory :) )

try

{

System.setProperty("sun.awt.noerasebackground", "true");

} catch(NoSuchMethodError ignore){// Ignore this error}
// SWT-AWT Bridge

awtFrame = SWT_AWT.new_Frame(awtComposite);

awtPanel = new Panel(new BorderLayout())

{

public void update(Graphics g) { paint(g); } };
// Generate the Chart. Add the chart to the panel

chart = new JFreechartFactory...blabla

cp = new ChartPanel(chart);

awtFrame.add(cp);

}

以上代码片断在我的示例程序中运行成功。

【技术心得】eclipse平台类加载器问题的解决

2006年7月30日晚上解决的问题,当时记录了,现在贴出来。原文如下:

今晚解决了一个问题,忍不住要记录一下,解决这个问题非常不容易,首先我要感谢Google,你是我最好的老师。

问题产生:我在eclipse的RCP程序中执行装载Jasper报表的程序。

// create JasperPrint using fillReport() method
JasperPrint jasperPrint = JasperFillManager.fillReport( jasperReport, parameters, DBUtil.getConnection());

如果在eclipse平台外执行执行装载Jasper报表的程序正常,但在eclipse平台里执行就老是出这样的错误:

Unhandled event loop exceptionReason:net/sf/jasperreports/engine/fill/JRFillParameter

于是我开始在网上不断搜索,经过很久的搜寻,终于发现了类似问题的解决方法。
我在装载Jasper报表的程序前面加上这句话,就可以在eclipse RCP平台中运行了。

Thread.currentThread().setContextClassLoader(this.getClass().getClassLoader());

【随写】Upload my photo

【随写】终于该搞一个Blog和大家分享一下东西了

开。