JAVA编程:在使用中到场全文检索功能――基于Java...
关于第二点:俺问问你,如果是企业级项目的话,诸如RMI,EJB,等一些关键技术,这些难道都不需要学么?如果光是使用jsp,servlet,javabean的话。全文检索|索引内容择要:
Lucene是一个基于Java的全文索引工具包。
基于Java的全文索引引擎Lucene简介:关于作者和Lucene的汗青
全文检索的完成:Luene全文索引和数据库索引的对照
中文切分词机制简介:基于词库和主动切分词算法的对照
详细的安装和利用简介:体系布局先容和演示
HackingLucene:简化的查询剖析器,删除的完成,定制的排序,使用接口的扩大
从Lucene我们还能够学到甚么
基于Java的全文索引/检索引擎――Lucene
Lucene不是一个完全的全文索引使用,而是是一个用Java写的全文索引引擎工具包,它能够便利的嵌进到各类使用中完成针对使用的全文索引/检索功效。
Lucene的Lucene的奉献者DougCutting是一名资深全文索引/检索专家,已经是V-Twin搜刮引擎(Apple的Copland操纵体系的成绩之一)的次要开辟者,后在Excite担当初级体系架构计划师,今朝处置于一些INTERNET底层架构的研讨。他奉献出的Lucene的方针是为各类中小型使用程序到场全文检索功效。
Lucene的开展过程:新近公布在作者本人的www.lucene.com,厥后公布在SourceForge,2001年岁尾成为APACHE基金会jakarta的一个子项目:http://jakarta.apache.org/lucene/
已有良多Java项目都利用了Lucene作为厥后台的全文索引引擎,对照出名的有:
Jive:WEB论坛体系;
Eyebrows:邮件列表HTML回档/扫瞄/查询体系,本文的次要参考文档“TheLucenesearchengine:Powerful,flexible,andfree”作者就是EyeBrows体系的次要开辟者之一,而EyeBrows已成为今朝APACHE项目标次要邮件列表回档体系。
Cocoon:基于XML的web公布框架,全文检索部分利用了Lucene
Eclipse:基于Java的开摊开发平台,匡助部分的全文索引利用了Lucene
关于中文用户来讲,最体贴的成绩是其是不是撑持中文的全文检索。但经由过程前面关于Lucene的布局的先容,你会懂得到因为Lucene优秀架构计划,对中文的撑持只需对其言语词法剖析接口举行扩大就可以完成对中文检索的撑持。
全文检索的完成机制
Lucene的API接口计划的对照通用,输出输入布局都很像数据库的表==>纪录==>字段,以是良多传统的使用的文件、数据库等都能够对照便利的映照到Lucene的存储布局/接口中。整体上看:能够先把Lucene当做一个撑持全文索引的数据库体系。
对照一下Lucene和数据库:
Lucene数据库
索引数据源:doc(field1,field2...)doc(field1,field2...)indexer/_____________|LuceneIndex|--------------/searcher了局输入:Hits(doc(field1,field2)doc(field1...))
索引数据源:record(field1,field2...)record(field1..)SQL:insert/_____________|DBIndex|-------------/SQL:select了局输入:results(record(field1,field2..)record(field1...))
Document:一个必要举行索引的“单位”
一个Document由多个字段构成Record:纪录,包括多个字段
Field:字段Field:字段
Hits:查询了局集,由婚配的Document构成RecordSet:查询了局集,由多个Record构成
全文检索≠like"%keyword%"
一般对照厚的书本前面经常附关头词索引表(好比:北京:12,34页,上海:3,77页……),它可以匡助读者对照快地找到相干内容的页码。而数据库索引可以年夜年夜进步查询的速率道理也是一样,想像一下经由过程书前面的索引查找的速率要比一页一页地翻内容高几倍……而索引之以是效力高,别的一个缘故原由是它是排好序的。关于检索体系来讲中心是一个排序成绩。
因为数据库索引不是为全文索引计划的,因而,利用like"%keyword%"时,数据库索引是不起感化的,在利用like查询时,搜刮历程又酿成相似于一页页翻书的遍历历程了,以是关于含有含混查询的数据库服务来讲,LIKE对功能的伤害是极年夜的。假如是必要对多个关头词举行含混婚配:like"%keyword1%"andlike"%keyword2%"...其效力也便可想而知了。
以是创建一个高效检索体系的关头是创建一个相似于科技索引一样的反向索引机制,将数据源(好比多篇文章)排序按次存储的同时,有别的一个排好序的关头词列表,用于存储关头词==>文章映照干系,使用如许的映照干系索引:[关头词==>呈现关头词的文章编号,呈现次数(乃至包含地位:肇端偏移量,停止偏移量),呈现频次],检索历程就是把含混查询酿成多个能够使用索引的准确查询的逻辑组合的历程。从而年夜年夜进步了多关头词查询的效力,以是,全文检索成绩回结到最初是一个排序成绩。
由此能够看出含混查询绝对数据库的准确查询是一个十分不断定的成绩,这也是年夜部分数据库对全文检索撑持无限的缘故原由。Lucene最中心的特性是经由过程特别的索引布局完成了传统数据库不善于的全文索引机制,并供应了扩大接口,以便利针对分歧使用的定制。
能够经由过程一下表格对照一下数据库的含混查询:
Lucene全文索引引擎数据库
索引将数据源中的数据都经由过程全文索引逐一创建反向索引关于LIKE查询来讲,数据传统的索引是基本用不上的。数据必要逐一便当纪录举行GREP式的含混婚配,比有索引的搜刮速率要有多个数目级的下落。
婚配效果经由过程词元(term)举行婚配,经由过程言语剖析接口的完成,能够完成对中文等非英语的撑持。利用:like"%net%"会把netherlands也婚配出来,
多个关头词的含混婚配:利用like"%com%net%":就不克不及婚配词序倒置的xxx.net..xxx.com
婚配度有婚配度算法,将婚配水平(类似度)对照高的了局排在后面。没有婚配水平的把持:好比有纪录中net呈现5词和呈现1次的,了局是一样的。
了局输入经由过程出格的算法,将最婚配度最高的头100条了局输入,了局集是缓冲式的小批量读取的。前往一切的了局集,在婚配条目十分多的时分(好比上万条)必要大批的内存寄存这些一时了局集。
可定制性经由过程分歧的言语剖析接话柄现,能够便利的定制出切合使用必要的索引划定规矩(包含对中文的撑持)没有接口或接口庞大,没法定制
结论高负载的含混查询使用,必要卖力的含混查询的划定规矩,索引的材料量对照年夜利用率低,含混婚配划定规矩复杂大概必要含混查询的材料量少
全文检索和数据库使用最年夜的分歧在于:让最相干的头100条了局满意98%以上用户的需求
Lucene的立异的地方:
年夜部分的搜刮(数据库)引擎都是用B树布局来保护索引,索引的更新会招致大批的IO操纵,Lucene在完成中,对此略微有所改善:不是保护一个索引文件,而是在扩大索引的时分不休创立新的索引文件,然后按期的把这些新的小索引文件兼并到本来的年夜索引中(针对分歧的更新战略,批次的巨细能够调剂),如许在不影响检索的效力的条件下,进步了索引的效力。
Lucene和其他一些全文检索体系/使用的对照:
Lucene其他开源全文检索体系
增量索引和批量索引能够举行增量的索引(Append),能够关于大批数据举行批量索引,而且接口计划用于优化批量索引和小批量的增量索引。良多体系只撑持批量的索引,偶然数据源有一点增添也必要重修索引。
数据源Lucene没有界说详细的数据源,而是一个文档的布局,因而能够十分天真的顺应各类使用(只需前端有符合的转换器把数据源转换成响应布局),良多体系只针对网页,缺少其他格局文档的天真性。
索引内容抓取Lucene的文档是由多个字段构成的,乃至能够把持那些字段必要举行索引,那些字段不必要索引,近一步索引的字段也分为必要分词和不必要分词的范例:
必要举行分词的索引,好比:题目,文章内容字段
不必要举行分词的索引,好比:作者/日期字段缺少通用性,常常将文档全部索引了
言语剖析经由过程言语剖析器的分歧扩大完成:
能够过滤失落不必要的词:antheof等,
西文语法剖析:将jumpsjumpedjumper都回结成jump举行索引/检索
非英文撑持:对亚洲言语,阿拉伯言语的索引撑持缺少通用接话柄现
查询剖析经由过程查询剖析接口的完成,能够定制本人的查询语律例则:
好比:多个关头词之间的+-andor干系等
并发会见可以撑持多用户的利用
关于亚洲言语的的切分词成绩(WordSegment)
关于中文来讲,全文索引起首还要办理一个言语剖析的成绩,关于英文来讲,语句中单词之间是自然经由过程空格分隔的,但亚洲言语的中日韩文语句中的字是一个字挨一个,一切,起首要把语句中按“词”举行索引的话,这个词怎样切分出来就是一个很年夜的成绩。
起首,一定不克不及用单个字符作(si-gram)为索引单位,不然查“上海”时,不克不及让含有“海上”也婚配。
但一句话:“北京天安门”,盘算机怎样依照中文的言语习气举行切分呢?
“北京天安门”仍是“北京天安门”?让盘算性能够依照言语习气举行切分,常常必要呆板有一个对照丰厚的词库才干够对照正确的辨认出语句中的单词。
别的一个办理的举措是接纳主动切分算法:将单词依照2元语法(bigram)体例切分出来,好比:
"北京天安门"==>"北京京天天安安门"。
如许,在查询的时分,不管是查询"北京"仍是查询"天安门",将查询词组按一样的划定规矩举行切分:"北京","天安安门",多个关头词之间按与"and"的干系组合,一样可以准确地映照到响应的索引中。这类体例关于其他亚洲言语:韩文,日文都是通用的。
基于主动切分的最年夜长处是没有词表保护本钱,完成复杂,弱点是索引效力低,但关于中小型使用来讲,基于2元语法的切分仍是够用的。基于2元切分后的索引一样平常巨细和源文件差未几,而关于英文,索引文件一样平常只要原文件的30%-40%分歧,
主动切分词表切分
完成完成十分复杂完成庞大
查询增添了查询剖析的庞大水平,适于完成对照庞大的查询语律例则
存储效力索引冗余年夜,索引几近和原文一样年夜索引效力高,为原文巨细的30%摆布
保护本钱无词表保护本钱词表保护本钱十分高:中日韩等言语必要分离保护。
还必要包含词频统计等外容
合用范畴嵌进式体系:运转情况资本无限
散布式体系:无词表同步成绩
多言语情况:无词表保护本钱对查询和存储效力请求高的专业搜刮引擎
今朝对照年夜的搜刮引擎的言语剖析算法通常为基于以上2个机制的分离。关于中文的言语剖析算法,人人能够在Google查关头词"wordsegmentsearch"能找到更多相干的材料。
安装和利用
下载:http://jakarta.apache.org/lucene/
注重:Lucene中的一些对照庞大的词法剖析是用JavaCC天生的(JavaCC:JavaCompilerCompiler,纯Java的词法剖析天生器),以是假如从源代码编译或必要修正个中的QueryParser、定制本人的词法剖析器,还必要从http://www.experimentalstuff.com/Technologies/JavaCC/下载javacc。
lucene的构成布局:关于内部使用来讲索引模块(index)和检索模块(search)是次要的内部使用出口
org.apache.Lucene.search/搜刮出口
org.apache.Lucene.index/索引出口
org.apache.Lucene.analysis/言语剖析器
org.apache.Lucene.queryParser/查询剖析器
org.apache.Lucene.document/存储布局
org.apache.Lucene.store/底层IO/存储布局
org.apache.Lucene.util/一些公用的数据布局
复杂的例子演示一下Lucene的利用办法:
索引历程:从命令行读取文件名(多个),将文件分路径(path字段)和内容(body字段)2个字段举行存储,并对内容举行全文索引:索引的单元是Document对象,每一个Document对象包括多个字段Field对象,针对分歧的字段属性和数据输入的需求,对字段还能够选择分歧的索引/存储字段划定规矩,列表以下:办法切词索引存储用处
Field.Text(Stringname,Stringvalue)YesYesYes切分词索引并存储,好比:题目,内容字段
Field.Text(Stringname,Readervalue)YesYesNo切分词索引不存储,好比:META信息,
不必于前往显现,但必要举行检索内容
Field.Keyword(Stringname,Stringvalue)NoYesYes不切分索引并存储,好比:日期字段
Field.UnIndexed(Stringname,Stringvalue)NoNoYes不索引,只存储,好比:文件路径
Field.UnStored(Stringname,Stringvalue)YesYesNo只全文索引,不存储
publicclassIndexFiles{//利用办法::IndexFiles[索引输入目次][索引的文件列表]...publicstaticvoidmain(String[]args)throwsException{StringindexPath=args;IndexWriterwriter;//用指定的言语剖析器机关一个新的写索引器(第3个参数暗示是不是为追加索引)writer=newIndexWriter(indexPath,newSimpleAnalyzer(),false);for(inti=1;i<args.length;i++){System.out.println("Indexingfile"+args);InputStreamis=newFileInputStream(args);//机关包括2个字段Field的Document对象//一个是路径path字段,不索引,只存储//一个是内容body字段,举行全文索引,并存储Documentdoc=newDocument();doc.add(Field.UnIndexed("path",args));doc.add(Field.Text("body",(Reader)newInputStreamReader(is)));//将文档写进索引writer.addDocument(doc);is.close();};//封闭写索引器writer.close();}}
索引过程当中能够看到:
言语剖析器供应了笼统的接口,因而言语剖析(Analyser)是能够定制的,固然lucene缺省供应了2个对照通用的剖析器SimpleAnalyser和StandardAnalyser,这2个剖析器缺省都不撑持中文,以是要到场对中文言语的切分划定规矩,必要修正这2个剖析器。
Lucene并没有划定数据源的格局,而只供应了一个通用的布局(Document对象)来承受索引的输出,因而输出的数据源能够是:数据库,WORD文档,PDF文档,HTML文档……只需可以计划响应的剖析转换器将数据源机关成成Docuement对象便可举行索引。
关于多量量的数据索引,还能够经由过程调剂IndexerWrite的文件兼并频次属性(mergeFactor)来进步批量索引的效力。
检索历程和了局显现:
搜刮了局前往的是Hits对象,能够经由过程它再会见Document==>Field中的内容。
假定依据body字段举行全文检索,能够将查询了局的path字段和响应查询的婚配度(score)打印出来,
publicclassSearch{publicstaticvoidmain(String[]args)throwsException{StringindexPath=args,queryString=args;//指向索引目次的搜刮器Searchersearcher=newIndexSearcher(indexPath);//查询剖析器:利用和索引一样的言语剖析器Queryquery=QueryParser.parse(queryString,"body",newSimpleAnalyzer());//搜刮了局利用Hits存储Hitshits=searcher.search(query);//经由过程hits能够会见到响应字段的数据和查询的婚配度for(inti=0;i<hits.length();i++){System.out.println(hits.doc(i).get("path")+";Score:"+hits.score(i));};}}
在全部检索过程当中,言语剖析器,查询剖析器,乃至搜刮器(Searcher)都是供应了笼统的接口,能够依据必要举行定制。
HackingLucene
简化的查询剖析器
团体感到lucene成为JAKARTA项目后,画在了太多的工夫用于调试日益庞大QueryParser,而个中年夜部分是年夜多半用户其实不很熟习的,今朝LUCENE撑持的语法:
Query::=(Clause)*
Clause::=["+","-"][<TERM>":"](<TERM>|"("Query")")
两头的逻辑包含:andor+-&&||等标记,并且另有"短语查询"和针对西文的前缀/含混查询等,团体感到关于一样平常使用来讲,这些功效有一些脆而不坚,实在可以完成今朝相似于Google的查询语句剖析功效实在关于年夜多半用户来讲已够了。以是,Lucene初期版本的QueryParser还是对照好的选择。
增加修正删除指定纪录(Document)
Lucene供应了索引的扩大机制,因而索引的静态扩大应当是没有成绩的,而指定纪录的修正也仿佛只能经由过程纪录的删除,然后从头到场完成。怎样删除指定的纪录呢?删除的办法也很复杂,只是必要在索引时依据数据源中的纪录ID专门另建索引,然后使用IndexReader.delete(Termterm)办法经由过程这个纪录ID删除响应的Document。
依据某个字段值的排序功效
lucene缺省是依照本人的相干度算法(score)举行了局排序的,但可以依据其他字段举行了局排序是一个在LUCENE的开辟邮件列表中常常提到的成绩,良多本来基于数据库使用都必要除基于婚配度(score)之外的排序功效。而从全文检索的道理我们能够懂得到,任何不基于索引的搜刮历程效力城市招致效力十分的低,假如基于其他字段的排序必要在搜刮过程当中会见存储字段,速率回年夜年夜下降,因而十分是不成取的。
但这里也有一个折衷的办理办法:在搜刮过程当中可以影响排序了局的只要索引中已存储的docID和score这2个参数,以是,基于score之外的排序,实在能够经由过程将数据源事后排好序,然后依据docID举行排序来完成。如许就制止了在LUCENE搜刮了局外对了局再次举行排序和在搜刮过程当中会见不在索引中的某个字段值。
这里必要修正的是IndexSearcher中的HitCollector历程:
... scorer.score(newHitCollector(){privatefloatminScore=0.0f;publicfinalvoidcollect(intdoc,floatscore){if(score>0.0f&&//ignorezeroedbuckets(bits==null||bits.get(doc))){//skipdocsnotinbitstotalHits++;if(score>=minScore){/*本来:Lucene将docID和响应的婚配度score例进了局射中列表中:*hq.put(newScoreDoc(doc,score));//updatehitqueue*假如用doc或1/doc取代score,就完成了依据docID顺排或逆排*假定数据源索引时已依照某个字段排好了序,而了局依据docID排序也就完成了*针对某个字段的排序,乃至能够完成更庞大的score和docID的拟合。*/hq.put(newScoreDoc(doc,(float)1/doc));if(hq.size()>nDocs){//ifhitqueueoverfullhq.pop();//removelowestinhitqueueminScore=((ScoreDoc)hq.top()).score;//resetminScore}}}}},reader.maxDoc());
更通用的输出输入接口
固然lucene没有界说一个断定的输出文档格局,但愈来愈多的人想到利用一个尺度的两头格局作为Lucene的数据导进接口,然后其他数据,好比PDF只必要经由过程剖析器转换成尺度的两头格局就能够举行数据索引了。这其中间格局次要以XML为主,相似完成已不下4,5个:
数据源:WORDPDFHTMLDBother|||/XML两头格局|LuceneINDEX
今朝还没有针对MSWord文档的剖析器,由于Word文档和基于ASCII的RTF文档分歧,必要利用COM对象机制剖析。这个是我在Google上查的相干材料:http://www.intrinsyc.com/products/enterprise_applications.asp
别的一个举措就是把Word文档转换成text:http://www.winfield.demon.nl/index.html
索引历程优化
索引一样平常分2种情形,一种是小批量的索引扩大,一种是多量量的索引重修。在索引过程当中,并非每次新的DOC到场出来索引都从头举行一次索引文件的写进操纵(文件I/O是一件十分损耗资本的事变)。
Lucene先在内存中举行索引操纵,并依据必定的批量举行文件的写进。这个批次的距离越年夜,文件的写进次数越少,但占用内存会良多。反之占用内存少,但文件IO操纵频仍,索引速率会很慢。在IndexWriter中有一个MERGE_FACTOR参数能够匡助你在机关索引器后依据使用情况的情形充实使用内存削减文件的操纵。依据我的利用履历:缺省Indexer是每20笔记录索引后写进一次,每将MERGE_FACTOR增添50倍,索引速率能够进步1倍摆布。
搜刮历程优化
lucene撑持内存索引:如许的搜刮比基于文件的I/O无数量级的速率提拔。
http://www.onjava.com/lpt/a/3273
而尽量削减IndexSearcher的创立和对搜刮了局的前台的缓存也是需要的。
Lucene面向全文检索的优化在于初次索引检索后,其实不把一切的纪录(Document)详细内容读掏出来,而起只将一切了局中婚配度最高的头100条了局(TopDocs)的ID放到了局集缓存中并前往,这里能够对照一下数据库检索:假如是一个10,000条的数据库检索了局集,数据库是必定要把一切纪录内容都获得今后再入手下手前往给使用了局集的。以是即便检索婚配总数良多,Lucene的了局集占用的内存空间也不会良多。关于一样平常的含混检索使用是用不到这么多的了局的,头100条已能够满意90%以上的检索需求。
假如首批缓存了局数用完后还要读取更前面的了局时Searcher会再次检索并天生一个前次的搜刮缓存数年夜1倍的缓存,并再从头向后抓取。以是假如机关一个Searcher往查1-120条了局,Searcher实际上是举行了2次搜刮历程:头100条取完后,缓存了局用完,Searcher从头检索再机关一个200条的了局缓存,依此类推,400条缓存,800条缓存。因为每次Searcher对象消散后,这些缓存也会见那不到了,你有大概想将了局纪录缓存上去,缓存数只管包管在100以下以充实使用初次的了局缓存,不让Lucene华侈屡次检索,并且能够分级举行了局缓存。
Lucene的别的一个特性是在搜集了局的过程当中将婚配度低的了局主动过滤失落了。这也是和数据库使用必要将搜刮的了局全体前往分歧的地方。
我的一些实验:
撑持中文的Tokenizer:这里有2个版本,一个是经由过程JavaCC天生的,对CJK部分按一个字符一个TOKEN索引,别的一个是从SimpleTokenizer改写的,对英文撑持数字和字母TOKEN,对中文按迭代索引。
基于XML数据源的索引器:XMLIndexer,因而一切数据源只需可以依照DTD转换成指定的XML,就能够用XMLIndxer举行索引了。
依据某个字段排序:按纪录索引按次排序了局的搜刮器:IndexOrderSearcher,因而假如必要让搜刮了局依据某个字段排序,可让数据源先按某个字段排好序(好比:PriceField),如许索引后,然后在使用这个按纪录的ID按次检索的搜刮器,了局就是相称因而谁人字段排序的了局了。
从Lucene学到更多
Luene切实其实是一个面临对象计划的典型
一切的成绩都经由过程一个分外笼统层来便利今后的扩大和重用:你能够经由过程从头完成来到达本人的目标,而对其他模块而不必要;
复杂的使用出口Searcher,Indexer,并挪用底层一系列组件协同的完成搜刮义务;
一切的对象的义务都十分专注:好比搜刮历程:QueryParser剖析将查询语句转换成一系列的准确查询的组合(Query),经由过程底层的索引读取布局IndexReader举行索引的读取,并用响应的打分器给搜刮了局举行打分/排序等。一切的功效模块原子化水平十分高,因而能够经由过程从头完成而不必要修正其他模块。
除天真的使用接口计划,Lucene还供应了一些合适年夜多半使用的言语剖析器完成(SimpleAnalyser,StandardAnalyser),这也是新用户可以很快上手的主要缘故原由之一。
这些长处都长短常值得在今后的开辟中进修自创的。作为一个通用工具包,Lunece切实其实赐与了必要将全文检索功效嵌进到使用中的开辟者良多的便当。
别的,经由过程对Lucene的进修和利用,我也更深入地舆解了为何良多数据库优化计划中请求,好比:
尽量对字段举行索引来进步查询速率,但过量的索引会对数据库表的更新操纵变慢,而对了局过量的排序前提,实践上常常也是功能的杀手之一。
良多贸易数据库对多量量的数据拔出操纵会供应一些优化参数,这个感化和索引器的merge_factor的感化是相似的,
20%/80%准绳:查的了局多其实不即是质量好,特别关于前往了局集很年夜,怎样优化这头几十条了局的质量常常才是最主要的。
尽量让使用从数据库中取得对照小的了局集,由于即便关于年夜型数据库,对了局集的随机会见也是一个十分损耗资本的操纵。
还有就是总有人问我到底该学习什么语言,什么语言有前途,那么我的回答是不论是C,C++,java,.net,ruby,asp或是其他语言都可以学,编程的关键不是语言,而是思想。 是一种为 Internet发展的计算机语言 让你能够真正掌握接口或抽象类的应用,从而在原来的Java语言基础上跃进一步,更重要的是,设计模式反复向你强调一个宗旨:要让你的程序尽可能的可重用。 至于JDBC,就不用我多说了,你如果用java编过存取数据库的程序,就应该很熟悉。还有,如果你要用Java编发送电子邮件的程序,你就得看看Javamail 了。 当然你也可以参加一些开源项目,一方面可以提高自己,另一方面也是为中国软件事业做贡献嘛!开发者在互联网上用CVS合作开发,用QQ,MSN,E-mail讨论联系,天南海北的程序员分散在各地却同时开发同一个软件,是不是很有意思呢? Java语言支持Internet应用的开发,在基本的Java应用编程接口中有一个网络应用编程接口(java net),它提供了用于网络应用编程的类库,包括URL、URLConnection、Socket、ServerSocket等。Java的RMI(远程方法激活)机制也是开发分布式应用的重要手段。 让你能够真正掌握接口或抽象类的应用,从而在原来的Java语言基础上跃进一步,更重要的是,设计模式反复向你强调一个宗旨:要让你的程序尽可能的可重用。 那么我书也看了,程序也做了,别人问我的问题我都能解决了,是不是就成为高手了呢?当然没那么简单,这只是万里长征走完了第一步。不信?那你出去接一个项目,你知道怎么下手吗,你知道怎么设计吗,你知道怎么组织人员进行开发吗?你现在脑子里除了一些散乱的代码之外,可能再没有别的东西了吧! 你可以去承接一些项目做了,一开始可能有些困难,可是你有技术积累,又考虑周全,接下项目来可以迅速作完,相信大家以后都会来找你的,所以Money就哗啦啦的。。。。。。 接着就是EJB了,EJB就是Enterprise JavaBean, 看名字好象它是Javabean,可是它和Javabean还是有区别的。它是一个体系结构,你可以搭建更安全、更稳定的企业应用。它的大量代码已由中间件(也就是我们常听到的 Weblogic,Websphere这些J2EE服务器)完成了,所以我们要做的程序代码量很少,大部分工作都在设计和配置中间件上。 所以现在应用最广泛又最好学的就是J2EE了。 J2EE又包括许多组件,如Jsp,Servlet,JavaBean,EJB,JDBC,JavaMail等。要学习起来可不是一两天的事。那么又该如何学习J2EE呢?当然Java语法得先看一看的,I/O包,Util包,Lang包你都熟悉了吗?然后再从JSP学起。 自从Sun推出Java以来,就力图使之无所不包,所以Java发展到现在,按应用来分主要分为三大块:J2SE,J2ME和J2EE,这也就是Sun ONE(Open Net Environment)体系。J2SE就是Java2的标准版,主要用于桌面应用软件的编程;J2ME主要应用于嵌入是系统开发,如手机和PDA的编程;J2EE是Java2的企业版,主要用于分布式的网络程序的开发,如电子商务网站和ERP系统。 你可以去承接一些项目做了,一开始可能有些困难,可是你有技术积累,又考虑周全,接下项目来可以迅速作完,相信大家以后都会来找你的,所以Money就哗啦啦的。。。。。。 学Java必读的两个开源程序就是Jive和Pet Store.。 Jive是国外一个非常著名的BBS程序,完全开放源码。论坛的设计采用了很多先进的技术,如Cache、用户认证、Filter、XML等,而且论坛完全屏蔽了对数据库的访问,可以很轻易的在不同数据库中移植。论坛还有方便的安装和管理程序,这是我们平时编程时容易忽略的一部份(中国程序员一般只注重编程的技术含量,却完全不考虑用户的感受,这就是我们与国外软件的差距所在)。 那么我书也看了,程序也做了,别人问我的问题我都能解决了,是不是就成为高手了呢?当然没那么简单,这只是万里长征走完了第一步。不信?那你出去接一个项目,你知道怎么下手吗,你知道怎么设计吗,你知道怎么组织人员进行开发吗?你现在脑子里除了一些散乱的代码之外,可能再没有别的东西了吧! http://www.jdon.com/去下载,或到同济技术论坛的服务器ftp://nro.shtdu.edu.cn去下,安装上有什么问题,可以到论坛上去提问。 另外编写和运行Java程序需要JDK(包括JRE),在sun的官方网站上有下载,thinking in java第三版用的JDK版本是1.4,现在流行的版本1.5(sun称作J2SE 5.0,汗),不过听说Bruce的TIJ第四版国外已经出来了,是专门为J2SE 5.0而写的。 你快去找一份Java的编程工作来做吧(如果是在校学生可以去做兼职啊),在实践中提高自己,那才是最快的。不过你得祈祷在公司里碰到一个高手,而且他 还愿意不厌其烦地教你,这样好象有点难哦!还有一个办法就是读开放源码的程序了。我们知道开放源码大都出自高手,他们设计合理,考虑周到,再加上有广大的程序员参与,代码的价值自然是字字珠叽,铿锵有力(对不起,偶最近《金装四大才子》看多了)。 J2SE开发桌面应用软件比起 VC,VB,DEPHI这些传统开发语言来说,优势好象并不明显。J2ME对于初学者来说,好象又有点深奥,而且一般开发者很难有开发环境。 你就该学一学Servlet了。Servlet就是服务器端小程序,他负责生成发送给客户端的HTML文件。JSP在执行时,也是先转换成Servlet再运行的。虽说JSP理论上可以完全取代Servlet,这也是SUN推出JSP的本意,可是Servlet用来控制流程跳转还是挺方便的,也令程序更清晰。接下来你应该学习一下Javabean了,可能你早就看不管JSP在HTML中嵌Java代码的混乱方式了,这种方式跟ASP又有什么区别呢?
页:
[1]
2