M-A-T Tory's Blog

  C++博客 :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理 ::
  16 随笔 :: 1 文章 :: 1 评论 :: 0 Trackbacks

2006年7月11日 #

Eclipse启动参数说明(部分)


其实,Eclipse是一个可以进行非常灵活配置的系统,除了以缺省的方式启动以外,还可以指定各种参数来定制启动方式。在参考了一些资料之后,我总结了一些比较常用的启动时Command Arguments,如果有不正确的地方希望大家予以指出。

-arch [processor architecture]
描述:指定所使用的处理器的类别
举例:eclipse -arch x86或eclipse -arch sparc

-application [id]
描述:指定要运行的应用,id为扩展org.eclipse.core.applications扩展点的插件id加扩展id
举例:例如有个插件id为edu.sdu.app,扩展id为myapp,则eclipse -application edu.sdu.app.myapp,就会执行你的扩展应用

-clean
描述:清空插件缓存内容
举例:eclipse -clean,有时插件显示不出来是因为Eclipse将插件进行了缓存以加速启动过程,若指定此参数则会清空缓存,从头加载

-configuration [cofigfile location]
描述:指定配置文件的位置,在启动时使用此目录下的配置文件config.ini来启动
举例:eclipse -configuration d:/eclipse/configuration

-data [workspace location]
描述:指定启动时的Workspace位置
举例:例如Workspace位置设在D:/myworkspace,则eclipse -data D:/myworkspace

-debug [option file]
描述:以Debug状态启动Eclipse,所有的Debug开关在.options文件中指定
举例:eclipse -debug d:/eclipse/.options

-dev [classpath entry]
描述:以开发状态启动Eclipse,这会添加所有指定的路径作为每个插件的Classpath
举例:例如eclipse -dev bin,会将产生在bin目录下的所有类加载到类路径中,这在开发插件时非常有用

-nosplash
描述:指定启动时不显示闪屏
举例:eclipse -nosplash

-vm [jre path]
描述:指定启动时所使用的Java虚拟机
举例:例如要使用自己的Java虚拟机,则eclipse -vm D:/j2sdk1.4.2_04/jre/bin/java.exe,这样还有一个好处,就是可以开启一个Console,能够显示控制台信息,当然若使用eclipse -vm D:/j2sdk1.4.2_04/jre/bin/javaw.exe则不会再显示控制台

-vmargs [Java VM arguments]
描述:指定启动时要使用的Java虚拟机参数
举例:例如要指定使用的内存容量,则eclipse -vmargs "-Xms256m -Xmx1024m"
注:此参数一定要放在所有参数变量的最后面

posted @ 2006-07-11 18:25 Tory 阅读(1952) | 评论 (0)编辑 收藏

2006年6月3日 #

     摘要: < html > < META HTTP - EQUIV = " Content-Type "  content = " text/html; charset=gb_2312-80 ...  阅读全文
posted @ 2006-06-03 19:21 Tory 阅读(570) | 评论 (0)编辑 收藏

2006年5月24日 #

什么是设计模式
设计模式是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结。使用设计模式是为了可重用代码、让代码更容易被他人理解、保证代码可靠性。

毫无疑问,设计模式于己于他人于系统都是多赢的,设计模式使代码编制真正工程化,设计模式是软件工程的基石,如同大厦的一块块砖石一样。

GoF的“设计模式”是第一次将设计模式提升到理论高度,并将之规范化,本书提出了23种基本设计模式,自此,在可复用面向对象软件的发展过程中,新的大量的设计模式不断出现。

设计模式和框架
现在,可复用面向对象软件系统现在一般划分为三大类:应用程序 工具箱和框架(Framework),我们平时开发的具体软件都是应用程序;Java的API属于工具箱;而框架是构成一类特定软件可复用设计的一组相互协作的类。EJB(Enterprise JavaBeans)是Java应用于企业计算的框架.

框架通常定义了应用体系的整体结构 类和对象的关系等等设计参数,以便于具体应用实现者能集中精力于应用本身的特定细节。框架主要记录软件应用中共同的设计决策,框架强调设计复用,因此框架设计中必然要使用设计模式.

另外,设计模式有助于对框架结构的理解,成熟的框架通常使用了多种设计模式,如果你熟悉这些设计模式,毫无疑问,你将迅速掌握框架的结构,我们一般开发者如果突然接触EJB J2EE等框架,会觉得特别难学,难掌握,那么转而先掌握设计模式,无疑是给了你剖析EJB或J2EE系统的一把利器。

EJB中的设计模式
下面我们从设计模式的角度看看EJB的框架是怎样的?在这之前假设你已经大概了解了设计模式。专门的设计模式阐述请见我的设计模式之系列.

EJB是采取多层结构,原先我们数据库开发基本是应用程序(商业逻辑运算)直接调用数据库驱动,在EJB中,为将商业逻辑计算和数据库截然分开,使用多个结构式模式:Adapter模式和Bridge模式等.这样做的好处显然有三个:

1.分离了商业逻辑层和数据访问层;
2.能同时支持多个数据库;
3.但数据库类型更换时,不会设计到商业逻辑代码的大量修改.

EJB中将对数据库进行调用(如发出select等语句)称为会话bean(Sessionbean),而将对应数据库一个个记录的bean称为实体bean(Entity bean);由这两种类型的bean完成对数据库的访问.

会话bean一般和客户端应用是一一对应,而和数据库端联系紧密的是实体bean,EJB在实体bean(或直接在会话bean)和数据库之间使用了Adapter模式和Bridge模式,无意在实体bean和数据库之间又多了一层,称之为DAO(Data Access Object ),DAO实际就是设计模式的混合体.

我们以Java的宠物店中的Catalog为例,这是专门处理宠物店中的宠物类别,在对数据库访问中,有两个主要程序:CatalogEJB和CatalogDAO,我们从具体代码中看看设计模式是怎么应用的.

Bridge模式和Adapter模式
我们首先看看CatalogEJB代码:

public class CatalogEJB implements SessionBean {
  protected CatalogDAO dao;

  //从DAO工厂中获取一个DAO 这是调用工厂(factory)模式的一个实例
  public void ejbCreate() {
    try {
      dao = CatalogDAOFactory.getDAO();
    }
    catch (CatalogDAOSysException se) {
      Debug.println("Exception getting dao " + se);
      throw new EJBException(se.getMessage());
    }
  }

  ....

 

}



我们发现在CatalogEJB中并没有通常的会话bean那样有对数据库操作的"select .. from ."等之类SQL操作语句,这些都被封装到DAO的具体实现中(Concrete class).

在Catalog这个示例中使用了设计模式的Bridge模式,判断是否是某种模式,主要依据其参与者的种类和相互关系,我们先看看Bridge模式的定义和参与者:

Bridge模式是将抽象和行为划分开来,各自独立,但能动态的结合起来(好象搭建了一座桥)。在本例中,是将商业逻辑和数据库访问这样的行为划分开来,数据库访问专门放置在DAO中了。

Bridge模式需要两个接口(抽象类和接口通称为接口),一个用来封装抽象部分,本例中是封装商业逻辑,是CatalogEJB;还有一个是封装行为(Implementor),本例中是CatalogDAO,看看CatalogDAO代码:


public interface CatalogDAO {

  public Category getCategory(String categoryID, Locale l)
  throws CatalogDAOSysException;

  public Page getCategories(int start, int count, Locale l)
  throws CatalogDAOSysException;

  public Product getProduct(String productID, Locale l)
  throws CatalogDAOSysException;

  public Page getProducts(String categoryID, int start, int count, Locale l)
  throws CatalogDAOSysException;

  public Item getItem(String itemID, Locale l)
  throws CatalogDAOSysException;

  public Page getItems(String productID, int start, int size, Locale l)
  throws CatalogDAOSysException;

  public Page searchItems(String query, int start, int size, Locale l)
  throws CatalogDAOSysException;


}


Bridge模式中参与者还需要有行为接口的具体实现(ConcreteImplementor),在本例中是CatalogDAOImpl,虽然在目前宠物店中只有一个ConcreteImplementor,但是可扩展为到Mysql XML等数据源访问,比如你可以自己新增一个叫CatalogDAOImplMysql,也是作为CatalogDAO的子类。

看看CatalogDAO的一个子类CatalogDAOImpl的代码:

public class CatalogDAOImpl implements CatalogDAO {
  protected static DataSource getDataSource()
    throws CatalogDAOSysException {
    try {
      InitialContext ic = new InitialContext();
      return (DataSource) ic.lookup(JNDINames.CATALOG_DATASOURCE);
    }
    catch (NamingException ne) {
      throw new CatalogDAOSysException("NamingException while looking "
        + "up DB context : "
        + ne.getMessage());
    }
  }

  //具体Select语句在这里出现,这里主要是Oracle 数据库的访问语句

  public Category getCategory(String categoryID, Locale l)
  throws CatalogDAOSysException {

    Connection c = null;
    PreparedStatement ps = null;
    ResultSet rs = null;
    Category ret = null;

    try {
      c = getDataSource().getConnection();

      ps = c.prepareStatement("select a.catid, name, descn "
          + "from (category a join "
          + "category_details b on "
          + "a.catid=b.catid) "
          + "where locale = ? "
          + "and a.catid = ?",
      ResultSet.TYPE_SCROLL_INSENSITIVE,
      ResultSet.CONCUR_READ_ONLY);
      ps.setString(1, l.toString());
      ps.setString(2, categoryID);
      rs = ps.executeQuery();
      if (rs.first()) {
        ret = new Category(rs.getString(1).trim(),
        rs.getString(2),
        rs.getString(3));
      }
      rs.close();
      ps.close();

      c.close();
      return ret;
    }
    catch (SQLException se) {
      throw new CatalogDAOSysException("SQLException: "
      + se.getMessage());
    }


    ....

}


Bridge模式参与者总结如下:

商业逻辑抽象类 (CatalogEJB)

抽象的商业逻辑操作.
对DAOImplementor调用.
不关心是具体什么数据源被使用(无论是Oracle还是JDBC还是XML).
DAO(Data Access Object) (CatalogDAO)

对数据源的抽象操作行为.
提供了非常方便访问和维护管理数据的API结构.
DAOImplementor (CatalogDAOImpl 有可能有CatalogDAOImplSybase CatalogDAOImplMysql 等)

实现具体的DAO接口内容.
使用Adapter模式,将特定的数据源驱动接口适配到DAO接口中去
数据源 ( Oracle, or Sybase database via JDBC API)

提供访问具体数据库的驱动接口,如包括连接池等.


在使用数据源驱动接口时,需要使用Adapter模式,Adapter模式将两个不相关的类纠合在一起使用,Adapter模式实际是使用组合(composition)和继承(inheritance)两种方式再生类,在著名的"think in Java"的"类再生"专门提到这两个方式.

很显然,如果你对Bridge模式和Adapter模式熟悉,那么对宠物店中的Catalog理解就会非常快,同样,在宠物店其他部分如订单 用户注册 等都能迅速理解。

Factory模式和Singleton模式
该模式类似new,是用来创建对象的,使用Factory模式是为了实现面向对象的基本原则.封装(Encapsulation)和分派(Delegation);将创建对象与使用对象进行分工。因此在平时开发过程中,尽量使用Factory模式创建对象。

本例CatalogEJB中是使用Factory模式获得一个DAO的具体实例对象,见上面CatalogEJB代码中注释。我们看看CatalogDAOFactory的代码:

public class CatalogDAOFactory {
  public static CatalogDAO getDAO() throws CatalogDAOSysException {

    CatalogDAO catDao = null;
    try {
      InitialContext ic = new InitialContext();
      String className = (String) ic.lookup(JNDINames.CATALOG_DAO_CLASS);
      catDao = (CatalogDAO) Class.forName(className).newInstance();
    } catch (NamingException ne) {
      ...

    }
    return catDao;
}



在CatalogDAOFactory可以依据系统的配置文件,动态获得DAO的方法,之所以采取动态方式,当然便于用户自己增加自己的DAO方式,而不必修改代码,只要直接修改配置文件就可以。

如果在这里只需要CatalogDAOFactory产生一个实例,可以采取Singleton模式,Singleton的目的是控制类实例对象的创建,并且允许整个程序只在一点对它进行访问。Singleton本身类只能创建一个,是单线程。


public class CatalogDAOFactory {
  private static CatalogDAO catDao = null;

  public static CatalogDAO getIntance(){
    if (catDao==null)
      try {
        InitialContext ic = new InitialContext();
        String className =
           (String) ic.lookup(JNDINames.CATALOG_DAO_CLASS);
        catDao = (CatalogDAO) Class.forName(className).newInstance();
      } catch (NamingException ne) {
        ...

      }
     }
    return catDao;

  }
}



那么在CatalogEJB的调用从
dao = CatalogDAOFactory.getDAO();
要改为
dao = CatalogDAOFactory.getIntance();

Facade模式
在EJB应用中,有两个端点,这一端是用户端,另外一端是EJB,通常在这两个端点间会增加一层,用来松散两个端点之间的耦合,比如在宠物店例子中,考虑到不同身份的用户有不同的操作流程,比如顾客注册进入后,需要浏览目录,下订单,而商店管理者进入后需要确认或者否定订单,或者检查库存。这些功能需要借助Session bean和Entity bean完成。

但是如果用户端直接和这些bean互动,会有以下问题:


1. 用户端必须注意和这些beans的所有有联系或互动的事情,无法阻止用户端可能不恰当的使用这些beans.
2.如果EJB的API改动,那么用户端的一些代码也要修改。无疑扩展性很差。
3.即使这些beans都在同一台服务器上,用户端还是用remote方式来调用它们,造成网络无故拥挤。

那么我们使用Facade模式来解决这个问题,Facade的定义是为子系统中的一组接口提供一个一致的界面,很显然我们需要为这些bean提供一个统一的对外界面。如下图:


在宠物店中,ShoppingClientFacadeLocalEJB是面对所有用户端操作的统一界面,用户端操作就不直接和那些EJB如CustomerEJB或ShoppingCartEJB有联系,而是都通过ShoppingClientFacadeLocalEJB来联系的。代码如下:

public class ShoppingClientFacadeLocalEJB implements SessionBean {
  ...

  //和CustomerEJB联系
  public CustomerLocal getCustomer() throws FinderException {
    if (userId == null) {
      ...
    }
    try {
      InitialContext ic = new InitialContext();
      Object o = ic.lookup("java:comp/env/ejb/petstore/local/customer");
      CustomerLocalHome home =(CustomerLocalHome)o;
      customer = home.findByPrimaryKey(userId);
    } catch (javax.naming.NamingException nx) {
      ...
    }

    return customer;
  }

  .....

  //和ShoppingCartEJB联系
  public ShoppingCartLocal getShoppingCart() {
    if (cart == null) {
      try {
        InitialContext ic = new InitialContext();
        Object o = ic.lookup("java:comp/env/ejb/cart/Cart");
        ShoppingCartLocalHome home =(ShoppingCartLocalHome)o;
        cart = home.create();
      } catch (javax.ejb.CreateException cx) {
       ...
      }
    }
    return cart;
  }

  ....

}



Facade模式参与者:

SessionFacade (ShoppingClientFacadeLocalEJB)

提供一组操作流程
将真正工作委托到EJB的bean.
EJB的bean (CustomerEJB, ShoppingCartEJB等等)

执行基本的商业逻辑操作
没有任何对SessionFacade的调用.

这样不但可扩展性大大增强,效率也提高了,用户端只需要一次Remote对SessionFacade调用就可以了,而SessionFacade会自动定位到与它同一台服务器的那些邻居bean(CustomerEJB, ShoppingCartEJB等等),无疑减少网络拥挤,提高了速度.

总结
在EJB的具体使用中,使用合适的设计模式,不但使代码可重用性 可拓展性增强,最重要的是能提高效率和速度,我们知道EJB框架由于考虑大型系统中事务安全等各方面问题,效率性能有所欠缺,那么我们在具体问题具体应用时,使用设计模式可以弥补这个问题。

例如Proxy模式可以为我们在访问巨大的需要花费一定时间才能展开的对象时,提供一个代理,这样不会因为那个巨大对象而影响当前运行速度,EJB中的那些bean很显然属于巨大对象(因为它们有反复的数据库操作,这些很费时间〕。

Flyweight模式是避免大量拥有相同内容的小类的开销(如耗费内存),使大家共享一个类(元类).当你要从EJB中获取一系列字符串,而这些字符串中肯定有许多是重复的,那么我们可以将这些重复的字符串储存在Flyweight池(pool)中以达到共享。
posted @ 2006-05-24 22:34 Tory 阅读(180) | 评论 (0)编辑 收藏

2006年5月23日 #

java操作Excel文件应该有两个方法,一种是利用POI,一种是利用 JAVA EXCEL 。
一开始本来是打算用POI,可是不知为什么,使用POI时可以正常写Excel,但读的时候却老出问题了,不得不改用JAVA EXCELLE。
 

Java Excel是一开放源码项目,通过它Java开发人员可以读取Excel文件的内容、创建新的Excel文件、更新已经存在的Excel文件。使用该API非Windows操作系统也可以通过纯Java应用来处理Excel数据表。因为是使用Java编写的,所以我们在Web应用中可以通过JSP、Servlet来调用API实现对Excel数据表的访问。

现在发布的稳定版本是V2.0,提供以下功能:

  • 从Excel 95、97、2000等格式的文件中读取数据;
  • 读取Excel公式(可以读取Excel 97以后的公式);
  • 生成Excel数据表(格式为Excel 97);
  • 支持字体、数字、日期的格式化;
  • 支持单元格的阴影操作,以及颜色操作;
  • 修改已经存在的数据表;

现在还不支持以下功能,但不久就会提供了:

  1. 不能够读取图表信息;
  2. 可以读,但是不能生成公式,任何类型公式最后的计算值都可以读出;

应用示例

1 从Excel文件读取数据表

class ReadExcelByJxl
{
public static void main(String [] args)
{
try
{
//构建Workbook对象, 只读Workbook对象
    
//直接从本地文件创建Workbook
//从输入流创建Workbook
    InputStream is = new FileInputStream("Electrolux_images_PM400download_complete.xls");
    jxl.Workbook rwb 
= Workbook.getWorkbook(is);
    
    Sheet[] rs 
= rwb.getSheets();
    
for(int i = 0; i < rs.length; i++)
    
{
    Cell cellUrl 
= rs[i].findCell("Location URI \n(to be entered by Dalian)");
    
int row = cellUrl.getRow();
    
int column = cellUrl.getColumn();
    String loUri 
= rs[i].getCell(column + 2, row).getContents();
    System.out.println(loUri);
}

具体用的时候很简单,遇到什么不懂得查一下API文档就可以了(今天才发现我也会用API了,^_^)。
关于POI使用时出现的问题现在还没有解决,不知道是什么原因。

posted @ 2006-05-23 20:51 Tory 阅读(451) | 评论 (0)编辑 收藏

2006年5月22日 #

     摘要: 今天在某网站上发现了一个javascript的计算器,很有创意,而且功能也很强大。具体哪一个网站记不清了,代码纯为了学习研究,请作者见谅。 < HTML >< HEAD >< TITLE > 科学计算器 </ TITLE >...  阅读全文
posted @ 2006-05-22 14:35 Tory 阅读(259) | 评论 (0)编辑 收藏

2006年5月19日 #

经过了两天多的摸索,axis终于配置成功了。步骤其实很简单的,主要是关于classpath的配置。axis主页上安装向导其实写的明白了,鉴于研究Web Service的人都是有一定java基础的人,所以上面并没有详细说明关于classpath的设置。像我这样的java新手自然要走很多弯路,没办法的事情,这是学习的一个过程。

axis的配置很简单,过程如下
1. 将axis-src-1_2_1这个包解压后,将axis-1_2_1\webapps下axis的所有东西拷贝到你刚刚建立的TOMCAT的webapps下。目录结构如下:
然后查看一下你的axis的WEB-INF的lib下*.jar文件是否全,应该有8个
axis.jar
axis-ant.jar
commons-discovery-0.2.jar
commons-logging-1.0.4.jar
jaxrpc.jar
log4j-1.2.8.jar
saaj.jar
wsdl4j-1.5.1.jar
(一定看好各个文件的文件名,一会将配置CLASSPATH)
axis的安装向导还要求其他的几个.jar文件,包括xerces.jar,和mail.jar.这些都可以在Apache网站上找到/
2. 然后到axis-1_2_1目录下,找到lib文件夹,拷贝其中的activation.jar文件,到
Tomcat\webapps\axis\WEB-INF\lib,和上面的8个jar文件在一起,就OK了。
3.剩下的就是整个过程中最为关键的部分,如果弄不好你需要走很弯路的。
关于classpath 的设置,包括两部分。一. 有关Tomcat的classpath的设置,这一部分是最容易被忽视的,很多关于axis的安装的文章都没有讲。这就使你在后面遇到很多问题,首先如果这部分没有设置,即使你后面关于axis的classpath设置的完全正确,在编写客户端测试Web Service 是也会出现错误。而且这时候,你的axis已经可以运行,你写的简单的HelloWorld.jws也没什么问题,能看到相应的SOAP消息。但是你的客户端程序却出问题了,你可以正常编译,不会出现错误。但运行时会出现诸如Exception in thread "main" java.lang.NoClassDefFoundError: org/apache/axis/client/Service此类的异常,这种错误通常是最令人痛苦的。
关于Tomcat的classpath一要注意,如果你是通过Windows安装程序安装时,这是你的系统中已经有了TOMCAT_HOME,和JAVA_HOME 环境变量,此时你要做的就是添加classpath环境变量(如果你还没有添加的话,具体做法我就不用说了,很简单的基础知识),classpath的设置如下
classpath=.;%JAVA_HOME%\lib\dt.jar;%JAVA_HOME%\lib\tools.jar(.;是必需的,它指代当前目录)
然后修改环境变量中的classpath,把tomat安装目录下的common\lib下的(可以根据实际追加)servlet.jar追加到classpath中去,修改后的classpath如下:
classpath=.;%JAVA_HOME%\lib\dt.jar;%JAVA_HOME%\lib\tools.jar;%CATALINA_HOME%\common\lib\servlet.jar;
4.接下来就是关于axis的环境变量的设置了,向导上讲的很清楚。就把原文直接考过来

On Windows, this can be done via the following. For this document we assume that you have installed Axis in C:\axis. To store this information permanently in WinNT/2000/XP you will need to right click on "My Computer" and select "Properties". Click the "Advanced" tab and create the new environmental variables. It is often better to use WordPad to create the variable string and then paste it into the appropriate text field.

set AXIS_HOME=c:\axis
set AXIS_LIB=%AXIS_HOME%\lib
set AXISCLASSPATH=%AXIS_LIB%\axis.jar;%AXIS_LIB%\commons-discovery.jar;
  %AXIS_LIB%\commons-logging.jar;%AXIS_LIB%\jaxrpc.jar;%AXIS_LIB%\saaj.jar;
  %AXIS_LIB%\log4j-1.2.8.jar;%AXIS_LIB%\xml-apis.jar;%AXIS_LIB%\xercesImpl.jar
注意一点,.jar文件要与你的解压的axis目录中的文件名一致,由于版本问题,文件名可能不一致。
5 .  测试
下面是一个简单的WebService, 供测试使用
(代码是转贴,呵呵)
import java.util.*;
 
public class wsTestService
{
  String strName 
= "Ryun";
  
int intAge = 21;
  List items 
= new ArrayList();
  
  
public String getName() {
    
return strName;
   }

  
  
public int getAge() {
    
return intAge;
   }

  
  
public List getItems() {
    
return items;
   }

  }

将此文件命名为 wsTestService.jws 存放到
Tomcat的\webapp\axis\目录下
访问 http://localhost:8080/axis/wsTestService.jws, 出现 "There is a Web

Service here"即表明 Web Service 服务端程序安装完成.
开发一个 Web Service 客户端程序
建立客户端程序wsTestClient.java
以下是客户端的源程序, 用于向 Web Service Server 提交服务请求:

import org.apache.axis.client.Call;
import org.apache.axis.client.Service;
 
public class wsTestClient {
  
public static void main(String args[]) {
    System.out.println(
"Start invoking");
    
try {
      String strUri 
= 

"http://localhost:8080/axis/wsTestService.jws";
      Service service 
= new Service();
      Call call 
= (Call)
      service.createCall();
      call.setTargetEndpointAddress(
new 

java.net.URL(strUri));
      call.setOperationName(
"getName");
      String ret 
= "" + call.invoke(new Object[] {});
      System.out.println(
"I am " + ret + ".");
     }

    
catch (Exception e) {
      System.err.println(e.toString());
     }

    System.out.println(
"Finished the invoking.");
    }

}
然后编译运行,如果出现问题,那可能是环境变量path,classpath配置的问题,自己查看

一下,这里就不再描述了。
C:\>cd \
C:\>javac wsTestClient.java
 
C:\>java wsTestClient
Start invoking...
I am Ryun.
Finished the invoking.
完成,再去学习,稍后总结
但这时还有一个问题,我还没有解决,关于log4j的一个warn,不知道该如何配置log4j,懒得再去找答案了。axis的相关问题搜索了两天了才有个结果,log4j的问题以后有时间再弄吧。

posted @ 2006-05-19 16:24 Tory 阅读(2396) | 评论 (1)编辑 收藏

2006年5月16日 #

匿名类:
1. 定义方法: new ClassNameorInrefaceName () {...}
2. 类名前不能有修饰符。
3. 类中不能有构造方法,因为它没有名字。在构造对象是使用父类的构造方法。如果实现接口,则接口后面的圆括号不能带参数。
class TestInnerAnonymous
{
  
public static void main(String[] args)
  
{
     Object obj 
= new Outer().makeTheInner(47);
     System.out.println(
"Hello World" + obj.toString());
  }

}


class Outer
{
  
private int size = 5;
  
public Object makeTheInner(int localVar)
  
{
    
final int fianlLocalVar = 99;
    
return new Object()
                
{
                   
public String toString()
                     
{
                         
return ("InnerSize" + size + "finalLocalVar:" + finalLocalVar);
                     }

                }
;
  }

}
如果要使用构造函数的话
                  {...}
注意:匿名类属于方法内嵌类,不可以使用父类的成员

抽象类与接口的区别:
抽象类可以有非抽象的方法,有构造函数。
抽象类是它所有子类的公共属性的集合,抽象类不能被实例化,它的构造函数是提供给它的子类调用的。
被abstract所修饰的方法叫抽象方法,格式如下
abstract returnType abstractMethod([paramlist]);
抽象类中可以包含抽象方法,也可以不包含abstract方法。但是,一旦某个类中包含了抽象方法,则这个类必须声明为abstract类。即abstract方法必须位于abstract类中。
接口是方法和常量值得集合。
posted @ 2006-05-16 22:01 Tory 阅读(783) | 评论 (0)编辑 收藏

首先,更正一下,是只显示了28层,而非27.

下面用了递归,可以清楚的看到你所要创建的表格层数都创建了,只是到显示的时候,从第28层之后都不能显示出来而已.

至于为什么显示不来,我也不得而知.

点击下面的代码,查看结果:

 

<! DOCTYPE html PUBLIC  " -//W3C//DTD XHTML 1.0 Transitional//EN "   " http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd " >
< html xmlns = " http://www.w3.org/1999/xhtml " >
< head >
< meta http - equiv = " Content-Type "  content = " text/html; charset=utf-8 "   />
< title > Untitled Document </ title >
</ head >

< body >
</ body >
</ html >
< script >
var  n  =   40 ;
function  createTable(pI) {
var  oTable  =  document.createElement( " TABLE " );
 oTable.border 
=   1 ;
 oTable.width 
=   1000   -  pI;
 oTable.height 
=   1000   -  pI;
var  oTBody  =  document.createElement( " TBODY " );
var  oTr  =  document.createElement( " TR " );
var  oTd  =  document.createElement( " TD " );
oTd.innerHTML 
=  pI;

if (pI < n)
  oTd.appendChild(createTable(pI
+ 1 ));

oTr.appendChild(oTd);
oTBody.appendChild(oTr);
oTable.appendChild(oTBody);
document.body.appendChild(oTable);
alert(pI)
return  oTable;
}


createTable(
1 );
</ script >
posted @ 2006-05-16 19:02 Tory 阅读(270) | 评论 (0)编辑 收藏

2006年5月5日 #

These characteristics, which we cover in depth in Section 3.1 , include how those relationships are influenced by the following factors detailed in the same section:

  • Platform

  • Location

  • Protocols

  • Programming language

  • Invocation patterns

  • Security

  • Service versioning

  • Service model

  • Information model

  • Data format

Figure 3.1. The domains of SOA.


 

Enterprise services share some or all of these characteristics that impact what actions the service performs, how it does so, and whom it interacts with. These services can be reclassified in the SOA model and placed into new domains that describe what function they perform in the overall model. An analysis of the preceding list identifies at least four different domains of architecture, along with subdomains that influence where a service can exist and the function it performs. These domains and subdomains, discussed later in this chapter, are as follows:

  • Infrastructure services domain with subdomains

    • Utility business services

    • Service-level automation and orchestration

    • Resource virtualization

  • Middleware domain

  • Business services domain

  • Application services domain with subdomains

    • Application programming model subdomain

    • Off-the-shelf commercial software subdomain

    • Information management subdomain

It is essential to maintain a separation of concerns and domains. In an enterprise, these domains can have separate implementations using any permutation of packaged applications, custom applications, existing infrastructure, and external or outsourced services.

posted @ 2006-05-05 22:04 Tory 阅读(235) | 评论 (0)编辑 收藏

2006年5月3日 #

在实施SOA的过程中牢记以下特征:
* 可从企业外部访问
* 随时可用
* 粗粒度的服务接口
* 分级
* 松散耦合
* 可重用的服务
* 服务接口设计管理
* 标准化的服务接口
* 支持各种消息模式
* 精确定义的服务契约


引用别人的话"它不是一门技术,更不能把它刻录到光盘去卖什么的..它提供的是一种思想!就想OO思想一样!


IBM WebSphere Integration Developer, Version 6 software is Eclipse technology-based tooling designed to enable you to rapidly assemble business solutions based on a composite application development framework and using minimal programming skills.

Its graphically rich interface allows developers to create composite business applications by wiring service components with minimal skills and agnostic of underlying programming implementations. It has fully integrated testing, debug and deployment environment that allows you to easily deploy to WebSphere Process Server. Once deployed, you can dynamically change and adapt to changes with its rich features, such as business rules, selectors, and state machines.


WebSphere Process Server includes three layers:

   SOA core
   Supporting services
   Service components

Role resources matrix
Duration matrix
Availablity matrix
Decision probabilities

posted @ 2006-05-03 22:36 Tory 阅读(253) | 评论 (0)编辑 收藏

仅列出标题  下一页