仓酷云

标题: JAVA网页编程之使用JSP 2.0开辟Web使用程序 [打印本页]

作者: 兰色精灵    时间: 2015-1-18 11:32
标题: JAVA网页编程之使用JSP 2.0开辟Web使用程序
比如模式、敏捷方法什么的,这些思想好,但是实施的人没有理解而且没有正确运用这些知识导致了开发周期的延长。比如说对象,通过getName()方法不能获取对象的名字。js|web|程序JSP(JavaServerPages)手艺是对Servlet的进一步笼统,它由JCP(JavaCommunityProcess)开辟,是用于天生静态内容的开放式的、可收费猎取的标准,也是J2EE(Java2EnterpriseEdition)标准的主要构成部分。很多贸易使用服务器如BEAWebLogic、IBMWebSphere、LiveJrun和Orion都撑持JSP手艺。

从机票预订体系、银行体系到购物体系,Web上各处都在使用JSP手艺。新公布的2.0版是对JSP1.2的晋级,增添了一些风趣的新特征。JSP2的方针是使静态网页的计划加倍简单,并且无需进修Java编程言语。

本文内容包含:

供应具有丰厚示例代码的教程来使你熟习JSP2.0
先容JSP2.0的新特征
供应使用JSP2.0开辟使用程序的一些体味
给出了一些示例代码,对这些代码略加修正便可用于你本人的使用程序。
假如你还不熟习JSP,那末间接从JSP2.0动手是一个不错的主张。可是假如但愿进修JSP1.2,大概你必要从JSP教程入手下手进修。

JSP2.0
JSP2.0是对JSP1.2的晋级,增添了几个风趣的新特征,可使Web使用程序计划职员和开辟职员的事情更简单一些。JSP2.0的方针是比之前更容易于利用,更主要的是不必进修Java言语自己就能够利用它。它增添了一种称为SimpleTag的新扩大机制来简化标签API(TagAPI)。

除其他一些改善外,JSP2.0引进的最次要的新特征包含:

1.一种复杂的表达式言语(EL),可以用来简单地从JSP页面会见数据,这类表达式言语简化了基于JSP的不含剧本的使用程序的编写,不必要利用JavaScriptlet大概Java表达式;

2.用于间接利用JSP手艺来界说可重用的自界说举动的新语法,该语法利用.tag和.tagx文件,这类文件可由开辟职员大概网页作者编写;

3.3XML语法失掉了本色性的改善,增添了新的尺度文件扩大名(.tagx用于标签文件,.jspx用于JSP文件)。

本文次要会商表达式言语、简化的标签API和标签文件。信任今朝的JSP开辟职员将会发明这些主要的特征不仅风趣,并且十分有效。

为什么要从1.2超过到2.0?
在Java规格哀求(JSR152)中版本号最后定为1.3。可是正如你将在前面看到的那样,因为这些新特征对JSP使用程序的开辟模子发生了云云深入的影响,专家组感应有需要把主版本号晋级到2.0,如许才干充实反应这类影响。别的,新的版本号也有助于把开辟职员的注重力吸引到这些风趣的新特征下去。使人欣喜的是,一切正当的JSP1.2页面同时也是正当的JSP2.0页面。

JSP2.0起步
在动手进修JSP2.0之前,你必要一个撑持JSP2.0和JavaServlet2.4标准的JSP情况。侥幸的是,JakartaTomcat5.0(alpha测试版)撑持新的JSP2.0和Servlet2.4标准,能够从http://jakarta.apache.org/builds/jakarta-tomcat/release/v5.0.4-alpha/下载并安装Tomcat5.0。

JSP表达式言语
向JSP网页传送信息是经由过程JSPscoped属性和哀求参数完成的。专门为网页作者量身定做的一种表达式言语(EL)把JSPscoped属性提拔为从营业逻辑向JSP页面传送信息的尺度体例。可是要注重,只管这类表达式言语是JSP的一个主要特征,它并非一种通用的程序言语。它仅仅是一种数据会见言语,能够便利地会见和处置使用程序数据,而无需利用scriptlet大概哀求时(request-time)表达式的值。

在JSP2.0之前,网页作者只能利用表达式<%=aName%>会见体系的值,好比上面的例子:

<someTags:aTagattribute="<%=pageContext.getAttribute("aName")%>">

大概利用自界说JavaBeans组件的值:

<%=aCustomer.getAddress().getCountry()%>

表达式言语同意网页作者利用复杂的语法会见对象。好比要会见一个复杂变量,能够像上面如许写:

<someTags:aTagattribute="${aName}">

而会见嵌套的JavaBeans属性,则能够像上面如许写:

${aCustomer.address.country}

你大概会问,这不是JavaScript的语法吗?完整准确!假如你利用过JavaScript,就会感应十分轻松,由于表达式言语恰是借用了会见布局化数据的JavaScript语法。


--------------------------------------------------------------------------------

注重:表达式言语最后是作为JSP尺度标签库(JSTL)1.0的一部分而开辟的,JSTL是一种尺度标签库,它供应对通用的、布局化的义务的撑持,如迭代和前提、XML文档处置、国际化和使用SQL会见数据库等。JSTL标准是由JSR52专家组开辟的。关于JSTL的先容,请拜见FasterDevelopmentwithJSTL(利用JSTL减速开辟).


--------------------------------------------------------------------------------

会见使用程序数据
可使用点号运算符(.)会见作为对象属性的使用程序数据,也可以使用方括号运算符[‘name’]会见定名的数组元素。

表达式${data}暗示名为data的scoped变量。可使用点号(.)或方括号([])运算符从汇合中检索属性值:

点号运算符用于会见定名的属性,好比表达式${customer.name}暗示scoped变量customer的name属性;
方括号运算符可用于检索定名的属性,好比在${customer[“name”]}中。也能够经由过程${customers[0]}的情势来会见汇合customers中的第一项。
表达式言语一致了对点号和方括号运算符的处置,因而${customer.name}与${customer[“name”]}是等价的。正如你看到的那样,表达式必需利用${和}包抄起来。

EL的标识符求值体例是利用PageContext.findAttribute(String),把标识符作为一个属性来查找它的值。假如没有找到该属性,则前往null。

运算符
表达式言语撑持算术运算符、干系运算符和逻辑运算符,以完成年夜多半的数据处置操纵。别的,它还供应了一个用于测试一个对象是不是为空的特别运算符。运算符如表1所示。你可使用empty运算符判别某个汇合或字符串是不是为空。例如说,只要当请求的定名参数param没有给出时,表达式${emptyparam.name}才前往真。Empty运算符能够与“!”运算符一同利用,好比${!emptyparam.name}当请求的定名参数param存在时前往真。

表1:表达式言语运算符

运算符
申明

+


-


*


/或div


%或mod
模(求余)

==或=
即是

!=或!=
不即是

<或lt
小于

>或gt
年夜于

<=或le
小于即是

>=或ge
年夜于即是

&&或and
逻辑与

||oror
逻辑或

!或not
逻辑非

empty
反省是不是为空值

a?b:c
前提运算符


隐含对象
除运算符外,表达式言语还界说了一些隐含对象以撑持网页作者会见必要的使用程序数据。表达式言语界说的隐含对象如表2所示,前面将给出利用这些隐含对象的一个例子。

表2:表达式言语中的隐含对象

隐含对象
内容

applicationScope
使用程序局限内的scoped变量构成的汇合

cookie
一切cookie构成的汇合

header
HTTP哀求头部,字符串

headerValues
HTTP哀求头部,字符串汇合

initParam
全体使用程序参数名构成的汇合

pageContext
以后页面的javax.servlet.jsp.PageContext对象

pageScope
页面局限内一切对象的汇合

param
一切哀求参数字符串构成的汇合

paramValues
一切作为字符串汇合的哀求参数

requestScope
一切哀求局限的对象的汇合

sessionScope
一切会话局限的对象的汇合


表达式言语的例子
如你所言,网页作者不必进修Java也可以利用这类表达式言语。示例代码1显现了一些表达式的例子和隐含对象的利用。

代码示例1:ex1.jsp

要运转这个例子,请参照以下步骤,这里我们假定Tomcat5.0安装在c:        omcat5.0下。

1.切换目次到c:Tomcat5.0webappsjsp-examples

2.创立新目次,名字能够是恣意的,好比jsp2-tutorial

3.切换到jsp2-tutorial

4.把ex1.jsp复制并保留到该目次下

5.启动Tomcat5服务器:指向“入手下手”->“程序”->“ApacheTomcat5.0”,单击“ApacheTomcat5.0”来启动Tomcat

6.在扫瞄器中输出http://localhost:8080/jsp-examples/jsp2-tutorial/ex1.jsp

你将看到相似所示的画面。利用表达式言语就这么复杂!


:JSP表达式言语和隐含对象


--------------------------------------------------------------------------------

注重:在本文中,一切的JSP文件都保留在c:Tomcat5.0webappsjsp-examplesjsp2-tutorial目次下。


--------------------------------------------------------------------------------

添补表单例子
隐含对象$paran[var]可用于读取添补表单的数据。代码示例2给出了一个复杂的表单,该表单提醒用户输出一个名字。

代码示例2:form.jsp

<HTML>
<HEAD>
<TITLE>FormContent</TITLE>
</HEAD>

<BODY>

<H3>Fill-out-form</H3>
<P>
<FORMaction="form.jsp"method="GET">
Name=<inputtype="text"name="name"value="${param[name]}">
<inputtype="submit"value="SubmitName">

</FORM>
<P>
TheNameis:${param.name}
</BODY>
</HTML>
在本例中,当用户输出名字并单击“提交”按钮时,输出的名字就会显现统一页面中的“TheNameis:”字样前面,如所示。

一样,运转这个例子只必要把form.jsp复制到c:Tomcat5.0webappsjsp-examplesjsp2-tutorial下并用扫瞄器翻开它。


:表单处置

界说和利用函数
表达式言语同意你界说可在表达式中挪用的函数。函数必需作为public类中的publicstatic办法编写。函数一经界说,它的署名(signature)就映照到标签库形貌符(TLD)中。

为了申明函数的利用,我们举一个复杂的例子,把两个数相加。起首要编写求两数之和的Java办法代码,如代码示例3所示,这里界说了一个静态办法,它吸收两个字符串参数,把它们剖析成整数并前往它们的和。

代码示例3:Compute.java

packagejsp2.examples.el;
importjava.util.*;
publicclassCompute{
publicstaticintadd(Stringx,Stringy){
inta=0;
intb=0;
try{
a=Integer.parseInt(x);
b=Integer.parseInt(y);
}catch(Exceptione){}
returna+b;
}
}
用javac把这段代码编译乐成后,下一步就要把函数的署名映照到标签库。代码示例4申明了怎样把add函数映照到包括函数完成和函数署名的类。前面将申明把这段代码增加到哪儿。

代码示例4:函数形貌符

<function>
<description>addxandy</description>
<name>add</name>
<function-class>jsp2.examples.el.Compute
</function-class>
<function-signature>int
add(java.lang.String,java.lang.String)
</function-signature>
</function>
如今我们就能够编写一个JSP页面来利用这个函数。代码示例5是包括两个字段的一个表单,用户输出两个数字并按下“乞降”按钮,就会挪用下面的函数并把两个数相加,了局在统一个页面中显现出来。

代码示例5:math.jsp

<%@taglibprefix="my"
uri="http://jakarta.apache.org/tomcat/jsp2-example-taglib%>
<HEAD>
<TITLE>Functions</TITLE>
</HEAD>
<BODY>
<H3>AddNumbers</H3>
<P>
<FORMaction="math.jsp"method="GET">
X=<inputtype="text"name="x"value="${param["x"]}">
<BR>
Y=<inputtype="text"name="y"value="${param["y"]}">
<inputtype="submit"value="AddNumbers">
</FORM>
<P>
Thesumis:${my:add(param["x"],param["y"])}
</BODY>
</HTML>
要运转这个例子:

1.复制Compute.java并保留到C:Tomcat5.0webappsjsp-examplesWEB-INFclassesjsp2examplesel下;

2.利用javac编译Compute.java;

3.编纂文件C:Tomcat5.0webappsjsp-examplesWEB-INFjsp2jsp2-example-taglib.tld,把代码示例4中的代码段增加到文件中最初一个</function>标签以后,</taglib>标签之前;

4.复制math.jsp并保留到c:Tomcat5.0webappsjsp-examplesjsp2-tutorial下;

5.用扫瞄器翻开该文件。

假如统统一般,应当会看到相似如所示的窗口。


:利用函数

标签处置器
JSP1.2中传统的标签处置API因为同意标签体中包括scriptlet而变得庞大,可是如今使用表达式言语能够编写不含scriptlet的JSP网页。终极,JSP2.0引进了一种新的标签扩大机制,称为“复杂标签扩大”,这类机制有两种利用体例:

1.Java开辟职员能够界说完成接口javax.servlet.jsp.tagext.SimpleTag的类;

2.不懂Java的网页编写职员则可使用标签文件。

起首来看第一种体例,代码示例6给出了一个复杂的标签处置器,它的感化仅仅是打印“Thisismyfirsttag!”。

代码示例6:HelloTag.java

packagejsp2.examples.simpletag;
importjavax.servlet.jsp.JspException;
importjavax.servlet.jsp.tagext.SimpleTagSupport;
importjava.io.IOException;
/**
*SimpleTaghandlerthatprints"Thisismyfirsttag!"
*/
publicclassHelloTagextendsSimpleTagSupport{
publicvoiddoTag()throwsJspException,IOException{
getJspContext().getOut().write("Thisismyfirsttag!");
}
}
编译乐成后,下一步就要在TLD中界说一个标签形貌符,上面是标签形貌符的例子。

代码示例7:标签形貌符

<tag>
<description>Printsthisismyfirsttag</description>
<name>hello</name>
<tag-class>jsp2.examples.simpletag.HelloTag</tag-class>
<body-content>empty</body-content>
</tag>
最初再编写一个利用上述标签的JSP页面文件,见代码示例8。

代码示例8:helloworld.jsp

<%@taglibprefix="mytag"uri="/WEB-INF/jsp2/jsp2-example-taglib.tld"%>
<HTML>
<HEAD>
<TITLE>SimpleTagHandler</TITLE>
</HEAD>
<BODY>
<H2>SimpleTagHandler</H2>
<P>
<B>Myfirsttagprints</B>:<mytag:hello/>
</BODY>
</HTML>
要运转这个例子:

1.复制HelloTg.java并保留到C:Tomcat5.0webappsjsp-examplesWEB-INFclassesjsp2examplessimpletag下;

2.利用javac编译HelloTag.java;

3.把代码示例7中的标签形貌符增加到文件C:Tomcat5.0webappsjsp-examplesWEB-INFjsp2jsp2-example-taglib.tld中的</taglib>之前;

4.复制helloworld.jsp并保留到c:Tomcat5.0webappsjsp-examplesjsp2-tutorial目次中;

5.用扫瞄器翻开helloworld.jsp。

假如统统一般,应当会看到相似如所示的画面。


:复杂标签处置器

标签文件
利用复杂标签扩大机制的另外一种办法是经由过程标签文件。标签文件是一种资本文件,网页作者能够使用它抽取一段JSP代码,经由过程定制功效来完成代码的复用。换句话说,标签文件同意JSP网页作者利用JSP语法创立可复用的标签库。标签文件的扩大名必需是“.tag”。

为申明利用标签文件是何等简单,思索一下代码示例9。没错,这就是一个标签文件!

代码示例9:greetings.tag

Hellothere.Howareyoudoing?
一旦界说了标签文件,就能够在JSP网页的编写中利用这类定制的功效。好比代码示例10中的JSP网页。

代码示例10:chat.jsp

<%@taglibprefix="tags"tagdir="/WEB-INF/tags"%>
<HTML>
<HEAD>
<TITLE>JSP2.0Examples-HelloWorldUsingaTagFile</TITLE>
</HEAD>
<BODY>
<H2>TagFileExample</H2>
<P>
<B>Theoutputofmyfirsttagfileis</B>:<tags:greetings/>
</BODY>
</HTML>
要运转这个例子:

1.复制标签文件greetings.tags并保留在c:Tomcat5.0webappsjsp-examplesWEB-INF        ags目次下;

2.复制JSP网页文件char.jsp并保留在c:Tomcat5.0webappsjsp-examplesjsp2-tutorial目次下;

3.用扫瞄器翻开chat.jsp文件。

假如统统一般,应当会看到相似如所示的窗口。


:复杂的标签文件


--------------------------------------------------------------------------------

注重:主要的是要注重到这里没无为问候标签编写TLD,而是创立了一个标签文件并放在特别的目次中,然后用taglib指令导进并间接利用它。


--------------------------------------------------------------------------------

另外一个标签文件的例子
标签文件能够作为模板利用。思索代码示例11中的标签文件display.tag,这个例子是依据Tomcat5.0中的面板的例子改写的。指令attribute相似于TLD中的<attribute>元素,同意声明自界说的举措属性。

代码示例11:display.tag

<%@attributename="color"%>
<%@attributename="bgcolor"%>
<%@attributename="title"%>
<TABLEborder="0"bgcolor="${color}">
<TR>
<TD><B>${title}</B></TD>
</TR>
<TR>
<TDbgcolor="${bgcolor}">
<jsp:doBody/>
</TD>
</TR>
</TABLE>
代码示例12给出了利用上述标签的一个复杂的JSP页面。

代码示例12:newsportal.jsp

<%@taglibprefix="tags"tagdir="/WEB-INF/tags"%>
<HTML>
<HEAD>
<TITLE>AnotherTagFileExample</TITLE>
</HEAD>
<BODY>
<H2>NewsPortal:AnotherTagFileExample</H2>
<TABLEborder="0">
<TRvalign="top">
<TD>
<tags:displaycolor="#ff0000"bgcolor="#ffc0c0"
title="Travel">
LastFrenchConcordeArrivesinNY<br/>
AnotherTravelHeadline<br/>
YetAnotherTravelHeadline<br/>
</tags:display>
</TD>
<TD>
<tags:displaycolor="#00fc00"bgcolor="#c0ffc0"
title="Technology">
Javaforin-flightentertainment<BR>
AnotherTechnologyHeadline<BR>
AnotherTechnologyHeadline<BR>
</tags:display>
</TD>
<TD>
<tags:displaycolor="#ffcc11"bgcolor="#ffffcc"
title="Sports">
AmericanFootball<BR/>
NBA<BR/>
Soccer<BR/>
</tags:display>
</TD>
</TR>
</TABLE>
</BODY>
</HTML>
要运转这个例子:

1.复制文件display.tag并保留在c:Tomcat5.0webappsjsp-examplesWEB-INF        ag下;

2.复制文件newsportal.jsp并保留到c:Tomcat5.0webappsjsp-examplesjsp2-tutorial下;

3.用扫瞄器翻开newsportal文件。

了局应当会失掉与相似的画面。


:把标签文件用作模板

结论
JSP2.0使得疾速开辟和保护静态网页比之前加倍简单,只管“Java”一词呈现在JSP中,但利用JSP2.0,网页作者不必进修Java程序言语自己,就可以开辟出全新的静态网页。本文中的例子申明了利用JSP2.0的新特征开辟静态网页是何等简单。

更多信息
FastTrackJSP1.2
JavaServerPagesTechnology
JavaServerPagesSpecification(JSR152)
TheTomcat5Servlet/JSPContainer
JSPDevelopersForum
JavaServerPagesStandardTagLibrary(JSTL)
FasterDevelopmentwithJavaServerPagesStandardTagLibrary(JSTL1.0)



Java伴随着互联网的迅猛发展而发展,逐渐成为重要的网络编程语言。Oracle收购Sun后Java前途未卜。
作者: 柔情似水    时间: 2015-1-21 09:38
Java 编程语言的风格十分接近C、C++语言。
作者: 金色的骷髅    时间: 2015-1-29 14:13
设计模式是高级程序员真正掌握面向对象核心思想的必修课。设计模式并不是一种具体"技术",它讲述的是思想,它不仅仅展示了接口或抽象类在实际案例中的灵活应用和智慧
作者: 因胸联盟    时间: 2015-2-4 01:42
你现在最缺的是实际的工作经验,而不是书本上那些凭空想出来的程序。
作者: 灵魂腐蚀    时间: 2015-2-6 16:16
我大二,Java也只学了一年,觉得还是看thinking in java好,有能力的话看英文原版(中文版翻的不怎么好),还能提高英文文档阅读能力。
作者: 乐观    时间: 2015-2-7 13:54
Java语言支持Internet应用的开发,在基本的Java应用编程接口中有一个网络应用编程接口(java net),它提供了用于网络应用编程的类库,包括URL、URLConnection、Socket、ServerSocket等。Java的RMI(远程方法激活)机制也是开发分布式应用的重要手段。
作者: 若天明    时间: 2015-2-13 09:03
Pet Store.(宠物店)是SUN公司为了演示其J2EE编程规范而推出的开放源码的程序,应该很具有权威性,想学J2EE和EJB的朋友不要 错过了。
作者: 海妖    时间: 2015-2-15 00:31
Jive的资料在很多网站上都有,大家可以找来研究一下。相信你读完代码后,会有脱胎换骨的感觉。遗憾的是Jive从2.5以后就不再无条件的开放源代码,同时有licence限制。不过幸好还有中国一流的Java程序员关注它,外国人不开源了,中国人就不能开源吗?这里向大家推荐一个汉化的Jive版本—J道。Jive(J道版)是由中国Java界大名 鼎鼎的banq在Jive 2.1版本基础上改编而成, 全中文,增加了一些实用功能,如贴图,用户头像和用户资料查询等,而且有一个开发团队在不断升级。你可以访问banq的网站
作者: 小妖女    时间: 2015-3-1 21:07
J2SE开发桌面应用软件比起 VC,VB,DEPHI这些传统开发语言来说,优势好象并不明显。J2ME对于初学者来说,好象又有点深奥,而且一般开发者很难有开发环境。
作者: 深爱那片海    时间: 2015-3-13 07:07
在全球云计算和移动互联网的产业环境下,Java更具备了显著优势和广阔前景。
作者: 兰色精灵    时间: 2015-3-20 15:35
多重继承(以接口取代)等特性,增加了垃圾回收器功能用于回收不再被引用的对象所占据的内存空间,使得程序员不用再为内存管理而担忧。在 Java 1.5 版本中,Java 又引入了泛型编程(Generic Programming)、类型安全的枚举、不定长参数和自动装/拆箱等语言特性。
作者: 爱飞    时间: 2015-3-21 23:51
是一种由美国SUN计算机公司(Sun Microsystems, Inc.)所研究而成的语言
作者: 再见西城    时间: 2015-3-27 08:10
我大二,Java也只学了一年,觉得还是看thinking in java好,有能力的话看英文原版(中文版翻的不怎么好),还能提高英文文档阅读能力。
作者: 不帅    时间: 2015-4-1 07:10
关于设计模式的资料,还是向大家推荐banq的网站 [url]http://www.jdon.com/[/url],他把GOF的23种模式以通俗易懂的方式诠释出来,纯Java描述,真是经典中的经典。
作者: 第二个灵魂    时间: 2015-4-1 15:10
当然你也可以参加一些开源项目,一方面可以提高自己,另一方面也是为中国软件事业做贡献嘛!开发者在互联网上用CVS合作开发,用QQ,MSN,E-mail讨论联系,天南海北的程序员分散在各地却同时开发同一个软件,是不是很有意思呢?
作者: 小女巫    时间: 2015-4-9 03:47
Java语言支持Internet应用的开发,在基本的Java应用编程接口中有一个网络应用编程接口(java net),它提供了用于网络应用编程的类库,包括URL、URLConnection、Socket、ServerSocket等。Java的RMI(远程方法激活)机制也是开发分布式应用的重要手段。
作者: 谁可相欹    时间: 2015-4-14 10:41
一般学编程语言都是从C语开始学的,我也不例外,但还是可能不学过程语言而直接学面向对象语言的,你是刚接触语言,还是从C开始学比较好,基础会很深点,如果你直接学习JAVA也能上手,一般大家在学语言的时候都记一些语言的关键词,常有的包和接口等。再去做逻辑代码的编写,以后的学习过程都是从逻辑代码编写中提升的,所以这方面都是经验积累的。你要开始学习就从
作者: 若相依    时间: 2015-4-16 05:01
是一种简化的C++语言 是一种安全的语言,具有阻绝计算机病毒传输的功能
作者: 只想知道    时间: 2015-4-21 00:33
Java 不同于一般的编译执行计算机语言和解释执行计算机语言。它首先将源代码编译成二进制字节码(bytecode),然后依赖各种不同平台上的虚拟机来解释执行字节码。从而实现了“一次编译、到处执行”的跨平台特性。
作者: 小魔女    时间: 2015-4-21 10:40
关于设计模式的资料,还是向大家推荐banq的网站 [url]http://www.jdon.com/[/url],他把GOF的23种模式以通俗易懂的方式诠释出来,纯Java描述,真是经典中的经典。




欢迎光临 仓酷云 (http://ckuyun.com/) Powered by Discuz! X3.2