applet程序的编写.doc_第1页
applet程序的编写.doc_第2页
applet程序的编写.doc_第3页
applet程序的编写.doc_第4页
applet程序的编写.doc_第5页
已阅读5页,还剩40页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

Applet程序的编写Applet是什么n Applet又称为Java小应用程序,是能够嵌入到一个HTML页面中,并且可通过Web浏览器下载和执行的一种Java类 。n Applet不需要main()方法,由Web浏览器中内嵌的Java虚拟机调用执行。通常我们在写程序的时候,如果要想程序能够运行,我们需要在程序中写main方法,而Applet执行不需要main方法,是由嵌入到Web浏览器中的Web虚拟机调用执行,我们在安装JDK的时候,就会给我们IE浏览器嵌入一个插件,这个插件就是用来给我们执行Applet Java小应用程序的。Applet的安全限制n 因为applet是从远端服务器上下载并且在本地执行,所以安全性就显得格外重要。如果我们从网络下载一个Applet能够随意地访问我们本地计算机的资源,那么就有可能将我们本地计算机的密码,帐号信息通过Internet传输出去,这样的后果相当严重。n 通过限制applet在沙箱(applet的运行环境)中运行,保证了对本地系统而言applet是安全的。n applet在沙箱中运行时:不能运行任何本地可执行程序;除了存放下载的applet的服务器外,applet不能和其它主机进行通信。也就是说当我们从远端服务器上下载applet的时候,这个applet只能和这个服务器进行通信,不能和其他主机进行通信。不能对本地文件系统进行读写下面我们看帮助文档。在java.applet中有一个类,叫做applet, java.applet Class Appletjava.lang.Object java.awt.Component java.awt.Container java.awt.Panel java.applet.Applet编写一个java小应用程序,就是编写一个类,让这个类,从applet派生而来Applet这个类它是从java。Awt。panel这个类派生而来,所以applet中添加像button,复选框这样的组件,因为applet是从panel派生出来的Panel缺省的布局管理器是flowlayout,所以applet缺省的布局管理器也是flowlayout,在applet类中有四个方法,表示了applet的生命周期。voiddestroy() voidinit()voidstart() voidstop() 这四个方法就表示了一个applet它的生命周期,下面编写一个java小应用程序。import java.applet.*;/ 导入applet中所有的类,但是我们在编写java小应用程序的时候,因为小应用程序是在网络上加载运行的,但我们用到一个包中某一个类,而我们采用的是导入这个包中所有的类在本地运行的时候不会有太大的影响,但是如果通过网络载一个类的时候,因为导入了一个包中所有的类,加载的时候效率会有影响,所以我们在编写一个java小应用程序的时候,最好是用到哪个类而导入哪个类,而不要导入包中所有的类,我们测试的时候为了简单可以将包中所有的类都导入public class TestApplet extends Applet写类的时候可以声明为public,也可以声明为缺省的类但是我们在编写一个java小应用程序的时候,所定义的的类要声明为public,否则的话浏览器就无法加载我们的类,因为用到applet,所以要引入包/重写四个方法public void init()System.out.println(init);public void start()System.out.println(start);public void stop()System.out.println(stop);public void destroy()System.out.println(destroy);编译源文件,因为在小应用程序类中没有main方法方法,所以不能用java解释器去运行,applet是嵌入在网页中运行的的类,所以我们要编写一个网页文件。新建一个文本文档,后缀为html,去测试,运行,applet类已经被我们浏览器加载运行了,为什么没有看到没有看到打印输出的文字呢,在我们的屏幕上打印输出文字,在我们的浏览器中看不到我们输出的文字。如何看到呢?可以利用sun公司提供的测试java小应用程序的工具,appletviewer在bin目录下面,这个工具就是用来测试我们所编写的java小应用程序的。JavacAppletview TestApplet.html调用了init,和start方法在菜单里面选择停止的时候,看到调用stop方法,选择启动的时候选择启动的时候,看到其调用了start方法,选择重新启动的时候,看到先调用stop方法,然后destroy方法,然后init方法,然后start方法,启动start方法。在执行的时候,四个方法执行的顺序是先启动init,然后调用start方法,当我们的applet要销毁的时候,我们调用的是destroy方法。Applet的生命周期n init():当浏览器加载applet,进行初始化的时候调用该方法。在我们编写applet的时候,不需要提供构造方法,应该将所有的初始化操作都放到init方法当中,因为当一个applet构造方法调用的时候,实际上在浏览器编辑环境中,有一些初始化的工作没有完成,所以将一些初始化工作放在init方法中,而不需要放在小应用程序的构造方法中,我们也不需要提供一个这样的构造方法。n start():在init()方法之后调用。当用户从其它页面转到包含applet的页面时,该方法也被调用。n stop():在用户离开包含applet的页面时被调用。也就是说当一个applet不可见的时候,会调用一个stop方法,当它重新可见的时候,会调用一个start方法。n destroy():当applet不再被使用,或浏览器退出的时候,该方法被调用。Applet 退出的时候,会调用destroy方法。这就是applet的生命周期。它还有一个好处,因为appletviewer只认applet,不管标签放在哪个文件当中的,通常测试的时候,可以直接在。Java的源文件当中,写上一个注释,然后将将拷贝放在源文件中,并且注释起来,当我们在执行的时候,可以利用appletview直接执行后缀名为java的源文件。,因为appletviewer这个工具会忽略除了applet这个标记之外的其他任何语句,所以这些代码都被忽略了,包括用来注释的反斜杆,只是执行applet标记中的代码,所以看到直接。Java这个文件,小程序查看器就加载了这个TestApplet这个类,然后执行。这样的话就不需要针对每一个applet类去写一个网页文件了,这样在测试的时候是极为方便的,当然正式发布的时候,还是需要写一个网页文件进行实际的测试,这是我们appletviewer这样的工具只认applet标记,我们如何在一个applet上面显示输出我们一行文字呢看一下pptpaint()方法n Applet本质上是图形方式的,我们应该在图形环境中绘制我们的显示内容。n 我们可以通过创建一个paint()方法在Applet的panel上绘图。只要Applet的显示需要刷新,paint()方法就会被浏览器环境调用。例如,当Applet的显示尺寸发生变化的时候,或浏览器窗口被最小化或被要求以图标方式显示时,这种调用就会发生。看帮助文档,在applet这个类上,查找paint方法,container这个类中有个paintt方法,我们applet这个类从container这个类继承了这个paint方法,paintpublic void paint(Graphicsg)Paints the container. This forwards the paint to any lightweight components that are children of this container. If this method is reimplemented, super.paint(g) should be called so that lightweight components are properly rendered. If a child component is entirely clipped by the current clipping setting in g, paint() will not be forwarded to that child. Overrides: paint in class ComponentParameters: g - the specified Graphics window See Also:有一个参数,它的类型是个Graphics,我们看java.awt Class Graphicsjava.lang.Object java.awt.GraphicsDirect Known Subclasses: DebugGraphics, Graphics2Dpublic abstract class Graphicsextends ObjectThe Graphics class is the abstract base class for all graphics contexts that allow an application to draw onto components that are realized on various devices, as well as onto off-screen images. Graphics这个类是来表示图形上下文的抽象基类,允许一个应用程序在各种不同的设备在实现的组件上绘图,这句话是指我们知道作为一个图形的现实来说,它是显示设备来完成显示的工作,Graphics这个类封装了显示细节,也就是屏蔽底层显示的细节,要想绘制一个图形,只需要获取一个Graphics这个类的对象,利用这个对象的方法,就可以完成我们绘制图形的工作。比如说我们要想在Applet上显示输出一行文本,可以利用类中的drawstring方法abstract voiddrawString(Stringstr, intx, inty) Draws the text given by the specified string, using this 方法第一个参数是string类型,后面两个参数是x坐标和y坐标,用来指示我们在哪个位置上面画我们字符串。使用图形上下文当前的字体和颜色。n 我们应该编写自己的paint()方法,以使它在任何时候被调用,都能正常地工作。也就是说我们应该在我们自己的类当中,去覆盖父类的paint方法,n 对它的调用是异步产生的,且由Applet的运行环境而不是程序来驱动 。 也就是说在程序当中,不应该自己去调用paint方法,paint方法调用是由applet运行环境来调用的,n paint()方法带有一个参数,它是java.awt.Graphics类的一个实例。这个参数总是建立该Applet的panel的图形上下文,我们可以用这个图形上下文在Applet中绘图或写入文本。 那么这个图形上下文,可以理解为我们做图和底层的显示实现细节的抽象层。利用图形上下文就可以完成我们图形绘制和文本输出的工作。下面演示重写paint方法import java.awt.*;public void paint(Graphics g)/Graphics这个类是AWT中的类,要导入g.drawString(维新科学技术培训中心,0,0);执行网页 appletviewer TestApplet.html看到小程序已经启动了,但是在屏幕上面,我们好像没有看到我们的文字输出,那么把这个文字输出,看pptg.drawString(gggggggggggggggg,0,0); 再次执行,观察,看到屏幕上看到g字母的下面的一部分,但是g字母在applet上没有完整显示出来,是什么原因呢。我们看一下啊ppt字符的各种属性ghascentdescentbase lineleadingheightascent line descent line对于字符来说有一些属性,当我们显示一个字符的时候,是以一个机械的位置开始显示,当显示的时候是以基线所在的位置开始显示,因为我们在00的位置,上输出我们的文字,显示的时候是以基线的位置开始显示,所以在基线以上的部分我们就没有看到,而基线以下的部分,显示出来了。在这个地方还有一个升序线,是在上面也就是字符最高的位置,就是我们的升序线,在升序线和基线之间的距离,我们叫做这个升序的高度,还有个降序线,是字母最低的位置,在基线和降序线之间这个高度是我们降序高度,还有个高度叫做leading值得,它是指我们这行文本的降序线和下一行文本的升序线之间的距离,叫做leading对于我们字符的高度,就是我们升序的高度加上降序的高度再加上leading的距离,作为字符的高度。知道属性之后,我们就知道为什么不可以看到整个字符内容了,在java中有个类,来帮助我们获取字符的属性。在awt包中,java.awt Class FontMetricsjava.lang.Object java.awt.FontMetricsAll Implemented Interfaces: SerializableintgetAscent() intgetDescent() intgetHeight() intgetLeading() 因此我们要获取一个字符属性的话,我们就会产生一个fontmetrics对象,然后调用其中的方法。g.drawString(gggggggggggg,0,30);执行。下面我们改变一下我们输出文字的字体,要创建字体有个类font,java.awt Class Fontjava.lang.Object java.awt.FontAll Implemented Interfaces: Serializable看构造方法protected Font(Fontfont) Creates a new Font from the specified font.Font(Mapattributes) Creates a new Font with the specified attributes.Font(Stringname, intstyle, intsize) Fontpublic Font(Stringname, intstyle, intsize)第一个参数是字体的名字在java中支持的字体是有限的,第二个是字体的类型,要输出的字体是简单的普通格式,还是其他粗体,或者斜体等。第三个参数是字体的大小。Font f=new Font(楷体_2312,Font.BOLD,30)将字体加入到当前的图形上下文中,当我们利用图形上下文绘制字符串的时候字体的改变,才能生效,利用Graphics中的abstract voidsetFont(Fontfont可以设置字体为指定的字体Font f=new Font(楷体_2312,Font.BOLD,30); g.setFont(f);g.drawString(城市轨道通信,0,30);可以看到以楷体的方式显示,而且字体的大小,明显加大了,这是利用font类创建字体,加入到图形上下文中,输出我们的文字,还可以改变输出文字的颜色。 g.setColor(Color.blue);执行,看到蓝色的显示输出文字。Applet如何从网页中获取信息呢正如应用程序可以通过命令行参数来获取信息一样,通过使用param标记,applet可以从网页中获取信息。在网页html文件中加入param标记;对于applet来说,如何去获取网页中设定的名字为font的值呢。看帮助文档。AppletgetParameterpublic String getParameter(Stringname)Returns the value of the named parameter 就是用来获取我们在html一个命名的参数的值,就可以在applet中利用getParameter来获取,我们名字为font的值,import java.awt.*;import java.applet.*;/ 导入applet中所有的类public class TestApplet extends AppletString strFont;/重写四个方法public void init()strFont=getParameter(font);/会返回font的值System.out.println(init);public void start()System.out.println(start);public void stop()System.out.println(stop);public void destroy()System.out.println(destroy);public void paint(Graphics g) Font f=new Font(strFont,Font.BOLD,30); g.setFont(f); g.setColor(Color.blue);g.drawString(城市轨道通信,0,30);/*/ 看到现在输出以楷体方式显示的。通过在网页当中,设定applet属性,所需要的信息,给我们提供了实践上的灵活性,我们可以根据需要,随时修改在网页中的信息。而不需要重新去编译我们applet,这是applet从网页中获取信息。Applet可以与用户之间直接进行交互。当用户在Applet上面点击鼠标,那么Applet可以响应这个事件,并且对这个事件进行处理,下面我们看如何在applet上面去画一个线条。分析画线的过程,一个线是由两个点组成的,也就是获取两个点,然后画线,我们画线的时候,是我们当鼠标左键按下去的时候,这个时候就可以获取到一个点,鼠标左键按下去就有个鼠标事件发生。我们可以响应这个时间,在响应这个事件的时候,我们在同时获取到一个点,当我们按下鼠标左键,在我们窗口上面拖动的时候,当我们松开鼠标左键的时候,又可以获取一个点也就是只要响应鼠标左键松开这样一个事件,那么我们就可以获取到另外一个点,有了这两个点,就可以画一条线了,我们在applet增加鼠标监听器,一旦有鼠标事件发生的时候,就由监听器去进行处理。如果我们对java中命名比较熟悉的话,我们知道java中有个mouselistener这个监听器,相应的方法就是addmouselistener。增加窗口监听器,就是一个addwindowlistenerjava.awt.event Class MouseAdaptervoidmousePressed(MouseEvente) Invoked when a mouse buttonvoidmouseReleased(MouseEvente) Invoked when a mouse button has been released on 重写int xOrigin,yOrigin;addMouseListener(new MouseAdapter()/利用匿名内部类完成/MouseAdapter是空实现,适配器中所有的方法都是空实现 public void mousePressed(MouseEvent e) /MouseEvent这个类给我们提供了2个方法,一个是getx,一个是get y xOrigin=e.getX(); yOrigin=e.gety(); /响应鼠标左键松开事件,捕获事件 /刚才我们是在paint方法中做图,有个方法是graphics /所以我们直接利用graphics对象做图 /但是在mousereleased中没有graphics对象,如何去画一条线呢 /首先要想办法去获取一个graphics对象因为graphics是个抽象 /的类,不能直接实例化,在applet中有没有相应java.applet Class AppletgetGraphicspublic Graphics getGraphics()这个方法就是用来创建一个组件的图形上下文。利用此获取图形上下文。Graphicsabstract voiddrawLine(intx1, inty1, intx2, inty2) Draws a line, using the current color, between the points (x1,y1) and (x2,y2) in this graphics contexts coordinate system.import java.awt.*;import java.applet.*;import java.awt.event.*;public class TestApplet extends AppletString strFont;int xOrigin,yOrigin;/重写四个方法public void init()strFont=getParameter(font);/会返回font的值addMouseListener(new MouseAdapter()/利用匿名内部类完成/MouseAdapter是空实现,适配器中所有的方法都是空实现 public void mousePressed(MouseEvent e) /MouseEvent这个类给我们提供了2个方法,一个是getx,一个是get y xOrigin=e.getX(); yOrigin=e.getY(); /响应鼠标左键松开事件,捕获事件 /刚才我们是在paint方法中做图,有个方法是graphics /所以我们直接利用graphics对象做图 /但是在mousereleased中没有graphics对象,如何去画一条线呢 /首先要想办法去获取一个graphics对象因为graphics是个抽象 /的类,不能直接实例化,在applet中有没有相应的方法去获取graphics对象 public void mouseReleased(MouseEvent e) Graphics g=getGraphics(); g.drawLine(xOrigin, yOrigin, e.getX(),e.getY(); );System.out.println(init);public void start()System.out.println(start);public void stop()System.out.println(stop);public void destroy()System.out.println(destroy);public void paint(Graphics g) Font f=new Font(strFont,Font.BOLD,30); g.setFont(f); g.setColor(Color.blue);g.drawString(城市轨道通信,0,30);/*/执行,可以发现可以画线改变颜色g.setColor(Color.red);这是applet中响应一个鼠标事件,通过一个监听器,监听器是个匿名的内部类,所以我们看到内部类的应用相当广泛的。在做图的时候,有个初学者很容易犯迷糊的问题,Graphics是个抽象的类,为什么就可以去产生对象,然后呢调用它的方法,呢,注意在paint的方法中,我们仅仅是声明了一个graphics这个类的引用类型的变量。这个时候并没有产生实际的对象。当我们applet这个运行环境去调用paint方法,自然回去构造一个graphics的对象,然后将对象作为实际参数传递过来,而这个g是个引用类型的变量,它仅仅保存了对象的引用,所以我们才能够通过g来调用graphics这个类中的方法,从而完成绘图。所以一定要注意引用类型的变量和真正的对象昂它们之间的关系弄清楚,当我们在声明一个变量的时候,这个对象并没有产生,不要以为public void paint(Graphics g)是个抽象的类,应该不能够去调用方法。一定要把引用类型的变量和真正的对象区分开来,下面看applet如何与浏览器之间进行通信。n 在浏览器中显示信息 调用AppletContext接口中的showStatus()方法java.applet Interface AppletContext这个接口可以理解为Applet和浏览器之间进行交互的,通信路径,在这个接口中的voidshowStatus(Stringstatus)方法可以在浏览器的状态栏上显示一些信息,但是要注意浏览器自身也会用到一些状态栏显示一些信息,我们调用shownstatus这个方法所显示的信息,因此这个方法不是太实用,很少使用voidshowDocument(URLurl) Requests that 可以请求浏览器打开另外一个网页,它有两个重载的方法,这个showdoucument是在当前的浏览器中打开一个网页,第二个showcument可以通过指定一个参数来指示浏览器是打开一个新的窗口呢,还是在当前窗口打开或者说在当前窗口的父窗口上面打开,。有一些选项Target ArgumentDescription_self Show in the window and frame that contain the applet._parent Show in the applets parent frame. If the applets frame has no parent frame, acts the same as _self._top Show in the top-level frame of the applets window. If the applets frame is the top-level frame, acts the same as _self._blank Show in a new, unnamed top-level Show in the frame or window named name. If a target named name does not already exist, a new top-level window with the specified 用来指示新打开的网页是在哪一个窗口当中,。下面看应用import java.awt.event.*;import .URL;/重写四个方法public void init() Button btn=new Button(链接); add(btn); btn.addActionListener(new ActionListener() /采用匿名内部类来实现actionlistener这个接口当中 /的所有方法 public void actionPerformed(ActionEvent e) try getAppletContext().showDocument( new URL(),_blank); /是applet类中的方法,可以获取一个 /实现了appletcontext的对象 /通过这个方法就可以获取到appletcontex /利用showdocument(),请求浏览器显示另外一个网页 /http:/localhost/postinfo.htm是我们本地机子上的一个文件 /确保IIS服务已经启动,第二个参数指示是在什么窗口中以何种方式打开url /选择blank在新的顶层窗口中打开url /因为我们URL时候,可能抛出异常,用try语句进行捕获。 catch(Exception ex) ex.printStackTrace(); );执行,可以看到打开目录下html文件,可以看到网页测试文件打开,同时applet也开始运行了,点击链接,可以看到新的窗口中打开了的文件n 请求浏览器显示指定的网页 调用AppletContext接口中的showDocument()方法。注意你的机子上安装了IIS, 并且确实启动了如何利用Applet来制作动画程序新建工程ImageTest,新建一个类ShowImage。从applet派生出来。package ImageTest;import java.applet.Applet;import java.awt.HeadlessException;public class Showimage extends Applet 先编译源文件。这样在目录下有class和src两个文件夹。如何在applet上面绘制图像呢?要在applet上面绘制图像,可以利用graphyis中的drawimage方法,看一下此方法。drawImagepublic abstract boolean drawImage(Imageimg, intx, inty, Colorbgcolor, ImageObserverobserver)如何获取image类多项 java.awtClass Imagejava.lang.Object java.awt.ImageDirect Known Subclasses:BufferedImage,VolatileImageImage是个抽象类不能直接实例化一个对象,如何去获取一个image类对象呢。利用applet中的getimage来获取。可以用来获取image类多项getImagepublic Image getImage(URLurl, Stringname)看一下image方法的其他参数。X和y表示绘制的坐标。java.awt.imageInterface ImageObserver是可以实施图像状态信息是否改变的接口,在java.awt的包中,。Componet这个类就实现了这个接口,因此applet这个类也间接实现了ImageObserver接口。java.appletClass Appletjava.lang.Object java.awt.Component java.awt.Container java.awt.Panel java.applet.AppletAll Implemented Interfaces:ImageObserver,MenuContainer,Serializable,Accessible所以可以直接将applet一个对象直接传递给drawimage方法去demo目录下打开applet找animator。Image。beans找到beans。拷贝一个复制到ImageTest、classes目录下。利用两个方法来构造URL,一个是getDocumentBasepublic URL getDocumentBase()Gets the URL of the document in which this applet is embedded. For example, suppose an applet is contained within the document: /products/jdk/1.2/index.html The document base is: /products/jdk/1.2/index.html Returns:theURLof the document that contains this applet.See Also:getCodeBase()返回一个包含applet的HTML文件所在的目录,但是这个解释错误的。实际上是返回包含了applet,html文件的URL。getCodeBasepublic URL getCodeBase()Gets the base URL. This is the URL of the directory which contains this applet.Returns:the baseURLof the directory which contains this applet.See Also:getDocumentBase()getCodeBase解释也是错误的,实际上是返回applet所在目录的URL,因此方法的解释和它们实际返回的URL是不一致的。但是不影响使用。如果图像适合HTML文件放在一起,我们可以用getdocumentbase。如果图像是和applet这个类放在一起,那么我们可以用getcodebase方法。package ImageTest;import java.applet.Applet;import java.awt.HeadlessException;import java.awt.*;/image是在awt中的类,所以要导入public class Showimage extends Applet private Image img; /定义一个img对象 public void init()/构造init方法,完成初始化工作 img=getImage(getDocumentBase(),T1.gif )/利用applet中的两个方法来构造URL /有了图像之后,就可以绘制 public void paint(Graphics g) g.drawImage(img,0,0,this);/利用this所代表的对象作为参数传递进去。 /写一个网页文件将applent嵌入到网页文件中注意文件夹如何存放,以及用appletviewer来看.可以看到图像显示出来,利用drawimage方法来显示一个图片, 传统的动画程序是通过连续播放一幅幅的图像,利用人眼的视觉残留效应来形成动画的效果,那么在applet中也是采用这种技术来实现 动画效果,先准备多幅图片,每隔一定的时间 就绘制一幅新的图形,就可以形成动态的效果,到beans目录下拷贝所有的图片。,放到相应的目录下。Compounent类的方法repaintpublic void repaint(intx, inty, intwidth, intheight)Repaints the specified rectangle of this component.If this component is a lightweight component, this method causes a call to this componentspaintmethod as soon as possible. Otherwise, this method causes a call to this componentsupdatemethod as soon as possible.Note: For more information on the paint mechanisms utilitized by AWT and Swing, including information on how to write the most efficient painting code, seePainting in AWT and Swing.Parameters:x- thexcoordinatey- theycoordinatewidth- the widthheight- the heightSince:JDK1.0See Also:update(Graphics)updatepublic void update(Graphicsg)Updates this component.If this component is not a lightweight component, the AWT calls theupdatemethod in response to a call torepaint. You can assume t

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

最新文档

评论

0/150

提交评论