用Jbuilder 2005开发Java Applet应用

 一、JBuilder 2005的新特性

  JBuilder 2005加速企业JavaBeans,WEB服务器,XML,移动产品和数据库应用程序开发,双向可视化设计工具和迅速调用J2EE应用服务器,这些应用服务器包括BEA WebLogic,IBM WebSphere,Sybase EAServer, JBoss和 integrated Borland Enterprise Server。拥有创新强大的JavaServer Faces,Struts和 Web服务设计工具,支持J2SE 5.0 (即JDK 1.5),UML代码可视化,分布式因子分解,代码审核,企业单位测试,多语控制系统等。

  二、图解JBuilder 2005开发Applet程序

  从简单的Applet程序开始我们一步一步的领略JBuilder 2005的强大功能。为了提高读者的感性认识,在每个一步骤中我都提供了明确的图形。

  三、在JBuilder 2005中测试Applet程序

  Borland在JBuilder 2005内内置了两种Applet的测试工具:AppletTestBed和Applet Viewer。

  结束语

  本文仅仅介绍了JBuilder 2005在开发Applet程序上的便利,但这只是JBuilder2005的优秀性能的冰山一角,我的目的只是希望读者朋友能通过本文对JBuilder 2005有个初步的认识,我将在以后的文章继续向大家介绍JBuilder 2005在开发EJB、Web服务以及与UML集成方面的应用。


一、JBuilder 2005的新特性
  JBuilder 2005加速企业JavaBeans,WEB服务器,XML,移动产品和数据库应用开发,双向可视化设计工具和迅速调用J2EE应用服务器,这些应用服务器包括BEA WebLogic,IBM WebSphere,Sybase EAServer, JBoss和 integrated Borland Enterprise Server。拥有创新强大的JavaServer Faces,Struts和 Web服务设计工具,支持J2SE 5.0 (即JDK1.5), UML代码可视化,分布式因子分解,代码审核,企业单位测试,支持多语控制系统。





11454144920150234.jpg





11454144925001525.jpg


  JBuilder 2005的新特性有:

  1、支持最新标准,快速开发各类型 Java 应用程序

  Borland JBuilder 2005 Enterprise 版支持各类型 Java 应用程序开发,包含 JSF、JavaServer Page (JSP)、Servlets、Enterprise JavaBean (EJB)、Web Services、Struts、XML、Swing、数据库应用程序、行动式设备应用程序等,JBuilder 协助开发人员了解最新J2SE 5.0 (JDK 1.5) 语言新功能所能带来之帮助,并针对 J2SE 5.0提供程序代码重构 (Refactoring) 与除错能力, JBuilder 2005 亦内建符合 J2EE 1.4 规格之 Tomcat 5.0 Web 服务器。

  2、开发企业级J2EE 平台应用程序,部署于主要应用程序服务器

  运用双向可视化的EJB设计工具,可快速建立能够重复使用之Enterprise JavaBean。可视化双向之部署描述编辑器(Deployment Descriptor Editor),帮您管理部署结构( structure )、交易(transaction )、策略(policies)、权限角色( security role)与其它组合与部署 EJB 所需之属性与信息,并且涵盖标准部署描述(Deployment Descriptor)与特定服务器专属之部署描述。JBuilder 紧密整合多重业界领先之J2EE应用服务器,包括Borland Enterprise Server、BEA WebLogic Server、JBoss、IBM WebSphere 与 Sybase EAServer。

  3、简化 JavaServer Faces 与 Struts 应用程序开发

  运用 JBuilder 所提供之多项工具与精灵,使得运用 JSF、Struts、Servlets、JavaServer Page 与 JSP表达式语言(Expression Language) 开发动态 Web 应用程序变得更为容易,运用流程设计工具可将现有 Web 应用程序建立 JSF 所需之档案,组合而成全功能之应用程序。Struts 设计工具将开发以 Struts 为基础之应用程序所需之工具紧密结合。此外, TagInsight 精灵能够针对 JSP、HTML与 XML 档案自动提示标签(Tag),并可将 JSP 表达式语言(Expression Language) 关键词以不同色彩标示,提升程序代码撰写速度并减少错误发生之机会。

  4、运交高质量、高效能之应用程序

  JBuilder 2005 Enterprise 版是市场上唯一完全整合效能调校工具之Java 整合开发环境,内建包含剖析工具(profiler ) 、执行绪除错器( thread debugger ) 与程序代码涵盖分析工具(Code Coverage),协助开发人员找出与修正效能相关问题。JBuilder 2005 Enterprise 版中增添了J2EE 效能剖析工具 Borland Optimizeit Request Analyzer协助您分析 J2EE 架构中跨越不同层级 ( tiers ) 程序代码之执行效率。

  此外, JBuilder 2005 中所内建之程序代码稽核 ( code audit ) 工具能够自动发现常见之错误写码方式,进而协助开发团队建立高质量、高效能之应用系统。


  二、使用JBuilder 2005开发Applet应用

  为了协助我们开发、测试与部署Applet应用程序,JBuilder2005提供下列工具:

   Applet Wizard:可快速建立Applet基本结构与相对应的HTML文件。

   AppletTestBed:JBuilder提供的Applet执行与测试工具,我们可以利用它来查看Applet执行结果。

   Applet Viewer:Sun Microsystems公司提供的Applet执行与测试工具。

  (一)使用Applet Wizard

  JBuilder 2005提供的Applet Wizard可协助我们建立Applet的基本程序代码。启动Applet Wizard的方式如下:

  ● 选取File | New,打开“Object Gallery”对话框。

  ● 在Web窗格内,选取Applet图标后按下[OK]按钮。(如下图1)





1145414492593288.jpg

图1(点击放大)


  以下是Applet Wizard的各项步骤:

  在步骤一中我们要在name栏中输入HelloApplet,directory栏中修改路径为c: jbprojectHelloApplet,并勾选[Generate standard method)选项。按下[Next]按钮前往步骤二。(如下图2)





11454144926873595.jpg

图2(点击放大)


  在步骤二中有JDK版本、Output path、Backup path、working directory以及选择的default path和test path,在这里我们都选默认值,按下[Next]按钮前往步骤三。(如下图3)





11454144927814932.jpg

图3(点击放大)


  在步骤三中我们修改class Javadoc fields中的Title、Description、Copyright、Company、author和version字段的值,其他项采用默认值,按下[Finish]按钮。(如下图4)





11454144928755192.jpg

图4(点击放大)


接下来开始下面的Applet Wizard四个步骤操作:(如下图5)




11454144930006682.jpg

图5(点击放大)

  ● Package字段:Applet隶属的套件名称,默认为目前工程名称。

  ● Class name字段:Applet类名称。

  ● Base class字段:Applet所继承的基础类,分为java.applet.Applet与javax.swing.JApplet两种;前者为AWT套件,后者则是使用Swing套件。

  此步骤还包含下列三个选项:

  ● Generate header comments:在Applet类文件内加上标头注解信息(设置于“Project Properties”对话框的General窗格)。

  ● Can run standalone:在Applet类内加入一个main()方法(主要用途是方便测试), 我们不需要另外撰写一个HTML文件就可以测试Applet。

  ● Generate standard methods:建立标准的Applet方法,例如:start()、stop()、destroy()、getAppletlnfo()与getParameterlnfo()方法。

  选择[Next] 按钮进入下一步:(如下图6)




11454144932037299.jpg

图6(点击放大)

  现在我们可以设置欲传入Applet的参数了。Applet Wizard会在HTML文件的<applet>标签内产生<param>标签,并在Applet类文件内加入必要的程序代码。点击[Add Parameter]按钮将产生一笔新数据,其Name字段值默认为param0。

  选择[Next] 按钮进入下一步:(如下图7)




11454144933128578.jpg

图7(点击放大)

  在这一步中,如果我们勾选了[Generate HTML Page)选项,Applet Wizard将会建立一个HTML文件:其中包含调用Applet所需要的<applet>标签。此外,我们可以通过Name、Codebase、Width、Height等字段来设置<applet>标签的各项属性。

  选择[Next] 按钮进入下一步:(如下图8)




11454144933759395.jpg

图8(点击放大)

  在这一步中,我们可以定义Applet的“运行时期配置”(runtime configuration)。如果我们的工程内并未定义任何“运行时期配置”,[Create a runtime configuration)默认会被勾选,请在Name字段内指定“运行时期配置”的名称。按下[Finish]按钮,离开Applet Wizard。回到“工程窗格”中,我们将发现Applet Wizard产生了两个文件:HelloApplet.java与 HelloApplet.html。

  (二)编译并执行HelloApplet

  虽然HelloApplet尚未具备任何功能,但是它已经是一个不折不扣的Applet了,让我们先看看它的执行结果。请在AppBrowser主菜单内选取Run | Run Proiect,执行结果如图9所示。




114541449353110891.jpg

图9(点击放大)


  当我们按下[Exit]按钮离开,接下来将设计Applet的用户界面。


  (三)设计Applet用户界面

  在此步骤中,我们将利用JBuilder 2005的设计工具为HelloApplet添加较丰富的用户界面,步骤如下。

  1、在“工程窗格”中,以鼠标左键双击HelloApplet.java文件,将它打开于JBuilder编辑器中。

  2、选取编辑器下方的Design页签。

  3、如图10所示,先在“结构窗格”的组件树中选取this节点,然后在查看器内将this节点的Layout属性更改为BorderLayout(原来为<defaultlayout>)。





114541449375011997.jpg

图10(点击放大)


  4、依照下列步骤在Applet内加入两个Panel容器对象

  点击“组件托盘”的AWT页签,在AWT页签内选取java.awt.Panel组件,然后以鼠标左键点击“结构窗格”的this节点。新的Panel对象将会出现在this节点下方,名称为panel1。请在查看器中将panel1的Constraints属性设置为North。仿照上一步骤加入第二个Panel对象,将它的Constraints属性设置为Center。

  5、更改Panel对象的名称与属性

  在panel1上点击鼠标右键,选取[Rename],将其名称更改为UpperPanel。接着在查看器内将background属性更改为Light Gray。
在panel2上点击鼠标右键,选取[Rename],将其名称更改为LowerPanel。接着在查看器内将background属性更改为White(我们也可以依照自己的喜好来设置背景颜色)。

  6、在LowerPanel加入两个Panel对象

  将LowerPanel的layout属性设置为CardLayout,在“组件托盘”内选取AWT页签的java.awt.Panel组件,然后点击“结构窗格”的LowerPanel节点,这个动作将加入一个Panel对象。新加入的Panel对象会出现在LowerPanel节点下方(名称为panel1)。依此要领加入第二个Panel对象(名称为panel2)。

  将panel1与panel2的Layout属性设置为BorderLayout,将panel1与panel2的background属性分别设置为White与Pink。

  完成上述所有步骤后,请先保存我们的工程。 现在我们已经完成Applet用户界面的基本雏形,接下来要加入某些UI组件。

  (四)设计UpperPanel容器对象

  依照下列步骤在UpperPanel内加入两个UI组件(Label与Choice):

  1、在“组件托盘”的AWT页签内选取,java.awt.Choice组件,然后点击“结构窗格”的UpperPanel节点。新的Choice组件将会出现在UpperPanel节点下方。

  2、在“组件托盘”的AWT页签内选取java.awt.Label组件,然后点击“结构窗格”的UpperPanel节点,这个动作将会加入新的Label组件。新的Label组件将出现在UpperPanel节点下方。

  3、更改lable1对象的属性:

  在“结构窗格”内点击label1对象,将Text属性更改为“Select a language:"。点击font属性的按钮打开Font对话框,在Size字段里输入20。 将foreground属性设置为Blue,“Select a Language:”字符串将以蓝色显示。

  4、在panel1与panel2对象内分别加入一个Label组件。首先在“组件托盘”内选取AWT页签的java.awt.Label组件,然后点击LowerPanel节点下的panel1节点。新加入的Label对象将会出现在panel1节点下方(名称为label2)。依此要领,在panel2内加入另一个Label组件(名称为label3)。

  5、依照下列方式设置label2的属性

  将text属性设置为“Good Movning!”,constraints属性设置为Center, alignment属性设置为CENTER。点击font属性的按钮,在Font对话框内将Size设置为24。

  6、依照下列方式设置label3的属性

  将text属性设置为“早上好”,constraints属性设置为Center,alignment属性设定为CENTER。点击font属性的按钮,在Font对话框内将Size设置为24。

  完成上述步骤就会出现如下图11所示:





114541449385912866.jpg

图11(点击放大)


 (五)设计Choice对象

  在此步骤中,我们将在Choice对象内加入两个选项,并加入必要的程序代码。

  1、点击编辑器下方的Source页签,切换到源代码编辑画面。

  2、点击“结构窗格”的init()方法,JBuilder 2005会自动将光标移到init()方法的声明位置。

  3、在init()方法内加入下列两行程序代码,用蓝颜色标识的(位于try/catch区块上方):(如下图12所示)




11454144940311327.jpg

图12(点击放大)



---------------------------------------------------
choice1.addItem("English");
choice1.addItem("Chinese");
--------------------------------------------------

  说明:additem()方法可以为Choice对象加入一个选项。

  4、点击Design页签回到UI设计工具。

  5、在“结构窗格”内点击choice1节点,然后选取“查看器”的Event页签。

  6、以鼠标左键双击itemStateChaoged事件,JBuilder会在HelloApplet.java内新增一个choice1_itemStateChanged()方法,并将光标移到该方法所在位置。

  7、参考下列范例撰写choice1_itemstateChanged()方法的内容,用蓝颜色标识的(如下图13所示)。


------------------------------------------------------------------------------------
public void choice1_itemStateChanged(ItemEvent e) {
if ("English".equals(choice1.getSelectedItem())){
cardLayout1.show(LowerPanel,"panel1");
}
else if ("Chinese".equals(choice1.getSelectedItem())){
cardLayout1.show(LowerPanel,"panel2");
}
}
-------------------------------------------------------------------------------------




114541449409314428.jpg


图13

  当HellloApplet被执行时,如果Choice选项为“English”,LowerPanel对象内将显示“Good Movning!”字符串(包含于panel1容器);如果Choice选项为“Chinese”,LowerPanel对象内将显示“早上好”字符串(包含于panel2容器)。

  8、保存JBuilder工程,编译并执行HelloApplet,执行结果如图14所示。




114541449423415179.jpg


图14

  9、将[Select a language]旁边的下拉式菜单(Choice对象)切换至“Chinese”,我们将发现下方的信息更改为“早上好”。如图15所示。




114541449451516216.jpg


图15
 Applet1.java源代码如下:


package helloapplet;

import java.awt.*;
import java.awt.event.*;
import java.applet.*;

/**
* <p>Title: Study</p>
*
* <p>Description: This is a Stendent</p>
*
* <p>Copyright: Copyright (c) 2004</p>
*
* <p>Company: </p>
*
* @author ghq
* @version 1.0
*/

public class Applet1 extends Applet {
 boolean isStandalone = false;
 BorderLayout borderLayout1 = new BorderLayout();
 BorderLayout borderLayout2 = new BorderLayout();
 Panel UpperPanel = new Panel();
 Panel LowerPanel = new Panel();
 CardLayout cardLayout1 = new CardLayout();
 Panel panel1 = new Panel();
 BorderLayout borderLayout3 = new BorderLayout();
 Panel panel2 = new Panel();
 BorderLayout borderLayout4 = new BorderLayout();
 Choice choice1 = new Choice();
 Label label1 = new Label();
 Label label2 = new Label();
 Label label3 = new Label();
 //Get a parameter value
 public String getParameter(String key, String def) {
  return isStandalone ? System.getProperty(key, def) :
  (getParameter(key) != null ? getParameter(key) : def);
 }

 //Construct the applet
 public Applet1() {}

 //Initialize the applet
 public void init() {
  choice1.addItem("English");
  choice1.addItem("Chinese");
  try {
   jbInit();
  } catch (Exception e) {
   e.printStackTrace();
  }
 }

 //Component initialization
 private void jbInit() throws Exception {
  this.setLayout(borderLayout2);
  UpperPanel.setForeground(Color.lightGray);
  LowerPanel.setForeground(Color.white);
  LowerPanel.setLayout(cardLayout1);
  panel1.setLayout(borderLayout3);
  panel2.setForeground(Color.pink);
  panel2.setLayout(borderLayout4);
  panel1.setForeground(Color.white);
  label1.setFont(new java.awt.Font("Dialog", Font.PLAIN, 20));
  label1.setForeground(Color.blue);
  label1.setText(""Select a Language:"");
  label2.setAlignment(Label.CENTER);
  label2.setFont(new java.awt.Font("Dialog", Font.PLAIN, 24));
  label2.setText(""Good Movning!"");
  label3.setAlignment(Label.CENTER);
  label3.setFont(new java.awt.Font("Dialog", Font.PLAIN, 24));
  label3.setText(""早上好"");
  choice1.addItemListener(new Applet1_choice1_itemAdapter(this));
  this.add(UpperPanel, java.awt.BorderLayout.NORTH);
  UpperPanel.add(label1);
  UpperPanel.add(choice1);
  this.add(LowerPanel, java.awt.BorderLayout.CENTER);
  LowerPanel.add(panel1, "panel1");
  LowerPanel.add(panel2, "panel2");
  panel1.add(label2, java.awt.BorderLayout.CENTER);
  panel2.add(label3, java.awt.BorderLayout.CENTER);
 }

 //Get Applet information
 public String getAppletInfo() {
  return "Applet Information";
 }

 //Get parameter info
 public String[][] getParameterInfo() {
  return null;
 }

 public void choice1_itemStateChanged(ItemEvent e) {
  if ("English".equals(choice1.getSelectedItem())){
   cardLayout1.show(LowerPanel,"panel1");
  }
  else if ("Chinese".equals(choice1.getSelectedItem())){
   cardLayout1.show(LowerPanel,"panel2");
  }
 }
}

class Applet1_choice1_itemAdapter implements ItemListener {
 private Applet1 adaptee;
 Applet1_choice1_itemAdapter(Applet1 adaptee) {
  this.adaptee = adaptee;
 }

 public void itemStateChanged(ItemEvent e) {
  adaptee.choice1_itemStateChanged(e);
 }
}


  三、在JBuilder 2005中测试Applet程序

  当Applet开发完毕后,我们可以直接在JBuilder 2005内测试Applet的执行结果是否正确,方式有下列两种:

  ● 利用JBuilder 2005的AppletTestBed。

  ● 利用Sun Microsystems的Applet Viewer。

  1、使用JBuilder 2005的AppletTestBed

  AppletTestBed是JBuilder 2005提供的Applet执行环境,当我们选取Run | Run Project时将会启动AppletTestBed,并执行JBuilder工程的“主要类”(main class)。我们可以依照下列方式将Applet设置为该工程的“主要类”:

  1)选取Project | Project Properties,打开“Project Properties”对话框。

  2)切换至Run窗格,按下[New]按钮建立新的“运行时期配置”;或是按下[Edit]按钮编辑既有的“运行时期配置”。

  3)打开“New Runtime Configuration”对话框之后,我们可以在Main class字段内定义“主要类”是什么。

  利用AppletTestBed执行Applet的结果,上方包含四个按钮:

  Info:显示Applet的参数; Start:执行Applet; Stop:停止Applet; Exit:离开AppletTestBed。

  2、使用Sun Microsystems的Applet Viewer

  在JBuilder 2005内欲使用Applet Viewer执行Applet时,必须通过一个包含<applet>标签的HTML文件。只要在该HTML文件上点击鼠标右键,选取(Run using“运行时期配置名称”)即可启动Applet Viewer。

  3、开发Applet时应注意的事项

  Applet的主要执行环境为Web浏览器。为了让Applet能够正确执行于客户端浏览器,请确定客户端浏览器是否提供JDK的支持。此外,JDK版本也应该和Applet一致,否则Applet执行结果可能和预期的不同。

  在开发Applet过程中,或许我们碰到过一些问题,明明Applet都可以顺利编译,但是却无法正确显示于HTML页面。问题发生的原因通常是<applet>标签的属性定义错误,例如:

  1)忽略Java语言必须区分大小写

  定义<applet>标签的code或archive属性时,其名称与大小写必须和服务器上的文件名称完全相同,否则Applet类文件将无法载入。

  2)code属性并未指定完整的类名称

  code属性所定义的Applet类文件必须包含套件(与子套件)名称。
 
  3)codebase属性设置有误

  如果Applet参照其他类文件或JAR文件,就必须将其路径定义在codebase属性。

  4)遗漏archive属性

  常见的Applet部署方式是将相关文件包装成JAR或ZIP文件,此时我们必须在 <applet>标签内定义archive属性。

  如果以JBuilder 2005的Applet Wizard来开发Applet,我们可以选择是否由JBuilder自动产生此类型HTML文件。

  以下两点是我们在开发Applet必须要考虑的要点:

  1、浏览器所支持的JDK版本

  随着Java技术的演进,光是JDK就分为好几个版本。某些开发人员偏好以较新的JDK来开发程序,但是他们往往忽略了一点:在一般情况下,用户通常不会自行更新浏览器的版本。

  因此经常会发生某些人可以正常执行Applet,但是其他人却无法执行的窘境。针对上述问题,我们应该从两个地方着手:

  1)要求或协助公司内所有员工的Web浏览器必须更新。

  2)如果Applet应用程序可通过Intemet存取,不妨在网页内加上警告信息,例如“为达到最佳执行效果,请确定我们的浏览器版本为XXX以上”。

  如果我们遭遇到浏览器JDK版本不合的问题,可参考下列几个解决方案:

  1)使用Java外挂程序(plug-in):

  大部分的JDK不相容问题都可以经由“Java外挂程序”来解决。举例来说,如果我们的Applet使用了Swing程序库,但是客户端浏览器的JDK版本太旧,无法支持Swing。

  我们可以要求客户端更新浏览器版本,或是前往http://java.sun.com/products/plugin/寻找适当的外挂程序。

  2)开发时期所使用的JDK版本尽量与客户端一致。

  3)使用Java Web Start。

  Java Web Start是Sun Microsystem公司所研发的一项新技术。用户可以在网页内点击某个链接,由此启动Applet或其他应用程序。这项技术能够有效解决JDK版本不合的问题,只要客户端浏览器事先安装Java Web Start外挂程序,就可以正确无误地执行Applet。

  2、安全性议题

  通过网络将应用程序传送到客户端执行----这点是Applet最为人诟病的地方。由于网络是一个开放式环境,任何在网络上传送的事物都有可能被人拦截、窃取甚至更改。因此,在开发Applet时必须格外重视应用程序的安全性。我们也必须有所了解,某些操作在一般的Java应用程序可以执行,但在Applet内却是不允许的。

  为了避免Applet执行时因为不明原因(有可能是程序代码遭到篡改)破坏或窃取客户端电脑数据,所有Applet都会被放在一个安全环境下执行,我们称之为Sandbox。这个安全机制可以确保用户电脑不会遭受危险程序的影响。目前Applet能够安全地在网络上传输与使用,Sandbox机制居功甚伟!在此机制的保护下,Applet不能删除或更改主机内的文件名称、不能建立文件,也无法检查文件与目录名称。Java解释器也会严格检查Applet是否执行任何不合法的操作,一旦发生将立刻中断程序执行。此外,Applet只能和原来的Web服务器进行数据交换,无法将数据传送到其他电脑。这些特性都是在开发Applet时必须特别注意的。有了这些严密的保护措施,就可以将用户可能面临的安全性问题降到最低。

  以下是与Applet安全性有关的开发技巧:

  1)对Applet加上标记式

  这个做法可以确保Applet在传送过程的完整性,然而它会有些缺点。以现阶段而言,还没有一套针对Applet制作标记式的标准。如果我们想获取更进一步的信息,请前往http://www.suitable.com/docs/signing.html。

  2)考虑以其他技术来克服Applet的安全性限制

  Applet的某些安全性限制可能导致特定动作无法执行,此时我们可以搭配其他Java技术来完成。举例来说,如果我们希望将数据回写至Web服务器,不妨利用Servlet来完成(因为Servlet是在服务器端执行的应用程序,不像Applet需要传送到客户端才执行,不会有程序代码遭到篡改的疑虑)。

[@more@]

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/9650775/viewspace-921404/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/9650775/viewspace-921404/

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值