应用程序互操作性:Microsoft .NET 和 J2EE

18 篇文章 0 订阅

Microsoft Corporation

摘要:带给您可用的,关于如何确保基于 J2EE 的企业级应用程序与基于 Microsoft.NET 的组件和谐工作及其相反过程的最佳信息。在一个企业环境中,如果您是一个负责实现这两个平台之间互用性的开发人员,那么本书正适合您阅读。

*
本页内容
谁应该读这本书谁应该读这本书
如何使用本书如何使用本书
什么是 Microsoft .NET?什么是 Microsoft .NET?
Java 2 Enterprise Edition 是什么?Java 2 Enterprise Edition 是什么?
确认互用性的业务需求确认互用性的业务需求
定义互用性 定义互用性
示例应用程序简介示例应用程序简介
小结小结
参考资料参考资料

欢迎阅读《应用程序的互用性:Microsoft .NET 和 J2EE》。本书带给您可用的关于如何确保基于 Java 2 Platform, Enterprise Edition (J2EE) 的企业级应用程序与基于 Microsoft.NET 的组件和谐工作及其相反过程的最佳信息。在一个企业环境中,如果您是一个负责实现这两个平台之间互用性的开发人员,那么本书正适合您阅读。

本书中的信息兼具实用性和规范性。本书并不详细讨论各种可能的互用性技术问题,而是关注三种最可能的情况,并且说明如何解决这些特定的问题。如果您要更深层地探讨这些资料背后的概念,请查阅以下资源,例如 Simon Guest 的 Microsoft .NET and J2EE Interoperability Toolkit,(Microsoft PressISBN 0-7356-1922-0)一书。

焦点更多地集中在企业或数据中心的环境上,它们的可伸缩性、吞吐量、可靠性和安全性是主要的运行要求。本书无意成为一本如何编写 .NET 或 J2EE 应用程序的手册,而是关注在尽量减少对运行有效性的损害的同时如何使这些组件共同工作。

本书包括在该领域上工作的顾问和互用性解决方案的早期实现者提供的资料。它包含与 J2EE 组件一起运行 Microsoft .Net 应用程序的当前最好的实践。我们希望您喜欢读本书,并且希望您在本书中找到有帮助的、能够增长见识的和感兴趣的材料。

谁应该读这本书

本书面向负责创建和实现基于 Microsoft .NET 或者 J2EE 的企业级业务应用程序、并且需要在两个平台上实现互用性的开发人员。

前提条件

因为本书面向两个读者群,所以对每个读者群来说有不同的前提条件:

针对 .NET 开发人员的部分假定读者了解分布式应用程序的开发过程并且精通 Microsoft Visual Studio?.NET 编程工具。因为示例应用程序是用 C# (C Sharp) 编写的,所以具备该语言的开发经验是基本的要求。具有 .NET 框架 SDK 和MSDN? Library 的开发经验也是有益的。

针对 Java 开发人员的部分假设他们熟悉 Java 编程方法和工具,尤其是 Enterprise Java Beans(EJB) 和 Java API(例如:Java 命名和目录接口 (JNDI) 和 Java 消息服务 (JMS))。

无论您是一个 .NET 开发人员还是一个 Java 开发人员,对其他平台的一个正确了解将是有益的,这使您能理解两个平台间的互用性技术。

两个读者群都需要熟悉跨平台开放标准,例如:可扩展标记语言 (XML) 的语法和方法、SOAP、Web 服务描述语言 (WSDL) 和 TCP/IP。本书还假设您了解分布式企业应用程序概念,例如:多层体系结构、缓存、异步消息处理、请求路由和缓冲。对于 .NET 开发人员, 您可以在 MSDN 的 Application Architecture for .NET: Designing Applications and Services 中找到该信息;而对于 Java 的开发人员,同样的信息可以在 Sun 的 Web 站点上获得。更多详细信息,请参阅本章结尾处的参考部分。

文档约定

本书使用的样式约定和术语如表 1.1 所示。

表 1.1:文档约定
元素含义

粗体

完全按照显示内容键入的字符(包括命令和开关)。编程元素,例如:方法、函数、数据类型和数据结构以粗体出现(除了代码示例的部分,有时它们使用 monospace 字体)。用户界面元素也采用粗体。

斜体

您赋特定值的变量。例如,Filename.ext 可代表讨论的情况中任何有效的文件名。新术语也在第一次出现时用斜体。

Monospace font

代码示例

%SystemRoot%

Windows 的安装文件夹。

如何使用本书

本书由九章组成。其他八章是:

第 2 章:“理解企业平台”

第 3 章:“互用性基本原理”

第 4 章:“互用性技术:点对点”

第 5 章:“互用性技术:数据层”

第 6 章:“实现互用性设计元素”

第 7 章:“在表示层集成 .NET”

第 8 章:“在业务层集成 .NET”

第 9 章:“实现异步互用性”

以下部分对每章的内容进行描述。

第 2 章:“理解企业平台”

第 2 章由两部分构成。第一部分从一个富有经验的 J2EE 开发人员的观点来看 .NET。该章将 .NET 的概念和您已经理解的原理联系起来,以说明这两个平台的不同和相似之处。这章的第二部分是第一部分的镜像,提供同样的信息,但这是对富有经验的 .NET 开发人员而言。该章向您介绍 J2EE 的企业特性并且解释 Java 应用程序如何工作在分布式环境中。

第 3 章:“互用性基本原理”

第 3 章介绍将基于 .NET 的应用程序和基于 Java 的应用程序结合使用的基本原理,致力于这两种技术之间的数据转换。主要着眼于使两个平台的数据类型达成一致,尤其是复杂数据类型。

第 4 章:“互用性技术:点对点”

第 4 章集中讨论 XML Web 服务和 .NET 远程处理的点对点通讯方法上。主题包括二进制通讯和路由传送,以及用于集成 Java 和 .NET 的第三方运行时桥的使用。

第 5 章:“互用性技术:数据层”

这一章继续第 4 章的内容,集中讨论应用于数据层或资源层的技术。所涉及的技术包括共享数据库和异步消息队列。最后,这一章简要地介绍了其他异步技术,例如:在 Microsoft Host Integration Server 中使用 MSMQ-MQSeries Bridge。

第 6 章:“实现互用性设计元素”

第 6 章根据第 4 章和第 5 章的概念描述如何能在企业级应用程序中实现这些思想。这一章介绍了在 J2EE 和 .NET 编程中的最佳实践,同时强调了应用程序中抽象层的角色。这一章将继续说明如何在设计中实现抽象层(例如:服务接口和互用性适配层)。最后,它详述了示例应用程序如何使用这些元素实现互用性。

第 7 章:“在表示层集成 .NET”

第 7 章用 Xbikes 示例说明了如下的方案:希望在保留现有的 J2EE 业务层的同时,集成 ASP.NET 表示层的组件。这使一个组织可以保护它对 J2EE 的已有投资并且利用 ASP.NET 提供的更丰富的客户端体验。

第 8 章:“在业务层集成 .NET。”

第 8 章说明当保留同样的基于 JavaServer Page(JSP) 的前端的同时,Xbikes 示例如何集成新的 .NET 业务层组件。该解决方案适用于需要保持相同的客户端体验但要修改业务层的公司。添加 .NET 组件允许快速开发业务逻辑组件或允许使用第三方 .NET 框架应用程序。

第 9 章:“实现异步互用性”

最后一章着眼于在数据层使用消息处理组件的互用性。使用 Xbikes 示例代码说明了如何用消息处理组件(例如:Microsoft 消息队列或 Java 的消息服务实现)连接消息队列,为事务和长时间运转的操作提供异步操作和支持。

什么是 Microsoft .NET?

Microsoft .NET 是一个术语,它涵盖了 Microsoft 的创建分布式企业应用程序的最新编程和开发环境。.NET 框架是它的主要组件,该框架由专门用于简化并增强该过程的一组元素构成。.NET 框架包括一些组件,如公共语言运行库 (CLR)、ASP.NET、ADO.NET、企业服务和 .NET 远程处理。

Microsoft .NET 的其他组件包括:

Visual Studio .NET 开发系统

Windows Server 2003 操作系统系列

Active Directory 目录服务

Windows Server 系统组件,例如:SQL Server 2000 和 Exchange Server 2003

Microsoft .NET 支持开放标准,例如:SOAP、Web 服务描述语言 (WSDL)、通用描述发现和集成 (UDDI) 以及 XML。Microsoft 为 .NET 框架提供全方位的支持,并且拥有各种运行在大多数 Windows 版本上的框架版本。第 2 章为富有经验的 J2EE 程序员提供 Microsoft .NET 的介绍。

Java 2 Enterprise Edition 是什么?

J2EE 规范描述了一个多层应用程序模型和一组可以用来创建分布式企业应用程序的 API。使用 J2EE,您可以在一个统一的安全模型内构建由可重用的元素组成的多层应用程序。

J2EE 标准是 Sun Microsystems 的知识产权。该标准由众多供应商和制造商认可,特别是 Sun 在推广 J2EE 的过程中发挥着杰出的作用。而且,有许多供应商和爱好者为 J2EE 提供支持。J2EE 运行在许多操作系统上,包括 Windows、Sun?Solaris、Unix 和 Linux。

组成 J2EE 的元素包括:

JavaServer Pages (JSP) 和 servlet

Enterprise JavaBeans (EJB)

J2EE 容器和模块

J2EE 软件开发工具包

Java 命名和目录接口 (JDNI)、Java 消息服务 (JMS) 和 Java 数据库连接 (JDBC) API

J2EE 当前的版本 (V1.3) 通过第三方实现支持开放标准,例如:SOAP、WSDL、UDDI 和 XML。J2EE v1.4(当前为 Beta 2)本身就支持这些协议。第 2 章为富有经验的 .NET 程序员提供 J2EE 的介绍。

确认互用性的业务需求

许多组织已经运行了基于 Java 或 Microsoft .NET 的大型企业环境。因此如果公司考虑使用新的应用程序或为当前的体系结构增加额外的内容,会习惯性地倾向于从当前已经实现的环境开始考虑。这种情况有时称为对技术进行调整的环境,制订有关增强当前环境的决策更倾向于在一直运行的旧环境上进行调整,而不是基于可提供最佳平台的新环境。

采用 J2EE 或 Microsoft .Net 设计企业系统是一个代价高昂的商业行为,但通常有充分的商业原因致使许多组织实现一个具有各个平台元素的混合环境。这一节将着眼于这些因素。

互用性对许多企业来说是一个主要的要求,它让内部系统统一工作并且使企业可以联系消费者、外部合作伙伴和供应商。随着对效率、响应性和成本降低的要求越来越高,互用性成为现代 IT 环境的一个主要要求。

实际的互用性项目采取的方法是,组织应使用最好的技术处理手头的工作。如果一个公司在内部创建大量应用程序,则可能有更多的因素促使保持当前的环境。然而,举例来说,如果您需要实现第三方解决方案或需要利用只有 .NET 才能提供的功能,互用性提供了一种有效的机制,用于确保两个环境共同工作。

进一步深入探究互用性的业务需求涉及到以下领域,其中互用性是主要因素:

实现现有系统的重用。

实现概念验证研究

向 Microsoft .NET 移植。

使项目开销更低。

实现现有系统的重用。

在考虑为什么要实现互用性项目时,通常最先考虑重用现有系统。许多组织通常在他们当前的基础结构中有大量的投资,并且要保护这些投资。然而,不断变更的要求可能使当前的系统不能满足新的需求的情况更加突出。在这种情况下,您可以通过使用其他技术实现新的功能,并且使用互用性将其集成到当前的基础结构中。

例如,您可能要在现有的基于 J2EE 的业务和数据层中加入一个新的 ASP.NET Web 层。您可以将 J2EE 环境和新的表示层组件集成在一起,而无需替换功能层。然后,该新的 .NET 组件可以增大现有系统的价值,在不断变化的网络环境中集成原应用程序和新增加的应用程序。

互用性技术也可以扩展软件资产的存在价值,例如:运行在专用硬件上的业务层应用程序。此外,如果应用程序和硬件功能可以接受,就没有立即替换它的必要。只需增加一个Web 服务接口即可延长该设备的运行寿命,并且为将其与更新的应用程序集成提供灵活性。

许多组织将保持和使用当前的各项技术作为最重要的因素之一。员工培训投资可能会影响投入到应用程序基础结构中的资金。虽然 .NET 相对于 Java 而言极大缩短了开发时间,但还是需要对当前体系结构提供持续的支持。因为您可能拥有为当前环境培训的熟练员工,可以继续支持那些方面。

实现概念验证研究

概念验证或初步研究使有活力的公司在最小的风险下试验新的业务方法和技术。例如:如果要实现一个新的基于蜂窝电话的界面,可以使用 .NET 非常快速地构造原形。然后在不更改原有代码的情况下,使新的界面与现有的环境一起运行。因此增加新的功能不需要抛弃和替换辛苦创建的所有东西。

Microsoft .NET 的与语言无关的开发环境为许多公司提供了更多的技术灵活性和将解决方案快速投放市场的能力。互用性技术确保这些新部署的功能无缝地与当前的基础结构协同运作。

移植到 Microsoft .NET

如果您的组织正考虑从 J2EE 移植到 Microsoft .NET,互用性可以极大减少任何此类移植项目的内在风险,并且可以使环境之间的转换顺畅。利用互用性允许独立地移植每个应用层,该移植计划可以减少项目依赖性、处理调度约束和最大限度地减少停机期。

移植不是一夜之间的事情,因此互用性移植计划可能包括创建一个新的 .NET 表示层并且切换到该层。在您为该新的组件正确工作感到欣喜万分之后,则开始替换业务层的独立组件。最后,将后端数据库移植到 SQL Server。

使用互用性技术使您可计划、实现、并且正确地执行从 J2EE 到 Microsoft .NET 上的移植。甚至只是计划移植都具有商业价值,因为当前在与供应商的谈判中,它让您处于更有利的位置。当目前的供应商不再满足要求时,它还使您能更快地作出反应。

使项目开销更低。

人力成本在整个项目开销中是主要因素,包括自定义的各行各业的应用程序。.NET 可以提供更低的整体项目开销,主要是因为更高的效率降低了人工因素。以下阐述了使用 .NET 而产生更高的生产效率的原因:

高效的开发工具(例如:Visual Studio.NET)使开发人员快速地将想法转化为应用程序。

.NET 框架具有妥善托管的用途广泛而易于使用的类库。该类库封装了许多编程任务和技术,而这些编程任务和技术对以往的许多开发人员而言是难以解决的。

多语言支持使开发人员可使用已有的技能。您可以用 .NET 框架支持的任何语言编写基于 .NET 的应用程序,例如:Visual Basic?.NET、C++、C#,或对 Java 程序员而言,使用语法上与 Java 一致的 j#。.NET 也支持许多第三方编程语言,例如:COBOL 和 FORTRAN。如果您正在用一种主流开发语言编写程序,则对应的 .NET 版本可能要么已经发布,要么正准备发布。

应用程序开发时间的减少与多语言兼容性相结合能帮助您最大限度地减少开发应用程序的开销。开发人员可以用他们最熟悉的 .NET 中的任一种语言编写程序,而创建组件非常容易(如 Visual Stidio .NET 中的Web 服务),提高了效率并且减少了部署时间。然而,必须将多语言支持的方便性与维护费用上升的潜在风险性一起权衡考虑。

表示层应用程序尤其得益于 ASP.NET 的特性,它允许程序员用他们所选择的语言,以最少的代码,去创建一个功能完整的 Web 站点。脚本元素从 HTML 代码中分离从而使调试更有效率,无需滚动 HTML 以识别编码错误。

JavaServer Face 的规范应该允许 J2EE 平台为 ASP.NET 提供相似的工具,尽管它不是当前 J2EE 发布版本的一部分。有关 JavaServer Face 的更多信息,请参阅位于http://java.sun.com/j2ee/javaserverfaces/ 的 JavaServer Face Web 页。

减少开发时间能够使您的组织将解决方案率先投放市场的几率大增。细心地挑选正确的开发环境和使用适当的互用性技术可以加速企业应用程序和新功能的成功部署,缩短了投放市场的时间,降低了开发的费用。

定义互用性

本书将互用性定义如下:

使用行业标准或被广泛认可的数据描述和通讯协议,在采用不同技术实现的不同平台上运行的功能单元之间进行通讯或者传输数据的能力。

对于 .NET/J2EE 互用性而言,该过程包括确保在一个平台上构建的应用程序能连接到另一个平台上创建的应用程序。图 1.1 说明了在一个企业应用程序环境下 J2EE 和 .NET 中等同的组件,并且在该体系结构的不同层中着重强调了互用性的机会和需求。

j2ee_interop_c1_fig1-1

图 1.1:在一个企业应用程序环境下 J2EE 和 .NET 的等同组件

组织得益于能够更为灵活地从各个企业应用程序环境中挑选最佳的组件,以满足他们的业务需求。然而,此互用性应该只带来最低的性能开销或功能损耗。

理解互用性场景

互用性以多种形态出现,其中某些场景比其他场景更可能采用互用性,而一些场景的组合则不可采用或非常不可能采用互用性。本书集中讨论三个主要互用性场景。它们是:

在表示层集成 .NET 组件。

在业务层集成 .NET 组件。

实现异步互用性。

第 4 章和第 5 章讲述可以在这些场景中使用的互用性技术。第 6 章描述在企业级应用程序中如何应用这些技术,并概述了 Xbikes 示例应用程序使用的实现策略。第 7、8、9 章在代码级别详细说明了每种互用性技术。

在表示层集成 .NET 组件

表示层到业务层的互用性是一个极为常见的场景,占所有 .NET/J2EE 互用性项目的很大部分。通常,在这两个层间的互用性涉及用基于 ASP.NET 的前端替换 JSP 元素,以获得更丰富的客户端体验。图 1.2 说明了此类实现的工作方式。

j2ee_interop_c1_fig1-2

图 1.2:.NET 表示层连接 J2EE 业务层

第一个场景的难点在于使 ASP.NET 组件与 J2EE 中间层元素交互,如图 1.2 所示。

在业务层集成 .NET 组件

下一个场景保护现有的 JSP 前端,而在业务层集成 .NET 组件。该方法允许开发人员在 .NET 中使用 .NET 框架支持的任何语言创建程序和程序集。实现 .NET 业务层组件的原因可能包括对业务实践快速改变的响应或使用第三方产品的需要。图 1.3 说明了此类实现的工作方式。

j2ee_interop_c1_fig1-3

图 1.3:将 .NET 业务层组件集成到 J2EE 体系结构中

在此您在 .NET 和 J2EE 间面临两个接口的挑战,一个接口来自表示层到业务层,另一个接口来自业务层到数据层。第 8 章给出了一个如何实现的详细示例。

实现异步互用性

此最后的主要互用性场景涉及需要使用事务性支持、处理长时间运行的事务或者提供网络问题恢复的情形。您通过处理一个异步资源或消息队列组件提供这些服务,例如:Microsoft 消息队列(也叫做 MSMQ)或 IBM 的 WebSphere MQ。图 1.4 说明了该实现。

j2ee_interop_c1_fig1-4

图 1.4:业务层到数据层的互用性

该场景的一个示例可能是连接一个管理和监视预定自行车生产的命令队列。该应用程序可以检查队列中的项目或者在一个特定的操作结束时接收通知。在此自行车生产结束后,一个消息将通知购车者已发货。

第 9 章详细讲述该场景。

互用性技术清单。

有许多方法可以实现 J2EE 到 .NET 的互用性。每个方法都有它特定的优点和缺点,并且工作在不同于其他环境的特定环境中。这些技术如下:

XML Web 服务。

运行时桥。

面向消息的中间件。

共享数据库。

集成代理程序。

Web 服务定义提供服务的应用程序(通常提供一个可编程接口),既可以直接实现客户端请求也可以使用 Internet 标准集成与其他 Web 服务的提供程序服务。外部的消费者或应用程序通过 XML 格式的消息与 Web 服务进行通讯,通常使用 XML 在 HTTP 上传输数据。基于 .NET 的应用程序和基于 J2EE 的应用程序都可以实现 XML Web 服务。

运行时桥是在 J2EE 和 .NET 之间提供互用性的第三方解决方案,以使 Java 类看起来类似于 .NET 类,反之亦然。允许使用 .NET 远程处理作为一个通讯方法,让运行时桥处理对 Java 端的调用。本书列举了该领域的两个产品,来自 JNBridgePro 的 JNBridge 和来自 Instrinsyc 的 Ja.NET。第 4 章提供这些产品的详细信息。

消息处理为不同层之间通讯提供异步机制,通常基于 MSMQ 或 IBM 的 MQSeries。消息处理允许松散的耦合操作,尤其在应用程序组件间不只需要一对一连接,但对 Web 服务不适用的情况下。消息处理也支持事务、安全(加密和身份验证)、网络问题容错和记录的消息传递。然而消息处理不提供任何形式的同步操作,可能由于端口分配和防火墙操作引起问题。

共享数据库技术通常涉及使用某种形式的数据库独立连接 API(例如开放式数据库连接 (ODBC) 或 Java 数据库连接 (JDBC)),提供一个来自数据库本身的抽象层(通常是 SQL Server 或 Oracle)。然而,这项技术的挑战在于产生一个所有应用程序可以寻址的合适的数据库架构。

集成代理程序超越点到点的连接提供端到端的应用程序集成,使跨越整个分布式应用程序或企业的关键业务进程实现自动化。通常建立在一个消息处理框架的基础上,集成代理程序对于应用程序的解决方案内需要用到贸易伙伴的信息的环境是极其重要的。集成代理程序也提供预制应用程序适配器,允许多个外部组件(例如:主框架或第三方应用程序)作为提供商或消费者(或同时兼具这两个职能)与集成代理程序交互。一些主要的集成代理程序产品包括 IBM MQSeries Integrator、CommerceBroker 和 microsoft BizTalk?Server 2004。

第 4 章和第 5 章深入讲解了除集成代理程序之外的所有这些技术。

将互用性技术与业务场景相联系。

表 1.2 说明了可能的互用性组合,及可为每种组合提供解决方案的技术。对勾标记指出适合每个场景的技术有哪些。

表 1.2:互用性场景
表示层到表示层表示层到业务层业务层到业务层业务层到数据层

XML Web 服务

checkmark

checkmark

checkmark

运行时桥

checkmark

checkmark

checkmark

消息处理

checkmark

checkmark

共享数据库

checkmark

checkmark

集成代理程序

checkmark

checkmark

建议在任何情况下都可以使用 XML Web 服务实现您的互用性解决方案。要详细地探讨每种互用性技术的优点和缺点,参见本书稍后的第 4 和 5 章。

示例应用程序简介

本书使用一个示例应用程序去说明三个第 7 章到第 9 章描述的互用性场景。该应用程序是 XBikes,一个电子商务应用程序,通过它您可以用各种“加速”颜色仿真订购不存在的昂贵自行车。这里有两个独立的 Xbikes 实现方法,一个用于 .NET 平台,另一个用于 J2EE 版本。

XBikes ??不是一个关于如何用每种体系结构写一个完美应用程序的示范。这也不是关于如何写一个卖自行车的安全 Web 站点,它是为展示如何使 J2EE 和 .NET 应用程序进行互用而提供的一个框架。

Xbikes 为您提供一个理解以下互用性方法的框架和示例代码。

一次一个地用对等的 .NET 元素替换 J2EE 体系结构的独立部分。

说明 J2EE 组件如何能没有限制地和 .NET 元素共同存在。

示范从 J2EE 到 .NET 完整环境的移植步骤。

第 6 章详细解释Xbikes 应用程序的体系结构。Xbikes 示例代码在随书的 CD 中。

小结

本章介绍本书的结构和各章的内容。它从宏观的角度介绍 J2EE 和 .NET 的互用性,然后涵盖了互用性的各种场景。它回顾了几种互用性技术并且介绍了 XBikes 示例应用程序。

为了确保熟悉 .NET 或 J2EE 的开发人员在技术上处在相同的理解等级,您现在应该阅读第 2 章的相关内容。

参考资料

Guest, Simon, Microsoft .NET and J2EE Interoperability Toolkit, Microsoft Press, ISBN 0-7356-1922-0

有关分布式企业应用程序概念的信息(例如:.NET 上的表示层、业务层和数据层),请参阅:
Application Architecture for .NET:Designing Applications and Services
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dnbda/html/distapp.asp

有关对应的Java 信息,请参阅 Sun J2EE Web 站点:
http://java.sun.com/j2ee/有关 XML Web 服务的一般信息,请参阅下列 Web 站点:

位于 http://www.xmlwebservices.cc/ 的 .NET XML Web Services Repertory

位于 http://msdn.microsoft.com/webservices 的 Web Services Developer Home

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值