当前位置:文档之家› Lucene 3.0.2 代码 分析

Lucene 3.0.2 代码 分析

Lucene 3.0.2 代码 分析
Lucene 3.0.2 代码 分析

全文检索与Lucene学习

全文检索与Lucene学习

本文是我最近针对Lucene3.3.0进行的总结,并提供了大量的实现Demo,常用的基本都有,下载地址:https://www.doczj.com/doc/cd5328720.html,/detail/a_2cai/3594154

1 概述

概念:Lucene不是一个完整的全文索引应用,而是是一个用Java写的全文索引引擎工具包,它可以方便的嵌入到各种应用中实现针对应用的全文索引/检索功能。

当前的版本有:Java版的,.NET版的(不完全),网上也有C++重写的,其他各类语言大部分也都有重写的。

简单地说它就两个功能:索引和检索。

主要应用:全文检索,顾名思义即在文件文本中搜索是否含有某个词之类的。(实质不一定是大文本)

全文检索是指计算机索引程序通过扫描文章中的每一个词,对每一个词建立一个索引,指明该词在文章中出现的次数和位置,当用户查询时,检索程序就根据事先建立的索引进行查找,并将查找的结果反馈给用户的检索方式。这个过程类似于通过字典中的检索字表查字的过程。

全文检索使用的理由:执行模糊查询都需要对全表扫描或索引扫描意味着消耗大量IO,如果模糊查询经常发生,会造成数据库性能恶化。(当然不一定非得是对大文件的检索,字段的模糊检索也是如此)

通常比较厚的书籍后面常常附关键词索引表(比如:北京:12, 34页,上海:3,77页……),它能够帮助读者比较快地找到相关内容的页码。而数据库索引能够大大提高查询的速度原理也是一样,想像一下通过书后面的索引查找的速度要比一页一页地翻内容高多少倍……而索引之所以效率高,另外一个原因是它是排好序的。对于检索系统来说核心是一个排序问题。

由于数据库索引不是为全文索引设计的,因此,使用like "%keyword%"时,数据库索引是不起作用的,在使用like查询时,搜索过程又变成类似于一页页翻书的遍历过程了,所以对于含有模糊查询的数据库服务来说,LIKE对性能的危

害是极大的。如果是需要对多个关键词进行模糊匹配:like"%keyword1%" and like "%keyword2%" ...其效率也就可想而知了。

全文检索:

全文检索的方法主要分为按字检索和按词检索两种。按字检索是指对于文章中的每一个字都建立索引,检索时将词分解为字的组合。对于各种不同的语言而言,字有不同的含义,比如英文中字与词实际上是合一的,而中文中字与词有很大分别。按词检索指对文章中的词,即语义单位建立索引,检索时按词检索,并且可以处理同义项等。英文等西方文字由于按照空白切分词,因此实现上与按字处理类似,添加同义处理也很容易。中文等东方文字则需要切分字词,以达到按词索引的目的,关于这方面的问题,是当前全文检索技术尤其是中文全文检索技术中的难点。

全文检索系统是按照全文检索理论建立起来的用于提供全文检索服务的软件系统。一般来说,全文检索需要具备建立索引和提供查询的基本功能,此外现代的全文检索系统还需要具有方便的用户接口、面向WWW的开发接口、二次应用开发接口等等。功能上,全文检索系统核心具有建立索引、处理查询返回结果集、增加索引、优化索引结构等等功能,外围则由各种不同应用具有的功能组成。结构上,全文检索系统核心具有索引引擎、查询引擎、文本分析引擎、对外接口等等,加上各种外围应用系统等等共同构成了全文检索系统。下图展示了上述全文检索系统的结构与功能。

在上图中,我们看到:全文检索系统中最为关键的部分是全文检索引擎,各种应用程序都需要建立在这个引擎之上。一个全文检索应用的优异程度,根本上由全文检索引擎来决定。因此提升全文检索引擎的效率即是我们提升全文检索应用的根本。另一个方面,一个优异的全文检索引擎,在做到效率优化的同时,还需要具有开放的体系结构,以方便程序员对整个系统进行优化改造,或者是添加原有系统没有的功能。比如在当今多语言处理的环境下,有时需要给全文检索系统添加处理某种语言或者文本格式的功能,比如在英文系统中添加中文处理功能,在纯文本系统中添加XML或者HTML格式的文本处理功能,系统的开放性和扩充性就十分的重要。

Lucene是纯Java的,是相对比较成熟的,速度也还是可以的,而对于其他的有很多是C++写的,速度甚至会更好,但是成熟性还不够,不过考虑效率的话完全可以选择一些C++版本的全文检索工具。

2 Lucene概述

系统结构与源码组织图:

Lucene索引文件的概念组成和结构组成:

以上就是Lucene的索引文件的概念结构。Lucene索引index由若干段(segment)组成,每一段由若干的文档(document)组成,每一个文档由若干的域(field)组成,每一个域由若干的项(term)组成。项是最小的索引概念单位,它直接代表了一个字符串以及其在文件中的位置、出现次数等信息。域是一个关联的元组,由一个域名和一个域值组成,域名是一个字串,域值是一个项,比如将“标题”和实际标题的项组成的域。文档是提取了某个文件中的所有信息之后的结果,这些组成了段,或者称为一个子索引。子索引可以组合为索引,也可以合并为一个新的包含了所有合并项内部元素的子索引。我们可以清楚的看出,Lucene 的索引结构在概念上即为传统的倒排索引(倒排文件或倒排索引是指索引对象是文档或者文档集合中的单词等,用来存储这些单词在一个文档或者一组文档中的存储位置,是对文档或者文档集合的一种最常用的索引机制。)结构。

主要的索引文件及功能:

1、segment_*:描述一组索引的参数,使用文件头固定格式描述后面的内容,包括每个独立新建索引的大小,属性等。

2、fnm:索引域描述文件,一个独立的索引(PerIndex)叫做一个segment(索引段),一个fnm文件描述了本索引的File数,各个 Field的属性编号。

3、fdx:文档域值索引文件,采用定长方式存储,根据docid排序,可直接定位。用来记录每个文档的Stored fields值的存储位置。

4、fdt:文档域值存储文件,存储Stored fields值的文件。通过fdx中记录的便宜访问。

5、tis:存储每个term在文档中的分布信息,如文档频率,每个含term文档出现次数记录的偏移和位置记录的偏移排列顺序。先按Field名字字典排序,在每个Field按term字典排序。

6、tii:该文件是tis文件的索引和精简,排列格式一样,但不含有每个term 属性的信息。这个文件可以完全读入到内存中。

7、frq:该文件是tis文件的扩展。记录每个term在每个包含文件中具体出现频率。

8、prx:该文件是tis文件的延伸,记录每个term在每个文档偏移信息。这个文档省略类docid,必须配合frq文件使用。

9、tvx,tvd,tvf:用来索引和保持每一个文档的向量化字段的信息。

命名规则:更新或创建都会修改文件名字 0-9a-z来进行命名,36进制命名规则。

3 Lucene的索引和检索

在此我做了一个简单的Demo,先以demo为例来讲述一下大体流程:

比如咱现在要将一些报警信息进行索引并用于检索,报警信息格式(简略演示)如下:

PCIP:xx.xx.xx.xx

DeviceIP:xx.xx.xx.xx

DeviceSerialNum:xxxxxxxx

AlarmType:移动侦测

AlarmDatetime:xxxxxx

为了读取待索引数据方便,将一些条目保存到记事本里面:

172.7.14.198 172.7.19.71 DS-2DF1-4010020090611AACH290005648WC移动侦测2011/9/1

172.7.14.198 172.7.19.71 DS-2DF1-4010020090611AACH290005648WC移动侦测2011/9/1

172.7.14.198 172.7.24.51 DS-9016HF-S1620100809BBRR401273372WCVU移动侦测 2011/9/1

172.7.14.198 172.7.24.51 DS-9016HF-S1620100809BBRR401273372WCVUC移动侦测 2011/9/1

建项目:

引入最新的Lucene包(3.3.0)lucene-core-3.3.0.jar到工程

建索引:

使用的对象和基本步骤:

Analyzer,解析器。

IndexWriter,需要对象IndexWriter来进行索引的创建与更新。

Document,写入的文档,是IndexWriter的基本对象。(一条报警可以用一个文档表示)

Field,一个Document可以有多个Field,这是我们存储的基本单位。(PCIP 等都可以视为Field)注:field默认域名区分大小写,最好统一。

A. 创建写对象IndexWriter,它依赖于Analyzer、存储路径,可通过IndexWriterConfig对其进行参数设置。

B. 创建空文档Document doc = new Document();

C. 向空文档里面添加若干个Field,doc.add(new Field("PCIP",

fields[0],Field.Store.YES, Field.Index.ANALYZED_NO_NORMS));

注:

Field参数STORE,与索引无关,是否额外存储原文,可以在搜索结果后调用出来,

NO不额外存储;

YES,额外存储。

Field参数INDEX,

NO,不索引;

ANALYZED,分词后索引;

NOT_ANALYZED,不分词索引

ANALYZED_NO_NORMS,分词索引,不存储NORMS;

NOT_ANALYZED_NO_NORMS,不分词,索引,不存储NORMS。

除了NO外都算索引,可以搜索。NORMS存储了boost所需信息,包含了NORM可能会占用更多内存。

D. 向IndexWriter添加Document,writer.addDocument(doc);

E. 优化索引(优化相对比较慢,可以选择进行,优化之后可以达到最大查询速度,//writer.optimize();//优化索引

注:实质上一个Document里面的同一个Field可以多次添加,也就是一个数组,这也可以理解为一个Document又可以添加自己的子集,例如下面的例子:

TeacherId: 1

StuFirstName: james

StuLastName: jones

TeacherId: 2

StuFirstName: james

StuLastName: smith

StuFirstName: sally

StuLastName: jones

TeacherId: 3

StuFirstName: james

StuLastName: smith

StuFirstName: keith

StuLastName: keith

StuFirstName: keith

StuLastName: keith

StuFirstName: sally

StuLastName: jones

三个老师,每个老师拥有的同学个数不一样,可以创建三个Document去存储,当然也可以创建更多的Document去处理,这个视实际的需要定。

检索:

IndexSearcher:由于检索的检索器

Analyzer:查询条件对象使用的解析器

QueryParser:将查询字符串转为查询条件对象

Query(或者SpanQuery):由于查询的查询条件对象。

TopDocs:获取结果集的最靠前的若干项。

ScoreDoc:获取结果集中的结果。

Document:每一条结果的文档对象,也就是所要查询的结果项,可以由它继续获取它所包含的所有Field等。

A.创建检索对象IndexSearcher,IndexSearcher searcher = new IndexSearcher(FSDirectory.open(new File(indexFilePath)));

B.创建查询条件对象Query(方式很多,也较复杂),它的详细类型在后面的查询方式总结中细述了。

C.开始查询:TopDocs results = searcher.search(query, 5 * hitsPerPage);

D.获取查询结果集:ScoreDoc[] hits = results.scoreDocs;

E.获取文档并对文档信息进行处理:

以上就是一个简单的索引和检索过程,实质上可以利用一些其他的类实现一些比较复杂的索引和查询,其功能是十分强大的。我写了很多的的Demo源码,大家可以传一下作为参考,依赖包为:lucene-core-3.3.0.jar。

对于IndexReader性能资源讨论

IndexReader封装了底层的API操作,reader的open操作非常耗费资源,因此reader应该重用。

但是reader打开后便不能获悉之后更新的Index,因此可reopen:

reopen将尝试尽量重用,如果无法重用将创建新的IndexReader,因此需要判断。

IndexReader newReader = reader.reopen();

if (reader != newReader) {

reader.close();

reader = newReader;

searcher = new IndexSearcher(reader);

}

执行搜索

IndexSearcher提供了很多API,下述几个均可以。

TopDocs search(Query query, int n)

TopDocs search(Query query, Filter filter, int n)

TopFieldDocs search(Query query, Filter filter, int n, Sort sort)

TopDocs

多数search直接返回一个TopDocs作为搜索的结果(已经按照相似度排序),它包含三个属性(方法):

totalHits:有多少个Document被匹配

scoreDocs:每一个具体的搜索结果(含分、Document等)

结果的分页

在Lucene中,常用的解决方法有:

1、在第一次就把很多结果都抓取过来,然后根据用户的分页请求来显示

2、每次重新查询

一般来说,Web是“无状态协议”,重新查询可回避状态的存储,是一种较好的选择。每次用户选择后面的页后,将“n”的数值加大,即可显示后面的内容。

“实时搜索”

实时搜索的关键是:不要自己创建Directory->IndexReader,而是使用下述办法:

IndexWriter.getReader():这可以不需要重新commit 索引就立即获得更新。

IndexReader newReader = reader.reopen():重用reader,比起open非常快捷,但是注意如果reader!=oldReader,则需要关闭oldReader。

4 查询方式总结

查询方式总体来讲分两类:查询API查询和语法查询

建议:依据咱项目的需要我觉得可以着重看一下这几种:语法查询(QueryParser),TermQuery,BooleanQuery,WildcardQuery,PrefixQuery,PhraseQuery ,SpanTermQuery ,FieldMaskingSpanQuery。

4.1 查询API

注:对于查询时的Field名一定要大小写对应,默认情况下要查询的关键字要转成小写,这在lucene建索引的时候做过特殊处理。可以采用

QueryParser.setLowercaseExpandedTerms(boolean flag)来设置是否将其转为小写。最好将查询的关键词转为小写来检索。

基类是Query,继承自Query类的一些类即可实现很多复杂的查询,这些查询包括:TermQuery,MultiTermQuery,BooleanQuery,WildcardQuery,PhraseQuery,PrefixQuery,MultiPhraseQuery,FuzzyQuery,TermRangeQuery,NumericRangeQuery,SpanQuery(又包括:SpanTermQuery、SpanFirstQuery、SpanNearQuery、SpanNotQuery、SpanOrQuery、 FieldMaskingSpanQuery、SpanMultiTermQueryWrapper)、MatchAllDocsQuery ,

其中:NumericRangeQuery,FuzzyQuery,NumericRangeQuery,PrefixQuery,TermRangeQuery,WildcardQuery,SpanMultiTermQueryWrapper 属于多term查询,继承自MultiTermQuery,我们也可以自定义实现我们自己的查询,下面我们来详细了解各种查询,并每一种都有对应的 demo,最好结合Demo 去理解各种查询。

TermQuery(词查询)

TermQuery是Lucene里面最基本的一种原子查询,它基本就是在某个Field里面查找某个词,如果查询到这个词就将对应的Document返回到结果集。

BooleanQuery (布尔查询)

布尔查询其实就是将各种查询的结果再进行布尔运算,最后在得到查询结果。一个查询中可以添加很多的布尔查询进行帅选。布尔查询在对于按条件查询记录的时候特别方便。

查询条件的限制方式:MUST、SHOULD、MUST_NOT

限制组合的意义:

1.MUST和MUST:取得连个查询子句的交集。

2.MUST和MUST_NOT:表示查询结果中不能包含MUST_NOT所对应得查询子句的检索结果。

3.SHOULD与MUST_NOT:连用时,功能同MUST和MUST_NOT。

4.SHOULD与MUST连用时,结果为MUST子句的检索结果,但是SHOULD可影响排序。

5.SHOULD与SHOULD:表示“或”关系,最终检索结果为所有检索子句的并集。6.MUST_NOT和MUST_NOT:无意义,检索无结果。

WildcardQuery(通配符查询)

Lucene支持通配符查询,通配符包括?(代表单个字符)和*(代表0个或多个字符)

PhraseQuery(词组查询)

PhraseQuery支持多个关键字的搜索,slop用于表示“距离”,设定PhraseQuery 的slop可控制多关键词的检索。相连的两词,将总被检索出来,无论slop为多少。对于slop距离的理解:对于“移动侦测”这个在不使用中文分词的技术时,被理解为4个词,现在以“移、侦、测”三个词为例:

‘移’当前处于位置1,实际位置1

‘侦’当前处于位置2,实际位置3

‘测’当前处于位置3,实际位置4

只需要移动一步就可以构成:移*侦测

所以slop最小为1.

假如现在给的关键字序列是:测、侦、移

‘移’当前处于位置3,实际位置1

‘侦’当前处于位置2,实际位置3

‘测’当前处于位置1,实际位置4

需要移动的步数最少是几呢?

1. 测侦移

2. 侦测移

3. 侦移测

4. 移侦测

5. 移*侦测

这是最少的移动方式,需要5次,所以slop最小为5时才可以检索到词组:移动侦测

综上我们了解到实质上slop是移动距离:将一个Query经过移动多少步可以符合另一个。

PrefixQuery(前缀搜索)

前缀搜索,只检索前缀为xxx字符串的匹配结果。

TermRangeQuery(非数字范围查询)

这一个查询是在查询符合某一范围的Term,然后返回其对应的Document,注意这一个不是对数字的范围限制,这个是对非数字的范围限制,基本就是字符串了,如果是数字的范围限制可以使用NumericRangeQuery。这一个类是继承自MultiTermQuery类的。

NumericRangeQuery(数字范围查询)

这一个查询是在查询符合某一范围的Term,然后返回其对应的Document,注意这一个是对数字的范围限制,所要查询的Field必须是数字类型。这一个类是继承自MultiTermQuery类的。

FuzzyQuery(模糊查询)

FuzzyQuery将枚举索引中全部的Term,比较耗费资源!! minimumSimilarity 是用来表示相似度的参数,为0~1.0之间的值,它没有Fuzzy数学中的那种对称性,而是递减的,即:minimumSimilarity的值越大,检索出的结果越少,但是越精确。默认情况下为0.5。

MatchAllDocsQuery(查询所有Document)

MatchAllDocsQuery将匹配索引中所有的Doc,Boost值默认都是1.0,并支持按照某field计算Boost数值。 Boost值的设置主要也就是起到一个排序的作用,下图对比了对AlarmType这个field作为Boost值计算依据的前后对比。

MultiPhraseQuery(多词组查询)

可以根据组合声明不同的查询方式,可以实现前缀查询、后缀查询、混合查询,详细使用方式可参照Demo。

前缀查询:

后缀查询:

混合查询:

SpanQuery (跨度搜索,又细分为很多类)

跨度搜索又分为:SpanTermQuery、SpanFirstQuery、SpanNearQuery、SpanNotQuery、SpanOrQuery、FieldMaskingSpanQuery、SpanMultiTermQueryWrapper

1.SpanTermQuery

SpanQuery中最基本的是SpanTermQuery,其只包含一个Term,与TermQuery所不同的是,其提供一个函数来得到匹配位置信息。

2. SpanFirstQuery

SpanFirstQuery仅取在开头部分包含查询词的文档。

3. SpanNearQuery

这个查询和PharseQuery查询类似,其中构造函数的参数slop表示移动最小次数,inOrder表示是否关键字必须有序出现,collectPayloads表示是否要加载payload数据,默认为true。

SpanNearQuery(SpanQuery[] clauses, int slop, boolean inOrder, boolean collectPayloads)

4. SpanNotQuery

查询词组中包含include,但是不能包含exclude的情况。(这个测试的结果是有点问题的)

public SpanNotQuery(SpanQuery include, SpanQuery exclude)

5.SpanOrQuery

查询field中包含其中的任意一个关键字即为符合条件。

6.FieldMaskingSpanQuery

首先我们来看为什么会有这种查询:

对于SpanNearQuery与SpanOrQuery两种查询我们知道是不允许跨域查询的,其实现是将StuLastName域隐藏为StuFirstName,但是有这样的一种情况:

假如当前索引了以下两个文档:

TeacherId: 1

StuFirstName: james

StuLastName: jones

TeacherId: 2

StuFirstName: james

StuLastName: smith

StuFirstName: sally

StuLastName: jones

TeacherId: 3

StuFirstName: james

StuLastName: smith

StuFirstName: keith

StuLastName: keith

StuFirstName: keith

StuLastName: keith

StuFirstName: sally

StuLastName: jones

这种情况可能会查到三个结果,于是我们需要调节slop为-1,这样才能保证StuFirstName与StuLastName对应。

4.2 QueryParser语法查询

虽然Lucene提供的API允许使用者创建各种各样的Query(查询语句),但它同时也允许通过QueryParser(查询分析器)生成各种各样的Query子对象。这使得Lucene的查询功能更加灵活和强大。它的作用就是把各种用户输入的符号串转为一个内部的Query或者一个Query 组,我们可以定义我们的查询语言串,交给它进行解析获得一个Query类,QueryParser是用javaCC生成的一个语法解析工具(应该也算是一种编译器),它的功能特别强大,它一般用在用户输入很多不同的查询条件,根据这些条件构成一个串,然后将这个串转换为Query类。

(1) 语法关键字

+ - && || ! ( ) { } [ ] ^ " ~ * ? : \

如果所要查询的查询词中本身包含关键字,则需要用\进行转义

(2) 查询词(Term)

Lucene支持两种查询词,一种是单一查询词,如"hello",一种是词组(phrase),如"hello world"。

(3) 查询域(Field)

在查询语句中,可以指定从哪个域中寻找查询词,如果不指定,则从默认域中查找。

Android源代码结构分析

目录 一、源代码结构 (2) 第一层次目录 (2) bionic目录 (3) bootloader目录 (5) build目录 (7) dalvik目录 (9) development目录 (9) external目录 (13) frameworks目录 (19) Hardware (20) Out (22) Kernel (22) packages目录 (22) prebuilt目录 (27) SDK (28) system目录 (28) Vendor (32)

一、源代码结构 第一层次目录 Google提供的Android包含了原始Android的目标机代码,主机编译工具、仿真环境,代码包经过解压缩后,第一级别的目录和文件如下所示: . |-- Makefile (全局的Makefile) |-- bionic (Bionic含义为仿生,这里面是一些基础的库的源代码) |-- bootloader (引导加载器),我们的是bootable, |-- build (build目录中的内容不是目标所用的代码,而是编译和配置所需要的脚本和工具) |-- dalvik (JAVA虚拟机) |-- development (程序开发所需要的模板和工具) |-- external (目标机器使用的一些库) |-- frameworks (应用程序的框架层) |-- hardware (与硬件相关的库) |-- kernel (Linux2.6的源代码) |-- packages (Android的各种应用程序) |-- prebuilt (Android在各种平台下编译的预置脚本) |-- recovery (与目标的恢复功能相关) `-- system (Android的底层的一些库)

Struts2框架工作原理及应用体会

2012年第11卷第6期 产业与科技论坛2012.(11).6 Industrial &Science Tribune Struts2框架工作原理及应用体会 □宋 君 张家爱 【摘要】通过针对特定用户的分析,搭建以Struts2为技术核心的旅行社管理系统。本文简单的介绍了MVC 、 Struts2的工作原理,同时总结了在项目制作过程中所得到的心得。 【关键词】 Struts2;MVC ;FilterDispatcher ;Action 【基金项目】本文为大学生科技创新院级基金项目(编号:2011070)成果 【作者单位】宋君,吉林农业科技学院信息工程学院;张家爱,吉林农业科技学院信息工程学院教师 本着锻炼自我与积极参与到实用性技术的目标,以发掘自身创新意识为前提。利用空闲时间,在老师的指导下,进行了一次大学生创新项目的实践性活动。本着实用原则,以某中小旅行社为客户(根据用户需求,匿名),以Struts2框架为基点,进行了一次旅行社管理系统的开发。在项目结束之余, 特将在项目过程中经历的种种认识进行了简单的总结,希望让阅读本文的朋友们,更多的参与到此类活动中。 一、基础思想— ——MVC 简述作为时下经典框架之一, MVC 具有其独特的价值。MVC 框架简单的说,就是将数据模型与用户视图进行分离。通过控制器进行协调处理的一种结构是框架。同时,也是本文中要讨论的Sturts2框架的基础思想。 M 是指模型层(Model ),V 是指用户视图(View ),C 则是指控制器 (Controller )。这种划分方式是以将模型层与视图层进行代码分离,从而降低两者之间的耦合性,使同一程序可以使用不同形式进行表现。不同层之间的修改不会或尽量少的印象到其他层功能的史前为前提。有效的提高的代码的维护性和设计难度。 图1 二、 Struts2工作原理(一)Struts2框架组成。Struts2框架由三个主要部分组成:核心控制器、业务控制器,以及由用户实现的业务逻辑组件。这里我们将侧重于核心控制器与业务控制器的理解与说明。 (二)核心控制器:FilterDispatcher 。FilterDispatcher 是Struts2框架的核心控制器,在此,我们可以将FilterDispatcher 看作一个类似于过滤网的过滤器。当用户发出请求,并到达Web 硬哟那种时,该过滤器会过滤用户请求。如果用户请求的结尾为action ,则将该请求转入Struts2框架进行处理。当Struts2框架获得了*.actio 请求后,会根据请求前面“*”的那部分内容,决定调用哪个业务逻辑组件作为响应单位。这里需要说明的是Struts2用来处理用户请求的Action 实例并不是业务控制器,而是作为Action 的代理———正因为Struts2的一大特点,与Servlet API 的非耦合性,使得用户实现的业务控制器无法直接处理用户请求。有效的提高了后期调试维护的效率。而Struts2框架再次提供了了一系列的拦截器。这些拦截器负责将HttpServletRequest 请求的参数解析出来,传入Action 中,并毁掉Action 的Execute 方法来处理用户请求。用户实现的Action 类仅作为Struts2的Action 代理的代理目标。用户实现的业务控制器则包含了对用户请求的处理。用户的请求数据包含在HttpServletRequest 对象中,而用户的Action 类无需访问HttpServletRequest 对象。拦截器负责将HttpServletRequest 里的请求数据解析出来,并传给业务逻辑组件Action 实例。 (三)业务控制器。业务控制器就是前文提到的用来实现用户Action 的实力,这里的每个Action 类通常包含有一个execute 方法,当业务控制器处理完用户的请求后,该方法将会针对此次处理返回一个字符串— ——该字符串就是一个逻辑树图名。当程序开发人员开发出系统所需要的业务控制器后,还需要针对性的配置Struts2的Action ,即需要配置Ac- tion 的以下三个部分:(1)Action 所处理的URl 。(2)Action 组件所对应的实现类。(3)Action 里包含的逻辑试图和物理资源之间的对应关系。每个Action 都要处理一个用户请求,而用户请求则总是包含有指定的URL 。当核心控制器过滤用户请求,并调用后,根据请求的URL 和Action 处理URL 之间的对应关系来处理转发。 · 342·

扫描代码

bool blnNamingOnly = false; string strFullPathFileName = ""; bool bl = axImgScan1.ScannerAvailable(); gstrWindowsTempDirectory = "D:\\"; if (axImgScan1.ScannerAvailable() == true)//判断扫描仪是否可用 { sPath = createFolder(); //创建文件夹 //检查文件夹是否存在文件,如文件存在,检测最后一个文件名,提取文件数字 DirectoryInfo dir = new DirectoryInfo(sPath); FileInfo[] finfo = dir.GetFiles(); string fnames = ""; for (int i = 0; i < finfo.Length; i++) { fnames = finfo[i].Name.Substring(20, 3);//截取文件名中的最后3为字符 if (int.Parse(fnames) > intNum) intNum = int.Parse(fnames); } intNum = intNum + 1; tooloptimizeBtn.Text = intNum.ToString(); axImgScan1.PageOption = ScanLibCtl.PageOptionConstants.AppendPages;//axImgScan1.PageOption = ScanLibCtl.PageOptionConstants.PromptToCreateNewFile; axImgScan1.OpenScanner();//打开扫描仪 axImgScan1.ScanTo = ScanLibCtl.ScanToConstants.DisplayAndFile;//以何种形式扫描,如仅文件、仅显示、或显示加文件 axImgScan1.MultiPage = true;//扫描多页 axImgScan1.FileType = ScanLibCtl.FileTypeConstants.TIFF;//被扫描后的文件存储格式类型 axImgScan1.Page = axImgScan1.PageCount + 1;//新添加 axImgScan1.Scroll = true; axImgScan1.SetPageTypeCompressionOpts(https://www.doczj.com/doc/cd5328720.html,pPreferenceConstants.GoodDisplay, ScanLibCtl.ImageTypeConstants.ColorPal4Bit, https://www.doczj.com/doc/cd5328720.html,pTypeConstants.TIFFPackbits, https://www.doczj.com/doc/cd5328720.html,pInfoConstants.TIFFPackbitsInfo);//.G31DFaxRBO) axImgScan1.Image = @sPath + "\\"+ label171.Text + "-"+ intNum.ToString("000") + ".tif";//保存文件 + "*" axImgScan1.StartScan(); //axImgScan1.DestImageControl = "axImgEdit1"; //axImgThumbnail1.Image = axImgScan1.Image; //axImgThumbnail1.DisplayThumbs();

编译原理词法分析五种类别识别程序含实现代码cpp

实验一词法分析 一、实验目的和要求 通过设计编制调试一个具体的词法分析程序,加深对词法分析原理的理解。并掌握在对程序设计语言源程序进行扫描过程中将其分解为各类单词的词法分析方法。 编制一个读单词过程,从输入的源程序中,识别出各个具有独立意义的单词,即基本保留字、标识符、常数、运算符、分隔符五大类。并依次输出各个单词的内部编码及单词符号自身值。(遇到错误时可显示“Error”,然后跳过错误部分继续显示) 二、实验过程 (1)程序思路 这里以开始定义的C语言子集的源程序作为词法分析程序的输入数据。在词法分析中,自文件头开始扫描源程序字符,一旦发现符合“单词”定义的源程序字符串时,将它翻译成固定长度的单词内部表示,并查填适当的信息表。经过词法分析后,源程序字符串(源程序的外部表示)被翻译成具有等长信息的单词串(源程序的内部表示),并产生两个表格:常数表和标识符表,它们分别包含了源程序中的所有常数和所有标识符。 0.定义部分:定义常量、变量、数据结构。 1.初始化:从文件将源程序全部输入到字符缓冲区中。 2.取单词前:去掉多余空白。 3.取单词后:去掉多余空白。 4.取单词:利用实验一的成果读出单词的每一个字符,组成单词,分析类型。 循环取字符,直到遇到“#”字符就停止扫描。 5.显示结果。 (2)程序实现部分代码 char *table[7]={" ","main","int","if","then","else","return"}; //定义关键字 char *table1[5]={"++",">=","<=","!=","=="}; //定义运算符符号 int lookup(char *TOKEN) //关键字匹配函数,查询所述程序中的关键字 { int m,i; for(i=0;i<=6;i++) { if((m=strcmp(TOKEN,table[i]))==0) return 1; }

静态分析、测试工具.doc

静态代码分析、测试工具汇总 静态代码扫描,借用一段网上的原文解释一下 ( 这里叫静态检查 ) :“静态测试包括代码检查、 静态结构分析、代码质量度量等。它可以由人工进行,充分发挥人的逻辑思维优势, 也可以借助软件工具自动进行。代码检查代码检查包括代码走查、桌面检查、代码审查等, 主要检查代码和设计的一致性,代码对标准的遵循、可读性,代码的逻辑表达的正确性,代 码结构的合理性等方面;可以发现违背程序编写标准的问题,程序中不安全、不明确和模糊 的部分,找出程序中不可移植部分、违背程序编程风格的问题,包括变量检查、命名和类型 审查、程序逻辑审查、程序语法检查和程序结构检查等内容。”。 我看了一系列的静态代码扫描或者叫静态代码分析工具后,总结对工具的看法:静态代码 扫描工具,和编译器的某些功能其实是很相似的,他们也需要词法分析,语法分析,语意 分析 ...但和编译器不一样的是他们可以自定义各种各样的复杂的规则去对代码进行分析。 以下将会列出的静态代码扫描工具,会由于实现方法,算法,分析的层次不同,功能上会 差异很大。有的可以做 SQL注入的检查,有的则不能 ( 当然,由于时间问题还没有对规则进行研究,但要检查复杂的代码安全漏洞,是需要更高深分析算法的,所以有的东西应该不 是设置规则库就可以检查到的,但在安全方面的检查,一定程度上也是可以通过设置规则 进行检查的 )。 主 工具名静态扫描语言开源 / 厂商介绍 页付费网 址 https://www.doczj.com/doc/cd5328720.html,、C、 ounec5.0 C++和 C#,付 Ounce Labs \ 还支持费 Java。 还有其他辅助工具: 1.Coverity Thread Coverity C/C++,C#,JAV Analyzer for Java 付费Coverity 2.Coverity Software Prevent A Readiness Manager for Java 3.Coverity

yaffs2文件系统制作

交叉编译器ARM-Linux-gcc4.1.2 开发板TX2440A Busybox-1.15.1.tar.bz2(在Linux中被称为瑞士军刀) mkyaffs2image工具 首先创建一个名字为root_2.6.31的文件夹,在其中创建如下文件夹 etc bin var dev home lib mnt proc root sbin sys tmp usr opt共14个文件夹 解压Busybox tar xjvf busybox 进入源目录,修改Makefile 第164行,CROSS_COMPILE=arm-linux- 第190行,ARCH=arm 执行#make men onfig进行配置 配置选项大部分都是保持默认的,只需要注意选择以下这几个选项,其他的选项都不用动:Busybox Setting---> Build Options---> [*]Build Busybox as a static binary(no shared libs) [*]Build with Large File Support(for accessing files>2GB) Installation Options--->

(./_install)Busybox installation prefix 进入这个选项,输入busybox的安装路径,如:../rootfs Busybox Library Tuning---> [*]vi-style line editing commands [*]Fancy shell prompts 要选择这个选项:“Fancy shell prompts”,否则挂载文件系统后,无法正常显示命令提示符:“[\u@\h\W]#” 配置完成以后 执行#make #make install 然后就会在上一级目录下生成rootfs文件夹,里面包含几个文件夹/bin/sbin/usr linuxrc 把这些文件全部复制到刚建好的root_2.6.31目录下, #cp–rf*../root_2.6.31 在dev目录下,创建两个设备节点: #mknod console c51 #mknod null c13 然后进入自己建立的etc目录 拷贝Busybox-1.15.2/examples/bootfloopy/etc/*到当前目录下。 #cp-r../../busybox-1.15.2/examples/bootfloopy/etc/*./ 包括文件:fstab init.d inittab profile

linux-2.6.18移植

Linux-2.6.18移植 有了我们的交叉编译环境和我们先前学的内核基础知识,下面我们就开始我们的内核移植了,我们所用的是博创的 S3C2410 。 关于 linux-2.6.18.tar.bz2 的下载网站先前我们说过,我们要先到该官方网站上去下载一个全新的内核。 [root@Binnary ~ ]# tar –jxvf linux-2.6.18.tar.bz2 [root@Binnary ~ ]# make mrproper 如果你是新下载的内核,那这一步就不用了。但如果你用的是别人移植好的内核,那最好在编译内核之前先清除一下中间文件,因为你们用来编译内核的交叉编译工具可能不同。 第一步:修改Makefile文件 将 改为 第二步:修改分区设置信息 我们要先在BootLoader中查看相应的分区信息 vivi>help 然后修改内核源码中的分区信息。分区信息文件在 a rch/arm/mach-s3c2410/common-smdk.c 将其中的

改为如下内容:

第三步:内核通过 BootLoader把数据写入NAND Flash,而vivi的ECC效验算法和内核的不同,内核的效验码是由NAND Flash控制器产生的,所以在此必须禁用NAND Flash ECC。所以我们就要修改 drivers/mtd/nand/s3c2410.c 这个文件。将 中的 chip->ecc.mode = NAND_ECC_SOFT ,改为如下 chip->ecc.mode = NAND_ECC_NONE。

只此一处。 第四步:下面是devfs的问题,因为2.6.12内核以后取消了devfs的配置选项,缺少了它内核会找不到mtdblock设备。所以我们需要修改 fs/Kconfig 文件,或者是从2.6.12的fs/Kconfig中拷贝下面几项到2.6.18的fs/Kconfig中去,我们采用修改的方法来完成。 修改 fs/Kconfig支持devfs 。 在Pseudo filesystems 主菜单的最后添加我们所要的内容。 第五步:文件系统的支持 Yaffs 文件系统 YAFFS文件系统简介 YAFFS,Yet Another Flash File System,是一种类似于JFFS/JFFS2的专门为Flash设计 的嵌入式文件系统。与JFFS相比,它减少了一些功能,因此速度更快、占用内存更少。 YAFFS和JFFS都提供了写均衡,垃圾收集等底层操作。它们的不同之处在于: (1)、JFFS是一种日志文件系统,通过日志机制保证文件系统的稳定性。YAFFS仅仅 借鉴了日志系统的思想,不提供日志机能,所以稳定性不如JAFFS,但是资源占用少。 (2)、JFFS中使用多级链表管理需要回收的脏块,并且使用系统生成伪随机变量决定 要回收的块,通过这种方法能提供较好的写均衡,在YAFFS中是从头到尾对块搜索, 所以在垃圾收集上JFFS的速度慢,但是能延长NAND的寿命。 (3)、JFFS支持文件压缩,适合存储容量较小的系统;YAFFS不支持压缩,更适合存 储容量大的系统。 YAFFS还带有NAND芯片驱动,并为嵌入式系统提供了直接访问文件系统的API,用 户可以不使用Linux中的MTD和VFS,直接对文件进行操作。NAND Flash大多采用 MTD+YAFFS的模式。MTD( Memory Technology Devices,内存技术设备)是对Flash 操作的接口,提供了一系列的标准函数,将硬件驱动设计和系统程序设计分开。 Yaffs 文件系统内核没有集成,可以对其主页下载: https://www.doczj.com/doc/cd5328720.html,/cgi-bin/viewcvs.cgi/#dirlist

struts2 实验报告

1.系统分析与设计 1.1 系统功能描述 本系统是个非常简单的注册、登录系统。本系统的实现是基于Struts2、Spring、Hibernate 三个框架,系统功能单一,业务逻辑简单。 当用户注册信用户时,就是向系统中增加一个新用户,对应的数据库增加一条记录。 当用户输入注册信息时,系统提供了基本的输入验证判断用户输入是否合法,只有当用户输入满足基本输入要求时,才会被提交到实际的登录系统,进行实际的登录处理。 系统还使用了随机产生的图形验证码来防止刷新,防止用户通过单击浏览器的书安心按钮来重复注册多个用户。 系统还提供了一种Ajax方式来验证用户输入的注册名是否有效,系统要求所有的用户名不能重复。故当用户输完用户名后,系统立即在页面上方提示用户该用户名是否可用,如果系统中没有该用户名,则系统提示该用户名可用;否则提示用户该用户名重复,用户必须重新选择用户名注册。 当用户注册一个新用户名之后,就可以使用系统的登录功能来登录系统了,用户输入登录用的用户名、密码后,系统一样提供了基本的输入校验。 除此之外,系统还采用了随机产生图形验证码来防止恶意用户的暴力破解,系统随机生成一个图形验证码,而用户登录必须输入图形验证码中显示的字符串,只有用户输入的字符串和系统随机生成的验证码字符相同时,系统才允许用户登录。 1.2 系统功能流程

1.3 数据库设计 相关的映射文件: 一旦提供了上面的映射文件,Hibernate 就可以理解User 和user_table 之间的对应关系。 2.系统实现与测试 2.1 系统采用的关键技术 MVC 框架采用了Struts2框架,Struts2框架的易用性,极好的简化了系统的MVC 层的实现;本系统使用了Struts2的JSON 插件来完成Ajax 功能,除此之外本系统为了避免进行底层的Ajax 交互,还是用了一个简单Prototype.js 函数库,用以简化Ajax 编程。Struts2框架的稳定性,为系统的稳定运行提供了保证。

Yaffs2文件系统中对NAND Flash磨损均衡的改进

Yaffs2文件系统中对NAND Flash磨损均衡的改进 摘要:针对以NAND Flash为存储介质时Yaffs2文件系统存在磨损均衡的缺陷,通过改进回收块选择机制,并在数据更新中引入冷热数据分离策略,从而改善NAND Flash的磨损均衡性能。实验借助Qemu软件建立Linux嵌入式仿真平台,从总擦除次数、最大最小擦除次数差值和块擦除次数标准差等方面进行对比。实验结果表明,在改进后的Yaffs2文件系统下NAND Flash的磨损均衡效果有明显提升,这有益于延长NAND Flash的使用寿命。 关键词: Yaffs2文件系统;NAND Flash;垃圾回收;冷热数据 0 引言 NAND Flash存储设备与传统机械磁盘相比,具有体积小、存储密度高、随机存储和读写能力强、抗震抗摔、功耗低等特点[1]。它被广泛用于智能手机、车载智能中心、平板电脑等智能终端中。近年来,以NAND Flash为存储介质的固态硬盘也得到越来越多的应用。目前Yaffs2文件系统(Yet Another Flash File System Two,Yaffs2)[1]是使用最多、可移植性最好的专用文件系统,在安卓、阿里云OS、Linux等嵌入式系统中都有使用。在Yaffs2文件系统下以NAND Flash为存储介质时存在磨损均衡的缺陷,可通过对回收块选择机制作改进和引入冷热数据分离策略来提高磨损均衡的效果。 1 Yaffs2和Nand Flash关系 这里以使用最多的Linux操作系统为实践,将Yaffs2文件系统移植到Linux操作系统中。Linux系统通常可以分为3层:应用层、内核层和设备层,其中支持NAND Flash设备的Yaffs2文件系统属于内核层,。 最上层用户应用程序通过VFS(Virtual File System)提供的统一接口,将数据更新等文件操作传递给Yaffs2。VFS代表虚拟文件系统,它为上层应用提供统一的接口。有了这些接口,应用程序只用遵循抽象后的访问规则,而不必理会底层文件系统和物理构成上的差异。然后Yaffs2通过MTD(Memory Technology Device)提供的统一访问接口对NAND Flash进行读、写和擦除操作,从而完成数据的更新或者存储操作。MTD代表内存技术设备,它为存储设备提供统一访问的接口。最终,在NAND Flash上以怎样的格式组织和存储数据由Yaffs2文件系统决定。 NAND Flash由若干块(block)组成,每个块又是由若干页(page)组成,页中含有数据区和附加区。NAND Flash的页根据状态不同,可以分为有效页、脏页、空闲页。有效页中存放有效数据,脏页中存放无效数据,空闲页是经过擦除后可以直接用于写入数据的页。NAND Flash在写入数据前需要执行擦除操作,因此数据不能直接在相同的位置更新。当一个页中数据需要更新时,必须将该页中有效数据拷贝到其他空闲页上再更新,并将原来页上的数据置为无效。随着时间的推移,许多无效页累积在存储器中使得空闲页逐渐减少。当存储器中的空闲空间不足时,启动垃圾回收操作,利用回收块选择机制从待回收块中选取满足要求的块来擦除,从而得到足够的空闲空间。NAND Flash中块的擦除次数有限,通常为10 000次~100 000次[2]。当某个块的擦除次数超过使用寿命时,该块将无法正常用于数据存储。因此,垃圾回收应利用合理的回收块选择机制,从待回收块中找到回收后能产生良好磨损均衡效果且付出较少额外代价的块来回收,从而获得足够的空闲空间用于数据更新操作。 2 Yaffs2在磨损均衡方面的缺陷 Yaffs2中回收块的选择机制[3]是从待回收块中找到有效数据最少的块来回收。回收过程中,Yaffs2能够减少有效数据的额外读和写操作。当数据更新处于均匀分布的情况下,Yaffs2表现出较好的磨损均衡效果。 但是,通常情况下数据的更新频率不同,有些数据经常更新,而有些数据很少更新。经

如何看懂源代码--(分析源代码方法)

如何看懂源代码--(分析源代码方法) 4 推 荐 由于今日计划着要看Struts 开源框架的源代码 昨天看了一个小时稍微有点头绪,可是这个速度本人表示非常不满意,先去找了下资 料, 觉得不错... 摘自(繁体中文 Traditional Chinese):http://203.208.39.132/translate_c?hl=zh-CN&sl=en&tl=zh-CN&u=http://ww https://www.doczj.com/doc/cd5328720.html,/itadm/article.php%3Fc%3D47717&prev=hp&rurl=https://www.doczj.com/doc/cd5328720.html,&usg=AL kJrhh4NPO-l6S3OZZlc5hOcEQGQ0nwKA 下文为经过Google翻译过的简体中文版: 我们在写程式时,有不少时间都是在看别人的代码。 例如看小组的代码,看小组整合的守则,若一开始没规划怎么看,就会“噜看噜苦(台语)”不管是参考也好,从开源抓下来研究也好,为了了解箇中含意,在有限的时间下,不免会对庞大的源代码解读感到压力。网路上有一篇关于分析看代码的方法,做为程式设计师的您,不妨参考看看,换个角度来分析。也能更有效率的解读你想要的程式码片段。 六个章节: ( 1 )读懂程式码,使心法皆为我所用。( 2 )摸清架构,便可轻松掌握全貌。( 3 )优质工具在手,读懂程式非难事。( 4 )望文生义,进而推敲组件的作用。( 5 )找到程式入口,再由上而下抽丝剥茧。( 6 )阅读的乐趣,透过程式码认识作者。 程式码是别人写的,只有原作者才真的了解程式码的用途及涵义。许多程式人心里都有一种不自觉的恐惧感,深怕被迫去碰触其他人所写的程式码。但是,与其抗拒接收别人的程式码,不如彻底了解相关的语言和惯例,当成是培养自我实力的基石。 对大多数的程式人来说,撰写程式码或许是令人开心的一件事情,但我相信,有更多人视阅读他人所写成的程式码为畏途。许多人宁可自己重新写过一遍程式码,也不愿意接收别人的程式码,进而修正错误,维护它们,甚至加强功能。 这其中的关键究竟在何处呢?若是一语道破,其实也很简单,程式码是别人写的,只有原作者才真的了解程式码的用途及涵义。许多程式人心里都有一种不自觉的恐惧感,深怕被迫去碰触其他人所写的程式码。这是来自于人类内心深处对于陌生事物的原始恐惧。 读懂别人写的程式码,让你收获满满 不过,基于许多现实的原因,程式人时常受迫要去接收别人的程式码。例如,同事离职了,必须接手他遗留下来的工作,也有可能你是刚进部门的菜鸟,而同事经验值够了,升级了,风水轮流转,一代菜鸟换菜鸟。甚至,你的公司所承接的专案,必须接手或是整合客户前一个厂商所遗留下来的系统,你们手上只有那套系统的原始码(运气好时,还有数量不等的文件)。 诸如此类的故事,其实时常在程式人身边或身上持续上演着。许多程式人都将接手他人的程式码,当做一件悲惨的事情。每个人都不想接手别人所撰写的程式码,因为不想花时间去探索,宁可将生产力花在产生新的程式码,而不是耗费在了解这些程式码上。

四款优秀的源代码扫描工具简介

一、DMSCA-企业级静态源代码扫描分析服务平台 端玛企业级静态源代码扫描分析服务平台(英文简称:DMSCA)是一个独特的源代码安 全漏洞、质量缺陷和逻辑缺陷扫描分析服务平台。该平台可用于识别、跟踪和修复在源代码 中的技术和逻辑上的缺陷,让软件开发团队及测试团队快速、准确定位源代码中的安全漏洞、质量和业务逻辑缺陷等问题,并依据提供的专业中肯的修复建议,快速修复。提高软件产品 的可靠性、安全性。同时兼容并达到国际、国内相关行业的合规要求。 DMSCA是端玛科技在多年静态分析技术的积累及研发努力的基础上,联合多所国内及国 际知名大学、专家共同分析全球静态分析技术的优缺点后、结合当前开发语言的技术现状、 源代码缺陷的发展势态和市场后,研发出的新一代源代码企业级分析方案旨在从根源上识别、跟踪和修复源代码技术和逻辑上的缺陷。该方案克服了传统静态分析工具误报率(False Positive)高和漏报(False Negative)的缺陷。打断了国外产品在高端静态分析产品方面的垄断,形成中国自主可控的高端源代码安全和质量扫描产品,并支持中国自己的源代码检测方 面的国家标准(GB/T34944-2017 Java、GB/T34943-2017 C/C++、GB/T34946-2017 C#),致 力于为在中国的企业提供更直接,更个性化的平台定制和本地化服务。 DMSCA支持主流编程语言安全漏洞及质量缺陷扫描和分析,支持客户化平台界面、报告、规则自定义,以满足客户特定安全策略、安全标准和研发运营环境集成的需要。产品从面世,就获得了中国国内众多客户的青睐,这些客户包括但不限于银行、在线支付、保险、电力、 能源、电信、汽车、媒体娱乐、软件、服务和军事等行业的财富1000企业。 1、系统架构 2、系统组件

Java静态检测工具的简单介绍 - Sonar、Findbugs

Java静态检测工具的简单介绍- Sonar、Findbugs 2010-11-04 13:55:54 标签:sonar休闲职场 Java静态检测工具的简单介绍 from: https://www.doczj.com/doc/cd5328720.html,/?p=9015静态检查:静态测试包括代码检查、静态结构分析、代码质量度量等。它可以由人 工进行,充分发挥人的逻辑思维优势,也可以借助软件工具自动进行。 代码检查代码检查包括代码走查、桌面检查、代码审查等,主要检查代码和 设计的一致性,代码对标准的遵循、可读性,代码的逻辑表达的正确性,代 码结构的合理性等方面;可以发现违背程序编写标准的问题,程序中不安全、 不明确和模糊的部分,找出程序中不可移植部分、违背程序编程风格的问题, 包括变量检查、命名和类型审查、程序逻辑审查、程序语法检查和程序结构 检查等内容。”。看了一系列的静态代码扫描或者叫静态代码分析工具后, 总结对工具的看法:静态代码扫描工具,和编译器的某些功能其实是很相似的, 他们也需要词法分析,语法分析,语意分析...但和编译器不一样的是他们可 以自定义各种各样的复杂的规则去对代码进行分析。 静态检测工具: 1.PMD 1)PMD是一个代码检查工具,它用于分析 Java 源代码,找出潜在的问题: 1)潜在的bug:空的try/catch/finally/switch语句 2)未使用的代码:未使用的局部变量、参数、私有方法等 3)可选的代码:String/StringBuffer的滥用

4)复杂的表达式:不必须的if语句、可以使用while循环完成的for循环 5)重复的代码:拷贝/粘贴代码意味着拷贝/粘贴bugs 2)PMD特点: 1)与其他分析工具不同的是,PMD通过静态分析获知代码错误。也就是说,在 不运行Java程序的情况下报告错误。 2)PMD附带了许多可以直接使用的规则,利用这些规则可以找出Java源程序的许 多问题 3)用户还可以自己定义规则,检查Java代码是否符合某些特定的编码规范。 3)同时,PMD已经与JDeveloper、Eclipse、jEdit、JBuilder、BlueJ、 CodeGuide、NetBeans、Sun JavaStudio Enterprise/Creator、 IntelliJ IDEA、TextPad、Maven、Ant、Gel、JCreator以及Emacs 集成在一起。 4)PMD规则是可以定制的: 可用的规则并不仅限于内置规则。您可以添加新规则: 可以通过编写 Java 代码并重新编译 PDM,或者更简单些,编写 XPath 表 达式,它会针对每个 Java 类的抽象语法树进行处理。 5)只使用PDM内置规则,PMD 也可以找到你代码中的一些真正问题。某些问题可能 很小,但有些问题则可能很大。PMD 不可能找到每个 bug,你仍然需要做单元测 试和接受测试,在查找已知 bug 时,即使是 PMD 也无法替代一个好的调试器。

2-Linux

Linux-2.6.32.2内核在mini2440上的移植(二)---yaffs2文件系统移植 移植环境(红色粗字体字为修改后内容,蓝色粗体字为特别注意内容) 2.1, yaffs2文件系统移植 【1】获取yaffs2 源代码 现在大部分开发板都可以支持yaffs2 文件系统,它是专门针对嵌入式设备,特别是使用nand flash 作为存储器的嵌入式设备而创建的一种文件系统,早先的yaffs 仅支持小页(512byte/page)的nand flash,现在的开发板大都配备了更大容量的nand flash,它们一般是大页模式的(2K/page),使用yaffs2 就可以支持大页的nand flash,下面是yaffs2 的移植详细步骤。 在https://www.doczj.com/doc/cd5328720.html,/node/346可以下载到最新的yaffs2 源代码,需要使用git工具( 安装方法见Git版本控制软件安装与使用),在命令行输入: [root@localhost ~]# cd ./linux-test [root@localhost linux-test]# git clone git://https://www.doczj.com/doc/cd5328720.html,/ya ffs2 Cloning into yaffs2... remote: Counting objects: 6592, done. remote: Compressing objects: 100% (3881/3881), done. remote: Total 6592 (delta 5237), reused 3396 (delta 2642) Receiving objects: 100% (6592/6592), 3.34 MiB | 166 KiB/s, d one. Resolving deltas: 100% (5237/5237), done.

Struts2的工作机制原理分析及实例

Struts2的工作机制分析及实例 一、概述 本章讲述Struts2的工作原理。 读者如果曾经学习过Struts1.x或者有过Struts1.x的开发经验,那么千万不要想当然地以为这一章可以跳过。实际上Struts1.x 与Struts2并无我们想象的血缘关系。虽然Struts2的开发小组极力保留Struts1.x的习惯,但因为Struts2的核心设计完全改变,从思想到设计到工作流程,都有了很大的不同。 Struts2是Struts社区和WebWork社区的共同成果,我们甚至可以说,Struts2是WebWork的升级版,他采用的正是WebWork 的核心,所以,Struts2并不是一个不成熟的产品,相反,构建在WebWork基础之上的Struts2是一个运行稳定、性能优异、设计成熟的WEB框架。 本章主要对Struts的源代码进行分析,因为Struts2与WebWork的关系如此密不可分,因此,读者需要下载xwork的源代码,访问https://www.doczj.com/doc/cd5328720.html,/xwork/download.action即可自行下载。 下载的Struts2源代码文件是一个名叫struts-2.1.0-src.zip的压缩包,里面的目录和文件非常多,读者可以定位到 struts-2.1.0-src\struts-2.0.10\src\core\src\main\java目录下查看Struts2的源文件,如图14所示。 (图14) 二、主要的包和类 Struts2框架的正常运行,除了占核心地位的xwork的支持以外,Struts2本身也提供了许多类,这些类被分门别类组织到不同的包中。从源代码中发现,基本上每一个Struts2类都访问了WebWork提供的功能,从而也可以看出Struts2与WebWork千丝万缕的联系。但无论如何,Struts2的核心功能比如将请求委托给哪个Action处理都是由xwork完成的,Struts2只是在WebWork 的基础上做了适当的简化、加强和封装,并少量保留Struts1.x中的习惯。

4种代码扫描工具分析

简介 本文首先介绍了静态代码分析的基本概念及主要技术,随后分别介绍了现有4 种主流Java 静态代码分析工具(Checkstyle,FindBugs,PMD,Jtest),最后从功能、特性等方面对它们进行分析和比较,希望能够帮助Java 软件开发人员了解静态代码分析工具,并选择合适的工具应用到软件开发中。 引言 在Java 软件开发过程中,开发团队往往要花费大量的时间和精力发现并修改代码缺陷。Java 静态代码分析(static code analysis)工具能够在代码构建过程中帮助开发人员快速、有效的定位代码缺陷并及时纠正这些问题,从而极大地提高软件可靠性并节省软件开发和测试成本。目前市场上的Java 静态代码分析工具种类繁多且各有千秋,因此本文将分别介绍现有4 种主流Java 静态代码分析工具(Checkstyle,FindBugs,PMD,Jtest),并从功能、特性等方面对它们进行分析和比较,希望能够帮助Java 软件开发人员了解静态代码分析工具,并选择合适的工具应用到软件开发中。

静态代码分析工具简介 什么是静态代码分析 静态代码分析是指无需运行被测代码,仅通过分析或检查源程序的语法、结构、过程、接口等来检查程序的正确性,找出代码隐藏的错误和缺陷,如参数不匹配,有歧义的嵌套语句,错误的递归,非法计算,可能出现的空指针引用等等。 在软件开发过程中,静态代码分析往往先于动态测试之前进行,同时也可以作为制定动态测试用例的参考。统计证明,在整个软件开发生命周期中,30% 至70% 的代码逻辑设计和编码缺陷是可以通过静态代码分析来发现和修复的。 但是,由于静态代码分析往往要求大量的时间消耗和相关知识的积累,因此对于软件开发团队来说,使用静态代码分析工具自动化执行代码检查和分析,能够极大地提高软件可靠性并节省软件开发和测试成本。 静态代码分析工具的优势 1. 帮助程序开发人员自动执行静态代码分析,快速定位代码隐藏错误和缺陷。 2. 帮助代码设计人员更专注于分析和解决代码设计缺陷。 3. 显著减少在代码逐行检查上花费的时间,提高软件可靠性并节省软件开发和测试成本。

Struts2考试题分析

题目1 以下不届丁 Struts2中result 的type 届性() ? A. action B. redirect 题目2 下歹0有关拦截器说法错误的是? 「A.struts 通过拦截器完成执行action 请求处理方法前一系歹U 操作。例如: 数据封装、文件上传、数据校验等 'B.在struts 中,直接访问jsp 页面,struts 将使用默认拦截器栈处理当前 请求。 厂C.在执行action 时,struts 将执行若干拦截器1、2、3,执行action 完成 后,将继续执行拦截器3、2、1 'D.默认情况,在一个action 没有配置拦截器的引用,说明当前action 将不 使用拦截器 题目3 以下哪些是Action 接口提供的返回值? W A A. success ,D B. none C. error 财 D.input 题目4 如果要实现struts2的数据检验功能 广A 普通的Action 类可以实现 C. redirectAction D. dispatcher

「B继承自Action接口的可以实现 面C继承自ActionSupport类可以实现 厂D继承自ActionValidate 类可以实现 题目5 struts2默认的处理结果类型是: ? A.dispatcher ' B.redirect 「C.chain D. forward 题目6 在值栈的上下文Context中,存在一些固定的key表示不同的对象,以下描述正确的是? A. request,表示request作用域的数据 'B.session,表示session 作用域的数据 阿 C.application ,表示application 作用域的数据 * D.parameters ,表示请求参数的所有数据 题目7 以下届丁struts2配置文件中的配置元素是:()多选) A. B. 厂 C. 厂 D.

相关主题
文本预览
相关文档 最新文档