QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 3914|回复: 0
打印 上一主题 下一主题

[转帖]J2ME开发及JBuilder工具的应用

[复制链接]
字体大小: 正常 放大

1253

主题

442

听众

-586

积分

复兴中华数学头子

  • TA的每日心情
    开心
    2011-9-26 17:31
  • 签到天数: 3 天

    [LV.2]偶尔看看I

    自我介绍
    数学中国网站(www.madio.cn)是目前中国最大的数学建模交流社区

    邮箱绑定达人 优秀斑竹奖 发帖功臣 元老勋章 新人进步奖 原创写作奖 最具活力勋章 风雨历程奖

    群组越狱吧

    群组湖南工业大学数学建模同盟会

    群组四川农业大学数学建模协会

    群组重庆交通大学数学建模协会

    群组中国矿业大学数学建模协会

    跳转到指定楼层
    1#
    发表于 2004-9-27 18:56 |只看该作者 |倒序浏览
    |招呼Ta 关注Ta |邮箱已经成功绑定
    【摘要】本文对J2ME体系结构及MIDP应用程序开发过程进行深入研究,总结出了MIDP应用程序开发的基本流程和方法,开发工具的选择及其比较。JBuilder作为典型的Java IDE工具,结合JBuilder MobileSet 2.0提供强大的MIDP开发功能,在本文MIDP开发方法研究基础之上,继续对如何使用JBuilder结合MobileSet进行MIDP开发进行研究,总结了使用JBuilder工具的特征和关键。
    ! f, q% \3 U% ?  k【关键词】J2ME、CLDC、MIDP、JBuilder、MobileSet! R9 D7 m: P7 t9 p: {& J

    : R/ o" f7 O' W在无线通信领域有两项重大的技术应用,一个是宽带CDMA技术,一个是IP技术。前者使无线通信获得更多带宽,3G的目标是静态速率达到2Mbps,而现在的2.5G技术(如国内正在建设的GPRS和CDMA2000 1X)都可达到115kbps的速率;后者使无线通信和因特网融合起来,实际上当前WAP2.0技术就采用已经很成熟的TCP、TLS和HTTP协议,而移动IP和IPv6技术将促使更多设备接入互联网,如各种设备、家电等。+ S/ r2 X! T; Y
    就是在这样的环境下J2ME技术得以快速发展,J2ME用来为接入和即将接入互联网的设备提供应用开发平台和执行环境,本文则主要论述如何利用JBuilder进行快速的J2ME应用开发。
    $ ^$ B# {# c/ ]( Z4 j7 I/ @1. J2ME分层结构及MIDP简表( u& W4 F# ?$ ^% u. u' V9 C+ H
    J2ME是SUN的JAVA2平台微型版(JAVA2平台3个版本之一,另两个是标准版J2SE和企业版J2EE),采用3层结构设计。最低层为配置层(Configuration),包括虚拟机(VM)和类库两部分,这一层与设备层(硬件及操作系统)关系紧密,由SUN提供参考规范和源代码,设备厂商根据设备特征进行相应的移植。当前J2ME提供有两个配置:连接设备配置(CDC)和有限连接设备配置(CLDC)。前者主要面向有较大内存和处理能力而只需有限功能的设备,如电视置顶盒、冰箱、汽车导航设备等,这些设备都有连接网络和相互交互的需求,其内存在2M以上;后者主要面向对内存和处理能力有较大限制的手持设备,如现在使用的手机、PDA等,现在及将来大多数这些设备都已经能够接入互联网,其内存范围160Kb(其中128Kb用于虚拟机及类库,至少32Kb用于CLDC规范所要求的应用程序堆栈空间)到2M。二者主要区别在于能提供给VM及应用程序的存储空间,CDC所用VM及类库实际是参考J2SE标准,去除了不需要的功能如AWT。CLDC所用VM(称作KVM)则有较大区别,包括类验证机制。对于下一代移动终端设备如智能电话、高端PDA,则是CDC所应用对象,因为它们将有超过2M的内存。" y, ^7 W* [8 r5 u. A
    设备层之上是简表层(Profile),再之上则是应用层(Application)。简表层扩展了配置层功能为上层应用提供API,如果说配置层面向设备,简表层则面向应用。可以根据需要在CDC或CLDC基础之上提供多种简表,一个配置层之上也可以有多个简表。当前CDC之上有基础简表(Foundation Profile)和基于FP的Personal Profile和RMI Profile。CLDC之上则主要提供有移动信息设备简表(MIDP),即用于手机、PDA等移动终端的设备简表,提供API以支持无线应用的开发。
    : \$ I1 F9 Z. n) k: i. w" GCLDC类库一部分来自J2SE,这部分类库是经过裁减的,去除了不必要的功能,主要包括java.lang包中的系统类、数据类型类、异常处理类,java.util包的集合类、时间类和附加工具类,java.io包的I/O处理类。CLDC专有类则主要是“通用连接框架(GCF)”,为CLDC提供网络连接功能,这些网络接口都是Connection类的子类,由类Connector所提供的方法调用,这些接口或类位于包javax.microedition.io。  z, C" N0 X3 j; I3 r7 o( t3 }0 _
    CDC类库则是CLDC的超集,因此为CLDC开发的应用程序可以移植到CDC平台,由于CDC采用标准的J2SE VM,因此其开发与标准的J2SE开发一致,只是在用javac工具编译源代码时需要使用CDC的类库,即使用-bootclasspath参数指向CDC类库。
    1 A+ {+ y  r, Z3 y# M9 X* _4 UMIDP扩展了CLDC的功能,它继承了GCF并在此基础上增加了类HttpConnection,用以提供HTTP连接功能(尽管从理论上CLDC/MIDP可以提供socket、数据报、文件、NFS等多种连接类型,但现在标准的CLDC/MIDP仅支持HTTP协议,一些设备实现则提供了socket和HTTPS协议的支持),MIDP类库总结如下:
    - S+ S! ]9 E. c9 S# V! l) W( n. n( J¨ java.io、java.lang、java.util,属于MIDP的核心包,分别用来提供系统I/O、语言支持和工具支持。包中的类来自CLDC并稍有增加,但都来自J2SE。
    / z9 N# [6 y5 B1 |. S0 E! f1 n: S¨ javax.microedition.midlet,定义了MIDP应用程序,以及应用程序和它所运行于环境之间的交互。
    0 R$ v& F' H) B# J* O. g" h- R6 Z¨ javax.microedition.lcdui,为MIDP应用程序提供用户界面API。
    2 S( F% z1 O# B* R5 T# q9 O" A& r¨ javax.microedition.rms,用来为MIDlet提供持久存储的机制,应用程序可以存储数据,在以后需要的时候获取这些数据。
    8 F2 b$ k& b- c5 W' X6 U; p¨ javax.microedition.io,提供了基于CLDC通用连接框架的网络支持。
    / g) b1 O9 Y3 Z( O. y& H2. MIDP应用程序开发
    7 C$ G& z+ G" t8 {$ ^' F' J+ F, I这里讨论的J2ME无线应用开发主要是基于CLDC/MIDP的开发,其应用程序可运行于移植有KVM的手机、PDA等,这类设备由MIDP定义,即移动信息设备(MID),可看作一垂直应用市场。4 X' T! k% Y8 Z! J
    可在PC(Windows、UNIX或Linux平台)上开发MIDP应用程序,编译成类文件形式,下载到目标设备上,经过类文件的验证(验证是否有不符合KVM规范的方法调用等)后即可解释执行。从源代码到最后应用程序的执行,整个过程如下:
    " t1 U0 ]- k0 e) Y8 k# j
    . V2 \4 W7 U$ P- g% p& r5 }% y& n. K2 J图1 MIDP应用程序开发过程
    ' w) k# U' n1 ~$ b这是开发一个MIDP应用程序的完成步骤,其中8和9可以在模拟器上进行,也可以把应用程序通过IrDA、RS232或OTA等方式之一下载到目标设备上运行。1、2步骤是在前期设计基础上编写源代码,其中资源文件可以是PNG图象或自定义结构数据,外部类库应该是符合CLDC/MIDP规范(即没有超出CLDC/MIDP的类或方法调用)的ZIP或JAR文件。生成的.java文件至少有一个是扩展了javax.microedition.midlet.MIDlet类的子类,并且实现几个规定的接口,比如下面的一个MIDlet程序 :( }( {9 l; h/ l5 q
    import javax.microedition.midlet.*; //应用程序生命周期,和J2SE一样,包java.lang.*是默认加载的
    : g, ?! c, f5 S! B1 ~; e( [import javax.microedition.lcdui.*; //MIDP用户界面' I) x: i; a: c7 L% d' [! I
    public class FirstMIDlet extends MIDlet implements CommandListener {
    * {  \. n3 t: y+ P, I# n4 t: hprivate Display display; // 引用MIDlet的Display 对象: \# |" ?3 b/ R! l9 ], k; P
    private TextBox textBox; // Textbox 显示一条消息! [6 `5 M9 }0 k7 W  I0 O
    private Command cmdExit; // 设定按钮用于退出MIDlet
    % J* X8 D+ t7 l6 h, y8 u8 ]# N8 apublic FirstMIDlet() { // MIDlet构造程序; Q- |- u. ^( K2 A" e* M5 e
    display = Display.getDisplay(this);
    : l! j- m. v6 QcmdExit = new Command("Exit", Command.SCREEN, 1);8 O& R0 G7 D" w4 P  ?
    textBox = new TextBox("My First MIDlet", "Hello, J2ME!", 50, 0);
    3 B4 H$ Q' P' v# c5 _: D3 KtextBox.addCommand(cmdExit);
    " N* T7 D$ w7 |+ m( E5 AtextBox.setCommandListener(this);& V1 l8 z/ n# r0 B# e
    }8 J- J, k, S& f/ R, M9 N
    public void startApp() { // 必须要实现的接口,被应用管理软件调用来启动MIDlet
    : r2 M  `$ T: j6 |! c' P+ F9 Kdisplay.setCurrent(textBox);: r5 m, J2 c5 r4 g& C) h
    }
    4 R4 m# {8 I0 l8 hpublic void pauseApp() { } // 必须要实现的接口
    5 j/ m# x4 P" G( _7 U, l- \0 rpublic void destroyApp(boolean unconditional) { } //必须要实现的接口
    & }" S2 Y# C. Dpublic void commandAction(Command c, Displayable d) { //检查一下是否选择了退出命令
      \2 n, r( ^" z/ U# c$ U9 {3 E5 ]1 o  Dif (c == cmdExit) {
    0 E0 N0 r3 v: P) odestroyApp(false);( m" I4 P# M) d
    notifyDestroyed();
    8 u( D# R) j. f8 A+ |, W}
    ' ?- T6 {8 x+ \! }. {# w}
    9 p7 O! x. a$ n1 K}" a5 q2 T  P5 s5 w
    这是最简单且功能完整的MIDlet应用程序,其中接口startApp、pauseApp、destroyApp是必须要实现的,应用程序管理器(JAM)通过这些接口调用和控制应用程序,与Applet类似。除这个主类外还可以有其它辅助类,其要求和J2SE一致。
    , [- a) Z! J+ {+ J9 Z# l然后使用javac工具编译,javac工具来自J2SE,至少JDK 1.3版,编译时应该使用参数-bootclasspath并指向MIDP类库。之后使用preverify工具预验证,以保证生成的.class文件符合CLDC要求,这一步为每个类文件添加堆栈映射(stackmap,此属性为CLDC新定义)属性,增加类文件大小约5%。1 W7 T% g7 D  T  O* P9 H) o
    此时可以用midp工具(来自MIDP实现的可执行文件)模拟运行,之后即可打包,需要编写一清单文件(清单文件参考CLDC/MIDP规范),用jar工具(来自J2SE)把预验证后的类文件、资源文件、清单文件打包。
    9 g0 ~# s: U7 `4 R要发布应用程序还需要编写一描述文件(JAD),JAD的要求同清单文件一致,可以自定义参数供应用程序调用。其中一个参数MIDlet-Jar-URL以URL方式指向JAR文件,移动终端设备通过JAM连接网络获取JAD,下载MIDlet-Jar-URL指向的JAR到设备中,通常JAM要先判断JAD与清单文件是否一致,应用程序是否有效,然后才决定下载。& K9 ]$ v8 Z+ s# b3 @& ]! i- {
    运行时执行环境、JAR包、JAD文件和应用程序生命周期,这些要素构成MIDlet套件,由JAM管理,每个MIDlet套件可包含一个或多个MIDlet。; v" H+ J1 ?4 j( {! a$ V2 S* g
    上面是一个MIDP应用程序开发的关键点,具体的开发方法及开发工具大致分为如下几种:
    . P& A7 v& G8 E3 ^0 EⅠ. 基本开发工具1 A# \7 Q3 m- }* C9 D
    最基本的开发方式是下载SUN提供的CLDC/MIDP参考实现及源代码,可根据需求编译生成一个CLDC/MIDP实现,并移植到设备上。配置好开发环境(CLDC/MIDP实现、JDK1.3)后即可采用上述方法和工具进行开发,多采用命令行方式,这是最原始的方法。
    $ {) [& |, [% G% sⅡ. J2MEWTK开发工具
    . n, D8 R! k- ]4 D: X这是SUN提供的便捷开发工具,用于Windows环境,同样需要先安装JDK1.3。源程序仍需要使用常规的文本编辑器,把编辑好的源文件及资源文件按一定要求放在规定目录下,J2MEWTK所提供的是菜单或按钮方式的命令。J2MEWTK中有相应的编译(和预验证一个步骤)、打包、模拟运行的菜单(或按钮),以及其它辅助工具。
    1 @+ g7 _) Q1 G" ]3 HⅢ. IDE工具5 k" z# O# B# M& i4 L
    可以使用Forte For Java、JBuilder等IDE工具和J2MEWTK集成使用,它们除了有J2MEWTK的功能外,就是提供有可视化的开发工具。
    5 _2 ^5 J* ]( L* o8 Z3. 使用JBuilder MobileSet9 @* ^4 ]- T$ X0 I% j" ~
    JBuilder是Java程序员常用工具之一,在于它强大的可视化编程工具,集成的编译、运行和调试环境。要为JBuilder提供J2ME无线应用开发支持,需要在JBuilder基础之上安装MobileSet,建议安装2.0版,当前支持CLDC/MIDP的1.0.3版本,而JBuilder的版本应该是6。JBuilder MobileSet 2可从下面网址免费下载:6 \  E. ^5 c# Q  Z- E: f9 _7 F! P
    http://www.borland.com/jbuilder/mobileset/
    3 p+ s5 J( s% j; n, }3 h- o4 J7 ?同时还要下载相应的MobileSet序列号和许可密钥(免费),根据提示安装MobileSet并注册后,运行JBuilder会找到“Help|MobileSet Guilde”菜单项。使用菜单“File->New...”打开“Object Gallery”对话框,会出现一个新的页面标签“Micro”,此时图标“MIDlet”和“MIDP Displayable”是灰色的,只有生成一个MIDP项目后才能使用这两个图标。
    + c  I( U# \" e3 j0 E7 Q' A3.1 JBuilder MobileSet的特征* \0 v. v9 e8 S8 u/ B/ f" c! q
    JBuilder MobileSet是一个开放工具,能够与其它供应商提供的J2ME开发工具包集成在一起,当前提供了对下列厂商工具包的支持:/ i3 A) j' Y# |4 E0 I: P7 H
    ¨ Sun提供的J2ME无线开发工具包1.0.3版(J2MEWTK)6 J3 p7 C2 d7 @& D# b. z% n
    ¨ 诺基亚的J2ME开发套件(http://forum.nokia.com)& c9 a; w/ |6 s" C+ R, S7 p
    ¨ 西门子的SMTK开发工具包(http://www.siemens-mobile.de)
    : V0 K5 ^2 e% d, Y/ a. ]6 G6 G其中J2MEWTK已经包含在MobileSet 2的安装文件中,如果要使用J2MEWTK提供的开发类库,并且还没有安装J2MEWTK,可以在安装MobileSet 2时选择完全安装。MobileSet 2提供了下列辅助开发的工具:
    ) g' k4 h9 G# N7 M7 N. M¨ 用于CLDC/MIDP类的CodeInsight工具
    & D: ~, s4 a, z¨ 类/包浏览器9 c# z) [& ~( _5 b+ \2 `
    ¨ JDK转换工具
    5 f: B3 `. _) q5 {3 h( T  y! w¨ 动态适配到任何J2ME简表,包括MIDP6 l# `2 G! l8 M8 M
    和开发其它Java应用程序一样,JBuilder通过MobileSet提供了快速开发模板,包括MIDP项目模板,MIDP Displayable模板,MIDlet模板。它提供了RAD(快速应用开发)的可视设计器,支持MIDP UI元素。通过MobileSet还支持MIDP应用程序打包和OTA配置(Over the Air,上载和下载文件和MIDlet套件,用来配置应用程序到设备上)。# m, A( r, ^; R/ J/ j) F; W& I
    MobileSet能够用在JBuilder的个人版、专家版和企业版,但是一些功能不能用在个人版如JDK设置切换,打包器等。$ S- `- j* @) i1 R7 [" X, g- m& x
    3.2 配置JDK
    4 r- l4 J' F, `* D1 M9 C前面已提到编译MIDP应用程序时需要设置特定的CLDC/MIDP类库,以避免使用默认的J2SE类库,在JBuilder中同样要进行类似设置。这是通过JDK配置选项实现的,JBuilder的设计独立于JDK,尽管每个JBuilder版本发布时会默认安装一个当时较新的JDK(类库),但还可以通过它的配置机制设置其它JDK,包括旧版本、更新版本或者OEM版的JDK,从而实现了JBulder的扩展性。
    & L% f, o, g6 G专家版和企业版的JBuilder可同时配置多个JDK,根据需要设置其中一个为默认即可,而个人版的却要在需要时重新配置每个JDK。安装MobileSet后可选择安装J2MEWTK、诺基亚和西门子的JDK,然后为设置的每个JDK自定义一个名称,并把其主目录指向这个JDK中\bin的父目录,需要注意的是JDK目录中不能有空格如c:\Program Files\ J2mewtk。, u( H2 }9 ?2 K* b. m* ^2 C
    3.3 MIDP项目& i6 N, f: n! i) M- {, {
    JBuilder开发都以项目概念为中心,项目文件包含一个(属于这个项目的)文件列表以及项目属性,其中项目属性包括项目模板、缺省路径、类库和连接配置等,JBuilder使用这些信息加载、保存、编译和运行项目。使用Jbuilder开发环境添加、移除文件,或者设置、更改项目属性都会更改项目文件。可以在项目面板中看到项目文件作为主节点显示。
    , e( V% C# A* I! \# c$ s7 \. w7 t生成项目的便捷方式是使用项目模板工具,可用来设置项目名称、类型和模板,以及JDK、工作目录、备份路径和编译输出路径等。其中项目类型可选择.jpx或者.jpr,二者内容一样,区别是前者使用XML格式文件,因此适合于共享的项目。! ]4 _9 n) D9 x, r
    而JDK则是前面所设置中的一个,并且只有选择CLDC/MIDP的JDK才能使用Object Gallery中的Micro选项。每个项目至少一个MIDlet主类,所以首先应使用MIDlet模板生成一个MIDlet主类。通过模板可以设置这个主类的类名、标题、屏幕类型和命令处理方式,其中屏幕类型有4个选择:(javax.microedition.lcdui.)Canvas、Form、List、TextBox,只有Form的扩展类才能添加其它的组件(Item的子类)。命令处理方式也有4个选择:4 o# d" z) v& m& u3 S6 {5 W
    Ⅰ. <none> —— 通过其它的类设置commandListener,比如MIDlet类。
    $ b& o' E0 z6 ~5 i( d: MⅡ. Interface implementation —— 生成一个类并在类中实现commandListener接口,这种方式生成的类的大小会比适配器方式生成的小。0 X6 h+ d* |% _8 d$ X0 m' f
    Ⅲ. Standard adapter —— 这种方式生成的代码采用标准适配器的形式:7 t3 D; ~, T4 V% ^$ o' E8 j
    class Foo {
    9 C* v6 i- f% I7 r! I1 j! iprivate void jbInit() {
    9 A% l( z; m% g! Z) SaddListener(new Adapter(this));# f, O" H& Y' e- O
    }+ C6 h  W4 @# l. w( r
    }
    1 c- [4 z% U' e- q; Oclass Adapter {" q" E8 s& b' k- I2 b. [- L
    ...4 H; \, R/ v' m6 o0 o! c
    }4 m# i8 S0 U  k$ t; r5 W: v
    Ⅳ. Anonymous adapter —— 这种方式生成的代码采用匿名适配器的形式:/ L: u: B) l" G; u3 O
    class Foo {
    + o4 |+ a( \  x/ aprivate void jbInit() {
    7 c& J5 H, {. f2 z. iaddListener(new Listener() {
    5 k+ A3 Y6 U- n% \; u+ A...
    9 H5 V- d- D, l" W5 d) w$ C});
    ( u+ f. F' z! N' n. [) g6 j$ p5 e}
    " o' g0 s( u7 I" q8 i1 c% A1 A) Z}0 C5 o2 {) N5 L4 K. h7 x. G
    后两种适配器形式可以通过项目属性“Code Style”设置。如果要在这个MIDP应用程序中添加更多的屏幕,可以使用Displayable模板添加,或者通过MIDlet模板添加更多的MIDP应用程序到项目中。
    - S( I( z  ]3 t: ^生成应用程序框架后,就可根据本文第2部分要求添加所需代码,并使用JBuilder提供的便捷方式进行编译(预验证)、打包、模拟运行和发布,JBuilder提供有内置web服务器和ftp服务器,以方便开发者测试应用程序的发布。
    0 V1 e/ r1 n# }2 O, w2 U如果使用MIDlet或Displayable模板生成一个Form类型的Displayable对象,则可以使用JBuilder的“MIDP设计器”定制用户界面,即从组件板上以拖拉方式生成UI元素,可用鼠标调整这些元素的位置或者进行复制、删除等操作,这就是JBuilder强大功能之所在。/ F: a) ?" A$ U
    如果是使用模板生成Displayable类,会自动生成jbInit()方法,当在Form中添加UI元素时,设计器会把代码添加进jbInit()方法。如果希望打开一个现有Displayable类到设计器,它已经有UI元素,但是没有jbInit()方法,首先需要生成一个jbInit()方法,然后把所有的UI元素转移进去。
    6 N  X) Z- Q# I% Y$ u2 _7 [/ T9 Z7 a$ @$ K2 u& F0 U. o- |6 \  I6 y
    【参考文献】, v! R/ ]! L+ @) v
    1. Connected Limited Device Configuration Specification Version 1.0a,
    $ ^9 V" [$ [1 p! B/ P0 {2. J2ME CLDC API 1.0
    % j; \; E" T7 [) m# l2 d( {3. Mobile Information Device Profile(JSR-37) JCP Specification9 d6 d$ y/ }$ J$ C
    4. Java Mobile Information Device Profile (MIDP) 1.0.3 Reference Implementation API  R7 v1 x" w, K6 {! U  G
    以上资料均来自http://java.sun.com/j2me
    " Q, x0 |/ v& D【SUBJECT】
    & z1 n% m" X1 v9 m1 tThis paper made a deep research in the architecture of J2ME and the developing process with MIDP, summarized the basic process and method of MIDP application developing, compared the alternate develop tools. As a typical JAVA IDE develop tool, JBuilder combining with JBuilder MobileSet 2.0 provided a powerful tool for MIDP developing. Based on the study of methodology in MIDP developing, the paper summarized the character and key of JBuilder as a MIDP developing tool.$ N+ z0 |: \' A2 R* M( Y
    【KEY WORD】J2ME、CLDC、MIDP、JBuilder、MobileSet
    zan
    转播转播0 分享淘帖0 分享分享0 收藏收藏0 支持支持0 反对反对0 微信微信
    数学中国网站是以数学中国社区为主体的综合性学术社区,下分建模、编程、学术理论、工程应用等版块。从2003年11月建站以来一直致力于数学建模的普及和推广工作,目前已经发展成国内会员最多,资源最丰富,流量最大的数学建模网络平台。我们始终秉承服务大众的理念,坚持资源共享、共同进步的原则,努力营造出严肃、认真、务实、合作的学术氛围,为中国数学的发展做出应有的贡献。
    您需要登录后才可以回帖 登录 | 注册地址

    qq
    收缩
    • 电话咨询

    • 04714969085
    fastpost

    关于我们| 联系我们| 诚征英才| 对外合作| 产品服务| QQ

    手机版|Archiver| |繁體中文 手机客户端  

    蒙公网安备 15010502000194号

    Powered by Discuz! X2.5   © 2001-2013 数学建模网-数学中国 ( 蒙ICP备14002410号-3 蒙BBS备-0002号 )     论坛法律顾问:王兆丰

    GMT+8, 2026-4-20 05:01 , Processed in 0.583344 second(s), 52 queries .

    回顶部