走在架构师的大道上 Jack.Wang's home

Java, C++, linux c, C#.net 技术,软件架构,领域建模,IT 项目管理 Dict.CN 在线词典, 英语学习, 在线翻译

BlogJava 首页 新随笔 联系 聚合 管理
  195 Posts :: 3 Stories :: 728 Comments :: 0 Trackbacks

配置数据库资源

大多数企业应用程序使用关系数据库。Community Edition 使用开放源代码的 TranQL 项目作为其数据库持久性引擎。Community Edition 提供一般资源适配器来使 JDBC 驱动程序可以作为 J2EE Connection Architecture (J2CA) 资源使用,并提供特定于 IBM Cloudscape 供应商的资源适配器来使 Cloudscape 可以作为 Tranql 的 J2CA 资源使用。作为一种增值,Community Edition 还提供一个 WebSphere 嵌入式资源适配器来使 Microsoft SQL 2000 服务器可以作为 J2CA 资源使用。了解 Community Edition 存储库中的下列文件将有助于您为数据源选择正确的资源适配器以及制定数据库部署计划:

  • repository\tranql\rars\
    • tranql-connector-1.0.rar:这是 TranQL Generic JDBC Resource Adapter,使用该资源适配器,可以通过一般 JDBC 连接来访问 SQL 数据库。连接是使用配置的 JDBC URL、用户名和密码从 java.sql.Driver 获得的。因为此接口不提供对 XAResource 的访问,所以只支持 Local 事务。
    • tranql-connector-derby-client-local-1.0.rar:这是用于 IBM Cloudscape 的 TranQL Client Local Transaction Resource Adapter。该资源适配器提供对具有本地事务支持的远程 IBM Cloudscape 数据库的访问。
    • tranql-connector-derby-client-xa-1.0.rar:这是用于 IBM Cloudscape 的 TranQL Client XA Transaction Resource Adapter。该资源适配器提供对具有 XA 事务支持的远程 IBM Cloudscape 数据库的访问。
    • tranql-connector-derby-embed-local-1.0.rar:这是用于 IBM Cloudscape 的 TranQL Embedded Local Resource Adapter。该资源适配器提供对具有本地事务支持的嵌入式 IBM Cloudscape 数据库的访问。
    • tranql-connector-derby-embed-xa-1.0.rar:这是用于 IBM Cloudscape 的 TranQL Embedded XA Resource Adapter。该资源适配器提供对具有 XA 事务支持的嵌入式 IBM Cloudscape 数据库的访问。
    • tranql-connector-websphere-embed-local-1.0.rar:这是用于 Microsoft SQL 2000 服务器的 TranQL IBM WebSphere Connect JDBC Driver Embedded Local Resource Adapter。该资源适配器提供对具有本地事务支持的 Microsoft SQL 2000 服务器数据库的访问。
    • tranql-connector-websphere-embed-xa-1.0.rar:这是用于 Microsoft SQL 2000 服务器的 TranQL IBM WebSphere Connect JDBC Driver Embedded XA Resource Adapter。该资源适配器提供对具有 XA 事务支持的 Microsoft SQL 2000 服务器数据库的访问。
    • 上面提到的所有 TranQL rar 文件都包含在 tranql-1.1.ibm.jar 文件中,该文件是数据库持久性引擎。
  • repository\org.apache.derby\jars:这个目录包含 IBM Cloudscape 数据库服务器 jar 文件。
  • repository\websphere\jars:这个目录包含用于 Microsoft SQL 2000 数据库服务器的 WebSphere 嵌入式 JDBC 驱动程序。

您可能想知道为什么尽管 Community Edition 支持前面提到的 Oracle、DB2 或 MySQL 数据库,但是却没有看到特定于这些数据库的任何资源适配器。这是因为用于 Oracle、DB2 和 MySQL 数据库服务器的 JDBC 驱动程序并没有包含在 Community Edition 安装镜像中。相反,将使用一般资源适配器 (tranql-connector-1.0.rar) 来部署用于 Oracle、DB2 和 MySQL 数据库服务器的数据源,并将必需的特定于数据库的类复制到 Community Edition 存储库中。与此有关的更多信息将在本文后面介绍。

数据库配置池类型

Community Edition 支持下列三种数据库配置池类型。您可以确定您的 J2EE 应用程序需要哪种数据库配置池类型。

  1. 服务器范围的数据源:它用于在服务器上运行的所有应用程序。Community Edition 提供的 EMPdemo 示例使用该服务器范围的数据源。
  2. 应用程序范围的数据源:它用于同一个应用程序的一个或多个模块。
  3. 模块范围的数据源:它只用于应用程序中的某个特定模块。Community Edition 提供的 daytrader 示例使用该模块范围的数据源。

配置数据库池

不管您决定使用哪种数据库配置池类型,您都需要制定一个数据库池部署计划。在数据库池部署计划中,您可以指定数据源配置 ID、其父 ID、依赖项和资源适配器配置信息,例如数据源名称、池大小的最小值和最大值。通过使用 EMPdemo 示例提供的数据库池部署计划,我们将向您介绍如何理解和修改此计划以制定自己的数据库部署计划。

  • 定义数据源配置 ID 和父 ID:数据库部署计划的下列部分指定 configId,对于 Community Edition 服务器实例,它必须是唯一的。如果在部署数据源时父 ID(parentId 的值)没有运行,则部署工具会首先启动该父 ID 以确保其可用。在 EMPdemo 示例中,数据库部署计划的这一部分对不同的数据库服务器来说是一样的(清单 1)。
    清单 1:EMPdemo Cloudscape 数据库池部署计划(第 I 部分)

    <?xml version="1.0"?>
    <connector xmlns="http://geronimo.apache.org/xml/ns/j2ee/connector-1.0"
    configId="EmployeeDatasource" parentId="org/apache/geronimo/Server">

  • 定义依赖元素:dependency 元素定义所有数据源依赖项及其相对于 Community Edition 存储库的相对路径(清单 2)。IBM Cloudscape 数据库服务器及其特定于供应商的 tranql 资源适配器是随 Community Edition 一起提供的,所以您不必担心要将 jar 文件复制到存储库中。通过将它们指定为依赖项,您可以免于将它们包含在自己的应用程序中。
    清单 2:EMPdemo Cloudscape 数据库池部署计划(第 II 部分)

    <dependency>
    <uri>org.apache.derby/jars/derby-10.1.ibm.jar</uri>
    </dependency>
    <dependency>s
    <uri>org.apache.derby/jars/derbynet-10.1.ibm.jar</uri>
    </dependency>

    正如前面提到的,Community Edition 也包含用于 Microsoft SQL 2000 服务器的 WebSphere 嵌入式 Tranql 资源适配器和 WebSphere 嵌入式类型 4 JDBC 驱动程序(jar 文件在 repository\websphere\jars 目录中)。根据这一事实,您可以提供以下访问 Microsoft SQL 2000 服务器的数据源的依赖元素(清单 3)。
    清单 3:EMPdemo Microsoft SQL 数据库池部署计划(第 II 部分)

    <dependency>
    <uri>websphere/jars/base-3.5.11.jar</uri>
    </dependency>
    <dependency>
    <uri>websphere/jars/util-3.5.11.jar</uri>
    </dependency>
    <dependency>
    <uri>websphere/jars/sqlserver-3.5.11.jar</uri>
    </dependency>

    如果您要为 Oracle、DB2 或 MySQL 服务器构建 dependency 元素,则可以遵循相同的模式。但是,您需要在 Community Edition 存储库中创建目录和子目录,将 JDBC 驱动程序 jar 文件从数据库服务器复制到新建的目录中,并在尝试部署数据库部署计划之前在 uri 依赖元素中指定该 jar 文件及其路径。
  • 配置资源适配器
    • IBM Cloudscape 数据库:配置用于 IBM Cloudscape 的资源适配器非常简单,因为 Community Edition 已经提供了特定于 Cloudscape 的资源适配器。您不需要输入 JDBC 驱动程序信息。如果您将 CreateDatabase 属性设置为 True,则也不需要事先创建数据库。如果您利用下面的示例,则只需要修改 nameUserNamePasswordDatabaseNameCreateDatabase 元素并配置数据库池,这样就可以构建自己的用于 Cloudscape 的资源适配器配置(清单 4)。name 元素定义其他模块将用于引用此连接池的名称。它在您定义的数据库池范围内必须是唯一的。例如,jdbc/EmployeeDatasource 在服务器范围内必须是唯一的,因为该配置用于服务器范围的数据源。您还需要指定 nameUserNamePasswordDatabaseNameCreateDatabase 元素。
      max-size 元素定义允许的最大并发连接数。min-size 元素定义允许的最小并发连接数。blocking-timeout-milliseconds 元素定义在从池中获取连接时等待的毫秒数,此后将放弃连接。idle-timeout-minutes 元素定义在连接关闭并从池中删除之前可以保持空闲状态的分钟数。
      您可能还想知道为什么将 global-jndi-name 元素注释掉了。这是因为在尝试从 J2EE 应用程序客户端连接到数据源时才使用该元素。EMPdemo 示例中没有 J2EE 应用程序客户端。有关 Cloudscape 资源适配器的详细信息,请参见 tranql-connector-derby-client-local-1.0.rartranql-connector-derby-client-xa-1.0.rartranql-connector-derby-embed-local-1.0.rartranql-connector-derby-embed-xa-1.0.rar 文件中的 ra.xml 文件。
      清单 4:EMPdemo Cloudscape 数据库池部署计划(第 III 部分)
       <resourceadapter>
      <outbound-resourceadapter>
      <connection-definition>
      <connectionfactory-interface>javax.sql.DataSource
      </connectionfactory-interface>
      <connectiondefinition-instance>
      <name>jdbc/EmployeeDatasource</name>
      <config-property-setting name="UserName">
      </config-property-setting>
      <config-property-setting name="Password">
      </config-property-setting>
      <config-property-setting name="DatabaseName">Employee
      </config-property-setting>
      <config-property-setting name="CreateDatabase">true
      </config-property-setting>
      <connectionmanager>
      <xa-transaction>
      <transaction-caching/>
      </xa-transaction>
      <single-pool>
      <max-size>5</max-size>
      <min-size>0</min-size>
      <blocking-timeout-milliseconds>5000
      </blocking-timeout-milliseconds>
      <idle-timeout-minutes>15</idle-timeout-minutes>
      <match-one/>
      </single-pool>
      </connectionmanager>
      <!--global-jndi-name>EmployeeDatasource</global-jndi-name-->
      </connectiondefinition-instance>
      </connection-definition>
      </outbound-resourceadapter>
      </resourceadapter>
      </connector>

    • Oracle 数据库:正如前面提到的,Community Edition 提供了特定于 IBM Cloudscape 和 Microsoft SQL Server 2000 的资源适配器。对于 Oracle、DB2 或 MySQL 数据库,您需要使用一般资源适配器,它允许您为 JDBC 驱动程序指定 Driver 和 ConnectionURL(清单 5)。有关一般资源适配器的详细信息,请参见 tranql-connector-1.0.rar 文件中的 ra.xml 文件。
      清单 5:EMPdemo Oracle 数据库资源适配器配置
       ...
      <config-property-setting name="UserName">wasce</config-property-setting>
      <config-property-setting name="Password">password</config-property-setting>
      <config-property-setting name="Driver">oracle.jdbc.driver.OracleDriver</
      config-property-setting>
      <config-property-setting name="ConnectionURL">jdbc:oracle:thin:
      @oracleServer.ibm.com:1521:orcl</config-property-setting>
      ...

    • IBM DB2 数据库:IBM DB2 数据库资源适配器配置与 Oracle 相同,唯一不同之处在于需要指定特定于 DB2UserNamePasswordDriverConnectionURL 元素(清单 6)。
      清单 6:Daytrader DB2 数据库资源适配器配置
       ...
      <config-property-setting name="UserName">db2inst1</config-property-setting>
      <config-property-setting name="Password">password</config-property-setting>
      <config-property-setting name="Driver">com.ibm.db2.jcc.DB2Driver</config-property-setting>
      <config-property-setting name="ConnectionURL">jdbc:db2://db2.raleigh.ibm.com:50001/tradedb
      </config-property-setting>
      ...

    • Microsoft SQL 2000 服务器:作为 Apache Geronimo 的一种增值,Community Edition 提供了用于 Microsoft SQL 2000 服务器的 WebSphere 嵌入式 Tranql 资源适配器,它为您处理 DriverConnectionURL 信息,所以您只需要指定 ServerName 和 DatabaseName(清单 7)。如果您的 SQL Server 在不同于缺省端口 (1433) 的其他端口上运行,则可以在 DatabaseName 元素之后指定 PortNumber 属性。有关资源适配器的详细信息,请参见 tranql-connector-websphere-embed-local-1.0.rartranql-connector-websphere-embed-xa-1.0.rar 文件中的 ra.xml 文件。
      清单 7:EMPdemo Microsoft SQL 数据库资源适配器配置
       ...
      <config-property-setting name="UserName">wasce</config-property-setting>
      <config-property-setting name="Password">password</config-property-setting>
      <config-property-setting name="ServerName">servername.ibm.com</config-property-setting>
      <config-property-setting name="DatabaseName">wascedb</config-property-setting>
      ...

部署和修改数据库池

部署数据库池:您已经了解了如何制定数据库部署计划,以及对于不同的数据库服务器应该使用什么资源适配器。现在,我们来演练如何在 Community Edition 服务器上使用 bin 目录中的部署工具来部署数据库池(清单 8)。
清单 8:部署 EMPdemo Cloudscape 数据源

 deploy.[bat|sh] --user system --password manager deploy ..\repository\tranql\rars\
tranql-connector-derby-embed-xa-1.0.rar Cloudscape-db-plan.xml

在运行部署命令的命令窗口中,您将看到一个指示数据库池是否已经部署成功的输出。必要时替换管理员用户名和密码。如果您想要使用其他资源适配器,则可以用您选择的资源适配器来替换上面的 rar 文件。例如,如果您部署 EMPdemo Oracle 数据库,则将 tranql-connector-derby-embed-xa-1.0.rar 替换为 tranql-connector-1.0.rar,将 Cloudscape-db-plan 替换为 EMPdemo Oracle 数据库部署计划 (oracle-db-plan.xml)。

修改数据库池:该部署工具并没有提供修改命令。要修改数据库池,您需要取消部署该数据库池然后再部署它。

使用数据库池

要使用您刚部署的数据库池,请定义 Apache Geronimo 部署计划中的特定资源引用来引用它(清单 9)。您还需要在 web.xml 中声明该资源引用,并在应用程序代码中通过 JNDI 查找数据库池。有关详细信息,可以查看 EMPdemo home 目录中的 src\webapp\WEB-INF\web.xmlsrc\webapp\jsp\EMPdemo.jsp 文件。
清单 9:EMPdemo 部署计划中的 resource-ref 元素

 <resource-ref>
<ref-name>jdbc/DataSource</ref-name>
<resource-link>jdbc/EmployeeDatasource</resource-link>
</resource-ref>

配置 Java Message Service

Java Message Service (JMS) 支持在不同的应用程序组件之间发送消息,即使在分发时也如此。消息驱动 Bean 使用 JMS 来接收消息,然后可能根据这些消息来采取某种操作。

ActiveMQ

Community Edition 中的 JMS 支持是由 ActiveMQ 提供的。ActiveMQ 是一个 JMS 1.1 提供程序,它完全支持遵循 J2EE 1.4 的服务器,包括 Community Edition。它还包含一个 Java Connector Architecture (JCA) 1.5 资源适配器,该资源适配器允许应用服务器连接到池、管理事务和控制连接器安全性。对 JMS 资源的访问是由遵循 ActiveMQ JCA 的资源适配器提供的。目前,ActiveMQ 是唯一已知可以用于 Community Edition 的 JMS 提供程序。

JMS 消息代理

ActiveMQ 服务器(或消息代理)在缺省情况下是在 Community Edition 服务器启动时启动的。其配置 (org/apache/geronimo/ActiveMQServer) 是在 system-activemq-plan.xml(可以在 wasce_install_root/doc/plan 目录中找到)中定义的。此配置包括两个传输:一个在端口 61616 上运行的 TCP 传输和一个在相同 JVM 上运行的客户端的直接传输(清单 10)。ActiveMQ 支持的其他传输包括 SSL、NIO、UDP、多播、JGroup 和 JXTA 传输。
清单 10:在 system-activemq-plan.xml 中定义的传输


<gbean gbeanName="geronimo.server:J2EEApplication=null,
J2EEModule=org/apache/geronimo/ActiveMQServer,J2EEServer=geronimo,
j2eeType=JMSConnector,broker=ActiveMQ,name=ActiveMQ.tcp.default"
class="org.activemq.gbean.ActiveMQConnectorGBean">
<attribute name="protocol">tcp</attribute>
<attribute name="host">0.0.0.0</attribute>
<attribute name="port">61616</attribute>
<reference name="activeMQContainer">
<gbean-name>geronimo.server:j2eeType=JMSServer,name=ActiveMQ,*
</gbean-name></reference>
</gbean>
<gbean gbeanName="geronimo.server:J2EEApplication=null,
J2EEModule=org/apache/geronimo/ActiveMQServer,J2EEServer=geronimo,j2eeType=JMSConnector,
broker=ActiveMQ,name=ActiveMQ.vm.localhost" class="org.activemq.gbean.ActiveMQConnectorGBean">
<attribute name="protocol">vm</attribute>
<attribute name="host">localhost</attribute>
<attribute name="port">-1</attribute>
<reference name="activeMQContainer">
<gbean-name>geronimo.server:j2eeType=JMSServer,name=ActiveMQ,*
</gbean-name></reference>
</gbean>

消息代理配置的建议更改方式是使用 config.xml 来配置正确的属性。有关使用 config.xml 来配置服务器属性的更多信息,请参见第 1 部分。问题在于,在实际操作中很难确定哪些是正确的 gbean 属性以及它们是否是可管理的。另外,建议不要重新部署 system-activemq-plan.xml,因为这种方式以后会导致问题的出现。如果您知道属性名称(以及它们是否可管理),则可以通过编辑 config.xml 来更改这些计划,然后重新部署它们。

配置 JMS 资源

消息代理仅在有配置目标时才有用。在 Community Edition 中创建和配置这些资源意味着部署一个带有如何与消息代理通信的信息的资源适配器实例。要获得示例,请查看 system-jms-plan.xml(可以在 wasce_install_root/doc/plan 目录中找到)。此计划将创建一个资源适配器实例和一个连接工厂,后者是创建供内部使用的两个队列(MDBTransferBeanOutQueue 和 SendReceiveQueue)所需要的(清单 11)。
清单 11:system-jms-plan.xml 中定义的连接器


<connector xmlns="http://geronimo.apache.org/xml/ns/j2ee/connector-1.0"
configId="org/apache/geronimo/SystemJMS"
parentId="org/apache/geronimo/ActiveMQServer">
<resourceadapter>
<resourceadapter-instance>
<resourceadapter-name>ActiveMQ RA</resourceadapter-name>
<config-property-setting name="ServerUrl"
>tcp://0.0.0.0:61616</config-property-setting>
...
</resourceadapter-instance>
...
</resourceadapter>
...
<adminobject>
<adminobject-interface>javax.jms.Queue</adminobject-interface>
<adminobject-class>org.codehaus.activemq.message.ActiveMQQueue
</adminobject-class>
<adminobject-instance>
<message-destination-name>SendReceiveQueue</message-destination-name>
<config-property-setting name="PhysicalName"
>SendReceiveQueue</config-property-setting>
</adminobject-instance>
</adminobject>
</connector>

要创建自己的资源适配器实例,您可以从 system-jms-plan.xml 计划复制连接器元素,为其提供自己的 configId,并用自己的队列和主题来替换其队列。将连接器元素复制到哪里取决于您想让连接器实例拥有的作用域。您可以将资源适配器定义和部署为对所有其他模块可见的独立连接器,方法是将其放在自己的计划中并用对 activemq rar 文件的引用来部署它:


deploy.[bat|sh] deploy my-jms-plan.xml ..\repository\activemq\rars\activemq-ra-3.2-M1.ibm.rar

另一种选择是在应用程序或模块范围内创建资源适配器实例。

dayTrader 示例应用程序是一个拥有自己的资源适配器实例的应用程序示例。它引用一个队列 (TradeBrokerQueue) 和一个主题 (TradeStreamerTopic)。这些资源的定义可以在 daytrader-plan.xml 中的一个 ext-module 元素内找到(清单 12)。通过 ext-module 元素 dayTrader,您可以使用现有的 Active MQ 连接器副本,而不必将其包含在应用程序中。
清单 12:dayTrader 的 JMS 资源使用现有的 Active MQ 连接器副本


<ext-module>
<connector>TradeJMS</connector>
<external-path>activemq/rars/activemq-ra-3.2-M1.ibm.rar</external-path>
<connector
xmlns="http://geronimo.apache.org/xml/ns/j2ee/connector"
xmlns:naming="http://geronimo.apache.org/xml/ns/naming"
configId="TradeJMS"
parentId="TradeDataSource">
...
</connector>
</ext-module>

system-jms-plan.xml 中的资源适配器实例和 daytrader-plan.xml 中的资源适配器实例都是使用相同的信息配置的:如何连接到 JMS 服务器、在创建新的资源时队列和主题连接工厂应该使用什么设置,以及对队列和主题的引用。这些与您在配置自己的资源适配器实例时需要提供的信息是相同的。

该连接器中的 adminobject 元素的作用在于将应用程序的 J2EE 描述符中声明的消息目的地引用与真正的物理目的地连接起来。例如,在 daytrader 的 ejb-jar.xml 文件中声明了用于 TradeBrokerQueueTradeStreamerStopicmessage-destination-ref 元素(清单 13)。
清单 13:ejb-jar.xml 中 dayTrader 的消息目的地引用


<message-destination-ref>
<message-destination-ref-name>jms/TradeBrokerQueue</message-destination-ref-name>
<message-destination-type>javax.jms.Queue</message-destination-type>
<message-destination-usage>Produces</message-destination-usage>
<message-destination-link>TradeBrokerQueue</message-destination-link>
</message-destination-ref>
<message-destination-ref>
<message-destination-ref-name>jms/TradeStreamerTopic</message-destination-ref-name>
<message-destination-type>javax.jms.Topic</message-destination-type>
<message-destination-usage>Produces</message-destination-usage>
<message-destination-link>TradeStreamerTopic</message-destination-link>
</message-destination-ref>

因为 adminobject 元素只在消息目的地引用与物理目的地之间映射,所以它们可以在多个位置建立映射。dayTrader 的 J2EE 应用程序客户端 (tradeStreamerAppclient) 也有一个资源适配器实例,它知道如何与 Community Edition 服务器进行通信,只要该服务器可以通过指定的 serverUrl 访问即可。在本例中,它为 tcp://localhost:61616。此客户端也有一个 adminobject 元素,该元素将 TradeStreamerTopic 引用映射到其真正的目的地。

其他有用的资源

下一部分为您提供其他资源。

配置 SSL

Community Edition 支持使用安全套接字层 (SSL) 来保护使用 HTTPS 协议访问的 Web 资源。Enterprise JavaBeans 的 SSL 支持还不可用。缺省情况下,Community Edition 在端口 8443 上启动 HTTPS 连接器来访问 Web 应用程序。此初始配置使用了一个密钥存储,您可以将其用于测试,但不能将其用于生产环境。由于 Community Edition 的每个副本都分发相同的密钥存储,因此不再认为该密钥是机密的。如果您需要更改初始配置、现有的密钥存储,或者可信的实体,则最值得参考的资料是 Community Edition 文档。相关部分包括:

  • Configuring an HTTPS connector
  • Managing SSL certificates
  • Managing trust

用 LDAP 配置 Community Edition

Community Edition 支持对目录服务器进行 Lightweight Directory Access Protocol (LDAP) 身份验证。您既可以使用 IBM LDAP 服务器,也可以使用 Apache LDAP Directory。不管您选择哪种 LDAP 服务器,都需要首先对其进行安装和设置,因为 Community Edition 不提供任何 LDAP 服务器。您还需要制定一个特定于 Community Edition 的 LDAP 安全领域计划,它通过将登录模块配置连接到该领域来定义 GenericSecurityRealm 的名称及其身份验证策略。有关此主题的更多信息,请参阅 Configuring Apache LDAP Directory。

配置 CORBA over IIOP

Common Object Request Broker Architecture (CORBA) 是一个与供应商无关的体系结构和基础设施,它允许计算机应用程序通过网络一起工作。Community Edition 同时为 Sun® 和 IBM JDK/JRE 提供 CORBA 支持。如果您的应用程序将 CORBA 用于 IBM JDK/JRE,请确保您有支持的 JDK/JRE ifix,它们在产品文档中有记录。有关 CORBA 配置的更多信息,请参阅 Forge ahead with Geronimo CORBA interoperability。





本博客为学习交流用,凡未注明引用的均为本人作品,转载请注明出处,如有版权问题请及时通知。由于博客时间仓促,错误之处敬请谅解,有任何意见可给我留言,愿共同学习进步。
posted on 2008-01-21 19:06 Jack.Wang 阅读(2294) 评论(1)  编辑  收藏 所属分类: 开发技术

Feedback

# re: WASCE (基于geronimo ) 配置 2009-11-23 11:19 noober
3x very much for doing this,I got much benefit from u.
  回复  更多评论
  


只有注册用户登录后才能发表评论。


网站导航: