仓酷云

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 1286|回复: 19
打印 上一主题 下一主题

[学习教程] JAVA教程之JasperReport履历谈

[复制链接]
萌萌妈妈 该用户已被删除
跳转到指定楼层
楼主
发表于 2015-1-18 11:42:48 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
轮性能微软曾做过一个例子,就是同一个项目用java和.net来作,结果开发周期,.net是java的一半,性能java是.net的十分之一,代码量java是.net的三倍。呵呵,这说明了什么,.net的全方位比java好。但是有的人说.net不能跨平台,这个问题我和我同学曾讨论过,都认为微软的.net很可能早都可以跨平台了,但是微软为了保护他们的操作系统,所以才没有推出跨平台的.net,只是推出了跨语言的.net,JasperReport和iReport是不错的Java报表工具.在实践项目中,自己用它们开辟了20个Report,触及SubReport,Image,Graph,堆集了一些履历.特别是关于Export到Excel方面,文档上也很少说起,地道是探索出来的,有的成绩仍是经由过程读源代码才办理的.此贴并不是进门教程,差未几算是条记吧,以问答情势纪录.


iReport
安装
下载,解压iReport0.4.0(保举src版本)
确认JDK是1.4以上
把JDK/lib下的tools.jar拷贝到{ireport_home}/lib目次中
运转
关于下载的Binary版本,只能运转/bin/startup.bat
关于下载的Src版本,能够经由过程antiReport运转(先安装ant)
假如运转startup.bat,呈现java.lang.NoSuchMethodError毛病,通常为JDK版本太低。假如确认已安装了1.4或以上,反省path体系变量,看看有1.3的JRE是否是排在后面(好比安装了Oracle的客户端,常常有1.3的JRE),假如呈现ClassNotFound,反省classpath。关于经由过程ant的体例运转,一样平常都没甚么成绩,以是保举下载src版本
JasperReport罕见成绩
.jrxmlvs.jasper
假如在运转时载进.jrxml,那末每次挪用还得编译,不如事后编译成.jasper.不外事后编译的jasper,必需用一样版本的JasperReport载进,并且天真性差些.不外关于年夜部分报表,仍是事后编译成jasper便利
假如批量编译jrxml
用Ant很简单办理



.....




怎样利用图片?
很简单,用Image控件就能够了.在ImageExpress内里能够用String来暗示图片的路径,大概用InputStream,File对象.不外不论用File仍是String对象,都不能不用相对路径,这明显很不天真.办理举措是,穿进一个$P的参数,暗示图片地点的目次,然后用$P和文件名拼接出完全的相对路径.更好的办法是用InputStream,比方this.getClass().getResourceAsStream("logo.jpg"),这时候只需把图片放在以后.jasper地点的目次就能够了,不用思索甚么参数,甚么路径了
显现非数据库字段变量
显现如运转日期等,能够间接在TextField内里输出newjava.util.Date(),然后把Pattern设成如mm/dd/yyyy.
静态把持某些Field是不是显现
每一个StaticText,TextField乃至全部Band的属性内里都有PrintWhenExpression,好比设成newBoolean(!$P{isDisplay}.equalsIgnoreCase("yes")),那末只要当参数display的值为yes的时分才显现
利用SubReport,怎样利用绝对路径
见1.3,和利用图片相似,用InputStream大概传进参数
Query内里怎样利用参数
$P!{xxx}大概$P{xxx}后者只能用于相似PreparedStatement参数绑定,而前者可交换Sql的恣意部分.在必要静态排序的时分,前者出格有效.好比selecta,b,cfromtorderby$P!{orderClause}不论用$P仍是$P!,SQL终极是以PreparedStatement体例实行的,不用太忧虑功能成绩注重:参数是不克不及嵌套的,好比$P{a}=$P{b},$P{b}=value,不要期望$P{a}能被交换成value
怎样利用图表(Graph)
JasperReport自己没有图表功效,只要显现Image的功效(见4.3).iReport里有个Graph导游,实在质是经由过程jFreeChart天生Image.更别的,更间接的做法是放一个Image控件,ImageExpressClass设置成java.awt.Image,在ImageExpression里经由过程自界说的类前往java.awt.Image对象.比方GraphProvider.getImage($P{REPORT_DATASOURCE},title,subtitle.....).GraphProvider是本人的类,publicstaticImagegetImage(JRDataSource,....)
假如显现多个图表
在一张报表上显现一个图表和显现多个图表是分歧的.假定Query是selectname,price,qtyfromxxx,第一张图显现name-price,第二张图显现name-qty,假如仍是按3.8的办法,第二张图基本显现不出来!为何由于传进的是JRDataSource,而JRDataSource仅仅是对ResultSet的复杂封装,在第一张图处置完后,游标已到了eof地位了,在入手下手处置第二张图的时分,就一定抛出游标耗尽的非常!怎样办本人写个JRDataSourceAdapter,把JRDataSource对象内里的值事后保留到一个Collection(相称于一个Offline的数据集),然后把这个Collection传个getImage办法.详细是,建一个Variablemydate,范例是java.util.Map,CalculationType-System,InitialValueExpression是JRDataSourceAdapter.JRDataSource2Map($P{REPORT_DATA_SOURCE},newString[]{"NAME","PRICE","QTY"},newClass[]{java.lang.String.class,java.lang.Double.class,java.lang.Double.class}),JRDataSource2Map是本人写的一个Adapter.然后在Image的Expression内里换成如GraphProvider.getImage(mydata,title,otherparams...),固然得修正getImage办法
Export到Excel的成绩
怎样往失落报表优等
间接把不必要的Band删除(把其高度设为0).假如仅仅是export到Excel的时分不必要报表头,而输入到PDF等仍旧必要保存,那末利用printwhenexpression,见4.4
假如让Excel看起来划一
不要有空缺中央!起首把一切的Field设成一样高,对齐!把地点Band的高度也设成和Field一样高,让Field恰好放进Band.然后调剂Field的宽度,让每一个Field都相邻,没有清闲.最初,记得设置参数:exporter.setParameter(JRXlsExporterParameter.IS_REMOVE_EMPTY_SPACE_BETWEEN_ROWS,
Boolean.TRUE);

怎样保存GridLine
起首,设置参数exporter.setParameter(JRXlsExporterParameter.IS_WHITE_PAGE_BACKGROUND,Boolean.FALSE);然后,把每一个Field大概StaticText框的Transparent属性都勾上
怎样使字段名只显现一次
假如把字段名放在ColumnHead地区,那末输入到Excel,会每一个Page都显现一遍.在计划Report时分,一样平常会设定Page巨细.但是关于Excel,这个Page设定仍旧存在,并且常常很厌恶,由于在Excel里,一般但愿失掉一连的数据,但是Jasper仍旧会自作多情举行分页.好比说,计划JasperReport的时分,设定pagesize为Letter,Portrait,那末输入到Excel的时分每隔约莫30行(详细取决于Field的高度),pageheader,columnheader,columnfoot,pagefoot会被反复一次,并且还附带一个高度为0的ExcelRow,暗示PageBreak的中央.把字段名放在titleband里,能够办理字段名反复的成绩,固然pageheader也不要显现了.假如必要,能够把titleband的printwhenexpression设成只要输入Excel的时分才显现
为何Excel内里的数据是从第二行,第B列入手下手显现的
由于第一行和第A列分离是用来暗示pagetopmargin和pageleftmargin的.关于Excel来讲,地道过剩.办理办法是把pagemargin设成0.不外假如这个report还必要以PDF等显现,那末设成0就欠好看了.最好能静态的改动pagemargin.固然,这个改动只能在内部(挪用Report的中央)举行,在计划Report的时分是力所不及的.不幸的是,JasperReport类竟然没有setMargin的办法,只要getter.折衷的办法只能是reflect了.代码表示以下://usereflecttosettheprivatefieldofJRBaseReport
java.lang.reflect.Fieldmargin=JRBaseReport.class.getDeclaredField(
"leftMargin");
margin.setAccessible(true);
margin.setInt(myRpt,0);margin=JRBaseReport.class.getDeclaredField("topMargin");
margin.setAccessible(true);
margin.setInt(myRpt,0);margin=JRBaseReport.class.getDeclaredField("bottomMargin");
margin.setAccessible(true);
margin.setInt(myRpt,0);
怎样往失落Excel中埋没的行
如前说述,因为pagebreak的干系,Excel中每隔几十行,就有一个高度为0的row,即便把pagebotommargin设为0,把pagefooter往失落都没有举措.独一的办理举措是把pageheight设为很年夜.同5.5一样,不能不利用reflect:
java.lang.reflect.FieldpageHeight=JRBaseReport.class.getDeclaredField(
"pageHeight");
pageHeight.setAccessible(true);
pageHeight.setInt(myRpt,Integer.MAX_VALUE);

文档
那里有文档
JasperReport有份UltimateGuide,不外不是收费的,和jFreeChart一个品德.不外网上有传播,写的还能够,60多页,不外也没具体到那里往.假如下载源代码版,那末看看自带的Demo也不错.SF的论坛也是问成绩的最好中央
源代码仅供参考(reportProvider--一个Servlet,GraphProider,JRDataAdapter都是一般类)
/**
*

Title:ReportProviderServlet


*
Description:ServlettogenerateJasperreports


*
Copyright:Copyright(c)2004


*
Company:*****


*@authorzephyr
*@version1.0
*/
packagexyz;

importnet.sf.jasperreports.engine.*;
importnet.sf.jasperreports.engine.base.*;
importnet.sf.jasperreports.engine.export.*;
importnet.sf.jasperreports.engine.util.*;

importorg.apache.log4j.*;

importjava.io.*;

importjava.sql.*;

importjava.util.*;

importjavax.servlet.*;
importjavax.servlet.http.*;


publicclassReportProviderServletextendsHttpServlet
{
privatestaticLoggerlog=LogManager.getLogger(ReportProviderServlet.class);

//Initialize:SetupDataSourceManager
publicvoidinit()throwsjavax.servlet.ServletException
{
Stringprefix=getServletContext().getRealPath("/");
Stringfile=getInitParameter("data-source-file");

DataSourceManager.configure(prefix+file);

log.info("initializedsuccessfully!");
}

//ProcesstheHTTPrequest
publicvoidservice(HttpServletRequestrequest,HttpServletResponseresponse)
throwsServletException,IOException
{
StringreportClass=request.getParameter("reportClass");

log.debug("RunningReport:"+reportClass);

booleanisExcelFormat=false;

if(reportClass==null)
{
thrownewIllegalArgumentException("JasperClassUnspecified");
}

StringreportFormat=request.getParameter("reportFormat");

if(reportFormat==null)
{
reportFormat="jasperPrint";
}

try
{
JasperReportmyRpt=JasperManager.loadReport(this.getClass()
.getResourceAsStream("/jasperReports/"+
reportClass+".jasper"));

//setReprintHeaderOnEachPage=falseforExcelFormat
isExcelFormat=reportFormat.equalsIgnoreCase("excel");

if(isExcelFormat)
{
//usereflecttosettheprivatefieldofJRBaseReport
//Nomarginforexcelformat,maxpageHeight
java.lang.reflect.Fieldmargin=JRBaseReport.class.getDeclaredField(
"leftMargin");
margin.setAccessible(true);
margin.setInt(myRpt,0);

margin=JRBaseReport.class.getDeclaredField("topMargin");
margin.setAccessible(true);
margin.setInt(myRpt,0);

margin=JRBaseReport.class.getDeclaredField("bottomMargin");
margin.setAccessible(true);
margin.setInt(myRpt,0);

java.lang.reflect.FieldpageHeight=JRBaseReport.class.getDeclaredField(
"pageHeight");
pageHeight.setAccessible(true);
pageHeight.setInt(myRpt,Integer.MAX_VALUE);

//Dontprintgroupheaderoneachpage
if(null!=myRpt.getGroups())
{
for(inti=0;i<myRpt.getGroups().length;i++)
{
myRpt.getGroups()[i].setReprintHeaderOnEachPage(false);
}
}
}

Mapparams=newHashMap(10);
Enumerationenu=request.getParameterNames();

while(enu.hasMoreElements())
{
Stringkey=(String)enu.nextElement();
params.put(key,
request.getParameter(key).toUpperCase().replaceAll("",""));
log.debug(key+"="+request.getParameter(key));
}

log.debug("BeforeFilling");

OutputStreamhttpOut=response.getOutputStream();

Connectionconn=DataSourceManager.getConnection(request.getSession());

JasperPrintrptPnt=JasperManager.fillReport(myRpt,params,conn);

conn.close();

if(reportFormat.equalsIgnoreCase("jasperPrint"))
{
response.setContentType("application/octet-stream");
JRSaver.saveObject(rptPnt,httpOut);
}
elseif(reportFormat.equalsIgnoreCase("pdf"))
{
response.setContentType("application/pdf");
response.setHeader("Content-Disposition",
"attachment;filename=""+reportClass+".PDF"");
JasperManager.printReportToPdfStream(rptPnt,httpOut);
}
elseif(reportFormat.equalsIgnoreCase("excel"))
{
response.setContentType("application/vnd.ms-excel");
response.setHeader("Content-Disposition",
"attachment;filename=""+reportClass+".XLS"");

JRXlsExporterexporter=newJRXlsExporter();

exporter.setParameter(JRExporterParameter.JASPER_PRINT,rptPnt);
exporter.setParameter(JRExporterParameter.OUTPUT_STREAM,httpOut);
exporter.setParameter(JRXlsExporterParameter.IS_REMOVE_EMPTY_SPACE_BETWEEN_ROWS,
Boolean.TRUE);
exporter.setParameter(JRXlsExporterParameter.IS_ONE_PAGE_PER_SHEET,
Boolean.FALSE);
exporter.setParameter(JRXlsExporterParameter.IS_WHITE_PAGE_BACKGROUND,
Boolean.FALSE);
exporter.exportReport();
}
elseif(reportFormat.equalsIgnoreCase("html"))
{
JRHtmlExporterexporter=newJRHtmlExporter();
response.setContentType("text/html");

MapimagesMap=newHashMap();

request.getSession().setAttribute("IMAGES_MAP",imagesMap);

exporter.setParameter(JRHtmlExporterParameter.IMAGES_MAP,
imagesMap);
exporter.setParameter(JRHtmlExporterParameter.IMAGES_URI,
"image.jspimage=");
exporter.setParameter(JRExporterParameter.JASPER_PRINT,rptPnt);
exporter.setParameter(JRExporterParameter.OUTPUT_STREAM,httpOut);

exporter.exportReport();
}

log.debug("ReportExported");
}
catch(Exceptionex)
{
log.error("ErrorOccured",ex);
}
}
}






/**
*

Title:JRDataSourceAdapter


*
Description:ConvertingJRDataSourcetoMappedArrayList


*
Copyright:Copyright(c)2004


*
Company:*****


*@authorzephyr
*@version1.0
*/
packagexyz;

importnet.sf.jasperreports.engine.*;
importnet.sf.jasperreports.engine.design.*;

importjava.util.*;


publicclassJRDataSourceAdapter
{
publicstaticMapJRDataSource2Map(JRDataSourcedataSource,String[]fieldNames,
Class[]fieldClasses)throwsJRException
{
HashMapresult;

if(fieldNames.length!=fieldClasses.length)
{
thrownewJRException("NumberofFieldName&Classunmatch");
}

JRDesignField[]fields=newJRDesignField[fieldNames.length];

result=newHashMap(4);

for(inti=0;i<fieldNames.length;i++)
{
fields[i]=newJRDesignField();
fields[i].setName(fieldNames[i]);
fields[i].setValueClass(fieldClasses[i]);
result.put(fieldNames[i],newArrayList());
}

do
{
for(inti=0;i<fields.length;i++)
{
Objectvalue=dataSource.getFieldValue(fields[i]);
((ArrayList)result.get(fields[i].getName())).add(value);
}
}
while(dataSource.next());

returnresult;
}
}




/**
*

Title:GraphProvider


*
Description:GenerateJFreeChartImage


*
Copyright:Copyright(c)2004


*
Company:****


*@authorzephyr
*@version1.0
*/
packagexyz;

importnet.sf.jasperreports.engine.*;
importnet.sf.jasperreports.engine.design.*;
importnet.sf.jasperreports.engine.export.*;

importorg.jfree.chart.*;
importorg.jfree.chart.axis.*;
importorg.jfree.chart.plot.*;

importorg.jfree.data.*;

importjava.awt.*;
importjava.awt.image.*;

importjava.io.*;

importjava.util.*;


publicclassGraphProvider
{
publicstaticImagegetImage(MapdataSource,StringfieldNameX,StringfieldNameY,
StringchartName,StringtitleX,StringtitleY,booleanisBarChart,intimageWidth,
intimageHeight)throwsJRException
{
JRDesignFieldfieldX=newJRDesignField();
fieldX.setName(fieldNameX);
fieldX.setValueClass(java.lang.String.class);

JRDesignFieldfieldY=newJRDesignField();
fieldY.setName(fieldNameY);
fieldY.setValueClass(java.lang.Double.class);

ArrayListperiods=(ArrayList)dataSource.get(fieldNameX);
ArrayListvalues=(ArrayList)dataSource.get(fieldNameY);

DefaultCategoryDatasetcategoryDs=newDefaultCategoryDataset();

for(inti=0;i<values.size();i++)
{
Objectobj=values.get(i);
doubledataValue=0;

if(obj!=null)
{
dataValue=((Double)obj).doubleValue();
}

categoryDs.addValue(dataValue,null,(String)periods.get(i));
}

JFreeChartc=null;

if(isBarChart)
{
c=ChartFactory.createBarChart(chartName,titleX,titleY,categoryDs,
PlotOrientation.VERTICAL,false,false,false);
}
else
{
c=ChartFactory.createLineChart(chartName,titleX,titleY,categoryDs,
PlotOrientation.VERTICAL,false,false,false);
}

c.getTitle().setFont(newFont("Arial",Font.BOLD,16));

NumberAxisaxis=(NumberAxis)c.getCategoryPlot().getRangeAxis();
axis.setAutoRange(true);

TickUnitSourcetickUnits=NumberAxis.createIntegerTickUnits();
axis.setStandardTickUnits(tickUnits);

return(c.createBufferedImage(imageWidth,imageHeight));

}
}



J2ME在手机游戏开发的作用也是无用质疑的。至于桌面程序,可能有人说java不行,界面不好看,但是请看看NetBeans和Eclipse吧,他们都是利用java开发的,而他们的界面是多么的华丽,所以界面决不是java的缺点。还有一个不得不提的优点就是大多java人员都挂在嘴边的java的跨平台性,目前这确实也是java优点之一。
莫相离 该用户已被删除
沙发
发表于 2015-1-21 13:01:36 | 只看该作者
还好,SUN提供了Javabean可以把你的JSP中的 Java代码封装起来,便于调用也便于重用。
第二个灵魂 该用户已被删除
板凳
发表于 2015-1-29 13:46:23 | 只看该作者
是一种为 Internet发展的计算机语言
透明 该用户已被删除
地板
发表于 2015-2-5 16:13:37 | 只看该作者
象、泛型编程的特性,广泛应用于企业级Web应用开发和移动应用开发。
精灵巫婆 该用户已被删除
5#
发表于 2015-2-12 22:58:24 | 只看该作者
当然你也可以参加一些开源项目,一方面可以提高自己,另一方面也是为中国软件事业做贡献嘛!开发者在互联网上用CVS合作开发,用QQ,MSN,E-mail讨论联系,天南海北的程序员分散在各地却同时开发同一个软件,是不是很有意思呢?
6#
发表于 2015-2-20 10:51:13 | 只看该作者
关于设计模式的资料,还是向大家推荐banq的网站 [url]http://www.jdon.com/[/url],他把GOF的23种模式以通俗易懂的方式诠释出来,纯Java描述,真是经典中的经典。
金色的骷髅 该用户已被删除
7#
发表于 2015-3-3 01:58:17 | 只看该作者
那么我书也看了,程序也做了,别人问我的问题我都能解决了,是不是就成为高手了呢?当然没那么简单,这只是万里长征走完了第一步。不信?那你出去接一个项目,你知道怎么下手吗,你知道怎么设计吗,你知道怎么组织人员进行开发吗?你现在脑子里除了一些散乱的代码之外,可能再没有别的东西了吧!
若天明 该用户已被删除
8#
发表于 2015-3-13 08:08:23 | 只看该作者
你一定会高兴地说,哈哈,原来成为Java高手就这么简单啊!记得Tomjava也曾碰到过一个项目经理,号称Java很简单,只要三个月就可以学会。
爱飞 该用户已被删除
9#
发表于 2015-3-14 05:20:50 | 只看该作者
不过,每次的执行编译后的字节码需要消耗一定的时间,这同时也在一定程度上降低了 Java 程序的运行效率。
小魔女 该用户已被删除
10#
发表于 2015-3-21 00:05:14 | 只看该作者
你一定会高兴地说,哈哈,原来成为Java高手就这么简单啊!记得Tomjava也曾碰到过一个项目经理,号称Java很简单,只要三个月就可以学会。
萌萌妈妈 该用户已被删除
11#
 楼主| 发表于 2015-3-25 20:26:23 | 只看该作者
如果要向java web方向发展也要吧看看《Java web从入门到精通》学完再到《Struts2.0入门到精通》这样你差不多就把代码给学完了。有兴趣可以看一些设计模块和框架的包等等。
不帅 该用户已被删除
12#
发表于 2015-3-26 21:22:37 | 只看该作者
是一种简化的C++语言 是一种安全的语言,具有阻绝计算机病毒传输的功能
若相依 该用户已被删除
13#
发表于 2015-3-30 04:30:12 | 只看该作者
设计模式是高级程序员真正掌握面向对象核心思想的必修课。设计模式并不是一种具体"技术",它讲述的是思想,它不仅仅展示了接口或抽象类在实际案例中的灵活应用和智慧
admin 该用户已被删除
14#
发表于 2015-4-5 04:47:14 | 只看该作者
你快去找一份Java的编程工作来做吧(如果是在校学生可以去做兼职啊),在实践中提高自己,那才是最快的。不过你得祈祷在公司里碰到一个高手,而且他 还愿意不厌其烦地教你,这样好象有点难哦!还有一个办法就是读开放源码的程序了。我们知道开放源码大都出自高手,他们设计合理,考虑周到,再加上有广大的程序员参与,代码的价值自然是字字珠叽,铿锵有力(对不起,偶最近《金装四大才子》看多了)。
小女巫 该用户已被删除
15#
发表于 2015-4-12 12:01:04 | 只看该作者
有时间再研究一下MVC结构(把Model-View-Control分离开的设计思想)
活着的死人 该用户已被删除
16#
发表于 2015-4-19 18:57:36 | 只看该作者
吧,现在很流行的Structs就是它的一种实现方式,不过Structs用起来实在是很繁,我们只要学习其精髓即可,我们完全可以设计自己的MVC结构。然后你再研究一下软件Refactoring (重构)和极限XP编程,相信你又会上一个台阶。 做完这些,你不如整理一下你的Java代码,把那些经典的程序和常见的应用整理出来,再精心打造一番,提高其重用性和可扩展性。你再找几个志同道合的朋友成立一个工作室吧
再见西城 该用户已被删除
17#
发表于 2015-5-1 14:09:33 | 只看该作者
一般学编程语言都是从C语开始学的,我也不例外,但还是可能不学过程语言而直接学面向对象语言的,你是刚接触语言,还是从C开始学比较好,基础会很深点,如果你直接学习JAVA也能上手,一般大家在学语言的时候都记一些语言的关键词,常有的包和接口等。再去做逻辑代码的编写,以后的学习过程都是从逻辑代码编写中提升的,所以这方面都是经验积累的。你要开始学习就从
飘飘悠悠 该用户已被删除
18#
发表于 2015-6-16 20:11:07 | 只看该作者
你就该学一学Servlet了。Servlet就是服务器端小程序,他负责生成发送给客户端的HTML文件。JSP在执行时,也是先转换成Servlet再运行的。虽说JSP理论上可以完全取代Servlet,这也是SUN推出JSP的本意,可是Servlet用来控制流程跳转还是挺方便的,也令程序更清晰。接下来你应该学习一下Javabean了,可能你早就看不管JSP在HTML中嵌Java代码的混乱方式了,这种方式跟ASP又有什么区别呢?
因胸联盟 该用户已被删除
19#
发表于 2015-7-1 18:36:39 | 只看该作者
任职于太阳微系统的詹姆斯·高斯林等人于1990年代初开发Java语言的雏形,最初被命名为Oak,目标设置在家用电器等小型系统的程序语言
乐观 该用户已被删除
20#
发表于 2015-7-4 12:34:51 | 只看该作者
是一种由美国SUN计算机公司(Sun Microsystems, Inc.)所研究而成的语言
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|仓酷云 鄂ICP备14007578号-2

GMT+8, 2024-5-1 08:21

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表