??xml version="1.0" encoding="utf-8" standalone="yes"?>国产精品二区三区,九色蝌蚪在线,国产一区二区三区四区五区加勒比 http://www.aygfsteel.com/wdlfellow/technical issues and my lifezh-cnWed, 07 May 2025 04:48:53 GMTWed, 07 May 2025 04:48:53 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>

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

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

我的处理q程Q?/p>

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

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

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

那会不会是这个文仉病毒感染了,我最讨厌感染型的蠕虫病毒了。我从我自己的电脑上把才cmd.exe拯q来了,用Y件比较了下(光看大小不行的)Q一L?/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病毒,会不会是上次病毒修改了注册表什么地方,虽然病毒是被杀了,但是修改的地方仍然没有改q来的呢。结果证明,q个判断是正的?/p>

具体处理ҎQ?/p>

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

HKEY_LOCAL_MACHINESOFTWAREMicrosoftWindows NTCurrentVersionImage File Execution Options  里面?/p>

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

删除可以了?/p>

典型?映像劫持?/p>

q只是处理病毒后遗症Q具体的处理病毒的方法没有写Q因为有很多病毒都会造成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不信,可是l过一q多?<br>研究和实践下来,我已l每月能?万多金了,比某些大公司总裁q多。但是, <br>我敢_80%以上的共享Y件作者ƈ不成功,实际上,他们q远没有赚到他们本来可以 <br>赚到的收入?<br><br>软g׃n发行销售(先试后买Q是一U市销手段Q和其他所有市销手段一P <br>是有学问的,要想通过软g׃n发行获得成功Q就必须掌握q些学问?<br><br>今天Q我来脓上第一技术文章,攉的办?<br>在几q以前,Internetq没有流行的时候,׃n软g的作者只能靠从邮件中收到用户的支和现金的方法来赚钱,而用户寄出支后,q要{上一周或更多的时间得到来自作者的注册码。注?当以下几U情况发生时QY件作者的生意做不成? <br>1Q用L支票本刚好用完,{他买回新支本Ӟ消费冲动已经没有?<br>2Q用L邮票刚好用完Q他q不得不M邮局买邮,转念一惻IqY件我也不?<br>非买不可Q算?<br>3Q用h法忍受要{好多天才能拿到注册?<br>一句话Q太不方便了 <br><br><br>现在好了Q有了InternetQ有了电子商务,用户可以在最想买你的软g的一刚w_q速的用他的信用卡在网上买下你的YӞq后悔的旉都没有,׃n软g发胦的日子到来乐?<br>那么Q如何在|上收取信用卡呢Q?<br>如果你拥有一个公司,在美国银行有信用卡商号帐?又购C银行的GATEWAY软g,在自q|站上开发了信用卡收费系l当然很?但对于广大共享Y件作者来?q很不现?有简单的办法Q就是找一家信用卡收款代理公司Q让他们替你收款Q你只要每个月等他们l你寄一张总额的支?他们会提取一定比例的佣金)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国银行开个户_北京中行的活期一本通就很好?,如果你打让信用卡公司把q汇给?你还要知道银行的英文名字,地址,帐户? <br>帐号,转帐的SWIFT Code(可以从银行职员那里问? <br>C用卡代理公司的网站上开户非常简单,通常认它们的一个在U协议,填入一些个Z息和产品信息Q几分钟OK?<br>q里面有一个值得注意的地方,是Q当用户付了Ƒ֐Q注册码怎么l的问题Q你可以选择׃来给Q每收到一份订单,他们会给你发一email,包含用户资料和emailQ,׃生成注册码emaill用P也可以把注册码生成代码给信用卡公司,让他们编C们的pȝ里去Q用h了订单后自动发出注册码,也可以由你一ơ性生成几百个注册码给他们Q他们每收到一份订单时用掉一个注册码?<br>我个人的意见是,q几个信用卡服务商信誉都非常好,一ơ给他们几百个注册码是最单的办法Q对服务商来说操作简单,对用h说快Q交完钱马上得到注册码?<br><br>当你完成作者和产品在信用卡服务商那里的登记后,׃得到一个URLq接Q你把这个连接加C的主上?标上一?#8220;Buy Now”Q用Lq里可以用信用卡付ƾ了Q当Ӟ你也可以把这个连接做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也是_如果一天里?0万个用户使用了你的Y件一ơ的话,你就得到200-500元。这家公司声Uͼ著名的下载工兯Y件Gozilla!落户Radiate后,每月从Radiate那里赚到22万美?我们著名的NetAnt是不是该赶快行动了? <br><br>我们也不反对用户用支和现金购买软gQ事实上Q信用卡服务商都提供支票和现金收ƾ业务,我们可以在网中提供信用卡服务商的地址和服务热U电话,具体例子可以参考我的网中 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用其他子语句的时候书写简?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些Ҏ支?br>下面插播一个小话题Q关于上边的那些Ҏ,我一直都没怎么用,今天既然说到q里Q就?br>把上边的几个Ҏ的用法说一下,也算对自q一个补充:
假设有两个表Q部门、员工,下面列D一些数据:
员工(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一个表的记录多ؓ准,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二个表的记录多ؓ准,W一个表中没有相应纪录的时候填充null}

3 大小写敏?br>
4。select语句
是要确定你要从查询中返回哪些对象或者哪些对象的属性。写几个例子吧:
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到底是做什么用的?望给于说明)
{等
5。数学函?br>JDO目前好像q不支持此类Ҏ?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(如果我们定义了一个子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;=”不光可以比较对象的属性,也可以比较对象,如:
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法)

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

Java public static final constants eg.Color.TABBY

其他不必解释了,在这里我只想Ҏ询中的参数问题说明一下:
大家知道在SQL中进行传递参数进行查询的时候,我们通常用PreparedStatementQ在语句中写一大堆?#8220;Q?#8221;Q?br>在hql中也可以用这U方法,如:
List mates = sess.find(
"select employee.name from Employee as employee " +
"where employee.Name=? ",
name,
Hibernate.STRING
);
(说明Q上面利用Session里的findҎQ在hibernate的api Session中重载了很多findҎQ它可以满你多UŞ式的查询)
上边是一个参数的情ŞQ这U情况下紧接着引入参数和定义参数的cdQ当为多个参敎ͼ调用另一个findҎQ它的后两个
参数都是数组的Ş式?br>
q有另外一U方法来解决上边的问题,JDO也有q样的方法,不过和hibernate的表现Ş式上有差别,但他们两个骨子里却是
一LQ如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语句没什么差别,如:
select employee.name from Employee as employee where employee.Name like 'J%' order by employee.ID desc (或者asc)

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

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同样支持子查询,写几个例子:

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



crazy zerlot 2007-04-25 13:21 发表评论
]]>
23U设计模式及其对应实??/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:1 单一实例 2 l多个对象共?3 自己创徏。网计数器 <br>   <br>二:{略模式(Strategy)  <br> <br>使用QQ泡MM时用外?nbsp; 客户?QME 抽象c: 外挂 具体Q策略(囄Q笑话,名h名言Q?br>图书销售算法(不同书本折扣的算法)<br> <br>三:原型模式(Prototype)<br> <br>复印技术: 1 不是同一个对?2 属同c?<br>短消息(转发Q?1-n个MM<br> <br>四:门面模式(Façade)<br> <br>Facade典型应用是数据库JDBC的应用和Session的应?br>ME---àMM---à(father,mum,sister,brother)<br> <br>五:备忘录模?Memento)<br> <br>备䆾pȝ时?<br>GHOST</p> <p>?Q?命o模式QCommandQ?br> <br>MMQ客LQ?-àMEQ请求者)--à命o角色--àQ具体命令)-à代理处(接收者)--àMM<br>上网 IE 输入 http地址 发送命?br> <br>七: 解释?Interpreter)<br> <br>~译原理之编译器<br>文言文注释:一D|a文,它译成白话文<br>八:调停者模?Mediator)<br> <br>法院和原告,被告的关p?br>九:责Q链模?CHAIN OF RESPONSIBLEITY)<br> <br>喝酒旉过成语接龙军_谁喝?马到成功Q功不可没-没完没了)<br>十:工厂模式QFactoryQ?br> <br>水果园—〉(葡萄园,Ҏ园)--〉(葡萄Q苹果)Q各自生产)<br>十一Q抽象工厂模式(Abstract FactoryQ?br> <br>奛_造h---〉(_阻I--〉(人,兽)----〉(男hQ女人,公兽Q母兽)(人和兽属于不同的产品c?<br> <br>十二Q徏造模式(BuilderQ?br> <br>汽R刉?br> <br>十三Q合成模式(CompositeQ?br> <br>windows的目录树Q文件系l)<br> <br>十四Q装饰模式(DECORATORQ?br> <br>在visio中文件可以用背景进行装?br>变废为宝<br>十五Q设计模式之Adapter(适配?<br> <br>充电器(手机?20V电压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元模式(FlyweightQ?br> <br>字体?6个字母和各自的斜体等<br> <br>十九Q状态模式(StateQ?br> <br>人心情不同时表现不同有不同的行ؓ<br>~钟<br>dlogin logout<br> <br>二十Q观察者模式(ObserverQ?br> <br>公司邮gpȝ<a href="mailto:everyone@sina.com">everyone@sina.com</a>的应用。当公司员工向这个邮发邮g时会发给公司的每一个员工。如果设|了Outlook则会及时收到通知?br>接收到短消息<br> <br>二十一Q模板方法模式(TemplateQ?br> <br>使用|页设计时用的模板架构|页Q骨Ӟ 法的各个逻辑pȝ<br> <br>二十二:讉K者模式(VisitorQ?br> <br>电脑销售系l: 讉K者(自己Q?--〉电脑配|系l(LQCPUQ内存。。。。。。)<br> <br>二十三:q代子模式(IteratorQ?br> <br>查询数据库,q回l果集(mapQ?listQ?setQ?br> <br>下面的参考文献是MW记的全部参考文献。这里不一定用到的?br>参考文献:<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>《设计模式:可复用面向对象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融合了很多新的观念Q比如Design PatternQ可更换的SkinQ可插入Plug{等。详l解d源代码对于理解这些新的设计上的概忉|很有裨益的。如果你对Design Pattern和Java语言有一定的了解Q但是还是会时常qh于其中的话,不妨研究研究Jive源代码,一定会对其中的很多概念有更深入的理解。这文章源于我的Jive源代码研I笔讎ͼ希望能够提纲挈领Q带领大家进入到q个好的世界。当Ӟ如果没有旉仔细地看源代码的话,看看q篇文章Q我想也是会有一些帮助的?/p> <p>再开始之前,需要指出的是,Jive中对Design Pattern的应用,q没有拘CgGOF书中所l出的实现方法,而是有许多变通的地方。一斚wQ我x׃具体的实际需要,另一斚wQ我惌也是设计观念q化的结果吧。因而,q些变通的地方Q将是我讲解的重炏V?/p> <br> <p><a name=2><span id="wmqeeuq" class=atitle>整体l构概叙</span></a></p> <p>Z一个OO的设计原则:面向接口~程Q而不是针对实现编E。Jive在设计的时候,把其大部分的基本对象都设计ؓ接口或者抽象类。在Jive中,基本的接口有ForumQForumMessageQForumThreadQGroupQUserQAuthorization和Query。我们可以很Ҏ的从q些接口的名字来知道他们的功用,下面的类囄Zq些cM间的一些静态关p:</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>你可能会有疑问,Z么会都是接口呢?q是Z扩展性考虑的。在Jivel出的实CQ所有的q些接口QForumQForumMessageQUser{等Q都使用数据库来实现的,一条消息,或者一个用户对应于数据库中的一条消息Jive使用了DbForumQDbForumMessageQDbUser{类来实现这些接口,通过JDBC来操作数据库Q之作坛的底层支撑?/p> <p>然而,有时候,或许我们q不想用数据库Q比如我们想只是使用文gpȝ来作坛的底层支撑Q这时候,我们需要做的只是编码实CForum{等接口的诸如FileFroumQFileForumMessage{对象,然后嵌入Jive中即可,原有的Q何代码都可以不用改变Q!Q这是面向接口~程的威力了Q?/p> <p>下面来看看具体的设计和编码?br><br></p> <p><a name=3><span id="wmqeeuq" class=atitle>AbstractFactory模式和可扩展?/span></a></p> <p>如果要实现较好的可扩展性,AbstractFactory模式实是一件利器。如上面所_如果要创建的Forum接口的不同实玎ͼ而又不想更改代码的话Q就需要用到抽象工厂了。再Jive中,AuthorizationFactorycL一个抽象类Q用来创建Authorization对象。这是一个抽象工厂,可以通过不同的子cL创徏不同的Authorization对象。这个工厂的实现Ҏ是:</p> <p>在AuthorizationFactory中用一个private static变量factoryQ用来引用具体的抽象工厂的实例: <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Ҏ来给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Ҏq回一个Authorization的过E中Q先初始化工厂类factory变量Q然后用factory的createAuthorizationҎ来创建:</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Ҏ的实现。比如在DbAuthorizationFactoryq个AuthorizationFactory的数据库实现子类中,createAuthorizationҎ是这样实现的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它们是如何协作的,又是如何划分抽象Ҏ和非抽象Ҏ的,q都是值得注意的地斏V一般的Q抽象方法需要子cL实现Q而抽象类中的非抽象方法应该所有子cL能够׃n的,或者可是说Q是定义在抽象方法之上的较高层的Ҏ。这实是一个抽象工厂的好例子!虽然实现的方法已l和GOF中给出的实现相差较远了,但思想没变Q这儿的实现Q也实是要巧妙的些?/p> <p>q有是静态方法的使用Q得这个类看v来有些Singleton的意呟뀂这使得对于AbstractFactory的创建变得简单?/p> <p>下面的类囄Zq个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中定义的其它ҎQ涉及到具体的如何创建AuthorizationQ都是作为abstractҎ出现Q具体实现留l子cL完成?/p> <p>q样Q在需要生成一个Authorization的时候,只需要调用AuthorizationFactory的静态方法getAuthorization可以了Q由子类实现了具体的l节?/p> <p>其它的,如同上面讲到的,在创建Forum的时候用的ForumFactoryQ具有同上面一L实现Q这是模式之所以称为模式的所在了?/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否则论坛就很可能会被搞得一团糟。Jive中引入Proxy对象QAuthorization接口以及权限描叙属类来提供对论坛的保护?/p> <p>以ForumFactoryZQ一个额外的ForumFactoryProxy来处理权限认证的工作Q它为某一个ForumFactory提供了一个代理,保证只有授权的用h能够存取ForumFactory的某些操作。实际上ForumFactory在这儿不仅仅只是一个生成Forum的类的,它更像是一个Forum的管理类。提供了dQ删除,枚D{等一pd的功能,而有些功能不是什么样的h都可以用的Q因而引入了另外的一个代理类来处理权限的问题?/p> <p>当然Q代理类需要承ForumFactoryQ以使方法签名一_ <code>ForumFactoryProxy extends ForumFactory</code> </p> <p>在它的构造方法中Q就提供了一个ForumFactory对象Q这是需要被代理的对象;一个Authorization对象Q提供用户信息;q有一个ForumPermissionsQ提供认证信息:</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个模式的类图:</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都会有一个相应的Proxy对象来进行权限控制。而在创徏具体的对象的时候,都是用相应的Proxy对象来代替原有的对象q回的。例如在ForumFactory的getInstance()Ҏ中需要返回一个Forum的时候,Jive是这样做的:</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抽象工厂保证了没有权限验证的对象根本不会客h得到Q它们只会在Proxy的内部扮演角Ԍ而永q不会被外部对象所存取Q这P׃Ҏ上保证了论坛的安全?/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但是承有的时候不够灵z,而且当功能的l合很多的时候,l承的子cd会成几何U数增长Q得类多的难以控制。正是基于这L考虑QDecorator模式得以诞生?/p> <p>Decorator模式相当于封装了某个特定的操作,当某个对象需要这个操作的时候,加上q个Decorator卛_。ƈ且,多个Decoratorq可以组合,以提供更多的功能?/p> <p>在Jive中,Decorator模式应用在一些过滤器QFilterQ中。Filter提供对ForumMessage对象内容的重新构造。比如,当一个ForumMessage对象过一个名为FilterCodeHighlight的过滤器后,存在于消息中的所有Java源代码文本,会被重新构造ؓh语法高亮昄的消息。在比如Q当l过了语法高亮修饰的消息再流q一个名为FilterHtml的过滤器后,消息中的HTML片断会被注释可以在HTML内部昄文本Q这样就防止了用戯入了HTML控制标签后,使得面昄不正常的问题?/p> <p>Jive中,所有的qo器承于一个抽象类ForumMessageFilterQ而ForumMessageFilter又实CForumMessage接口。也是_每一个过滤器实际上也是一个ForumMessage对象?/p> <p>ForumMessageFilter中还装一个ForumMessage对象。进行过滤的Ҏ很简单,使用的是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ҎQ实施具体的qo的细节。getBody()Ҏ实际上是定义在ForumMessage接口中的Q当调用qo器的getBody()ҎӞp够得到结构重整后的ForumMessage对象了。这个对象可以被其他客户引用Q也可以在传递给另外的过滤器Q实施进一步的操作?/p> <p>在实C个具体的消息的过滤的时候,在Forum中有addForumMessageFilter()QapplyFilters()ҎQ用来实现对qo器的应用?/p> <p>对一个ForumQ用addForumMessageFilter()Ҏd一个Filter的时候,q没有指定一个具体的MessageQ而只是一个规则(Filter中封装了qo规则Q,然后applyFilter()Ҏ中,实施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器的clone()ҎQؓqo器复制消息体。这个方法的使用Q分M在过滤器中对于消息体和过滤规则的初始化过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接口中仅仅定义了三个ҎQhasNext()判断是否遍历完最后一个元素,next()Ҏq回要遍历的数据l构中一个对象,remove()则删除当前对象。Jive中用IteratorProxy抽象cȝ承了q一接口。这儿Proxy的含义和上面一P也就是说Q这个IteratorProxyZ会实现Iterator的遍历功能外Q还会有代理权限控制的功能?/p> <p>对于论坛中的基本对象ForumQForumThreadQForumMessageQGroupQUser都有相应的遍历器。比如对应于Forum接口有ForumIteratorProxy对象。这个ForumIteratorProxy遍历器就相当于一个封装了一pdForum对象的集合类Q通过定义好的接口hasNext()和next()可以方便的遍历这个集合,而ƈ不需要知道是如何遍历q个集合的。遍历的法可能很简单,也可能很复杂Q但是对于外部的客户而言Q这q没有Q何的区别?/p> <p>而对于论坛中具体的遍历方法,q取决于具体的实玎ͼ在Jive中给出的是数据库的实现?/p> <p>我们׃MessageIteratorProxyZQ来讲解Iterator模式的用法?/p> <p>DbThreadIterator对象实现了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()Ҏ从数据库中取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通过Ҏ据库的操作,DbThreadIterator实现了对一个Thread中所有Message遍历的方法?/p> <p>再ForumThread接口中有messages()ҎQ返回在q个Thread中的所有Message的一个遍历器QIteratorQ,实际上也是q回了一个Message的集合: <br><code>public Iterator messages();</code> </p> <p>在DbForumThread中实Cq个ҎQ?<br><code>public Iterator messages() {return new DbThreadIterator(this);}</code> </p> <p>从DbForumThread的messages()Ҏ中所q回的就是这个Thread中所有Message的一个遍历器Q通过q个遍历器,我们可以访问Thread中的所有的Message了。当Ӟ事情q没有完Q由于权限的问题Q我们还需要构造这个遍历器的Proxy对象Q然后通过q个Proxy对象来访问遍历器?/p> <p>下面的类囄Z在Jive中Iterator模式的实现方法:</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中,因ؓ在一个Thread之下QMessage是按树Şl构l织的,因而,当需要层U表CZ个Thread中的Message之间的关pȝ时候,仅仅用上面讲到的U性的Iterator是不够的。这时候,对Iterator的概念进行推q,引入了TreeWalker接口?/p> <p>֐思义QTreeWalker提供了遍历一个树和存取树上节点的Ҏ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?/p> <p>再此QJive设计中所有涉及到的设计模式的地方Q基本上都讲完了Q看完了之后Q是不是对设计模式有了更q一步的了解了呢Q?/p> <p>下一部分的内容,会涉及到具体的~码Q深入到JSP的内部,我们会看到Jive中是如何实现可更换的Skin的,q会涉及Tag Library的一些内宏V好了,q次到q儿了。下ơ再见?/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 以字节ؓ导向的stream<br>以字节ؓ导向的streamQ表CZ字节为单位从stream中读取或往stream中写入信息。以字节为导向的stream包括下面几种cdQ?br>1) inputstreamQ?br>1) ByteArrayInputStreamQ把内存中的一个缓冲区作ؓInputStream使用<br>2) StringBufferInputStreamQ把一个String对象作ؓInputStream<br>3) FileInputStreamQ把一个文件作为InputStreamQ实现对文g的读取操?br>4) PipedInputStreamQ实Cpipe的概念,主要在线E中使用<br>5) SequenceInputStreamQ把多个InputStream合ƈZ个InputStream</font></p> <p><font color=#000000>2) Outputstream<br>1) ByteArrayOutputStreamQ把信息存入内存中的一个缓冲区?br>2) FileOutputStreamQ把信息存入文g?br>3) PipedOutputStreamQ实Cpipe的概念,主要在线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类型:<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ؓ导向的stream基本上对有与之相对应的以字节为导向的stream。两个对应类实现的功能相同,字是在操作时的导向不同。如</font></p> <p><font color=#000000>CharArrayReaderQ和ByteArrayInputStream的作用都是把内存中的一个缓冲区作ؓInputStream使用Q所不同的是前者每ơ从内存中读取一?/font></p> <p><font color=#000000>字节的信息,而后者每ơ从内存中读取一个字W?br>1.3 两种不现导向的stream之间的{?br>InputStreamReader和OutputStreamReaderQ把一个以字节为导向的stream转换成一个以字符为导向的stream?br>2. streamd属?br>2.1 “为streamd属?#8221;的作?br>q用上面介绍的Java中操作IO的APIQ我们就可完成我们想完成的Q何操作了。但通过FilterInputStream和FilterOutStream的子c,我们可以</font></p> <p><font color=#000000>为streamd属性。下面以一个例子来说明q种功能的作用?br>如果我们要往一个文件中写入数据Q我们可以这h作:<br>FileOutStream fs = new FileOutStream(“test.txt”);<br>然后可以通过产生的fs对象调用write()函数来往test.txt文g中写入数据了。但是,如果我们惛_?#8220;先把要写入文件的数据先缓存到内存</font></p> <p><font color=#000000>中,再把~存中的数据写入文g?#8221;的功能时Q上面的API没有一个能满我们的需求了。但是通过FilterInputStream和FilterOutStream?/font></p> <p><font color=#000000>子类QؓFileOutStreamd我们所需要的功能?br>2.2 FilterInputStream的各U类?br>2.2.1 用于装以字节ؓ导向的InputStream<br>1) DataInputStreamQ从stream中读取基本类型(int、char{)数据?br>2) BufferedInputStreamQ用缓冲区<br>3) LineNumberInputStreamQ会记录input stream内的行数Q然后可以调用getLineNumber()和setLineNumber(int)<br>4) PushbackInputStreamQ很用刎ͼ一般用于编译器开?br>2.2.2 用于装以字Wؓ导向的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 用于装以字节ؓ导向的OutputStream<br>1) DataIOutStreamQ往stream中输出基本类型(int、char{)数据?br>2) BufferedOutStreamQ用缓冲区<br>3) PrintStreamQ生格式化输出<br>2.2.4 用于装以字Wؓ导向的OutputStream<br>1) BufferedWriteQ与对应<br>2) PrintWriteQ与对应<br>3. RandomAccessFile<br>1) 可通过RandomAccessFile对象完成Ҏ件的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>关于代码的解释(以区为单位)Q?br>1ZQ当d文gӞ先把文g内容d~存中,当调用in.readLine()Ӟ再从~存中以字符的方式读取数据(以下U?#8220;~存字节d?/font></p> <p><font color=#000000>?#8221;Q?br>1bZQ由于想以缓存字节读取方式从标准IOQ键盘)中读取数据,所以要先把标准IOQSystem.inQ{换成字符导向的streamQ再q行</font></p> <p><font color=#000000>BufferedReader装?br>2ZQ要以字W的形式从一个String对象中读取数据,所以要产生一个StringReadercd的stream?br>4ZQ对String对象s2d数据Ӟ先把对象中的数据存入~存中,再从~冲中进行读取;对TestIO.out文gq行操作Ӟ先把格式化后的信</font></p> <p><font color=#000000>息输出到~存中,再把~存中的信息输出到文件中?br>5ZQ对Data.txt文gq行输出Ӟ是先把基本类型的数据输出屋缓存中Q再把缓存中的数据输出到文g中;Ҏ件进行读取操作时Q先把文</font></p> <p><font color=#000000>件中的数据读取到~存中,再从~存中以基本cd的Ş式进行读取。注意in5.readDouble()q一行。因为写入第一个writeDouble()Q所以ؓ?/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)Q?br>q个动作会导致常量池的解析,Dogc被隐式装蝲?br>如果当前ClassLoader无法扑ֈDogQ则抛出NoClassDefFoundError?br><br>2、Class clazz Q?Class.forNameQ?#8220;Dog”Q;<br>   Object dog Qclazz.newInstanceQ)Q?br>通过反射加蝲cdQƈ创徏对象实例<br>如果无法扑ֈDogQ则抛出ClassNotFoundException?br><br>3、Class clazz Q?classLoader.loadClassQ?#8220;Dog”Q;<br>   Object dog Qclazz.newInstanceQ)Q?br>通过反射加蝲cdQƈ创徏对象实例<br>如果无法扑ֈDogQ则抛出ClassNotFoundException?br><br>那么Q???I竟有什么区别呢Q分别用于什么情况呢Q?br><br>1?使用的类加蝲器是相同的,都是当前cd载器。(卻Ithis.getClass.getClassLoaderQ?br>3qh定类加蝲器?br><br>如果需要在当前c\径以外寻扄Q则只能采用W?U方式。第3U方式加载的cM当前cd属不同的命名I间?br>当前cd载器命名I间对其不可见。当Ӟ如果被加载类的超cd于当前类命名I间可见的话Q则可以q行强制转型?br><br>W?和第2U情况区别不大。如果,Dogcd~译时无法得刎ͼ则用第2U方式?br><br>另外Q第1U和W?U都会导致类被初始化Q即Q执行类的静态初始化语句Q而第3U情况不会?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>华ؓ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明抛出未被捕Lq行时异
常?br>6 说出一些常用的c,?接口Q请各D5 ?br>7 说出ArrayList,Vector, LinkedList 的存储性能和特?br>ArrayList 和Vector 都是使用数组方式存储数据Q此数组元素数大于实际存储的
数据以便增加和插入元素,它们都允许直接按序号索引元素Q但是插入元素要?br>及数l元素移动等内存操作Q所以烦引数据快而插入数据慢QVector ׃使用?br>synchronized ҎQ线E安全)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 的内|对象及Ҏ?br>request request 表示HttpServletRequest 对象。它包含了有x览器h的信息,q且?br>供了几个用于获取cookie, header, 和session 数据的有用的Ҏ?br>response response 表示HttpServletResponse 对象Qƈ提供了几个用于设|送回 览器的
响应的方法(如cookies,头信息等Q?br>out out 对象是javax.jsp.JspWriter 的一个实例,q提供了几个Ҏ使你能用于向览器回
送输出结果?br>pageContext pageContext 表示一个javax.servlet.jsp.PageContext 对象。它是用于方便存
取各U范围的名字I间、servlet 相关的对象的APIQƈ且包装了通用的servlet 相关功能?br>Ҏ?br>session session 表示一个请求的javax.servlet.http.HttpSession 对象。Session 可以存贮?br>L状态信?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 ҎQ请求到达时q行其service ?br>法,service Ҏ自动zNq行与请求对应的doXXX ҎQdoGetQdoPostQ等Q?br>当服务器军_实例销毁的时候调用其destroy Ҏ?br>与cgi 的区别在于servlet 处于服务器进E中Q它通过多线E方式运行其service
ҎQ一个实例可以服务于多个hQƈ且其实例一般不会销毁,而CGI Ҏ
个请求都产生新的q程Q服务完成后销毁,所以效率上低于servlet?br>12.EJB 是基于哪些技术实现的?q说出SessionBean 和EntityBean 的区别,
StatefulBean 和StatelessBean 的区别?br>13QEJB 包括QSessionBean,EntityBeanQ说Z们的生命周期Q及如何理事务
的?
14Q说出数据连接池的工作机制是什?
15 同步和异步有和异同,在什么情况下分别使用他们QD例说明?br>16 应用服务器有那些Q?br>17 你所知道的集合类都有哪些Q主要方法?
18 l你一?驱动E序A,数据源名UCؓB,用户名称为C,密码为D,数据库表为TQ?br>LJDBC 索出表T 的所有数据?br>19Q说出在JSP 面里是怎么分页?
面需要保存以下参敎ͼ
总行敎ͼҎsql 语句得到总行?br>每页昄行数Q设定?br>当前|Q请求参?br>面Ҏ当前|和每行数计出当前늬一行行敎ͼ定位l果集到此行Q对
l果集取出每|C数的行即可?br>数据库方面:
1. 存储q程和函数的区别
存储q程是用户定义的一pdsql 语句的集合,涉及特定表或其它对象
的Q务,用户可以调用存储q程Q而函数通常是数据库已定义的ҎQ?br>它接收参数ƈq回某种cd的值ƈ且不涉及特定用户表?br>2. 事务是什么?
事务是作Z个逻辑单元执行的一pd操作Q一个逻辑工作单元必须有四?br>属性,UCؓ ACIDQ原子性、一致性、隔L和持久性)属性,只有q样才能?br>Z个事务:
原子?br>事务必须是原子工作单元;对于其数据修改,要么全都执行Q要么全都不执行?br>一致?br>事务在完成时Q必M所有的数据都保持一致状态。在相关数据库中Q所有规?br>都必d用于事务的修改,以保持所有数据的完整性。事务结束时Q所有的内部
数据l构Q如 B 树烦引或双向链表Q都必须是正的?br>隔离?br>由ƈ发事务所作的修改必须与Q何其它ƈ发事务所作的修改隔离。事务查看数?br>时数据所处的状态,要么是另一q发事务修改它之前的状态,要么是另一事务?br>改它之后的状态,事务不会查看中间状态的数据。这UCؓ可串行性,因ؓ它能?br>重新装蝲起始数据Qƈ且重播一pd事务Q以使数据结束时的状态与原始事务?br>行的状态相同?br>持久?br>事务完成之后Q它对于pȝ的媄响是怹性的。该修改即出现pȝ故障也将一
直保持?br>3. 游标的作用?如何知道游标已经C最后?
游标用于定位l果集的行,通过判断全局变量@@FETCH_STATUS 可以?br>断是否到了最后,通常此变量不{于0 表示出错或到了最后?br>4. 触发器分Z前触发和事后触发Q这两种触发有和区别。语句触发?br>行触发有何区别?br>事前触发器运行于触发事g发生之前Q而事后触发器q行于触发事件发
生之后。通常事前触发器可以获取事件之前和新的字段倹{?br>语句U触发器可以在语句执行前或后执行Q而行U触发在触发器所影响
的每一行触发一ơ?br>

crazy zerlot 2007-04-11 09:38 发表评论
]]>
վ֩ģ壺 ˳| | | ƽ| ԭ| | ƽ| | ˷| | | | ÷ӿ| | | | ²| | | ͬ| Ȫ| ¸| ˶| | | | Ͽ| ԭ| ɳ| ½| | | | | ɾ| ӱ| | | ̫| ͷ| |