`
jetway
  • 浏览: 485706 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
社区版块
存档分类
最新评论

将 Spring 和 Hibernate 与 WebSphere Application Server 一起使用

    博客分类:
  • java
阅读更多

引言

Spring Framework(通常称为 Spring)是一个开放源代码项目,目的是为了使 J2EE™ 环境更具可访问性。Spring 为简单 Java™ 对象提供框架,使这些对象可以通过包装类和 XML 配置使用 J2EE 容器。Spring 的目标是为这些项目提供显著的好处,提高这些项目的开发效率和运行时性能,同时改进测试覆盖率和应用程序质量。

Hibernate 是开放源代码持久性和查询框架,提供传统 Java 对象(Plain Old Java ObjectPOJO)到关系数据库表的对象-关系映射,以及数据查询和检索功能。

尽管许多组织感兴趣的是了解使用这些框架能够获得什么好处,但 IBM 希望让使用这些框架的客户知道,他们可以通过 WebSphere Application Server 以稳健和可靠的方式做到这一点。本文介绍这些框架如何与 WebSphere Application Server 一起使用,并介绍针对各种用例的最佳实践,以帮助您尽快开始使用 Spring Hibernate


使用 Spring

您可以点击如下链接,马上下载 WebSphere Application Server 软件 V7 版本,体验其为您带来的新特性及新功能。

更多关于 WebSphere Application Server 的技术资源,请参考:

通常将 Spring 描述为轻量级容器环境,但是将其描述为用于简化开发的框架可能更适当。Spring Framework Interface21 根据 Rod Johnson 发表的关于依赖项注入设计模式的出版物开发而成。Spring 可以在独立应用程序中使用,或与应用程序服务器一起使用。其主要概念是使用依赖项注入和面向方面的编程来简化和平稳地进行从开发到测试再到生产的转换。

涉及 Spring 的最常用场景之一是使用简单的 Java Bean 类配置并驱动业务逻辑。Spring 文档应该提供了使用 Spring Bean 构建应用程序的足够信息,其中没有提供任何特定于 WebSphere 的内容。以下部分将描述在 WebSphere Application Server 上使用 Spring 的一些使用场景。根据本文的建议开发的 Spring 应用程序应该能够毫无问题地在 WebSphere Application Server WebSphere Application Server Network Deployment 环境中执行。

除明确指出以外,本文提供的信息适用于所有平台上的 WebSphere Application Server 版本 6.0.2.x6.1.x 7.0.x

表示层注意事项

本部分介绍与在基于 Web 的表示层中使用 Spring 相关的注意事项。

  • Web MVC 框架

Spring Web MVC 框架很长时间以来一直是其他框架的替代框架。直接由 WebSphere Application Server 交付、使用和支持的 Web MVC 框架包括 JavaServer Faces (JSF) StrutsSpring 文档描述了如何将 Spring 与这些 Web 框架集成。尽管 WebSphere Application Server 支持使用上面的任何 MVC,但 IBM 仅为 WebSphere Application Server 附带的框架提供产品支持。

  • Portlet MVC 框架

Spring 还提供了一个 Portlet MVC 框架(该框架镜像 Spring Web MVC 框架),而且在 WebSphere Portal V6.0 WebSphere Application Server V6.1 Portlet 容器中运行。(有关 Spring Portlet 的示例集,请参见 Spring Portlet MVC。)在 WebSphere Application Server V6.1 Portlet 容器中运行 Portlet 需要创建附加的 Web 应用程序,以定义 Portlet 的布局和聚合。从 WebSphere Application Server 信息中心和文章 Portlet 容器介绍中可以获得关于如何使用 Portlet 聚合器标记库的信息。通常的做法是结合使用 JSF Portlet 进行呈现。关于如何将 SpringHibernateJSF WebSphere Portal 组合起来的信息,请参见使用 IBM WebSphere Portal 配置 Hibernate、Spring、Portlets 和 OpenInSessionViewFilter

数据访问注意事项

本部分介绍与访问事务中的数据的 Spring Bean 配置相关的注意事项。

Spring Framework 实际上使用一个容器管理层(在 J2EE 环境中委托给基础 J2EE 运行时)包装 Spring Bean。下面将介绍应如何配置 Spring Bean,以便 Spring Framework 可以正确地向 WebSphere Application Server 运行时做出委托并与之集成。

  • 访问 WebSphere Application Server 中配置的数据源

WebSphere Application Server 管理在应用程序服务器执行环境中使用的资源。需要访问诸如 JDBC 数据源等资源的 Spring 应用程序应该利用 WebSphere 管理的资源。为此,请执行以下步骤:

  •  
    1. 在开发过程中,应该使用资源引用配置 WAR 模块。例如:

<resource-ref>

        <res-ref-name>jdbc/springdb</res-ref-name>

        <res-type>javax.sql.DataSource</res-type>

        <res-auth>Container</res-auth>

        <res-sharing-scope>Shareable</res-sharing-scope>

</resource-ref>

 

  •  
    1. 对于 EJB JAR 文件,应该在需要访问数据源的每个 EJB 中声明同一资源引用。
    2. 然后在 Spring 应用程序配置中声明数据源代理 Bean,代理 Bean 引用 WebSphere 管理的资源提供者:

<bean id="wasDataSource"

    class="org.springframework.jndi.JndiObjectFactoryBean">

        <property name="jndiName"

               value="java:comp/env/jdbc/springdb"/>

        <property name="lookupOnStartup"

               value="false"/>

        <property name="cache"

               value="true"/>

        <property name="proxyInterface"

               value="javax.sql.DataSource"/>

</bean>

  •  
    1.  
    2. 通过此代理 Bean 访问数据源将会导致使用模块配置的引用查找数据源,从而能够由 WebSphere Application Server 正确管理。请注意,jndiName 属性值与使用资源引用中声明的资源引用名称连接的模式 java:comp/env/ 匹配。
    3. 或者,在 Spring 2.5 以后的版本中,可以使用 <j2ee:jndi-lookup/> 方法完成此匹配。请注意 jndiName 属性如何匹配资源引用中声明的资源引用名称与 resource-ref="true" 属性相结合的实际值:

<jee:jndi-lookup id=" wasDataSource "

        jndi-name="jdbc/springdb"

        cache="true"

        resource-ref="true"

        lookup-on-startup="false"

        proxy-interface="javax.sql.DataSource"/>

  •  
    1.  
    2. 然后,Spring 应用程序可以在适当情况下使用数据源代理 Bean
    3. 将应用程序部署到 WebSphere Application Server 时,必须以常规方式配置资源提供者和资源数据源,以便由 Spring 应用程序资源引用使用。在部署过程中,在模块的部署描述符中声明的资源引用将绑定到应用程序服务器配置的数据源。
  • 使用 JDBC 本机连接

当各种 JDBC 操作需要与本机 JDBC 资源交互时,Spring 可提供访问本机连接的机制。当在 JdbcTemplate 类上设置了 NativeJdbcExtractor 类时,Spring JdbcTemplate 类才可以利用此功能。设置 NativeJdbcExtractor 类后,当与 WebSphere Application Server 一起使用时,Spring 总是向下找到本机 JDBC 连接。这将忽略以下 WebSphere 服务质量功能和优点:

  •  
    • 连接处理跟踪和再关联
    • 连接共享
    • 参与事务
    • 连接池管理

这带来的另一个问题是 WebSphereNativeJdbcExtractor 类将依赖于内部 WebSphere 适配器类。这些内部类可能因 WebSphere Application Server 的版本而异,并且以后可能更改,从而破坏依赖于此功能的应用程序。

WebSphere Application Server 上不支持使用 NativeJdbcExtractor 类实现(例如 WebSphereNativeJdbcExtractor),您应避免需要使用该类的场景。替代方案是使用 WebSphere Application Server WSCallHelper 类来访问非标准供应商的数据源扩展。

WebSphere Application Server 为事务处理和管理与资源提供者的连接提供了一个稳健和可伸缩的环境。无论是否在使用全局事务,与 JDBCJMS Java Connector 资源适配器的连接均由 WebSphere Application Server 管理;甚至在缺少全局事务时,始终存在一个运行时上下文,在该上下文中可以访问所有资源提供者连接。WebSphere Application Server 将此运行时上下文称为本地事务容器 (LTC) 作用域;在缺少全局事务时始终存在一个 LTC,并且无论是存在全局事务还是 LTC,资源访问始终由运行时管理。为确保事务上下文管理的完整性,以便可以正确管理事务资源,WebSphere Application Server 不向 WebSphere Application Server 中部署的应用程序或应用程序框架公开 javax.transaction.TransactionManager 接口。

Spring 中,有许多方法可以驱动事务控制下的资源更新,这包括编程形式和声明形式。声明形式包括 Java Annotation XML 描述符形式。如果将 Spring 2.5 WebSphere Application Server V6.0.2.19 V6.1.0.9 或者更高版本一起使用,则可以利用对 Spring 的声明式事务模型的完全支持。Spring 2.5 有一个新的用于 WebSphere Application Server PlatformTransactionManager 类,名为 WebSphereUowTransactionManager。该类利用 WebSphere Application Server 的受支持 UOWManager 接口进行事务上下文管理。通过 WebSphere Application Server UOWManager 类管理事务划分可以确保在访问资源提供者时始终可以使用适当的全局事务或 LTC 上下文。不过,早期版本的 Spring 使用了内部 WebSphere 接口,以牺牲 Web EJB 容器功能为代价来管理资源,并且不支持由应用程序使用。这会使容器处于未知状态,从而有可能导致数据损坏。

Spring 2.5 或更高版本中的声明式事务划分在 WebSphere Application Server 中受支持,它使用下面的声明提供对 WebSphere 事务的支持:

<bean id="transactionManager"

        class="org.springframework.transaction.jta.WebSphereUowTransactionManager"/>

 

引用此声明的 Spring Bean 然后将使用标准 Spring 依赖项注入来使用事务支持,例如:

<bean id="someBean" class="some.class">

        <property name="transactionManager" >

               <ref bean="transactionManager"/>

        </property>

...

</bean>

<property name="transactionAttributes">

        <props>

               <prop key="*">PROPAGATION_REQUIRED</prop>

        </props>

        </property>

 

或者,在 Spring 2.5 以后的版本中,可以利用 Spring AspectJ 支持。在下面的示例中,可以将 <tx:advice/> 应用于应用程序的各个部分。这指示所有以“get”开头的方法都是 PROPAGATION_REQUIRED,并且所有以“set”开头的方法都是 PROPAGATION_REQUIRES_NEW。所有其他方法使用缺省事务设置。

<tx:advice id="txAdvice" transaction-manager="transactionManager">

   <tx:attributes>

      <tx:method name="get*" propagation="REQUIRED" read-only="true" />

      <tx:method name="set*" propagation="REQUIRES_NEW" />

      <tx:method name="*" />

   </tx:attributes>

</tx:advice>

 

<aop:config/> 标记将那些设置应用于类 MyService 中定义的任何已执行操作。

<aop:config>

   <aop:pointcut id="myServiceOperation"

      expression="execution(* sample.service.MyService.*(..))"/>

   <aop:advisor advice-ref="txAdvice"

      pointcut-ref="myServiceOperation"/>

</aop:config>

 

用于声明事务设置的另一种替代机制是使用基于 Spring 注释的事务支持。这要求使用 Java 5+,因此无法与 WebSphere Application Server V6.0.2.x 一起使用。

将以下内容添加到 Spring.xml 配置:

<tx:annotation-driven/>

然后应该使用 @Transactional 注释对需要事务属性的任何方法进行标记:

@Transactional(readOnly = true)

public String getUserName()

{ ...

 

请注意,只能将 @Transactional 注释用于注释公共方法。

WebSphereUowTransactionManager 支持每个 Spring 事务属性:

  •  
    • PROPAGATION_REQUIRED
    • PROPAGATION_SUPPORTS
    • PROPAGATION_MANDATORY
    • PROPAGATION_REQUIRES_NEW
    • PROPAGATION_NOT_SUPPORTED
    • PROPAGATION_NEVER

对于没有提供 org.springframework.transaction.jta.WebSphereUowTransactionManager 的早期 Spring 版本以及没有提供 com.ibm.wsspi.uow.UOWManager WebSphere Application Server V6.0.2.19 V6.1.0.9 之前的版本,WebSphere Application Server 中的事务支持通过以下 Spring 配置实现:

<bean id="transactionManager"

        class="org.springframework.transaction.jta.JtaTransactionManager">

               <property name="autodetectTransactionManager"value="false" />

</bean>

 

此配置支持一组受限制的事务属性,其中不包括 PROPAGATION_NOT_SUPPORTED PROPAGATION_REQUIRES_NEWSpring org.springframework.transaction.jta.WebSphereTransactionManagerFactoryBean 也宣称提供 PROPAGATION_NOT_SUPPORTED PROPAGATION_REQUIRES_NEW 功能,它使用不受支持的内部 WebSphere Application Server 接口,不应将其与 WebSphere Application Server 一起使用。

  • 使用 Spring JMS

与访问 JDBC 数据源类似,打算访问 JMS 目的地的 Spring 应用程序必须确保它们使用了 WebSphere 管理的 JMS 资源提供者。使用 Spring JndiObjectFactoryBean 作为 ConnectionFactory 代理的相同模式将确保可以正确地管理 JMS 资源。

对于 JMS 消息发送或同步 JMS 消息接收,可以使用 JMSTemplates。这包括通过 JNDI 和真正的动态解析使用 Spring 的动态目的地解析功能。

下面的示例演示了 ConnectionFactory 的资源引用配置。此引用在应用程序部署过程中映射为指向应用程序服务器的 JNDI 命名空间中存储的已配置托管 ConnectionFactoryConnectionFactory 是执行消息处理所必需的,并且应该将其注入 Spring JMSTemplate

<resource-ref>

      <res-ref-name>jms/myCF</res-ref-name>

      <res-type>javax.jms.ConnectionFactory</res-type>

      <res-auth>Container</res-auth>

      <res-sharing-scope>Shareable</res-sharing-scope>

</resource-ref>

 

现在应用程序中的 ConnectionFactory 有了已定义的 JNDI 名称,可以对其进行查找并将其注入 JMSTemplate

<jee:jndi-lookup id="jmsConnectionFactory" jndi-name=" jms/myCF "/>

 

<bean id="jmsQueueTemplate"

         class="org.springframework.jms.core.JmsTemplate">

  <property name="connectionFactory">

      <ref bean="jmsConnectionFactory"/>

   </property>

   <property name="destinationResolver">

      <ref bean="jmsDestResolver"/>

   </property>

    ...

</bean>

 

<!-- A dynamic resolver -->

<bean id="jmsDestResolver" class="

      org.springframework.jms.support.destination.DynamicDestinationResolver"/>

 

<!-- A JNDI resolver -->

<bean id="jmsDestResolver"

        class=" org.springframework.jms.support.destination.JndiDestinationResolver"/>

 

在运行时,JMSTemplate 可以基于目的地的 JNDI 名称(在应用程序资源引用中配置)或通过“动态解析”来基于 WebSphere Application Server 中配置的目的地的管理名称定位目的地;例如,对于绑定到 jms/myQueue JNDI 引用的 JMS myQueue 队列:

JNDI 解析:
jmsTemplate.send("java:comp/env/jms/myQueue", messageCreator);

动态解析:
jmsTemplate.send("myQueue", messageCreator);

作为对 J2EE 消息驱动 Bean (MDB) 的替代,Spring 提供了用于异步地处理入站 JMS 消息的消息驱动 POJO 模型。仅有一个 DefaultMessageListenerContainer 类将管理从 JMS 队列到已配置的 POJO 的消息,该 POJO 必须是 javax.jms.MessageListener 实现。

WebSphere Application Server 环境中,您还必须指定一个 WorkManagerTaskExecutor 类,这意味着 DefaultMessageListenerContainer 类将向服务器管理的线程池作出委托。正如上面描述过的,还应该通过 WebSphereUowTransactionManager 使用服务器的事务管理来配置 DefaultMessageListenerContainer

<bean id="messageListener" class="sample.ExampleMessageListener" />

 

   <bean id="msgListenerContainer"

      class="org.springframework.jms.listener.DefaultMessageListenerContainer">

      <property name="connectionFactory" ref="jmsConnectionFactory" />

      <property name="destination" ref="jmsQueue" />

      <property name="messageListener" ref="messageListener" />

      <property name="transactionManager" ref="transactionManager" />

      <property name="taskExecutor" ref="myTaskExecutor" />

   </bean>

 

   <bean id="myTaskExecutor"

      class="org.springframework.scheduling.commonj.WorkManagerTaskExecutor">

      <property name="workManagerName" value="wm/default" />

   </bean>

 

   <bean id="transactionManager"

      class="org.springframework.transaction.jta.WebSphereUowTransactionManager" />

 

   <jee:jndi-lookup id="jmsConnectionFactory" jndi-name="jms/CF1" />

 

   <jee:jndi-lookup id="jmsQueue" jndi-name="jms/jmsQueue" />

 

虽然可以使用此消息驱动 POJO 模型,但是在需要工作负载管理和/或高可用性的 WebSphere Application Server 配置中,建议直接使用 J2EE 消息驱动 Bean (MDB)。请注意,不支持任何其他 Spring JMS MessageListenerContainer 类型,因为它们可以启动非托管线程,而且还可能使用不应由 Java EE 环境中的应用程序调用的 JMS API

  • JPA Spring 一起使用

EJB 3.0 规范将 Java Persistence API (JPA) 定义为提供可移植持久 Java 实体的方法。WebSphere Application Server V7 WebSphere Application Server V6.1 EJB 3 功能包都提供了 EJB 3 JPA 的实现;还可以将 JPA Apache OpenJPA 实现与 WebSphere Application Server V6.1 一起使用(请参见参考资料)。将 Spring JPA 实现结合使用时,您应该直接使用 JPA,而不是使用 Spring JPA Helper 类(在 org.springframework.orm.jpa 包中)。

WebSphere Application Server V6.1 及更高版本支持 JPA 应用程序托管的实体管理器,该管理器可能是 JTA 或本地资源事务类型。JTA 实体管理器使用应用程序服务器的基础 JTA 事务支持,其事务划分可以使用上面描述的标准 J2EE 技术或 Spring 的声明式事务模型进行定义。

使用 JPA 的数据访问对象 (DAO) persistence.xml 打包在一起,后者为应用程序使用的 JPA EntityManager 定义持久性上下文。例如,可以按下面的方式设置用于 JTA 实体管理器(使用的数据源的 JNDI 名称为“java:comp/env/jdbc/springdb”)的 persistence.xml

<persistence

   xmlns="http://java.sun.com/xml/ns/persistence"

   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

   xsi:schemaLocation="http://java.sun.com/xml/ns/persistence

   http://java.sun.com/xml/ns/persistence/persistence_1_0.xsd" version="1.0">

        <persistence-unit name="default" transaction-type="JTA">

        <provider> org.apache.openjpa.persistence.PersistenceProviderImpl </provider>

        <jta-data-source> java:comp/env/jdbc/springdb </jta-data-source>

        <properties>

               <property name="openjpa.TransactionMode" value="managed" />

               <property name="openjpa.ConnectionFactoryMode"value="managed" />

               <property name="openjpa.jdbc.DBDictionary" value="db2" />

        </properties>

        </persistence-unit>

</persistence>

<br style

分享到:
评论

相关推荐

    spring+hibernate+web

    ### 使用Spring、Hibernate与WebSphere Application Server的知识点详解 #### 引言 Spring Framework 和 Hibernate 是两个非常重要的开源框架,在企业级应用开发中扮演着关键角色。Spring 主要用于简化 Java 开发,...

    Flex、Spring、Hibernate 集成

    其中,Adobe的**Flex** 是一个基于Flash的RIA技术平台,它不仅提供了强大的用户界面设计工具,还能够通过与**Spring** 和 **Hibernate** 这两个流行的Java开源框架集成,进一步增强应用的功能性和可维护性。...

    WebSphere6.1

    IBM WebSphere Application Server(简称 WebSphere)是一款先进的应用服务器,支持 Java 应用程序和服务的部署与运行。WebSphere 6.1 版本是 IBM 在 2008 年发布的产品,它提供了企业级的可靠性、可伸缩性和安全性...

    webshpere Application Server 最好的参考书

    WebSphere Application Server(WAS)是IBM提供的一款强大的企业级应用服务器,它在Java EE(Java Platform, Enterprise Edition)平台上运行,为开发和部署分布式应用程序提供了全面的支持。本指南将深入探讨WAS的...

    Struts Hibernate Ibatis Spring RAD WID

    -- Be familiar with Websphere Application Server, Familiar with IBM java development IDE such as Eclipse, RAD or WID -- Programming skills: Java, JSP, JavaScript, HTML, XML,Web Service,design ...

    ssh(structs,spring,hibernate)框架中的上传下载

     您可以使用Hibernate Middlegen、HIbernate Tools、Hibernate Syhchronizer等工具或手工的方式,编写Hibernate的领域对象和映射文件。其中对应T_FILE表的领域对象Tfile.java为:  代码 1 领域对象Tfile 1. ...

    WebSphere

    对于源码级别的操作,WebSphere支持Java标准版(Java EE)的API,开发者可以利用开源框架(如Spring、Hibernate)来编写源码。 **五、文档资源** 提供的“websphere使用说明书.doc”文档,应当包含了详细的安装...

    Windows下WebSphere安装手册

    以上步骤完成后,你应能成功在Windows环境下搭建一个基于WebSphere 6.1和MyEclipse的开发与运行环境,支持Struts2+Spring2+Hibernate3的集成。记得在实际操作中根据你的具体需求和环境调整相关配置。

    WebSphere部署war项目

    WebSphere 6.1是IBM提供的一款企业级应用服务器,支持多种Java EE规范,包括Struts2、Spring2和Hibernate3等流行的开源框架。以下将详细阐述在WebSphere 6.1环境下,如何配置MyEclipse 6.0.0.M1以实现Struts2+Spring...

    IBM Rational Application Developer 7.5 License

    2. **WebSphere应用服务器集成**:由于IBM Rational Application Developer与IBM WebSphere Application Server紧密集成,用户可以直接在IDE内管理、部署和调试WebSphere应用,简化了应用生命周期管理流程。...

    Spring-Reference_zh_CN(Spring中文参考手册)

    1. 简介 1.1. 概览 1.2. 使用场景 2. Spring 2.0 的新特性 2.1. 简介 2.2. 控制反转(IoC)容器 2.2.1. 更简单的XML配置 2.2.2. 新的bean作用域 2.2.3. 可扩展的XML编写 ... 将 Spring Beans 注入到 Tapestry ...

    Spring 2.0 开发参考手册

    17. 使用Spring进行远程访问与Web服务 17.1. 简介 17.2. 使用RMI暴露服务 17.2.1. 使用 RmiServiceExporter 暴露服务 17.2.2. 在客户端链接服务 17.3. 使用Hessian或者Burlap通过HTTP远程调用服务 17.3.1. 为...

    \websphere部署EJB3.docx

    接下来,创建一个动态Web项目,如`WEB`,它可以包含Struts、Hibernate、Spring等框架。在创建时,确保选择已创建的企业应用项目`WEBEJB3`,这样Web项目就会成为整体应用的一部分。 3. **创建EJB项目**: 创建一个...

    Spring中文帮助文档

    2.6.4. 将Spring 应用程序上下文部署为JCA adapter 2.6.5. 计划任务 2.6.6. 对Java 5 (Tiger) 支持 2.7. 移植到Spring 2.5 2.7.1. 改变 2.8. 更新的样例应用 2.9. 改进的文档 I. 核心技术 3. IoC(控制反转)...

    Spring API

    2.6.4. 将Spring 应用程序上下文部署为JCA adapter 2.6.5. 计划任务 2.6.6. 对Java 5 (Tiger) 支持 2.7. 移植到Spring 2.5 2.7.1. 改变 2.8. 更新的样例应用 2.9. 改进的文档 I. 核心技术 3. IoC(控制反转)...

    spring chm文档

    17. 使用Spring进行远程访问与Web服务 17.1. 简介 17.2. 使用RMI暴露服务 17.2.1. 使用 RmiServiceExporter 暴露服务 17.2.2. 在客户端链接服务 17.3. 使用Hessian或者Burlap通过HTTP远程调用服务 17.3.1. 为...

    webpsphere教程合集,对你肯定有帮助

    WebSphere可以与其他IBM产品如DB2数据库、MQ消息队列、Tivoli监控工具等无缝集成,同时也能与非IBM技术如Spring框架、Hibernate ORM等配合使用。 9. **WebSphere Liberty Profile** Liberty是WebSphere的一种轻量...

    JAVA和J2EE的学习之路

    WebSphere Application Server Community Edition(WAS CE)是WAS的轻量级版本,免费且基于Apache Geronimo,适合初学者学习和小型项目。 WAS有不同的版本,包括Express、Base和Network Deployment。Express和Base...

Global site tag (gtag.js) - Google Analytics