??xml version="1.0" encoding="utf-8" standalone="yes"?> jar cf myJarFile.jar *.class 它会创徏了一个名为myJarFile.jar的JAR"卷宗"。这个卷宗会包括当前目录下的所有class文gQƈ且自动生成manifest文g?/p> jar cmf myJarFile.jar myManifestFile.mf *.* 把当前目录的所有文?/strong>都打包,增加个用戯定义的,名ؓmyManifestFile.mf的manifest文g?/p> jar tf myJarFile.jar q回myJarFile.jar所含文件的列表?/p> jar tvf myJarFile.jar ?verbose(详细)"标志Q给出更详细的,关于myJarFile.jar当中的文件的信息?/p> jar cvf myApp.jar audio classes image 假设audioQclassesQimage都是子目录。这个命令会把这些子目录全都收进myApp.jar?/p> 一个JAR"卷宗"只有一个文Ӟ"卷宗"包含两个文gQ一个是Zip文gQ另一个是描述Zip文g所包含的文件的"manifest(清单)"?/p> 用法Qjar CheckStyle是SourceForge下的一个项目,提供了一个帮?a target="_self">JAVA开发h员遵守某些编码规范的工具。它能够自动化代码规范检查过E,从而得开发h员从q项重要Q但是枯燥的d中解脱出来[1]?/p> 2.2. CheckStyle验的主要内容 CheckStyle默认提供一下主要检查内容: ·Javadoc注释 ·命名U定 ·标题 ·Import语句 ·体积大小 ·I白 ·修饰W?/p> ·?/p> ·代码问题 ·c设?/p> ·混合查(包活一些有用的比如非必ȝSystem.out和printstackTraceQ?/p> 从上面可以看出,CheckStyle提供了大部分功能都是对于代码规范的检查,而没有提供象PMD和Jalopy那么多的增强代码质量和修改代码的功能。但是,对于团队开发,其是强调代码规范的公司来说Q它的功能已l够强大?/p> 2.3. CheckStyle的主要运行方?/p> 目前QCheckStyle的版本是3.0Q与以前的版本不同,它的配置文g是基于XML而非Properties文g?/p> 它的3.0版本提供了两U运行的方式Q?/p> ·命o行工?/p> ·ANTd 同时QCheckStyle目前有很多针Ҏ行IDE的插Ӟ例如Eclipse、IntelliJ IDEA、JBuilder{。但是,大部分都是基?.4的版本,新版本的Ҏ不支持Q同旉|也较ؓ复杂?/p> 因ؓ一般情况下Q如果与开发过E与环境集成hQ编码规范的查会更加有效Q因此,作ؓANTd的运行方式用的更加普遍?/p> 在ANT的build.xml文g中添加CheckStyled的步骤如下: 1. checkstyle-all-3.1.jar拯到项目的LIB目录Q?/p> 2. 建立配置文gQ?/p> 3. 声明CheckStyledQ?/p> Qtaskdef resource="checkstyletask.properties" classpath="${lib}/checkstyle-all-3.1.jar"/Q?/p> 4. 建立CheckStyledQ?/p> Qtarget name="checkstyle"Q?br />Qcheckstyle cQ?br />Qfileset dir="${src}" includes=" **/*.java" /Q?br />Q?checkstyleQ?br />Q?targetQ?/p> 2.4. 定制CheckStyle CheckStyle的执行基于XML配置文gQ它的主要组成部分是Q?/p> ·ModuleQ整个配|文件就是一Module树。根节点是Checker Module?/p> ·PropertiesQ它来决定一个Module如何q行查。每个Module都有一个默认|如果不满_发需求,可以讑֮其它的倹{?/p> 下面是一个示例: Qmodule name="MethodLength"Q?br />Qproperty name="max" value="60"/Q?br />Q?moduleQ?/p> 它表C,如果Ҏ或者构造函数的长度过60行,CheckStyle׃报错。而默认值是150行?/p> 以下是一DCheckStyle对于Maven目源文件的查报告: Method 'createExpression' is not designed for extension - needs to be abstract, final or empty. 91 一般情况下Q与IDE集成在一起用的时候,点击出错的条目,可以跌{到相应的代码?br />本脓来自ZDNetChina中文Chttp://bbs.zdnet.com.cn,本脓地址Q?a >http://bbs.zdnet.com.cn/viewthread.php?tid=178617 3.1. Sun’s Code Conventions的修?/p> 在CheckStyle的最新发布版本中Q有一个对于Sun的Java~码规范的配|文件信息。但是,其中有很多条目ƈ不一定符合项目开发的需要。就是对于很多优秀的开源项目,按照q个规范来进行检查,也会出现成千上万的错误?/p> 下面提出的一些修Ҏ见,是从实际目执行q程中ȝ出来的,可以作ؓ大家的参考。我们以CheckStyle3.0配置文g的顺序来介绍Q?/p> 1. 去除对于每个包都有一个package.html文g的限Ӟ Q?--Qmodule name="PackageHtml"/Q?-Q?br /> 3. 修改对于体积大小的限Ӟ目前Q很多显C器都是17寸,而且打印斚w的限制也比以前有所改善Q同Ӟ׃代码中Factory{模式的q用Q以及有意义? Ҏ名称{约定,默认每行代码的长度(80Q是q远不能满要求Q对于方法长度等{,也应该根据项目情况自行决定: Qmodule name="FileLength"/Q?br />Qmodule name="LineLength"Q?br />Qproperty name="max" value="120"/Q?br />Q?moduleQ?br />Qmodule name="MethodLength"Q?br />Qproperty name="max" value="300"/Q?br />Q?moduleQ?br />Qmodule name="ParameterNumber"/Q?/p> 4. 修改对于Throws的的限制Q允许Throws Unchecked Exception以及Throws Subclass Of Another Declared Exception?/p> Qmodule name="RedundantThrows"Q?br />Qproperty name="allowUnchecked" value="true"/Q?br />Qproperty name="allowSubclasses" value="true"/Q?br />Q?moduleQ?/p> 5. 修改成员变量的可视性:一般情况下Q应该允许Protected Members以及Package Visible Members?/p> Qmodule name="VisibilityModifier"Q?br />Qproperty name="protectedAllowed" value="true"/Q?br />Qproperty name="packageAllowed" value="true"/Q?br />Q?moduleQ?/p> 3.2. CheckStyle应用的最佛_?/p> 采用CheckStyle以后Q编码规范的查就变得及其单,可以作ؓ一切实可行的实践加以执行?/p> 一般情况下Q在目组中引入CheckStyle可以按照下面的步骤进行: 1Q?Code Review与Code Conventions的重要作用; 2Q?介绍CheckStyleQ?/p> 3Q?初步应用CheckStyleQ参照CheckStyle附带的配|文Ӟ酌情加以剪裁Q在目的Ant配置文g中,dCheckStyledQ可以单独执行; 4Q?修改、定型CheckStyle的配|文Ӟ按照基本配置文g执行一D|_2?周)Q听取开发h员的反馈意见Q修攚w|信息; 5Q? 作ؓ开发过E的日常实践Q强制执行CheckStyleQ稳定CheckStyle的配|信息,同时CheckStyled作ؓBuild的依赖Q? 或者配|源码控制系l(目前QCheckStyle可以与CVS有效集成Q,使得代码在加入系l之前必通过查?/p> 同时需要指出的是,CheckStyle的有效执行需要依赖两个条Ӟ ·Ant的广泛应用:CheckStyleZAnt执行的方式比较容易,而且可以在项目内容Ş成一致的执行环境。同Ӟ也比较容易与其它dQ例如Build{发生关联?/p> ·IDE Format Code的强大功能:׃CheckStyle本nq没有提供很强大的Code Format{功能,因此Q需要借助IDE的帮助,从而得在发生错误的时候,可以很容易的q行修复。目前,L的Java IDE都提供了q方面的功能QIDEA在这斚w其H出。它提供的统一、可定义的Code Format TemplateQ项目小l内部可以用统一模板Q以及方便的快捷键功?Ctrl+Alt+TQFormat Code, Ctrl+Alt+OQOptimize Import{??/p> 四、结?/p> 利用CheckStyle可以方便的对于编码的Code Conventionsq行查,同时Q也有效地减了Code Review?a target="_self">工作Q得Reviw人员的精力更多的集中到逻辑和性能查?br /> Checkstyle的结果输?/p> 序号 输出内容意义 1 Type is missing a javadoc commentClass ~少cd说明 2“{” should be on the previous line “{” 应该位于前一?/p> 3Methos is missing a javadoc commentҎ前面~少javadoc注释 4Expected @throws tag for “Exception”在注释中希望有@throws的说?/p> 5“.” Is preceeded with whitespace “.” 前面不能有空?/p> 6“.” Is followed by whitespace“.” 后面不能有空?/p> 7“=” is not preceeded with whitespace“=” 前面~少I格 8“=” is not followed with whitespace“=” 后面~少I格 9“}” should be on the same line“}” 应该与下条语句位于同一?/p> 10Unused @param tag for “unused”没有参数“unused”Q不需注释 11Variable “CA” missing javadoc变量“CA”~少javadoc注释 12Line longer than 80characters行长度超q?0 13Line contains a tab character行含?#8221;tab” 字符 14Redundant “Public” modifier冗余?#8220;public” modifier 15Final modifier out of order with the JSL suggestionFinal modifier的顺序错?/p> 16Avoid using the “.*” form of importImport格式避免使用“.*” 17Redundant import from the same package从同一个包中Import内容 18Unused import-java.util.listImportq来的java.util.list没有被?/p> 19Duplicate import to line 13重复Import同一个内?/p> 20Import from illegal package从非法包?Import内容 21“while” construct must use “{}”“while” 语句~少“{}” 22Variable “sTest1” must be private and have accessor method变量“sTest1”应该是private的,q且有调用它的方?/p> 23Variable “ABC” must match pattern “^[a-z][a-zA-Z0-9]*$”变量“ABC”不符合命名规?#8220;^[a-z][a-zA-Z0-9]*$” 24“(” is followed by whitespace“(” 后面不能有空?25“)” is proceeded by whitespace“)” 前面不能有空?/p> 不太明白的错误解{?/p> 1. 'X' hides a field. public class Foo public Foo(int bar) public final int getBar() 解释Q全局private int bar;和局部public Foo(int bar)的bar变量名字重复?br />此错误,可以忽略不检查?/p> public Foo(int bar) public final int getBar() 解释Qpublic Foo(int bar)的局部变量,被认为是不可改变的,查需要加上final关键字定义public Foo(final int bar) 3. Redundant 'X' modifier. public interface CacheHRTreeService extends Manager { /** /** 解释Q多余的字段。public OrganizationDTO getOrganization() throws Exception;此时public为多余的字段Q因为interface定义的时候,是public的?/p> 需要检查?/p> 4. - Class X should be declared as final. 解释Q对于单例设计模式,要求q回唯一的类对象。但是HRFactory和ContextFactoryZ化的两个c,不需求检查?br />其他的单例类Q依焉要进行检查?/p> 解释Q工L不必提供默认的构造方法?br />需要检查,仅仅为提C?/p> 6. File does not end with a newline. 7. - Method 'addChildrenId' is not designed for extension - needs to be 解释Q通过父类l承的,此类有点Ҏ 8. Variable 'id' must be private and have accessor methods. 9. -Array brackets at illegal position. 可以是一对一、一对多、多对多的关pR在一般情况下Q它们是一对一的关p:即一张原始单据对应且?
对应一个实体。在Ҏ情况下,它们可能是一对多或多对一的关p,即一张原始单证对应多个实体,或多张原始单证对应一个实体。这里的实体可以理解为基本表?
明确q种对应关系后,Ҏ们设计录入界面大有好处?/p>
比如Q一份员工历资料,在h力资源信息系l中Q就对应三个基本表:员工基本情况表、社会关p表、工作简历表。这是“一张原始单证对应多个实?#8221;的典型例子?/p>
一般而言Q一个实体不能既无主键又无外键。在E—R 图中, 处于叶子部位的实?
可以定义主键Q也可以不定义主键(因ؓ它无子孙Q? 但必要有外键(因ؓ它有父亲Q?
主键与外键的设计Q在全局数据库的设计中,占有重要C。当全局数据库的设计完成以后Q有个美国数据库设计专家_“键,到处都是键,除了键之外,什么也
没有”Q这是他的数据库设计经验之谈,也反映了他对信息pȝ核心Q数据模型)的高度抽象思想。因为:主键是实体的高度抽象Q主键与外键的配对,表示实体
之间的连接?/p>
基本表与中间表、时表不同Q因为它h如下四个Ҏ: 理解基本表的性质后,在设计数据库Ӟp基本表与中间表、时表区分开来?/p>
基本表及其字D之间的关系, 应尽量满第三范式。但是,满W三范式的数据库设计Q往往不是最好的设计。ؓ了提高数据库的运行效率,常常需要降低范式标准:适当增加冗余Q达CI间换时间的目的?/p>
比如有一张存攑֕品的基本表,如表1所C?#8220;金额”q个字段的存在,表明该表的设计不满W三范式Q因?#8220;金额”可以?#8220;单h”乘以“数量”得到Q说?#8220;金额”是冗余字Dc但是,增加“金额”q个冗余字段Q可以提高查询统计的速度Q这是以空间换旉的作法?/p>
在Rose 2002中,规定列有两种cdQ数据列和计列?#8220;金额”q样的列被称?#8220;计算?#8221;Q?#8220;单h”?#8220;数量”q样的列被称?#8220;数据?#8221;?/p>
? 商品表的表结?/p>
通俗地理解三个范式,对于数据库设计大有好处。在数据库设计中Qؓ了更好地应用三个范式Q就必须通俗地理解三个范式(通俗地理解是够用的理解,q不是最U学最准确的理解)Q?/p>
没有冗余的数据库设计可以做到。但是,没有冗余的数据库未必是最好的数据库,有时Z提高q行效率Q就必须降低范式标准Q适当保留冗余数据。具体做法是Q在概念数据模型设计旉守第三范式,降低范式标准的工作放到物理数据模型设计时考虑。降低范式就是增加字D,允许冗余?/p>
若两个实体之间存在多对多的关p,则应消除q种关系。消除的办法是,在两者之间增加第三个实体。这
P原来一个多对多的关p,现在变ؓ两个一对多的关pR要原来两个实体的属性合理地分配C个实体中厅R这里的W三个实体,实质上是一个较复杂的关p,
它对应一张基本表。一般来Ԍ数据库设计工具不能识别多对多的关p,但能处理多对多的关系?/p>
比如?#8220;图书馆信息系l?#8221;中,“图书”是一个实体,“读?#8221;也是一个实体。这两个实体之间的关p,
是一个典型的多对多关p:一本图书在不同旉可以被多个读者借阅Q一个读者又可以借多本图书。ؓ此,要在二者之间增加第三个实体Q该实体取名?#8220;借还
?#8221;Q它的属性ؓQ借还旉、借还标志Q?表示借书Q?表示q书Q,另外Q它q应该有两个外键Q?#8220;图书”的主键,“读?#8221;的主键)Q它能?#8220;图书”?
“读?#8221;q接?/p>
PK是供E序员用的表间q接工具Q可以是一无物理意义的数字? q序自动加1来实现。也可以是有物理意义的字D名或字D名的组合。不q前者比后者好。当PK是字D名的组合时Q徏议字D늚个数不要太多Q多了不但烦引占用空间大Q而且速度也慢?/p>
主键与外键在多表中的重复出现Q不属于数据冗余Q这个概念必L楚,事实上有许多不清楚。非键字D늚重复出现Q才是数据冗余!而且是一U低U冗余,即重复性的冗余。高U冗余不是字D늚重复出现Q而是字段的派生出现?/p>
比如商品中的“单h、数量、金?#8221;三个字段Q?#8220;金额”是?#8220;单h”乘以“数量”z出来的,它就
是冗余,而且是一U高U冗余。冗余的目的是ؓ了提高处理速度。只有低U冗余才会增加数据的不一致性,因ؓ同一数据Q可能从不同旉、地炏V角色上多次?
入。因此,我们提倡高U冗余(z性冗余)Q反对低U冗余(重复性冗余)?/p>
信息pȝ的E-R图没有标准答案,因ؓ它的设计与画法不是惟一的,只要它覆盖了pȝ需求的业务范围
和功能内容,是可行的。反之要修改E-R图。尽它没有惟一的标准答案,q不意味着可以随意设计。好的E—R囄标准是:l构清晰、关联简z、实体个?
适中、属性分配合理、没有低U冗余?/p>
与基本表、代码表、中间表不同Q视图是一U虚表,它依赖数据源的实表而存在。视图是供程序员使用?
据库的一个窗口,是基表数据综合的一UŞ? 是数据处理的一U方法,是用h据保密的一U手Dcؓ了进行复杂处理、提高运速度和节省存储空?
视图的定义深度一般不得超q三层?若三层视图仍不够? 则应在视图上定义临时? 在时表上再定义视图。这样反复交q定?
视图的深度就不受限制了?/p>
对于某些与国家政沅R经、技术、军事和安全利益有关的信息系l,视图的作用更加重要。这些系l的
基本表完成物理设计之后,立即在基本表上徏立第一层视图,q层视图的个数和l构Q与基本表的个数和结构是完全相同。ƈ且规定,所有的E序员,一律只准在?
图上操作。只有数据库理员,带着多个人员共同掌握?#8220;安全钥匙”Q才能直接在基本表上操作。请读者想惻Iq是Z么? 中间表是存放l计数据的表Q它是ؓ数据仓库、输出报表或查询l果而设计的Q有时它没有主键与外键(数据仓库除外Q。时表是程序员个h设计的,存放临时记录Qؓ个h所用。基表和中间表由DBAl护Q时表q序员自己用程序自动维护?/p>
域的完整性:用Check来实现约束,在数据库设计工具中,对字D늚取D围进行定义时Q有一个Check按钮Q通过它定义字D늚值城?/p>
参照完整性:用PK、FK、表U触发器来实现?/p>
用户定义完整性:它是一些业务规则,用存储过E和触发器来实现?/p>
数据库设计的实用原则是:在数据冗余和处理速度之间扑ֈ合适的q炏V?#8220;三少”是一个整体概念,l?
合观点,不能孤立某一个原则。该原则是相对的Q不是绝对的?#8220;三多”原则肯定是错误的。试惻I若覆盖系l同L功能Q一百个实体Q共一千个属性)
的E-R图,肯定比二百个实体Q共二千个属性) 的E--R图,要好得多?/p>
提?#8220;三少”原则Q是叫读者学会利用数据库设计技术进行系l的数据集成。数据集成的步骤是将文gp?
l集成ؓ应用数据库,应用数据库集成Z题数据库Q将主题数据库集成ؓ全局l合数据库。集成的E度高Q数据共享性就强Q信息孤岛现象就少Q整个企
业信息系l的全局E—R图中实体的个数、主键的个数、属性的个数׃少?/p>
提?#8220;三少”原则的目的,是防止读者利用打补丁技术,不断地对数据库进行增删改Q企业数据库变成了随意设计数据库表?#8220;垃圾?#8221;Q或数据库表?#8220;大杂?#8221;Q最后造成数据库中的基本表、代码表、中间表、时表杂ؕ无章Q不计其敎ͼD企事业单位的信息pȝ无法l护而瘫痪?/p>
“三多”原则M人都可以做到Q该原则?#8220;打补丁方?#8221;设计数据库的歪理学说?#8220;三少”原则是少而精的原则,它要求有较高的数据库设计技巧与艺术Q不是Q何h都能做到的,因ؓ该原则是杜绝?#8220;打补丁方?#8221;设计数据库的理论依据?/p>
在给定的pȝg和系lY件条件下Q提高数据库pȝ的运行效率的办法是: MQ要提高数据库的q行效率Q必M数据库系l优化、数据库设计U优化、程序实现优化Q这三个层次上同时下功夫?/p>
上述十四个技巧,是许多h在大量的数据库分析与设计实践中,逐步ȝ出来的。对于这些经验的q用Q读者不能生帮硬套,死记背Q而要消化理解Q实事求是,灉|掌握。ƈ逐步做到Q在应用中发展,在发展中应用? 通过Debug发现QTomcat在经q和不经qApache代理的两U情况下Q得到的中文参数是不同的Q而后者是q?/p>
从网上查了一下资料,发现Apache在用AJP13模式代理到TomcatӞ也应该ؓTomcat的AJP13讑֮一些参数?/p>
具体说来Q应该在Tomcat的server.xml中设|ؓQ? x没用的启动项Q?/p>
Q?QWTP Q一个跟myeclipse差不多的东西Q主要差别是 WTP 是免费的Q如果用myeclipseQ这个可以取?/p>
Q?QMylynQ组队Q务管理工PcM?CVS Q以d为单位管理项目进度,没用到的可以取消 Q?QDerbyQ一U保存成 jar 形式的数据库Q我没用刎ͼ取消 Q?Q一大排?MyEclipse EASIE 打头的启动项Qmyeclipse 支持的服务器Q只选自q的,其他取消 2、取消MyEclipse在启动时自动验证目配置文g 如果需要验证的时候只需要选中文gQ然后右键选择 MyEclipse - Run Validation可以了?/p>
3、去掉拼写检查(如果你觉的有用可以不去) windows–>perferences–>general–>editors->Text Editors->spelling 4、关闭自动更?/strong> Q?Q关掉maven自动更新Q?/strong> window-preferences-MyEclipse Enterprise Workbench-Maven4MyEclipse-Maven, 关闭所有Download和Update开头的选项Q共四项Q去掉前面的勾) Q?Q关闭更新调度:window –> preferences –> General –> Startup and Shutdown –> Automatic Updates SchedulerQ去掉前面的勾) Q?Qwindow –> preferences –>Myeclipse Dashboard,关闭Show Myeclipse Dashboard on startup 5、加大JVM的非堆内?/strong> -Xmx384m -XX:MaxPermSize=384m -XX:ReservedCodeCacheSize=96m 可以修改-XmxQ?XX:MaxPermSizeQ?XX:ReservedCodeCacheSizeQ?/p>
这三项的D大,但ƈ不是大好Q曾l在相同的条件下做过试Q内?GBQ,-XmxQ?XX:MaxPermSize的gؓ384m时比512m时要快(视具体的计算定Q, -XmxQ?XX:MaxPermSize的D为同样大且两者之和不能超Z的计机本n的内存大?/p>
6、window-preferences-MyEclipse Enterprise Workbench-Maven4MyEclipse-MavenQ将Maven JDK改ؓ电脑上安装的JDKQ即不用myeclipse提供的JDK 7、window-preferences-MyEclipse Enterprise
Workbench-Matisse4Myeclipse/Swing,Design-time information(dt.jar)
location 改用电脑安装的JDK的dt.jar
/**
* 定义武器行ؓ接口
* @author User
*
*/
public interface WeaponBehavior {
public void userWeapon();//选择所使用的武?/span>
}
package strategy;
public class BowAndArrorBehavior implements WeaponBehavior {
/**
* 实现用弓射?br /> */
public void userWeapon() {
System.out.println("用弓射?/span>");
}
}
package strategy;
public class SwordBehavior implements WeaponBehavior {
/**
* 实现用宝剑攻击行?br /> */
public void userWeapon() {
System.out.println("用宝剑攻?!");
}
}
package strategy;
public class KnightBehavior implements WeaponBehavior {
/**
* 实现用匕首刺杀的行?br /> */
public void userWeapon() {
System.out.println("用匕首刺杀!!");
}
}
2Q定义角?br />package strategy;
/**
* 角色的抽象父c?nbsp;定义抽象fightҎ以及{略属?br /> * @author User
*
*/
public abstract class Character {
protected WeaponBehavior weapon;//{略调用 武器
public abstract void fight();
protected String name;
//委托l行为类
public void performFight(){
System.out.print(name+":");
weapon.userWeapon();
}
/**
* 改变所使用的武?br /> * @param weapon
*/
public void setWeapon(WeaponBehavior weapon) {
this.weapon = weapon;
}
}
package strategy;
public class King extends Character {
public King(){
this.weapon=new SwordBehavior();//用宝?/span>
this.name="King";
}
@Override
public void fight() {
System.out.println("King fight");
}
}
package strategy;
public class Queen extends Character {
public Queen(){
this.weapon=new KnightBehavior();
this.name="queen";
}
@Override
public void fight() {
System.out.println("queen fight");
}
}
3Q测试类
package strategy;
public class Test {
/**
* @param args
*/
public static void main(String[] args) {
//定义能够使用的武?/span>
SwordBehavior swordBehavior=new SwordBehavior();
KnightBehavior knightBehavior=new KnightBehavior();
BowAndArrorBehavior bowAndArrorBehavior=new BowAndArrorBehavior();
//定义角色
Character king=new King();
Character queen=new Queen();
//使用默认的武?/span>
System.out.println("**************使用默认武器****************");
king.performFight();
queen.performFight();
//切换武器
king.setWeapon(knightBehavior);
queen.setWeapon(swordBehavior);
System.out.println("**************更换武器?***************");
king.performFight();
queen.performFight();
}
}
4Q结?br />**************使用默认武器****************
King:用宝剑攻?/span>!!
queen:用匕首刺杀!!
**************更换武器?/span>****************
King:用匕首刺杀!!
queen:用宝剑攻?/span>!!
]]>
选项Q?br />
]]>
Unable to get class information for JellyException. 91
Line has trailing spaces. 93
Line has trailing spaces. 104
Method 'evaluate' is not designed for extension - needs to be abstract, final or empty. 113
Parameter context should be final. 113
Line has trailing spaces. 130
Method 'getExpressionText' is not designed for extension - needs to be abstract, final or empty. 131
Line has trailing spaces. 134
Line has trailing spaces. 135
Method 'toString' is not designed for extension - needs to be abstract, final or empty. 137
Method 'isSupportAntVariables' is not designed for extension - needs to be abstract, final or empty. 156
Method 'setSupportAntVariables' is not designed for extension - needs to be abstract, final or empty. 168
Parameter supportAntVariables should be final. 168
'supportAntVariables' hides a field. 168
Method 'isValidAntVariableName' is not designed for extension - needs to be abstract, final or empty. 183
Parameter text should be final. 183
三、CheckStyle的最佛_?/p>
2. 修改对于JavaDoc Comments的限定:对于很多使用Code Generator的项目来_需要将手写代码与生成代码?a target="_self">单元试代码的检查分开q行Q?/p>
{
private int bar;
{
this.bar = bar;
}
{
return bar;
}
}
2. Parameter X should be final.
public class Foo
{
private int bar;
{
this.bar = bar;
}
{
return bar;
}
}
此错误,可以忽略不检查?/p>
* Organization Tree
*
* @param orgDto
* @return
* @throws Exception
*/
public void setOrganization(OrganizationDTO orgDto) throws Exception;
* Organization Tree
*
* @return
* @throws Exception
*/
public OrganizationDTO getOrganization() throws Exception;
......
}
5. Utility classes should not have a public or default constructor.
解释Q虽然JAVAE序不要求结要用新行,但是习惯上应该要IZ行?br />需要检查,仅仅为提C?/p>
abstract, final or empty.
可以忽略此类?/p>
解释QBaseHRDTOc,为父c,属性给子类l承Q比较特D?br />但是其他的类Q声名需要加上范?private'关键?br />需要检查?/p>
解释Q代码写法,习惯不一栗?br />需要检查,仅仅提示?/p>
]]>
商品名称
商品型号
单h
数量
金额
电视?/td>
29?/td>
2,500
40
100,000
]]>
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Map.Entry;
public class hashmap {
public static void main(String[] args) {
HashMap<String, String> map = new HashMap<String, String>();
map.put("1", "aaa");
map.put("2", "bbb");
map.put("3", "ccc");
map.put("4", "ddd");
map.put("5", "eee");
map.put("6", "fff");
map.put("7", "ggg");
map.put("8", "hhh");
map.put("9", "iii");
/*
* 遍历hashmap
*/
hashmap1(map);
line();
/*
* 用keySet遍历
*/
hashmap2(map);
line();
/*
* 用entrySet遍历 速度?br />
*/
hashmap3(map);
line();
}
public static void hashmap1(HashMap<String, String> map) {
for (Map.Entry<String, String> entry : map.entrySet()) {
System.out.println("Key:" + entry.getKey() + " value:" + entry.getValue().toString());
}
}
public static void hashmap2(HashMap<String, String> map) {
Iterator<String> it=map.keySet().iterator();//q是取得键对?nbsp;
while(it.hasNext()) {
System.out.println("value: "+map.get(it.next())); //获得键所对应的倹{?nbsp;
}
}
public static void hashmap3(HashMap<String, String> map) {
Iterator<Entry<String, String>> it = map.entrySet().iterator();
while(it.hasNext()){
Entry<String, String> entry=(Entry<String, String>)it.next();
System.out.println("key:"+entry.getKey()+" value:"+entry.getValue());
}
}
public static void line(){
System.out.println("========================华丽的分割线===============================");
}
}
Hashmap实际上是一个数l和链表的结合体Q利用数l来模拟一个个ӞcM于Bucket SortQ以快速存取不同hashCode的keyQ对于相同hashCode的不同keyQ再调用其equalsҎ从List中提取出和key所相对应的value
]]>
先看一个例子,q个例子把Google首页的html抓取下来q显C在控制CQ?br />
view plaincopy to clipboardprint?
1. # 别惊Ӟ整个E序实只用了两行代?nbsp;
2. import urllib
3. print urllib.urlopen('http://www.google.com').read()
# 别惊Ӟ整个E序实只用了两行代?br />
import urllib
print urllib.urlopen('http://www.google.com').read()
urllib.urlopen(url[, data[, proxies]]) :
创徏一个表CEurl的类文g对象Q然后像本地文g一h作这个类文g对象来获取远E数据。参数url表示q程数据的\径,一般是|址Q参数data表示以post方式提交到url的数?玩过web的h应该知道提交数据的两U方式:post与get。如果你不清楚,也不必太在意Q一般情况下很少用到q个参数)Q参数proxies用于讄代理Q这里不详细讲怎么使用代理Q感兴趣的看客可以去阅Python手册urllib模块Q。urlopenq回 一个类文g对象Q他提供了如下方法:
* read() , readline() , readlines() , fileno() , close() Q这些方法的使用方式与文件对象完全一?
* info()Q返回一个httplib.HTTPMessage 对象Q表CE服务器q回的头信息Q?br />
* getcode()Q返回Http状态码。如果是httphQ?00表示h成功完成;404表示|址未找刎ͼ
* geturl()Q返回请求的urlQ?br />
下面来扩充一下上面的例子Q看官可以运行一下这个例子,加深对urllib的印象:
view plaincopy to clipboardprint?
1. google = urllib.urlopen('http://www.google.com')
2. print 'http header:\n', google.info()
3. print 'http status:', google.getcode()
4. print 'url:', google.geturl()
5. for line in google: # 像在操作本地文?nbsp;
6. print line,
7. google.close()
google = urllib.urlopen('http://www.google.com')
print 'http header:\n', google.info()
print 'http status:', google.getcode()
print 'url:', google.geturl()
for line in google: # 像在操作本地文?br />
print line,
google.close()
urllib.urlretrieve(url[, filename[, reporthook[, data]]])Q?br />
urlretrieveҎ直接远E数据下载到本地。参数filename指定了保存到本地的\径(如果未指定该参数Qurllib会生成一个时文件来保存数据Q;参数reporthook是一个回调函敎ͼ当连接上服务器、以及相应的数据块传输完毕的时候会触发该回调。我们可以利用这个回调函 数来昄当前的下载进度,下面的例子会展示。参数data指post到服务器的数据。该Ҏq回一个包含两个元素的元组(filename, headers)Qfilename表示保存到本地的路径Qheader表示服务器的响应头。下面通过例子来演CZ下这个方法的使用Q这个例子将新浪首页的html抓取到本圎ͼ保存在D:\sina.html文g中,同时昄下蝲的进度?br />
view plaincopy to clipboardprint?
1. def cbk(a, b, c):
2. '''''回调函数
3. @a: 已经下蝲的数据块
4. @b: 数据块的大小
5. @c: q程文g的大?nbsp;
6. '''
7. per = 100.0 * a * b / c
8. if per > 100:
9. per = 100
10. print '%.2f%%' % per
11.
12. url = 'http://www.sina.com.cn'
13. local = 'd:\\sina.html'
14. urllib.urlretrieve(url, local, cbk)
def cbk(a, b, c):
'''回调函数
@a: 已经下蝲的数据块
@b: 数据块的大小
@c: q程文g的大?br />
'''
per = 100.0 * a * b / c
if per > 100:
per = 100
print '%.2f%%' % per
url = 'http://www.sina.com.cn'
local = 'd:\\sina.html'
urllib.urlretrieve(url, local, cbk)
上面介绍的两个方法是urllib中最常用的方法,q些Ҏ在获取远E数据的时候,内部会用URLopener或?nbsp;FancyURLOpenercR作为urllib的用者,我们很少会用到这两个c,q里我不惛_讌Ӏ如果对urllib的实现感兴趣Q?nbsp;或者希望urllib支持更多的协议,可以研究q两个类。在Python手册中,urllib的作者还列出了这个模块的~陷和不I感兴的同学可以打开 Python手册了解一下?br />
urllib中还提供了一些辅助方法,用于对urlq行~码、解码。url中是不能出现一些特D的W号的,有些W号有特D的用途。我们知道以get方式提交数据的时候,会在url中添加key=valueq样的字W串Q所以在value中是不允许有'='Q因此要对其q行~码Q与此同时服务器接收到这些参数的时候,要进行解码,q原成原始的数据。这个时候,q些辅助Ҏ会很有用Q?br />
* urllib.quote(string[, safe])Q对字符串进行编码。参数safe指定了不需要编码的字符;
* urllib.unquote(string) Q对字符串进行解码;
* urllib.quote_plus(string [ , safe ] ) Q与urllib.quotecMQ但q个Ҏ?/span>'+'来替?/span>' 'Q而quote?/span>'%20'来代?/span>' '
* urllib.unquote_plus(string ) Q对字符串进行解码;
* urllib.urlencode(query[, doseq])Q将dict或者包含两个元素的元组列表转换成url参数。例?nbsp;字典{'name': 'dark-bull', 'age': 200}被转换?/span>"name=dark-bull&age=200"
* urllib.pathname2url(path)Q将本地路径转换成url路径Q?br />
* urllib.url2pathname(path)Q将url路径转换成本地\径;
用一个例子来体验一下这些方法吧~~Q?br />
view plaincopy to clipboardprint?
1. data = 'name = ~a+3'
2.
3. data1 = urllib.quote(data)
4. print data1 # result: name%20%3D%20%7Ea%2B3
5. print urllib.unquote(data1) # result: name = ~a+3
6.
7. data2 = urllib.quote_plus(data)
8. print data2 # result: name+%3D+%7Ea%2B3
9. print urllib.unquote_plus(data2) # result: name = ~a+3
10.
11. data3 = urllib.urlencode({ 'name': 'dark-bull', 'age': 200 })
12. print data3 # result: age=200&name=dark-bull
13.
14. data4 = urllib.pathname2url(r'd:\a\b\c\23.php')
15. print data4 # result: ///D|/a/b/c/23.php
16. print urllib.url2pathname(data4) # result: D:\a\b\c\23.php
data = 'name = ~a+3'
data1 = urllib.quote(data)
print data1 # result: name%20%3D%20%7Ea%2B3
print urllib.unquote(data1) # result: name = ~a+3
data2 = urllib.quote_plus(data)
print data2 # result: name+%3D+%7Ea%2B3
print urllib.unquote_plus(data2) # result: name = ~a+3
data3 = urllib.urlencode({ 'name': 'dark-bull', 'age': 200 })
print data3 # result: age=200&name=dark-bull
data4 = urllib.pathname2url(r'd:\a\b\c\23.php')
print data4 # result: ///D|/a/b/c/23.php
print urllib.url2pathname(data4) # result: D:\a\b\c\23.php
]]>
]]>
<!-- 防止中文q -->
useBodyEncodingForURI="true" URIEncoding="UTF8" />
<Connector port="8009" protocol="AJP/1.3" redirectPort="8443"
<!-- 防止中文q -->
useBodyEncodingForURI="true" URIEncoding="UTF8" />
]]>
Windows – Preferences - General - Startup and ShutdownQ这个时候在右侧显C出了Eclipse启动时加载的模块Q可以根据自q实际情况去除一些模块?/p>
默认情况下MyEclipse在启动的时候会自动验证每个目的配|文Ӟq是一个非常耗时的过E,可以在PreferencesH口依次选择
MyEclipse Enterprise Workbench - ValidationQ然后在右侧的Validator列表中只保留 Manual
就可以?Manual全部N,Bulid只留下W一??/p>
拼写查会l我们带来不的ȝQ我们的Ҏ命名都会是单词的~写Q他也会提示有错Q所以最好去掉,没有多大的用处:
如果是myeclipse7.5Q?/p>
打开 myeclipse.ini
登记add按钮Q选择你的电脑上的JDK卛_Q注意:不是JREQ?/strong>
Q即不用myeclipse提供的dt.jarQ?/strong>
]]>
iso8859-1 : SIMPLIFIED CHINESE_CHINA.we8iso8859p1
gbk: SIMPLIFIED CHINESE_CHINA.ZHS16GBK
]]>
代码如下Q?br />
2 public static int test() {
3 try {
4 return fun1();
5 } finally {
6 return fun2();
7 }
8 }
9 public static int fun1() {
10 System.out.println("fun1被执行了");
11 return 1;
12 }
13 public static int fun2() {
14 System.out.println("funQ被执行?/span>");
15 return 2;
16 }
17 public static void main(String[] args) {
18 System.out.println(new test002().test());
19 }
20 }
funQ被执行?br />
2
]]>
public int[] sort(int[] a){
//排序代码
return a;
}
}
Q?Q新Z个类ReflectionQReflection中不能有对Testcȝ引用Q,通过反射调用Testcȝsort()?
法,打印输出排序前和排序后的数组?br />
public class Reflection {
private static int[] a = {3,2,8,11,20,5,6,18,7,12};
//………………
}
public class test002 {
public int[] sort(int[] a) {
int b;
for (int i = 0; i < a.length - 1; i++) {
for (int j = i + 1; j < a.length; j++) {
if (a[i] > a[j]) {
b = a[i];
a[i] = a[j];
a[j] = b;// q个数不能变?br />
}
}
}
for (int i = 0; i < a.length; i++) {
System.out.println(a[i]);
}
return a;
}
}
public class test003 {
/**
* @param args
*/
public static test002 t(String t){
test002 test=null;
try {
test=(test002) Class.forName("cn.yu.test."+t).newInstance();
} catch (InstantiationException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IllegalAccessException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return test;
}
public static void main(String[] args) {
test002 t02=t("test002");
int[] t=new int[]{1,2,3,4,8,5};
System.out.println(t02.sort(t));
}
}
]]>
import org.dom4j.io.*;
import java.io.*;
import java.util.*;
public class test {
//写入
public void cXML(){
try {
Document document = DocumentHelper.createDocument();
Element friendsElement = document.addElement("scores");
Element friends1Element = friendsElement.addElement("JAVA");
Element friends2Element = friendsElement.addElement("C");
Element friends3Element = friendsElement.addElement("JS");
friends1Element.setText("85");
friends2Element.setText("80");
friends3Element.setText("90");
XMLWriter writer = new XMLWriter(new FileWriter(new File("c:/test.xml")));
writer.write(document);
writer.close();
System.out.println("创徏XML成功");
}catch (Exception err) {
err.printStackTrace();
}
}
//d
public void read(){
try{
File f = new File("c:/test.xml");
SAXReader reader = new SAXReader();
Document doc = reader.read(f);
Element root = doc.getRootElement();
System.out.println("已找到XML");
System.out.println("节点JAVA下的gؓQ?/span>"+root.elementText("JAVA"));
System.out.println("节点C下的gؓQ?/span>"+root.elementText("C"));
System.out.println("节点JS下的gؓQ?/span>"+root.elementText("JS"));
}
catch(Exception err){
err.printStackTrace();
}
}
public static void main(String[] args){
test a=new test();
a.cXML();//写入
a.read();//d
}
}
Q?Q用E序创徏一个xml文gc:/test.xml, 文g增加学生成W节点内容如下Q?br />
<scores>
<Java>85</Java>
<C++>80</C++>
<JS>90</JS>
</scores>
]]>
XSL 语法
M XSL 文档的第一行实际上都是 XML 声明Q?br /><?xml version="1.0" encoding="GB2312"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
......
</xsl:stylesheet>
<xsl:template match="/">......</xsl:template>
模板的作用是用来承蝲XML文档中的数据?像一个模P如果q个模具是方形的Q那么用q个模具做出来的模型也一定是方Ş的,而XML文档中的数据是用来真充模具的原料。实际上在模板中可以嵌套子模板,但最上层模板必须match设ؓ"/"?br /> happyold.xml<?xml version="1.0" encoding="GB2312"?>
<׃?gt;
<会员>
<姓名>cnbruce </姓名>
<q龄>10 </q龄>
<性别>?</性别>
<描述>他是一个糟p的家伙Q?lt;/描述>
</会员>
<会员>
<姓名>yufuzi</姓名>
<q龄>80 </q龄>
<性别>?</性别>
<描述>他是一个优U的男人!</描述>
</会员>
<会员>
<姓名>xiaojin</姓名>
<q龄>20 </q龄>
<性别>?</性别>
<描述>他h品有问题Q?lt;/描述>
</会员>
</׃?gt;
<xsl:for-each select="...">......</xsl:for-each>
与典型的 for 循环作用相同?br /> old.xsl<?xml version="1.0" encoding="GB2312"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:template match="/">
<table border="1">
<tr>
<th>姓名</th>
<th>q龄</th>
<th>性别</th>
<th>描述</th>
</tr>
<xsl:for-each select="׃?会员">
<tr>
<!--表达式ؓ何不需要包括父节点或从文档根开始。这是因些元素的路径是根?<xsl:for-each> 构造中?XPath 表达式来计算?->
<td><xsl:value-of select="姓名"/></td>
<td><xsl:value-of select="q龄"/></td>
<td><xsl:value-of select="性别"/></td>
<td><xsl:value-of select="描述"/></td>
</tr>
</xsl:for-each>
</table>
</xsl:template>
</xsl:stylesheet>
<?xml-stylesheet type="text/xsl" href="old.xsl"?>
然后在浏览器中预览一下显C结果?br /><?xml version="1.0" encoding="GB2312"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:template match="/">
<table border="1">
<tr>
<th>姓名</th>
<th>q龄</th>
<th>性别</th>
<th>描述</th>
</tr>
<xsl:for-each select="׃?会员[q龄>30]">
<tr>
<td><xsl:value-of select="姓名"/></td>
<td><xsl:value-of select="q龄"/></td>
<td><xsl:value-of select="性别"/></td>
<td><xsl:value-of select="描述"/></td>
</tr>
</xsl:for-each>
</table>
</xsl:template>
</xsl:stylesheet>
{于 (=)
不等?(!=)
于 (<)
于或等?(<=)
大于 (>)
大于或等?(>=)
<?xml version="1.0" encoding="GB2312"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:template match="/">
<table border="1">
<tr>
<th>姓名</th>
<th>q龄</th>
<th>性别</th>
<th>描述</th>
</tr>
<xsl:for-each select="׃?会员">
<xsl:sort select="q龄" order="descending"/>
<tr>
<td><xsl:value-of select="姓名"/></td>
<td><xsl:value-of select="q龄"/></td>
<td><xsl:value-of select="性别"/></td>
<td><xsl:value-of select="描述"/></td>
</tr>
</xsl:for-each>
</table>
</xsl:template>
</xsl:stylesheet>
<xsl:choose>
<xsl:when test="表达?>
</xsl:when>
<xsl:otherwise>
</xsl:otherwise>
</xsl:choose>
log4j.appender.A2=org.apache.log4j.ConsoleAppender
log4j.appender.A2.layout=org.apache.log4j.PatternLayout
log4j.appender.A2.layout.ConversionPattern=%d [%t] %-5p %c - %m%n
#for file
log4j.appender.ccfile.layout=org.apache.log4j.PatternLayout
log4j.appender.ccfile.layout.ConversionPattern=%d [%t] %-5p %c - %m%n
log4j.appender.ccfile=org.apache.log4j.RollingFileAppender
log4j.appender.ccfile.File=ccexample.log
log4j.appender.ccfile.MaxFileSize=10000KB
log4j.appender.DATABASE=org.apache.log4j.jdbc.JDBCAppender
#log4j.appender.DATABASE.BufferSize=10
log4j.appender.DATABASE.URL=jdbc:oracle:thin:@127.0.0.1:1521:orcl2
log4j.appender.DATABASE.driver=oracle.jdbc.driver.OracleDriver
log4j.appender.DATABASE.user=qp
log4j.appender.DATABASE.password=qp
log4j.appender.DATABASE.sql=INSERT INTO tbl_log VALUES ('%m')
log4j.appender.DATABASE.layout=org.apache.log4j.PatternLayout
#log4j.category.cn.javass.crm=error
#log4j.category.cn.javass.wf=debug