??xml version="1.0" encoding="utf-8" standalone="yes"?>亚洲国产欧美一区 ,在线播放毛片,日韩写真福利视频在线http://www.aygfsteel.com/wdlfellow/technical issues and my lifezh-cnSat, 17 May 2025 20:05:24 GMTSat, 17 May 2025 20:05:24 GMT60修复注册?修复msconfig, regedit http://www.aygfsteel.com/wdlfellow/archive/2007/05/12/116997.htmlcrazy zerlotcrazy zerlotSat, 12 May 2007 08:25:00 GMThttp://www.aygfsteel.com/wdlfellow/archive/2007/05/12/116997.htmlhttp://www.aygfsteel.com/wdlfellow/comments/116997.htmlhttp://www.aygfsteel.com/wdlfellow/archive/2007/05/12/116997.html#Feedback0http://www.aygfsteel.com/wdlfellow/comments/commentRss/116997.htmlhttp://www.aygfsteel.com/wdlfellow/services/trackbacks/116997.html

q行cmd regedit msconfig提示找不到文?/strong>

今天我同学的?sh)脑Q开始运?#8220;cmd regedit msconfig” q三个命令都不行 Q提C?找不到文?。可是文件明明在ѝ?/p>

直接q行system32目录下的cmd也不行,照样提示"找不到文?。把cmd改名为cmd1p够运?/p>

我的处理q程Q?/p>

开始我怀疑是中病毒了(jin)Q是病毒E序在监听哪个程序标题(sh)ؓ(f)“cmd”Q发现就l束?/p>

首先用卡巴扫?jin)一下启动项Q没发现病毒。又用冰刃查?jin)一下启动项Q进E,都没问题?/p>

想了(jin)想会(x)不会(x)中了(jin)rootkit U的马儿Q可用冰刃仔l看?jin)看内核Q没有显C红色的阿,刚才杀毒Y件也没报Q是的可能性就不怎么大了(jin)?/p>

那会(x)不会(x)是这个文仉病毒感染?jin),我最讨厌感染型的蠕虫病毒?jin)。我从我自己的电(sh)脑上把才cmd.exe拯q来?jin),用Y件比较了(jin)下(光看大小不行的)(j)Q一L(fng)?/p>

下蝲文gHash.zip (28.61 KB , 下蝲:6?

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

文g: C:WINDOWSsystem32cmd.exe
大小: 470528 字节
文g版本: 5.1.2600.2180 (xpsp_sp2_rtm.040803-2158)
修改旉: 2005q?2?5? 8:00:00
MD5: 722A247ACB86960A708528120759266D
SHA1: A859B7173FB0B1786BE07B01F779725EDF9043E7
CRC32: 15544920

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

后来l过询问前几天中q病毒,?x)不会(x)是上次病毒修改了(jin)注册表什么地方,虽然病毒是被杀?jin),但是修改的地方仍然没有改q来的呢。结果证明,q个判断是正的?/p>

具体处理Ҏ(gu)Q?/p>

 用冰刃的修改注册表,或者将windeows目录下的regedit.exe修改一下名字,比如叫regedit1.exeQ修Ҏ(gu)册表?/p>

HKEY_LOCAL_MACHINESOFTWAREMicrosoftWindows NTCurrentVersionImage File Execution Options  里面?/p>

cmd.exe
msconfig.exe
regedit.exe
regedit32.exe

删除可以了(jin)?/p>

典型?映像劫持?/p>

q只是处理病毒后遗症Q具体的处理病毒的方法没有写Q因为有很多病毒都会(x)造成q种状况Q具体病毒具体对待?/font>



crazy zerlot 2007-05-12 16:25 发表评论
]]>
创业故事-?/title><link>http://www.aygfsteel.com/wdlfellow/archive/2007/04/25/113512.html</link><dc:creator>crazy zerlot</dc:creator><author>crazy zerlot</author><pubDate>Wed, 25 Apr 2007 05:50:00 GMT</pubDate><guid>http://www.aygfsteel.com/wdlfellow/archive/2007/04/25/113512.html</guid><wfw:comment>http://www.aygfsteel.com/wdlfellow/comments/113512.html</wfw:comment><comments>http://www.aygfsteel.com/wdlfellow/archive/2007/04/25/113512.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.aygfsteel.com/wdlfellow/comments/commentRss/113512.html</wfw:commentRss><trackback:ping>http://www.aygfsteel.com/wdlfellow/services/trackbacks/113512.html</trackback:ping><description><![CDATA[--转自<br><br>做共享Y件是有利可图的,q是真的Q?999q?月以前我q(sh)信,可是l过一q多?<br>研究和实践下来,我已l每月能?万多金?jin),比某些大公司总裁q多。但是, <br>我敢_(d)80%以上的共享Y件作者ƈ不成功,实际上,他们q远没有赚到他们本来可以 <br>赚到的收入?<br><br>软g׃n发行销售(先试后买Q是一U市(jng)销手段Q和其他所有市(jng)销手段一P <br>是有学问的,要想通过软g׃n发行获得成功Q就必须掌握q些学问?<br><br>今天Q我来脓(chung)上第一技术文章,攉的办?<br>在几q以前,Internetq没有流行的时候,׃n软g的作者只能靠从邮件中收到用户的支和现金的方法来赚钱,而用户寄出支后,q要{上一周或更多的时间得到来自作者的注册码。注?当以下几U情况发生时QY件作者的生意做不成? <br>1Q用L(fng)支票本刚好用完,{他买回新支本Ӟ消费冲动已经没有?<br>2Q用L(fng)邮票刚好用完Q他q(sh)得不M邮局买邮,转念一惻IqY件我也不?<br>非买不可Q算?<br>3Q用h法忍受要{好多天才能拿到注册?<br>一句话Q太不方便了(jin) <br><br><br>现在好了(jin)Q有?jin)InternetQ有?jin)?sh)子商务,用户可以在最想买你的软g的一刚w_(d)q速的用他的信用卡在网上买下你的YӞq后(zhn)的旉都没有,׃n软g发胦(ch)的日子到来乐?<br>那么Q如何在|上收取信用卡呢Q?<br>如果你拥有一个公司,在美国银行有信用卡商号帐?又购C(jin)银行的GATEWAY软g,在自q|站上开发了(jin)信用卡收费系l当然很?但对于广大共享Y件作者来?q很不现?有简单的办法Q就是找一家信用卡收款代理公司Q让他们替你收款Q你只要每个月等他们l你寄一张总额的支?他们?x)提取一定比例的佣金)p? <br>q样的代理公司网站有Q?<br>WWW.QWERKS.COM   提成 15-20% Q服务极好,是我的服务商Q?<br>WWW.Shareit.COM <br>WWW.REGNOW.COM <br>WWW.REGSOFT.COM <br>WWW.Kagi.com <br><br>对于׃国内的共享Y件作者,q要做的一件事是M国银行开个户_(d)北京中行的活期一本通就很好?,如果你打让信用卡公司把q(sh)汇给?你还要知道银行的英文名字,地址,帐户? <br>帐号,转帐的SWIFT Code(可以从银行职员那里问? <br>C用卡代理公司的网站上开户非常简单,通常认它们的一个在U协议,填入一些个Z息和产品信息Q几分钟O(jin)K?<br>q里面有一个值得注意的地方,是Q当用户付(sh)(jin)Ƒ֐Q注册码怎么l的问题Q你可以选择׃来给Q每收到一份订单,他们?x)给你发一email,包含用户资料和emailQ,׃生成注册码emaill用P也可以把注册码生成代码给信用卡公司,让他们编C们的pȝ里去Q用h?jin)订单后自动发出注册码,也可以由你一ơ性生成几百个注册码给他们Q他们每收到一份订单时用掉一个注册码?<br>我个人的意见是,q几个信用卡服务商信誉都非常好,一ơ给他们几百个注册码是最单的办法Q对服务商来说操作简单,对用h说快Q交完钱马上得到注册码?<br><br>当你完成作者和产品在信用卡服务商那里的登记后,׃(x)得到一个URLq接Q你把这个连接加C的主上?标上一?#8220;Buy Now”Q用L(fng)q里可以用信用卡付?gu)ƾ?jin)Q当?dng)你也可以把这个连接做C的Y件界面里去,q样用户在试用你的Y件时Q随时想买都可以点击q个q接上网购买 <br><br>具体实例可以参考我的网站和软g <br>http://www.zy2000.com <br>MP3 CD Maker <br><br><br>对于一些Internet软gQ如断点l传的下载YӞq有另外一U赚钱方法,是对用户免费,而在软g界面上登一个bannerq告赚取q告贏V最有名的广告代理商?<br>www.radiate.com <br>他的q告付费是每CPM 2-5元Q也是_(d)如果一天里?0万个用户使用?jin)你的Y件一ơ的话,你就得到200-500元。这家公司声Uͼ著名的下载工兯Y件Gozilla!落户Radiate后,每月从Radiate那里赚到22万美?我们著名的NetAnt是不是该赶快行动?jin)?<br><br>我们也不反对用户用支和现金购买软gQ事实上Q信用卡服务商都提供支票和现金收ƾ业务,我们可以在网中提供信用卡服务商的地址和服务热U电(sh)话,具体例子可以参考我的网中 FAQ 一늚内容 <br> <img src ="http://www.aygfsteel.com/wdlfellow/aggbug/113512.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/wdlfellow/" target="_blank">crazy zerlot</a> 2007-04-25 13:50 <a href="http://www.aygfsteel.com/wdlfellow/archive/2007/04/25/113512.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>HQL查询语言基础http://www.aygfsteel.com/wdlfellow/archive/2007/04/25/113497.htmlcrazy zerlotcrazy zerlotWed, 25 Apr 2007 05:21:00 GMThttp://www.aygfsteel.com/wdlfellow/archive/2007/04/25/113497.htmlhttp://www.aygfsteel.com/wdlfellow/comments/113497.htmlhttp://www.aygfsteel.com/wdlfellow/archive/2007/04/25/113497.html#Feedback0http://www.aygfsteel.com/wdlfellow/comments/commentRss/113497.htmlhttp://www.aygfsteel.com/wdlfellow/services/trackbacks/113497.html

1 .from

1.1单表查询

from eg.cat as cat.其中Qcat只是一个别名,Z(jin)用其他子语句的时候书写简?br>
1.2多表查询

from eg.Cat,eg.Dog
from eg.Cat as cat,eg.Dog as dog
2 join相关
(inner) join
left (outer) join
right (outer) join
full join
HQL同样对SQL中的q些Ҏ(gu)支?br>下面插播一个小话题Q关于上边的那些Ҏ(gu),我一直都没怎么用,今天既然说到q里Q就?br>把上边的几个Ҏ(gu)的用法说一下,也算对自q一个补充:(x)
假设有两个表Q部门、员工,下面列D一些数据:(x)
员工(Employee)Q?br>ID Name DepNo
001 Jplateau 01
002 Jony 01
003 Camel 02
部门(Department)Q?br>ID Name
01 研发?br>02 营销?br>
在Hibernate中我们操U늚都是对象Q所以我们操U늚是部门类和员工类
1).(inner) join
select employee.ID as id1,employee.Name as name1,department.ID as id2,department.Name
as name2 from Employee as employee join Department as department on employee.DepNo=
department.ID (注意到条件语句我用on 没有用where)
那么执行l果是什么呢Q?br>id1 name1 id2 name2
++++++++++++++++++++++++++++++++++++++
001 Jplateau 01 研发?br>002 Jony 01 研发?br>
2).left (outer) join
select employee.ID as id1,employee.Name as name1,department.ID as id2,department.Name
as name2 from Employee as employee left join Department as department on employee.DepNo=
department.ID
那么执行l果又该是什么呢Q?br>id1 name1 id2 name2
++++++++++++++++++++++++++++++++++++++
001 Jplateau 01 研发?br>002 Jony 01 研发?
003 Camel null null
{是说此时我要已W一个表的记录多ؓ(f)准,W二个表中没有相应纪录的时候填充null}
3). right (outer) join
select employee.ID as id1,employee.Name as name1,department.ID as id2,department.Name
as name2 from Employee as employee right join Department as department on employee.DepNo=
department.ID
那么执行l果又该是什么呢Q?br>id1 name1 id2 name2
++++++++++++++++++++++++++++++++++++++
001 Jplateau 01 研发?br>002 Jony 01 研发?
null null 02 营销?
{是说此时我要已W二个表的记录多ؓ(f)准,W一个表中没有相应纪录的时候填充null}

3 大小写敏?br>
4。select语句
是要确定你要从查询中返回哪些对象或者哪些对象的属性。写几个例子吧:(x)
select employee form Employee as employee
select employee form Employee as employee where employee.Name like 'J%'
select employee.Name form Employee as employee where employee.Name like 'J%'
select employee.ID as id1,employee.Name as name1,department.ID as id2,department.Name
as name2 from Employee as employee right join Department as department on employee.DepNo=
department.ID

select elements(employee.Name) from Employee as employee
Q不明白elements到底是做什么用的?望给于说明)(j)
{等
5。数学函?br>JDO目前好像q(sh)支持此类Ҏ(gu)?br>avg(...), sum(...), min(...), max(...)

count(*)

count(...), count(distinct ...), count(all...)

其用法和SQL基本相同

select distinct employee.name from Employee as employee
select count(distinct employee.name),count(employee) from Employee as employee

6。polymorphism (暂时不知道如何解释?)
from com.test.Animal as animal
不光得到所有Animal得实例,而且可以得到所有Animal的子c(如果我们定义?jin)一个子cCatQ?br>一个比较极端的例子
from java.lang.Object as o
可以得到所有持久类的实?br>
7。where语句
定义查询语句的条Ӟ丑և个例子吧Q?br>from Employee as employee where employee.Name='Jplateau'
from Employee as employee where employee.Name like 'J%'
from Employee as employee where employee.Name like '%u'
在where语句?#8220;=”不光可以比较对象的属性,也可以比较对象,如:(x)
select animal from com.test.Animal as animal where animal.name=dog

8。表辑ּ

在SQL语句中大部分的表辑ּ在HQL中都可以使用Q?br>mathematical operators +, -, *, /

binary comparison operators =, >=, <=, <>, !=, like

logical operations and, or, not

string concatenation ||

SQL scalar functions like upper() and lower()

Parentheses ( ) indicate grouping

in, between, is null

JDBC IN parameters ?

named parameters :name, :start_date, :x1 Q这U应该是另一U??"的变通解x(chng)法)(j)

SQL literals 'foo', 69, '1970-01-01 10:00:01.0'

Java public static final constants eg.Color.TABBY

其他不必解释?jin),在这里我只想?gu)询中的参数问题说明一下:(x)
大家知道在SQL中进行传递参数进行查询的时候,我们通常用PreparedStatementQ在语句中写一大堆?#8220;Q?#8221;Q?br>在hql中也可以用这U方法,如:(x)
List mates = sess.find(
"select employee.name from Employee as employee " +
"where employee.Name=? ",
name,
Hibernate.STRING
);
(说明Q上面利用Session里的findҎ(gu)Q在hibernate的api Session中重载了(jin)很多findҎ(gu)Q它可以满你多UŞ式的查询)
上边是一个参数的情ŞQ这U情况下紧接着引入参数和定义参数的cdQ当为多个参敎ͼ调用另一个findҎ(gu)Q它的后两个
参数都是数组的Ş式?br>
q有另外一U方法来解决上边的问题,JDO也有q样的方法,不过和hibernate的表现Ş式上有差别,但他们两个骨子里却是
一L(fng)Q如Q?br>Query q = sess.createQuery("select employee.name from Employee as employee where employee.Name=:name");
q.setString("name", "Jplateau");
//当有多个参数的时候在此逐一定义
Iterator employees = q.iterate();

9。order 语句
和sql语句没什么差别,如:(x)
select employee.name from Employee as employee where employee.Name like 'J%' order by employee.ID desc (或者asc)

10。group by 语句
同样和sql语句没什么差别,如:(x)

select employee.name,employee.DepNo from Employee as employee group by employee.DepNo

select foo.id, avg( elements(foo.names) ), max( indices(foo.names) ) from eg.Foo foo group by foo.id
{Note: You may use the elements and indices constructs inside a select clause, even on databases with no subselects.}
谁帮我解释一下上边两句,谢过Q?br>
11。子查询
hibernate同样支持子查询,写几个例子:(x)

from eg.Cat as fatcat where fatcat.weight > ( select avg(cat.weight) from eg.DomesticCat cat )



crazy zerlot 2007-04-25 13:21 发表评论
]]>
23U设计模式及(qing)其对应实??/title><link>http://www.aygfsteel.com/wdlfellow/archive/2007/04/17/111320.html</link><dc:creator>crazy zerlot</dc:creator><author>crazy zerlot</author><pubDate>Tue, 17 Apr 2007 07:15:00 GMT</pubDate><guid>http://www.aygfsteel.com/wdlfellow/archive/2007/04/17/111320.html</guid><wfw:comment>http://www.aygfsteel.com/wdlfellow/comments/111320.html</wfw:comment><comments>http://www.aygfsteel.com/wdlfellow/archive/2007/04/17/111320.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.aygfsteel.com/wdlfellow/comments/commentRss/111320.html</wfw:commentRss><trackback:ping>http://www.aygfsteel.com/wdlfellow/services/trackbacks/111320.html</trackback:ping><description><![CDATA[<p>Q{?/p> <p>下面是作者对设计模式的理解ƈ自以为所对应的实?br>一 Q?单例模式(Singleton)<br> <br>账本c:(x)1 单一实例 2 l多个对象共?3 自己创徏。网计数器 <br>   <br>二:(x){略模式(Strategy)  <br> <br>使用QQ泡MM时用外?nbsp; 客户?QME 抽象c:(x) 外挂 具体Q策略(囄Q笑话,名h名言Q?br>图书销售算法(不同书本折扣的算法)(j)<br> <br>三:(x)原型模式(Prototype)<br> <br>复印技术:(x) 1 不是同一个对?2 属同c?<br>短消息(转发Q?1-n个MM<br> <br>四:(x)门面模式(Façade)<br> <br>Facade典型应用是数据库JDBC的应用和Session的应?br>ME---àMM---à(father,mum,sister,brother)<br> <br>五:(x)备忘录模?Memento)<br> <br>备䆾pȝ时?<br>GHOST</p> <p>?Q?命o(h)模式QCommandQ?br> <br>MMQ客L(fng)Q?-àMEQ请求者)(j)--à命o(h)角色--àQ具体命令)(j)-à代理处(接收者)(j)--àMM<br>上网 IE 输入 http地址 发送命?br> <br>七:(x) 解释?Interpreter)<br> <br>~译原理之编译器<br>文言文注释:(x)一D|a文,它译成白话文<br>八:(x)调停者模?Mediator)<br> <br>法院和原告,被告的关p?br>?ji)?x)责Q链模?CHAIN OF RESPONSIBLEITY)<br> <br>喝酒旉过成语接龙军_谁喝?马到成功Q功不可没-没完没了(jin))<br>十:(x)工厂模式QF(tun)actoryQ?br> <br>水果园—〉(葡萄园,Ҏ(gu)园)(j)--〉(葡萄Q苹果)(j)Q各自生产)(j)<br>十一Q抽象工厂模式(Abstract FactoryQ?br> <br>奛_造h---〉(_(d)阻I(j)--〉(人,兽)(j)----〉(男hQ女人,公兽Q母兽)(j)(人和兽属于不同的产品c?<br> <br>十二Q徏造模式(BuilderQ?br> <br>汽R刉?br> <br>十三Q合成模式(CompositeQ?br> <br>windows的目录树(wi)Q文件系l)(j)<br> <br>十四Q装饰模式(DECORATORQ?br> <br>在visio中文件可以用背景进行装?br>变废为宝<br>十五Q设计模式之Adapter(适配?<br> <br>充电(sh)器(手机?20V?sh)压Q?br>jdbc-odbc?br>十六Q桥梁模式(BridgeQ?br> <br>jdbc驱动E序<br> <br>十七Q代理模式(ProxyQ?br> <br>用代理服务器q接出网<br>销售代理(厂商Q律师代理(客户Q?br>foxmail<br>枪手<br> <br>十八Qn元模式(F(tun)lyweightQ?br> <br>字体?6个字母和各自的斜体等<br> <br>十九(ji)Q状态模式(StateQ?br> <br>人心(j)情不同时表现不同有不同的行ؓ(f)<br>~钟<br>dlogin logout<br> <br>二十Q观察者模式(ObserverQ?br> <br>公司邮gpȝ<a href="mailto:everyone@sina.com">everyone@sina.com</a>的应用。当公司员工向这个邮发邮g时会(x)发给公司的每一个员工。如果设|了(jin)Outlook则会(x)?qing)时收到通知?br>接收到短消息<br> <br>二十一Q模板方法模式(TemplateQ?br> <br>使用|页设计时用的模板架构|页Q骨Ӟ(j) 法的各个逻辑pȝ<br> <br>二十二:(x)讉K者模式(VisitorQ?br> <br>?sh)脑销售系l:(x) 讉K者(自己Q?--〉电(sh)脑配|系l(LQCPUQ内存。。。。。。)(j)<br> <br>二十三:(x)q代子模式(IteratorQ?br> <br>查询数据库,q回l果集(mapQ?listQ?setQ?br> <br>下面的参考文献是MW记的全部参考文献。这里不一定用到的?br>参考文献:(x)<br><a >http://blog.csdn.net/airhand/</a><br><a >http://blog.csdn.net/bloom121/</a><br><a >http://blog.csdn.net/laurecn/</a><br><a >http://blog.csdn.net/legendinfo/</a><br><a >http://www-128.ibm.com/developerworks/cn/java/l-struts1-1/</a><br>《Design Patterns?br>《Java与模式?br>《设计模式:(x)可复用面向对象Y件的基础?/p> <p> </p> <p>Trackback: <a >http://tb.blog.csdn.net/TrackBack.aspx?PostId=1227902</a></p> <img src ="http://www.aygfsteel.com/wdlfellow/aggbug/111320.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/wdlfellow/" target="_blank">crazy zerlot</a> 2007-04-17 15:15 <a href="http://www.aygfsteel.com/wdlfellow/archive/2007/04/17/111320.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>JavaScript 技?/title><link>http://www.aygfsteel.com/wdlfellow/archive/2007/04/16/111015.html</link><dc:creator>crazy zerlot</dc:creator><author>crazy zerlot</author><pubDate>Mon, 16 Apr 2007 08:46:00 GMT</pubDate><guid>http://www.aygfsteel.com/wdlfellow/archive/2007/04/16/111015.html</guid><wfw:comment>http://www.aygfsteel.com/wdlfellow/comments/111015.html</wfw:comment><comments>http://www.aygfsteel.com/wdlfellow/archive/2007/04/16/111015.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.aygfsteel.com/wdlfellow/comments/commentRss/111015.html</wfw:commentRss><trackback:ping>http://www.aygfsteel.com/wdlfellow/services/trackbacks/111015.html</trackback:ping><description><![CDATA[     摘要: 事g源对?event.srcElement.tagName event.srcElement.type 捕获释放 event.srcElement.setCapture();  event.srcElement.releaseCapture();  事g按键 event.keyCode event.shiftKey event.altKey event....  <a href='http://www.aygfsteel.com/wdlfellow/archive/2007/04/16/111015.html'>阅读全文</a><img src ="http://www.aygfsteel.com/wdlfellow/aggbug/111015.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/wdlfellow/" target="_blank">crazy zerlot</a> 2007-04-16 16:46 <a href="http://www.aygfsteel.com/wdlfellow/archive/2007/04/16/111015.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Jive 源码研究与设计模式-?/title><link>http://www.aygfsteel.com/wdlfellow/archive/2007/04/14/110625.html</link><dc:creator>crazy zerlot</dc:creator><author>crazy zerlot</author><pubDate>Sat, 14 Apr 2007 04:46:00 GMT</pubDate><guid>http://www.aygfsteel.com/wdlfellow/archive/2007/04/14/110625.html</guid><wfw:comment>http://www.aygfsteel.com/wdlfellow/comments/110625.html</wfw:comment><comments>http://www.aygfsteel.com/wdlfellow/archive/2007/04/14/110625.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.aygfsteel.com/wdlfellow/comments/commentRss/110625.html</wfw:commentRss><trackback:ping>http://www.aygfsteel.com/wdlfellow/services/trackbacks/110625.html</trackback:ping><description><![CDATA[转自 IBM 刘武东,谢谢作者的辛勤力_Q?br><br> <p><a name=1><span id="wmqeeuq" class=atitle>前言</span></a></p> <p>Jive是一个开攄Java源代码项目。其目标是徏设一个开攄构的Q强壮的Q易于扩展的ZJSP的论坛。在其设计目标的指导下,其结构设计得非常得好Q融合了(jin)很多新的观念Q比如Design PatternQ可更换的SkinQ可插入Plug{等。详l解d源代码对于理解这些新的设计上的概忉|很有裨益的。如果你对Design Pattern和Java语言有一定的?jin)解Q但是还是会(x)时常qh于其中的话,不妨研究研究Jive源代码,一定会(x)对其中的很多概念有更深入的理解。这文章源于我的Jive源代码研I笔讎ͼ希望能够提纲挈领Q带领大家进入到q个好的世界。当?dng)如果没有旉仔细地看源代码的话,看看q篇文章Q我想也是会(x)有一些帮助的?/p> <p>再开始之前,需要指出的是,Jive中对Design Pattern的应用,q没有拘CgGOF书中所l出的实现方法,而是有许多变通的地方。一斚wQ我x(chng)׃具体的实际需要,另一斚wQ我惌也是设计观念q化的结果吧。因而,q些变通的地方Q将是我讲解的重炏V?/p> <br> <p><a name=2><span id="wmqeeuq" class=atitle>整体l构概叙</span></a></p> <p>Z一个OO的设计原则:(x)面向接口~程Q而不是针对实现编E。Jive在设计的时候,把其大部分的基本对象都设计ؓ(f)接口或者抽象类。在Jive中,基本的接口有ForumQForumMessageQForumThreadQGroupQUserQAuthorization和Query。我们可以很Ҏ(gu)的从q些接口的名字来知道他们的功用,下面的类囄Z(jin)q些cM间的一些静(rn)态关p:(x)</p> <br><br><a name=N1004F><strong>?QJive整体关系</strong></a><br><img height=300 alt=?QJive整体关系 src="http://www.ibm.com/developerworks/cn/java/l-jivesrc/fig1.gif" width=415> <br> <p>你可能会(x)有疑问,Z么会(x)都是接口呢?q是Z扩展性考虑的。在Jivel出的实CQ所有的q些接口QForumQForumMessageQUser{等Q都使用数据库来实现的,一条消息,或者一个用户对应于数据库中的一条消息Jive使用?jin)DbForumQDbForumMessageQDbUser{类来实现这些接口,通过JDBC来操作数据库Q之作坛的底层支撑?/p> <p>然而,有时候,或许我们q不想用数据库Q比如我们想只是使用文gpȝ来作坛的底层支撑Q这时候,我们需要做的只是编码实C(jin)Forum{等接口的诸如FileFroumQFileForumMessage{对象,然后嵌入Jive中即可,原有的Q何代码都可以不用改变Q!Q这是面向接口~程的威力了(jin)Q?/p> <p>下面来看看具体的设计和编码?br><br></p> <p><a name=3><span id="wmqeeuq" class=atitle>AbstractFactory模式和可扩展?/span></a></p> <p>如果要实现较好的可扩展性,AbstractFactory模式实是一件利器。如上面所_(d)如果要创建的Forum接口的不同实玎ͼ而又不想更改代码的话Q就需要用到抽象工厂了(jin)。再Jive中,AuthorizationFactorycL一个抽象类Q用来创建Authorization对象。这是一个抽象工厂,可以通过不同的子cL创徏不同的Authorization对象。这个工厂的实现Ҏ(gu)是:(x)</p> <p>在AuthorizationFactory中用一个private static变量factoryQ用来引用具体的抽象工厂的实例:(x) <br><code>private static AuthorizationFactory factory = null;</code> </p> <p>用一个private static的StringQ来指明具体的抽象工厂的子类cdQ?<br><code>private static String className ="com.coolservlets.forum.database.DbAuthorizationFactory";</code> </p> <p>然后是用一个private static的loadAuthorizationFactoryҎ(gu)来给q个factory变量赋|生成具体的抽象工厂类Q?br></p> <table cellSpacing=0 cellPadding=0 width="100%" border=0> <tbody> <tr> <td class=code-outline> <pre class=displaycode> private static void loadAuthorizationFactory() { if (factory == null) { synchronized(className) { if (factory == null) { String classNameProp = PropertyManager.getProperty( "AuthorizationFactory.className" ); if (classNameProp != null) { className = classNameProp; } try { Class c = Class.forName(className); factory = (AuthorizationFactory)c.newInstance(); } catch (Exception e) { System.err.println("Exception loading class: " + e); e.printStackTrace(); } } } } }</pre> </td> </tr> </tbody> </table> <br> <p>在static的getAuthorizationҎ(gu)q回一个Authorization的过E中Q先初始化工厂类factory变量Q然后用factory的createAuthorizationҎ(gu)来创建:(x)</p> <table cellSpacing=0 cellPadding=0 width="100%" border=0> <tbody> <tr> <td class=code-outline> <pre class=displaycode> public static Authorization getAuthorization(String username, String password) throws UnauthorizedException { loadAuthorizationFactory(); return factory.createAuthorization(username, password); }</pre> </td> </tr> </tbody> </table> <br> <p>不同的子cL不同的createAuthorizationҎ(gu)的实现。比如在DbAuthorizationFactoryq个AuthorizationFactory的数据库实现子类中,createAuthorizationҎ(gu)是这样实现的Q?/p> <table cellSpacing=0 cellPadding=0 width="100%" border=0> <tbody> <tr> <td class=code-outline> <pre class=displaycode> public Authorization createAuthorization(String username, String password) throws UnauthorizedException { if (username == null || password == null) { throw new UnauthorizedException(); } password = StringUtils.hash(password); int userID = 0; Connection con = null; PreparedStatement pstmt = null; try { con = DbConnectionManager.getConnection(); pstmt = con.prepareStatement(AUTHORIZE); pstmt.setString(1, username); pstmt.setString(2, password); ResultSet rs = pstmt.executeQuery(); if (!rs.next()) { throw new UnauthorizedException(); } userID = rs.getInt(1); } catch( SQLException sqle ) { System.err.println("Exception in DbAuthorizationFactory:" + sqle); sqle.printStackTrace(); throw new UnauthorizedException(); } finally { try { pstmt.close(); } catch (Exception e) { e.printStackTrace(); } try { con.close(); } catch (Exception e) { e.printStackTrace(); } } return new DbAuthorization(userID); }</pre> </td> </tr> </tbody> </table> <br> <p>在这个类中,可以看到抽象cd具体的子cM间的关系Q它们是如何协作的,又是如何划分抽象Ҏ(gu)和非抽象Ҏ(gu)的,q都是值得注意的地斏V一般的Q抽象方法需要子cL实现Q而抽象类中的非抽象方法应该所有子cL能够׃n的,或者可是说Q是定义在抽象方法之上的较高层的Ҏ(gu)。这实是一个抽象工厂的好例子!虽然实现的方法已l和GOF中给出的实现相差较远?jin),但思想没变Q这儿的实现Q也实是要巧妙的些?/p> <p>q有是?rn)态方法的使用Q得这个类看v来有些Singleton的意呟뀂这使得对于AbstractFactory的创建变得简单?/p> <p>下面的类囄Z(jin)q个AbstractFactory的实现的M情况Q?/p> <br><br><a name=N100A0><strong>?QAbstractFactory模式的实现类?/strong></a><br><img height=256 alt=?QAbstractFactory模式的实现类?src="http://www.ibm.com/developerworks/cn/java/l-jivesrc/fig2.gif" width=570> <br> <p>在AuthorizationFactory中定义的其它Ҏ(gu)Q涉?qing)到具体的如何创建AuthorizationQ都是作为abstractҎ(gu)出现Q具体实现留l子cL完成?/p> <p>q样Q在需要生成一个Authorization的时候,只需要调用AuthorizationFactory的静(rn)态方法getAuthorization可以了(jin)Q由子类实现?jin)具体的l节?/p> <p>其它的,如同上面讲到的,在创建Forum的时候用的ForumFactoryQ具有同上面一L(fng)实现Q这是模式之所以称为模式的所在了(jin)?/p> <br> <table cellSpacing=0 cellPadding=0 width="100%" border=0> <tbody> <tr> <td><img height=1 alt="" src="http://www.ibm.com/i/v14/rules/blue_rule.gif" width="100%"><br><img height=6 alt="" src="http://www.ibm.com/i/c.gif" width=8 border=0></td> </tr> </tbody> </table> <table class=no-print cellSpacing=0 cellPadding=0 align=right> <tbody> <tr align=right> <td><img height=4 alt="" src="http://www.ibm.com/i/c.gif" width="100%"><br> <table cellSpacing=0 cellPadding=0 border=0> <tbody> <tr> <td vAlign=center><img height=16 alt="" src="http://www.ibm.com/i/v14/icons/u_bold.gif" width=16 border=0><br></td> <td vAlign=top align=right><a class=fbox ><strong><font color=#996699>回页?/font></strong></a></td> </tr> </tbody> </table> </td> </tr> </tbody> </table> <br><br> <p><a name=4><span id="wmqeeuq" class=atitle>Proxy模式和权限控?/span></a></p> <p>Proxy模式的功能有很多Q比如远E代理,用来l远E对象提供一个本C表;虚代理,用来为创建开大开销的对象提供缓Ԍ{等。在Jive中用的是保护代理,保护的对象提供权限控制?/p> <p>我们都知道在一个论坛中Q权限的控制是必ȝQ否则论坛就很可能会(x)被搞得一团糟。Jive中引入Proxy对象QAuthorization接口以及(qing)权限描叙属类来提供对论坛的保护?/p> <p>以ForumFactoryZQ一个额外的ForumFactoryProxy来处理权限认证的工作Q它为某一个ForumFactory提供?jin)一个代理,保证只有授权的用h能够存取ForumFactory的某些操作。实际上ForumFactory在这儿不仅仅只是一个生成Forum的类的,它更像是一个Forum的管理类。提供了(jin)dQ删除,枚D{等一pd的功能,而有些功能不是什么样的h都可以用的Q因而引入了(jin)另外的一个代理类来处理权限的问题?/p> <p>当然Q代理类需要(h)承ForumFactoryQ以使方法签名一_(d)(x) <code>ForumFactoryProxy extends ForumFactory</code> </p> <p>在它的构造方法中Q就提供?jin)一个ForumFactory对象Q这是需要被代理的对象;一个Authorization对象Q提供用户信息;q有一个ForumPermissionsQ提供认证信息:(x)</p> <table cellSpacing=0 cellPadding=0 width="100%" border=0> <tbody> <tr> <td class=code-outline> <pre class=displaycode> public ForumFactoryProxy(ForumFactory factory, Authorization authorization, ForumPermissions permissions) { this.factory = factory; this.authorization = authorization; this.permissions = permissions; }</pre> </td> </tr> </tbody> </table> <br> <p>一般的代理q程都是q样的,在访问某个方法之前,必须接受权限的检查,以createForumZQ?/p> <table cellSpacing=0 cellPadding=0 width="100%" border=0> <tbody> <tr> <td class=code-outline> <pre class=displaycode> public Forum createForum(String name, String description) throws UnauthorizedException, ForumAlreadyExistsException { if (permissions.get(ForumPermissions.SYSTEM_ADMIN)) { Forum newForum = factory.createForum(name, description); return new ForumProxy(newForum, authorization, permissions); } else { throw new UnauthorizedException(); } }</pre> </td> </tr> </tbody> </table> <br> <p>下面l出q个模式的类图:(x)</p> <br><br><a name=N100DF><strong>?QProxy模式的类?/strong></a><br><img height=199 alt=?QProxy模式的类?src="http://www.ibm.com/developerworks/cn/java/l-jivesrc/fig3.gif" width=421> <br> <p>q个模式的实现基本上和GOF中所l出的实C致。在Jive中,几乎所有的接口QForumQForumMessageQForumThread{等Q都?x)有一个相应的Proxy对象来进行权限控制。而在创徏具体的对象的时候,都是用相应的Proxy对象来代替原有的对象q回的。例如在ForumFactory的getInstance()Ҏ(gu)中需要返回一个Forum的时候,Jive是这样做的:(x)</p> <table cellSpacing=0 cellPadding=0 width="100%" border=0> <tbody> <tr> <td class=code-outline> <pre class=displaycode>public static ForumFactory getInstance(Authorization authorization) { ...... ForumFactoryProxy proxy = new ForumFactoryProxy(factory,authorization, factory.getPermissions(authorization)); return proxy; }</pre> </td> </tr> </tbody> </table> <br> <p>因而,所有被创徏的对象实际上都是Proxy对象Q抽象工厂保证了(jin)没有权限验证的对象根本不?x)客h得到Q它们只?x)在Proxy的内部扮演角Ԍ而永q不?x)被外部对象所存取Q这P׃Ҏ(gu)上保证了(jin)论坛的安全?/p> <br> <table cellSpacing=0 cellPadding=0 width="100%" border=0> <tbody> <tr> <td><img height=1 alt="" src="http://www.ibm.com/i/v14/rules/blue_rule.gif" width="100%"><br><img height=6 alt="" src="http://www.ibm.com/i/c.gif" width=8 border=0></td> </tr> </tbody> </table> <table class=no-print cellSpacing=0 cellPadding=0 align=right> <tbody> <tr align=right> <td><img height=4 alt="" src="http://www.ibm.com/i/c.gif" width="100%"><br> <table cellSpacing=0 cellPadding=0 border=0> <tbody> <tr> <td vAlign=center><img height=16 alt="" src="http://www.ibm.com/i/v14/icons/u_bold.gif" width=16 border=0><br></td> <td vAlign=top align=right><a class=fbox ><strong><font color=#996699>回页?/font></strong></a></td> </tr> </tbody> </table> </td> </tr> </tbody> </table> <br><br> <p><a name=5><span id="wmqeeuq" class=atitle>Decorator模式和过滤器</span></a></p> <p>一般的在OO设计中,而外功能的添加是通过l承来实现的Q但是(h)承有的时候不够灵z,而且当功能的l合很多的时候,l承的子cd?x)成几何U数增长Q得类多的难以控制。正是基于这L(fng)考虑QDecorator模式得以诞生?/p> <p>Decorator模式相当于封装了(jin)某个特定的操作,当某个对象需要这个操作的时候,加上q个Decorator卛_。ƈ且,多个Decoratorq可以组合,以提供更多的功能?/p> <p>在Jive中,Decorator模式应用在一些过滤器QF(tun)ilterQ中。Filter提供对ForumMessage对象内容的重新构造。比如,当一个ForumMessage对象过一个名为FilterCodeHighlight的过滤器后,存在于消息中的所有Java源代码文本,?x)被重新构造ؓ(f)h语法高(sh)昄的消息。在比如Q当l过?jin)语法高(sh)修饰的消息再流q一个名为FilterHtml的过滤器后,消息中的HTML片断?x)被注释可以在HTML内部昄文本Q这样就防止?jin)用戯入?jin)HTML控制标签后,使得面昄不正常的问题?/p> <p>Jive中,所有的qo(h)器(h)承于一个抽象类ForumMessageFilterQ而ForumMessageFilter又实C(jin)ForumMessage接口。也是_(d)每一个过滤器实际上也是一个ForumMessage对象?/p> <p>ForumMessageFilter中还装一个ForumMessage对象。进行过滤的Ҏ(gu)很简单,使用的是getBody()Q比如在FilterCodeHighlightq个cMQ?/p> <table cellSpacing=0 cellPadding=0 width="100%" border=0> <tbody> <tr> <td class=code-outline> <pre class=displaycode> public String getBody() { return highlightCode(message.getBody()); }</pre> </td> </tr> </tbody> </table> <br> <p>highlightCode是一个privateҎ(gu)Q实施具体的qo(h)的细节。getBody()Ҏ(gu)实际上是定义在ForumMessage接口中的Q当调用qo(h)器的getBody()Ҏ(gu)Ӟp够得到结构重整后的ForumMessage对象?jin)。这个对象可以被其他客户引用Q也可以在传递给另外的过滤器Q实施进一步的操作?/p> <p>在实C个具体的消息的过滤的时候,在Forum中有addForumMessageFilter()QapplyFilters()Ҏ(gu)Q用来实现对qo(h)器的应用?/p> <p>对一个ForumQ用addForumMessageFilter()Ҏ(gu)d一个Filter的时候,q没有指定一个具体的MessageQ而只是一个规则(F(tun)ilter中封装了(jin)qo(h)规则Q,然后applyFilter()Ҏ(gu)中,实施q些规则Q?/p> <table cellSpacing=0 cellPadding=0 width="100%" border=0> <tbody> <tr> <td class=code-outline> <pre class=displaycode> public ForumMessage applyFilters(ForumMessage message) { //Loop through filters and apply them for (int i=0; i < filters.length; i++) { message = filters[i].clone(message); } return message; }</pre> </td> </tr> </tbody> </table> <br> <p>qo(h)器的clone()Ҏ(gu)Qؓ(f)qo(h)器复制消息体。这个方法的使用Q分M(jin)在过滤器中对于消息体和过滤规则的初始化过E,q也是一个值得借鉴的技巧!</p> <p>下面l出Decorator模式的类?</p> <br><br><a name=N10124><strong>?QDecorator模式的类?/strong></a><br><img height=227 alt=?QDecorator模式的类?src="http://www.ibm.com/developerworks/cn/java/l-jivesrc/fig4.gif" width=458> <br> <p>我们可以看到Decorator模式实际上和Proxy模式是很相近的,但是它们代表两个不同的功能含义。Proxy模式提供一个对象的控制Q而Decorator模式则是为对象提供额外的功能?br><br></p> <p><a name=6><span id="wmqeeuq" class=atitle>Iterator模式和论坛的览</span></a>erator模式用来分离数据l构和遍历算法,降低两者之间的耦合度,以得同一个数据结构用不同的算法遍历时Q仍能够h相同的接口,另一斚wQIterator模式使得当改换遍历算法后Q不需要更改程序的代码?/p> <p>在Java的JDK中本w就定义有一个Iterator接口Q在Iterator接口中仅仅定义了(jin)三个Ҏ(gu)QhasNext()判断是否遍历完最后一个元素,next()Ҏ(gu)q回要遍历的数据l构中一个对象,remove()则删除当前对象。Jive中用IteratorProxy抽象cȝ(h)承了(jin)q一接口。这儿Proxy的含义和上面一P也就是说Q这个IteratorProxyZ(jin)?x)实现Iterator的遍历功能外Q还?sh)(x)有代理权限控制的功能?/p> <p>对于论坛中的基本对象ForumQForumThreadQForumMessageQGroupQUser都有相应的遍历器。比如对应于Forum接口有ForumIteratorProxy对象。这个ForumIteratorProxy遍历器就相当于一个封装了(jin)一pdForum对象的集合类Q通过定义好的接口hasNext()和next()可以方便的遍历这个集合,而ƈ不需要知道是如何遍历q个集合的。遍历的法可能很简单,也可能很复杂Q但是对于外部的客户而言Q这q没有Q何的区别?/p> <p>而对于论坛中具体的遍历方法,q取决于具体的实玎ͼ在Jive中给出的是数据库的实现?/p> <p>我们׃MessageIteratorProxyZQ来讲解Iterator模式的用法?/p> <p>DbThreadIterator对象实现?jin)Iterator接口Q是对于一个Thread中所有Message的遍历器Q我们来看看它是如何实现的?/p> <p>hasNext()判断在这个Thread中是不是q有下一条MessageQ?/p> <table cellSpacing=0 cellPadding=0 width="100%" border=0> <tbody> <tr> <td class=code-outline> <pre class=displaycode>public boolean hasNext() { if (currentIndex+1 >= messages.length) { return false; } return true; }</pre> </td> </tr> </tbody> </table> <br> <p>next()Ҏ(gu)从数据库中取Z在这个Thread中的下一条MessageQ?/p> <table cellSpacing=0 cellPadding=0 width="100%" border=0> <tbody> <tr> <td class=code-outline> <pre class=displaycode> public Object next() throws java.util.NoSuchElementException { ForumMessage message = null; if (nextMessage != null) { message = nextMessage; nextMessage = null; } else { message = getNextMessage(); if (message == null) { throw new java.util.NoSuchElementException(); } } return message; }</pre> </td> </tr> </tbody> </table> <br> <p>q样Q通过Ҏ(gu)据库的操作,DbThreadIterator实现?jin)对一个Thread中所有Message遍历的方法?/p> <p>再ForumThread接口中有messages()Ҏ(gu)Q返回在q个Thread中的所有Message的一个遍历器QIteratorQ,实际上也是q回?jin)一个Message的集合:(x) <br><code>public Iterator messages();</code> </p> <p>在DbForumThread中实C(jin)q个Ҏ(gu)Q?<br><code>public Iterator messages() {return new DbThreadIterator(this);}</code> </p> <p>从DbForumThread的messages()Ҏ(gu)中所q回的就是这个Thread中所有Message的一个遍历器Q通过q个遍历器,我们可以访问Thread中的所有的Message?jin)。当?dng)事情q没有完Q由于权限的问题Q我们还需要构造这个遍历器的Proxy对象Q然后通过q个Proxy对象来访问遍历器?/p> <p>下面的类囄Z(jin)在Jive中Iterator模式的实现方法:(x)</p> <br><br><a name=N10177><strong>?QJive中Iterator模式的实?/strong></a><br><img height=234 alt=?QJive中Iterator模式的实?src="http://www.ibm.com/developerworks/cn/java/l-jivesrc/fig5.gif" width=447> <br> <p>在Jive中,因ؓ(f)在一个Thread之下QMessage是按?wi)Şl构l织的,因而,当需要层U表CZ个Thread中的Message之间的关pȝ时候,仅仅用上面讲到的U性的Iterator是不够的。这时候,对Iterator的概念进行推q,引入了(jin)TreeWalker接口?/p> <p>֐思义QTreeWalker提供?jin)遍历一个树(wi)和存取树(wi)上节点的Ҏ(gu)Q?/p> <table cellSpacing=0 cellPadding=0 width="100%" border=0> <tbody> <tr> <td class=code-outline> <pre class=displaycode>public interface TreeWalker { public ForumMessage getRoot(); public ForumMessage getChild(ForumMessage parent, int index); public int getChildCount(ForumMessage parent); public int getRecursiveChildCount(ForumMessage parent); public int getIndexOfChild(ForumMessage parent, ForumMessage child); public boolean isLeaf(ForumMessage node);</pre> </td> </tr> </tbody> </table> <br> <p>TreeWalker只是Iterator的简单推q,q没有Iterator应用的那么广泛,而且Q也可以很容易的在TreeWalker上面在套一层Iterator的借口Q让它在某些情况下行使Iterator的职责。这儿就不再多讨Z(jin)?/p> <p>再此QJive设计中所有涉?qing)到的设计模式的地方Q基本上都讲完了(jin)Q看完了(jin)之后Q是不是对设计模式有?jin)更q一步的?jin)解了(jin)呢Q?/p> <p>下一部分的内容,会(x)涉及(qing)到具体的~码Q深入到JSP的内部,我们会(x)看到Jive中是如何实现可更换的Skin的,q(sh)(x)涉及(qing)Tag Library的一些内宏V好?jin),q次到q儿?jin)。下ơ再见?/p> <img src ="http://www.aygfsteel.com/wdlfellow/aggbug/110625.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/wdlfellow/" target="_blank">crazy zerlot</a> 2007-04-14 12:46 <a href="http://www.aygfsteel.com/wdlfellow/archive/2007/04/14/110625.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>d明白Java的IOpȝ-?/title><link>http://www.aygfsteel.com/wdlfellow/archive/2007/04/13/110305.html</link><dc:creator>crazy zerlot</dc:creator><author>crazy zerlot</author><pubDate>Thu, 12 Apr 2007 16:07:00 GMT</pubDate><guid>http://www.aygfsteel.com/wdlfellow/archive/2007/04/13/110305.html</guid><wfw:comment>http://www.aygfsteel.com/wdlfellow/comments/110305.html</wfw:comment><comments>http://www.aygfsteel.com/wdlfellow/archive/2007/04/13/110305.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.aygfsteel.com/wdlfellow/comments/commentRss/110305.html</wfw:commentRss><trackback:ping>http://www.aygfsteel.com/wdlfellow/services/trackbacks/110305.html</trackback:ping><description><![CDATA[<p>转蝲?a ><font color=#0000ff>http://hi.baidu.com/ahunspun/blog/item/0069084e9882a0cbd0c86a66.html</font></a><br><br></p> <p><font color=#000000>一Q?Input和Output<br>1. stream代表的是M有能力出数据的数据源,或是M有能力接收数据的接收源。在Java的IO中,所有的streamQ包括Input和Out </font></p> <p><font color=#000000>streamQ都包括两种cdQ?/font></p> <p><font color=#000000>1.1 以字节ؓ(f)导向的stream<br>以字节ؓ(f)导向的streamQ表CZ字节为单位从stream中读取或往stream中写入信息。以字节为导向的stream包括下面几种cdQ?br>1) inputstreamQ?br>1) ByteArrayInputStreamQ把内存?sh)的一个缓冲区作ؓ(f)InputStream使用<br>2) StringBufferInputStreamQ把一个String对象作ؓ(f)InputStream<br>3) FileInputStreamQ把一个文件作为InputStreamQ实现对文g的读取操?br>4) PipedInputStreamQ实C(jin)pipe的概念,主要在线E中使用<br>5) SequenceInputStreamQ把多个InputStream合ƈZ个InputStream</font></p> <p><font color=#000000>2) Outputstream<br>1) ByteArrayOutputStreamQ把信息存入内存?sh)的一个缓冲区?br>2) FileOutputStreamQ把信息存入文g?br>3) PipedOutputStreamQ实C(jin)pipe的概念,主要在线E中使用<br>4) SequenceOutputStreamQ把多个OutStream合ƈZ个OutStream</font></p> <p><font color=#000000>1.2 以Unicode字符为导向的stream<br>以Unicode字符为导向的streamQ表CZUnicode字符为单位从stream中读取或往stream中写入信息。以Unicode字符为导向的stream包括下面?/font></p> <p><font color=#000000>U类型:(x)<br>1) Input Stream<br>1) CharArrayReaderQ与ByteArrayInputStream对应<br>2) StringReaderQ与StringBufferInputStream对应<br>3) FileReaderQ与FileInputStream对应<br>4) PipedReaderQ与PipedInputStream对应</font></p> <p><font color=#000000>2) Out Stream<br>1) CharArrayWriteQ与ByteArrayOutputStream对应<br>2) StringWriteQ无与之对应的以字节为导向的stream<br>3) FileWriteQ与FileOutputStream对应<br>4) PipedWriteQ与PipedOutputStream对应<br>以字Wؓ(f)导向的stream基本上对有与之相对应的以字节为导向的stream。两个对应类实现的功能相同,字是在操作时的导向不同。如</font></p> <p><font color=#000000>CharArrayReaderQ和ByteArrayInputStream的作用都是把内存?sh)的一个缓冲区作ؓ(f)InputStream使用Q所不同的是前者每ơ从内存?sh)读取一?/font></p> <p><font color=#000000>字节的信息,而后者每ơ从内存?sh)读取一个字W?br>1.3 两种不现导向的stream之间的{?br>InputStreamReader和OutputStreamReaderQ把一个以字节为导向的stream转换成一个以字符为导向的stream?br>2. streamd属?br>2.1 “为streamd属?#8221;的作?br>q用上面介绍的Java中操作IO的APIQ我们就可完成我们想完成的Q何操作了(jin)。但通过FilterInputStream和FilterOutStream的子c,我们可以</font></p> <p><font color=#000000>为streamd属性。下面以一个例子来说明q种功能的作用?br>如果我们要往一个文件中写入数据Q我们可以这h作:(x)<br>FileOutStream fs = new FileOutStream(“test.txt”);<br>然后可以通过产生的fs对象调用write()函数来往test.txt文g中写入数据了(jin)。但是,如果我们惛_?#8220;先把要写入文件的数据先缓存到内存</font></p> <p><font color=#000000>中,再把~存?sh)的数据写入文g?#8221;的功能时Q上面的API没有一个能满我们的需求了(jin)。但是通过FilterInputStream和FilterOutStream?/font></p> <p><font color=#000000>子类Qؓ(f)FileOutStreamd我们所需要的功能?br>2.2 FilterInputStream的各U类?br>2.2.1 用于装以字节ؓ(f)导向的InputStream<br>1) DataInputStreamQ从stream中读取基本类型(int、char{)(j)数据?br>2) BufferedInputStreamQ用缓冲区<br>3) LineNumberInputStreamQ会(x)记录input stream内的行数Q然后可以调用getLineNumber()和setLineNumber(int)<br>4) PushbackInputStreamQ很用刎ͼ一般用于编译器开?br>2.2.2 用于装以字Wؓ(f)导向的InputStream<br>1) 没有与DataInputStream对应的类。除非在要用readLine()时改用BufferedReaderQ否则用DataInputStream<br>2) BufferedReaderQ与BufferedInputStream对应<br>3) LineNumberReaderQ与LineNumberInputStream对应<br>4) PushBackReaderQ与PushbackInputStream对应<br>2.3 FilterOutStream的各U类?br>2.2.3 用于装以字节ؓ(f)导向的OutputStream<br>1) DataIOutStreamQ往stream中输出基本类型(int、char{)(j)数据?br>2) BufferedOutStreamQ用缓冲区<br>3) PrintStreamQ生格式化输出<br>2.2.4 用于装以字Wؓ(f)导向的OutputStream<br>1) BufferedWriteQ与对应<br>2) PrintWriteQ与对应<br>3. RandomAccessFile<br>1) 可通过RandomAccessFile对象完成Ҏ(gu)件的d操作<br>2) 在生一个对象时Q可指明要打开的文件的性质QrQ只读;wQ只写;rw可读?br>3) 可以直接跛_文g中指定的位置<br>4. I/O应用的一个例?br>import java.io.*;<br>public class TestIO{<br>public static void main(String[] args)<br>throws IOException{<br>//1.以行为单位从一个文件读取数?br>BufferedReader in = <br>new BufferedReader(<br>new FileReader("F:\\nepalon\\TestIO.java"));<br>String s, s2 = new String();<br>while((s = in.readLine()) != null)<br>s2 += s + "\n";<br>in.close();</font></p> <p><font color=#000000>//1b. 接收键盘的输?br>BufferedReader stdin = <br>new BufferedReader(<br>new InputStreamReader(System.in));<br>System.out.println("Enter a line:");<br>System.out.println(stdin.readLine());</font></p> <p><font color=#000000>//2. 从一个String对象中读取数?br>StringReader in2 = new StringReader(s2);<br>int c;<br>while((c = in2.read()) != -1)<br>System.out.println((char)c);<br>in2.close();</font></p> <p><font color=#000000>//3. 从内存取出格式化输入<br>try{<br>DataInputStream in3 = <br>new DataInputStream(<br>new ByteArrayInputStream(s2.getBytes()));<br>while(true)<br>System.out.println((char)in3.readByte()); <br>}<br>catch(EOFException e){<br>System.out.println("End of stream");<br>}</font></p> <p><font color=#000000>//4. 输出到文?br>try{<br>BufferedReader in4 =<br>new BufferedReader(<br>new StringReader(s2));<br>PrintWriter out1 =<br>new PrintWriter(<br>new BufferedWriter(<br>new FileWriter("F:\\nepalon\\ TestIO.out")));<br>int lineCount = 1;<br>while((s = in4.readLine()) != null)<br>out1.println(lineCount++ + "Q? + s);<br>out1.close();<br>in4.close();<br>}<br>catch(EOFException ex){<br>System.out.println("End of stream");<br>}</font></p> <p><font color=#000000>//5. 数据的存储和恢复<br>try{<br>DataOutputStream out2 = <br>new DataOutputStream(<br>new BufferedOutputStream(<br>new FileOutputStream("F:\\nepalon\\ Data.txt")));<br>out2.writeDouble(3.1415926);<br>out2.writeChars("\nThas was pi:writeChars\n");<br>out2.writeBytes("Thas was pi:writeByte\n");<br>out2.close();<br>DataInputStream in5 =<br>new DataInputStream(<br>new BufferedInputStream(<br>new FileInputStream("F:\\nepalon\\ Data.txt")));<br>BufferedReader in5br =<br>new BufferedReader(<br>new InputStreamReader(in5));<br>System.out.println(in5.readDouble());<br>System.out.println(in5br.readLine());<br>System.out.println(in5br.readLine());<br>}<br>catch(EOFException e){<br>System.out.println("End of stream");<br>}</font></p> <p><font color=#000000>//6. 通过RandomAccessFile操作文g<br>RandomAccessFile rf =<br>new RandomAccessFile("F:\\nepalon\\ rtest.dat", "rw");<br>for(int i=0; i<10; i++)<br>rf.writeDouble(i*1.414);<br>rf.close();</font></p> <p><font color=#000000>rf = new RandomAccessFile("F:\\nepalon\\ rtest.dat", "r");<br>for(int i=0; i<10; i++)<br>System.out.println("Value " + i + "Q? + rf.readDouble());<br>rf.close();</font></p> <p><font color=#000000>rf = new RandomAccessFile("F:\\nepalon\\ rtest.dat", "rw");<br>rf.seek(5*8);<br>rf.writeDouble(47.0001);<br>rf.close();</font></p> <p><font color=#000000>rf = new RandomAccessFile("F:\\nepalon\\ rtest.dat", "r");<br>for(int i=0; i<10; i++)<br>System.out.println("Value " + i + "Q? + rf.readDouble());<br>rf.close();<br>}<br>}<br>关于代码的解释(以区为单位)(j)Q?br>1ZQ当d文gӞ先把文g内容d~存?sh),当调用in.readLine()Ӟ再从~存?sh)以字符的方式读取数据(以下U?#8220;~存字节d?/font></p> <p><font color=#000000>?#8221;Q?br>1bZQ由于想以缓存字节读取方式从标准IOQ键盘)(j)中读取数据,所以要先把标准IOQSystem.inQ{换成字符导向的streamQ再q行</font></p> <p><font color=#000000>BufferedReader装?br>2ZQ要以字W的形式从一个String对象中读取数据,所以要产生一个StringReadercd的stream?br>4ZQ对String对象s2d数据Ӟ先把对象中的数据存入~存?sh),再从~冲中进行读取;对TestIO.out文gq行操作Ӟ先把格式化后的信</font></p> <p><font color=#000000>息输出到~存?sh),再把~存?sh)的信息输出到文件中?br>5ZQ对Data.txt文gq行输出Ӟ是先把基本类型的数据输出屋缓存(sh)Q再把缓存(sh)的数据输出到文g中;Ҏ(gu)件进行读取操作时Q先把文</font></p> <p><font color=#000000>件中的数据读取到~存?sh),再从~存?sh)以基本cd的Ş式进行读取。注意in5.readDouble()q一行。因为写入第一个writeDouble()Q所以ؓ(f)?/font></p> <p><font color=#000000>正确昄。也要以基本cd的Ş式进行读取?br>6区是通过RandomAccessFilecd文gq行操作?/font></p> <img src ="http://www.aygfsteel.com/wdlfellow/aggbug/110305.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/wdlfellow/" target="_blank">crazy zerlot</a> 2007-04-13 00:07 <a href="http://www.aygfsteel.com/wdlfellow/archive/2007/04/13/110305.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Java 通用U程池-转自CSDNhttp://www.aygfsteel.com/wdlfellow/archive/2007/04/12/110297.htmlcrazy zerlotcrazy zerlotThu, 12 Apr 2007 15:33:00 GMThttp://www.aygfsteel.com/wdlfellow/archive/2007/04/12/110297.htmlhttp://www.aygfsteel.com/wdlfellow/comments/110297.htmlhttp://www.aygfsteel.com/wdlfellow/archive/2007/04/12/110297.html#Feedback0http://www.aygfsteel.com/wdlfellow/comments/commentRss/110297.htmlhttp://www.aygfsteel.com/wdlfellow/services/trackbacks/110297.html阅读全文

crazy zerlot 2007-04-12 23:33 发表评论
]]>
JAVA虚拟机加载类的方式解?/title><link>http://www.aygfsteel.com/wdlfellow/archive/2007/04/11/109819.html</link><dc:creator>crazy zerlot</dc:creator><author>crazy zerlot</author><pubDate>Wed, 11 Apr 2007 01:47:00 GMT</pubDate><guid>http://www.aygfsteel.com/wdlfellow/archive/2007/04/11/109819.html</guid><wfw:comment>http://www.aygfsteel.com/wdlfellow/comments/109819.html</wfw:comment><comments>http://www.aygfsteel.com/wdlfellow/archive/2007/04/11/109819.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.aygfsteel.com/wdlfellow/comments/commentRss/109819.html</wfw:commentRss><trackback:ping>http://www.aygfsteel.com/wdlfellow/services/trackbacks/109819.html</trackback:ping><description><![CDATA[虚拟机加载类的途径Q?br><br>1、Dog dog Q?new DogQ)(j)Q?br>q个动作?x)导致常量池的解析,Dogc被隐式装蝲?br>如果当前ClassLoader无法扑ֈDogQ则抛出NoClassDefFoundError?br><br>2、Class clazz Q?Class.forNameQ?#8220;Dog”Q;<br>   Object dog Qclazz.newInstanceQ)(j)Q?br>通过反射加蝲cdQƈ创徏对象实例<br>如果无法扑ֈDogQ则抛出ClassNotFoundException?br><br>3、Class clazz Q?classLoader.loadClassQ?#8220;Dog”Q;<br>   Object dog Qclazz.newInstanceQ)(j)Q?br>通过反射加蝲cdQƈ创徏对象实例<br>如果无法扑ֈDogQ则抛出ClassNotFoundException?br><br>那么Q???I竟有什么区别呢Q分别用于什么情况呢Q?br><br>1?使用的类加蝲器是相同的,都是当前cd载器。(卻I(x)this.getClass.getClassLoaderQ?br>3qh定类加蝲器?br><br>如果需要在当前c\径以外寻扄Q则只能采用W?U方式。第3U方式加载的cM当前cd属不同的命名I间?br>当前cd载器命名I间对其不可见。当?dng)如果被加载类的超cd于当前类命名I间可见的话Q则可以q行强制转型?br><br>W?和第2U情况区别不大。如果,Dogcd~译时无法得刎ͼ则用第2U方式?br><br>另外Q第1U和W?U都?x)导致类被初始化Q即Q执行类的静(rn)态初始化语句Q而第3U情况不?x)?br>另外注意Q第1U抛出ErrorQ第2?U抛出ExceptionQ它们分属于不同的异?错误分支?br> <img src ="http://www.aygfsteel.com/wdlfellow/aggbug/109819.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/wdlfellow/" target="_blank">crazy zerlot</a> 2007-04-11 09:47 <a href="http://www.aygfsteel.com/wdlfellow/archive/2007/04/11/109819.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>华ؓ(f)JAVA inteview topicshttp://www.aygfsteel.com/wdlfellow/archive/2007/04/11/109814.htmlcrazy zerlotcrazy zerlotWed, 11 Apr 2007 01:38:00 GMThttp://www.aygfsteel.com/wdlfellow/archive/2007/04/11/109814.htmlhttp://www.aygfsteel.com/wdlfellow/comments/109814.htmlhttp://www.aygfsteel.com/wdlfellow/archive/2007/04/11/109814.html#Feedback0http://www.aygfsteel.com/wdlfellow/comments/commentRss/109814.htmlhttp://www.aygfsteel.com/wdlfellow/services/trackbacks/109814.html
1 面向对象的特征有哪些斚w
2 String 是最基本的数据类型吗?
3 int ?Integer 有什么区?br>4 String 和StringBuffer 的区?br>5 q行时异怸一般异常有何异同?
异常表示E序q行q程中可能出现的非正常状态,q行时异常表C拟机的通常
操作中可能遇到的异常Q是一U常见运行错误。java ~译器要求方法必d明抛
出可能发生的非运行时异常Q但是ƈ不要求必d明抛出未被捕L(fng)q行时异
常?br>6 说出一些常用的c,?接口Q请各D5 ?br>7 说出ArrayList,Vector, LinkedList 的存储性能和特?br>ArrayList 和Vector 都是使用数组方式存储数据Q此数组元素数大于实际存储的
数据以便增加和插入元素,它们都允许直接按序号索引元素Q但是插入元素要?br>?qing)数l元素移动等内存操作Q所以烦(ch)引数据快而插入数据慢QVector ׃使用?br>synchronized Ҏ(gu)Q线E安全)(j)Q通常性能上较ArrayList 差,而LinkedList 使用
双向链表实现存储Q按序号索引数据需要进行前向或后向遍历Q但是插入数据时
只需要记录本的前后即可,所以插入速度较快?br>8 设计4 个线E,其中两个U程每次对j 增加1Q另外两个线E对j 每次减少1?br>写出E序?br>以下E序使用内部cd现线E,对j 增减的时候没有考虑序问题?br>public class ThreadTest1{
private int j;
public static void main(String args[]){
ThreadTest1 tt=new ThreadTest1();
Inc inc=tt.new Inc();
Dec dec=tt.new Dec();
for(int i=0;i<2;i++){
Thread t=new Thread(inc);
t.start();
t=new Thread(dec);
t.start();
}
}
private synchronized void inc(){
j++;
System.out.println(Thread.currentThread().getName()+"-inc:"+j);
}
private synchronized void dec(){
j--;
System.out.println(Thread.currentThread().getName()+"-dec:"+j);
}
class Inc implements Runnable{
public void run(){
for(int i=0;i<100;i++){
inc();
}
}
}
class Dec implements Runnable{
public void run(){
for(int i=0;i<100;i++){
dec();
}
}
}
}
9QJSP 的内|对象及(qing)Ҏ(gu)?br>request request 表示HttpServletRequest 对象。它包含?jin)有x(chng)览器h的信息,q且?br>供了(jin)几个用于获取cookie, header, 和session 数据的有用的Ҏ(gu)?br>response response 表示HttpServletResponse 对象Qƈ提供?jin)几个用于设|送回 览器的
响应的方法(如cookies,头信息等Q?br>out out 对象是javax.jsp.JspWriter 的一个实例,q提供了(jin)几个Ҏ(gu)使你能用于向览器回
送输出结果?br>pageContext pageContext 表示一个javax.servlet.jsp.PageContext 对象。它是用于方便存
取各U范围的名字I间、servlet 相关的对象的APIQƈ且包装了(jin)通用的servlet 相关功能?br>Ҏ(gu)?br>session session 表示一个请求的javax.servlet.http.HttpSession 对象。Session 可以存贮?br>L(fng)状态信?br>application applicaton 表示一个javax.servle.ServletContext 对象。这有助于查找有?br>servlet 引擎和servlet 环境的信?br>config config 表示一个javax.servlet.ServletConfig 对象。该对象用于存取servlet 实例的初
始化参数?br>page page 表示从该面产生的一个servlet 实例
10.用socket 通讯写出客户端和服务器端的通讯Q要求客户发送数据后能够回显
相同的数据?br>参见评中socket 通讯例子?br>11 说出Servlet 的生命周期,q说出Servlet 和CGI 的区别?br>Servlet 被服务器实例化后Q容器运行其init Ҏ(gu)Q请求到达时q行其service ?br>法,service Ҏ(gu)自动zNq行与请求对应的doXXX Ҏ(gu)QdoGetQdoPostQ等Q?br>当服务器军_实例销毁的时候调用其destroy Ҏ(gu)?br>与cgi 的区别在于servlet 处于服务器进E中Q它通过多线E方式运行其service
Ҏ(gu)Q一个实例可以服务于多个hQƈ且其实例一般不?x)销毁,而CGI Ҏ(gu)
个请求都产生新的q程Q服务完成后销毁,所以效率上低于servlet?br>12.EJB 是基于哪些技术实现的?q说出SessionBean 和EntityBean 的区别,
StatefulBean 和StatelessBean 的区别?br>13QEJB 包括QSessionBean,EntityBeanQ说Z们的生命周期Q及(qing)如何理事务
的?
14Q说出数据连接池的工作机制是什?
15 同步和异步有和异同,在什么情况下分别使用他们QD例说明?br>16 应用服务器有那些Q?br>17 你所知道的集合类都有哪些Q主要方法?
18 l你一?驱动E序A,数据源名UCؓ(f)B,用户名称为C,密码为D,数据库表为TQ?br>L(fng)JDBC (g)索出表T 的所有数据?br>19Q说出在JSP 面里是怎么分页?
面需要保存(sh)下参敎ͼ(x)
总行敎ͼ(x)Ҏ(gu)sql 语句得到总行?br>每页昄行数Q设定?br>当前|Q请求参?br>面Ҏ(gu)当前|和每行数计出当前늬一行行敎ͼ定位l果集到此行Q对
l果集取出每|C数的行即可?br>数据库方面:(x)
1. 存储q程和函数的区别
存储q程是用户定义的一pdsql 语句的集合,涉及(qing)特定表或其它对象
的Q务,用户可以调用存储q程Q而函数通常是数据库已定义的Ҏ(gu)Q?br>它接收参数ƈq回某种cd的值ƈ且不涉及(qing)特定用户表?br>2. 事务是什么?
事务是作Z个逻辑单元执行的一pd操作Q一个逻辑工作单元必须有四?br>属性,UCؓ(f) ACIDQ原子性、一致性、隔L和持久性)(j)属性,只有q样才能?br>Z个事务:(x)
原子?br>事务必须是原子工作单元;对于其数据修改,要么全都执行Q要么全都不执行?br>一致?br>事务在完成时Q必M所有的数据都保持一致状态。在相关数据库中Q所有规?br>都必d用于事务的修改,以保持所有数据的完整性。事务结束时Q所有的内部
数据l构Q如 B ?wi)?ch)引或双向链表Q都必须是正的?br>隔离?br>由ƈ发事务所作的修改必须与Q何其它ƈ发事务所作的修改隔离。事务查看数?br>时数据所处的状态,要么是另一q发事务修改它之前的状态,要么是另一事务?br>改它之后的状态,事务不会(x)查看中间状态的数据。这UCؓ(f)可串行性,因ؓ(f)它能?br>重新装蝲起始数据Qƈ且重播一pd事务Q以使数据结束时的状态与原始事务?br>行的状态相同?br>持久?br>事务完成之后Q它对于pȝ的媄(jing)响是怹性的。该修改即出现pȝ故障也将一
直保持?br>3. 游标的作用?如何知道游标已经C(jin)最后?
游标用于定位l果集的行,通过判断全局变量@@FETCH_STATUS 可以?br>断是否到?jin)最后,通常此变量不{于0 表示出错或到?jin)最后?br>4. 触发器分Z前触发和事后触发Q这两种触发有和区别。语句触发?br>行触发有何区别?br>事前触发器运行于触发事g发生之前Q而事后触发器q行于触发事件发
生之后。通常事前触发器可以获取事件之前和新的字段倹{?br>语句U触发器可以在语句执行前或后执行Q而行U触发在触发器所影响
的每一行触发一ơ?br>

crazy zerlot 2007-04-11 09:38 发表评论
]]>
վ֩ģ壺 | | | ˮ| פ| | | ׿| ǧ| | ɽ| Ϫ| | | | | | ɽ| Զ| | ɽ| | ɽ| | | | | | ̨| | ͼľ| | Ԫı| ʻ| | | ˮ| ɰ| | | |