??xml version="1.0" encoding="utf-8" standalone="yes"?>精品久久久久亚洲,久久精品国产亚洲AV久,亚洲日本久久久午夜精品http://m.tkk7.com/fisher/category/18300.html天行健,君子以自Z息。地势坤Q君子以厚d载物?/description>zh-cnTue, 27 Feb 2007 12:37:59 GMTTue, 27 Feb 2007 12:37:59 GMT60Subversion(SVN)安装使用指南 (?http://m.tkk7.com/fisher/articles/98232.htmlFisherFisherTue, 06 Feb 2007 04:13:00 GMThttp://m.tkk7.com/fisher/articles/98232.htmlhttp://m.tkk7.com/fisher/comments/98232.htmlhttp://m.tkk7.com/fisher/articles/98232.html#Feedback0http://m.tkk7.com/fisher/comments/commentRss/98232.htmlhttp://m.tkk7.com/fisher/services/trackbacks/98232.html

Subversion(SVN)安装使用指南

ȝq?/font>

Subversion是近期在开源社Z非常行的一Ƅ本控制YӞ它是CVS的替代物?/p>

它的主要特征有:

  • CVS大部分的功能?
  • 支持“目录”别的版本理Qƈ且解决了CVS中迟q未能解决的文g重命名和Ud{问题。甚臛_文g或文件夹的属性都提供了版本管理?
  • “提交(commitQ”实C真正意义上的原子操作。也是cM数据库中的事务的功能?
  • 版本号依据每ơ提交而改变,不再针对每个文g。日志信息也是针Ҏ(gu)ơ提交而设|。所以看到版本号是几百或者几千也不用太惊Ӟ表示方式不一L(fng)Ş了?
  • 通过WebDAV/DeltaV协议Q可以与Apache的网l服务无~衔接(通过Apache来运行)。这样就能提供一些额外的功能Q例如:认证Q压~传输,以及数据仓库QRepositoryQ见下)的浏览等?
  • 也可以作为独立服务器q行Q但q样的话提供的功能较为简单薄弱?
  • 两种q行模式都支持SSHQ当焉要各自的支持和配|)
  • 降低了分支(BranchQ和标签QtagQ上的时间消耗。底层设计理念和实现上的不同Q不l说了?
  • 旉消耗依据的是文件改变部分的大小Q而不是数据总量?
  • 创徏数据仓库Ӟ用户可以指定是用内嵌的 BerkeleyDB 数据库,q是特定格式的文件系l?

其他q有些零星的功能,具体可以参阅Q?http://subversion.tigris.org/roadmap.html

q里解释一?数据仓库 的概念:
一个数据仓库对应的可以是一个项目,也可以是多个目。SVN是基于数据仓库进行管理的?br />按照用户习惯Q可以只在每个数据仓库内仅放|一个项目的内容?/p>

M载?/font>

Subversion 1.2.3:
http://subversion.tigris.org/project_packages.html
QSVN的Server端,分不同操作系l的版本Q这里我下蝲的是for windows及for linux的)

TortoiseSVN:
http://tortoisesvn.tigris.org/download.html
Qwindows下的SVN客户端,以shell方式集成在系l右键菜单中Q?/p>

Apache 2.0.55:
http://httpd.apache.org/download.cgi
Q视操作pȝ而下Q?/p>

d装用?/font>

下面说一下安装,分两U^収ͼwindowsQlinuxQ及两种模式Q与Apachel定 vs. Stand-aloneQ?br />具体在Apache上的配置倒是大同异?/p>

另外QSVN是支持SSL的,但是q个配置牉|到其他太多东西,本文׃q多涉及了。真的有需要可以参考SVN的手册(英文Q?/p>

方便赯Q用几个变量代表具体的|误行加以调_

%SystemRoot% ?windows的系l所在目录,一般类DPC:\WINNT
%SVN_HOME% ?SVN的安装目?br />%SVN_REPO_PARENT% ?SVN所有数据仓库的根目录(是存放全部版本文g的ȝ录)
%PROJECT_NAME% ?目名,严格的来说它对应的是一个数据仓库,但是q里遵从用户习惯Q以目名称方式来命名?br />%SERVER_NAME_OR_IP% ?服务器名或IP地址
%APACHE_HOME% ?Apache2的安装\?/p>

另外Q安装过E默认用文件系l做后台数据库,文中不再加以说明。如需使用BerkeleyDBQ请自行参考SVN文档?/p>

Windows上的服务器端安装
____________________________________________

1.双击下蝲得来的”svn-1.2.3-setup.exe”ƈ安装到?SVN_HOME%?/p>

2.安装完毕后,?SVN_HOME%\bin”应该已l自动加入到pȝ路径Q?PATH%Q中。如果没有,h工添加?/p>

3.用命令行来测试安装结果是否正:

  1. cmd
  2. svnadmin

如果q回q样的错误信息:”svnadmin.exe - Unable To Locate DLL”,那就需要尝试一下步骤的中的一U或几种Q?br />安装VC++ 6.0Q主要是安装VC的运行库Q?br />或者直接从别的机器上拷贝一个”msvcp60.dll”文件到本机的?SystemRoot%\system32″下

4.使用以下命o创徏一个数据仓库,用来存放目的源代码和其他文Ӟ

  1. cmd
  2. svnadmin   create %SVN_REPO_PARENT %\ %PROJECT_NAME %

5.其中%SVN_REPO_PARENT%是包含所有数据仓库的目录Q?PROJECT_NAME%是所创徏的数据仓库对应的目名?/p>


*************************
* ?Stand-alone 模式q行 *
*************************

6.从命令行启动SVN ServerQ?/p>

  1. cmd
  2. svnserve - d - r   %SVN_REPO_PARENT %

注意里面的参?r 限定了浏览全部数据仓库的根目?/p>

当然如果觉得每次q样启动太麻烦的话,也有SVN Serveice的包装程序(http://dark.clansoft.dk/~mbn/svnservice/Q。通过它能够以windows service的方式运行SVN ServerQ其本质q是Stand-aloneQ,q行h相对比较方便?/p>

7.创徏用户数据库(其实是一个txt文本Q就叫它”users.conf”吧Q你也可以改名)Q保存到
%SVN_REPO_PARENT%\%PROJECT_NAME%\conf
目录Q那个conf子文件夹在创建数据仓库时已被自动创徏好)Q然后在q个文g内添加需要的用户名和密码。基本的样例如下Q?/p>

  1. [ users ]
  2. your_username = your_password

注意q里密码是明文存攄Q所以也是这U方式的不之处?/p>

8.在?SVN_REPO_PARENT%\%PROJECT_NAME%\conf”目录下扑ֈq个”svnserve.conf”文Ӟ用Q何文本编辑器打开Qؓ刚才创徏的那些用h加读写权限:

  1. [ general ]
  2. anon - access = none               # 匿名讉K权限
  3. auth - access = write              # 认证用户的权?/span>
  4. password - db = users . conf         # 认证用户数据?/span>
  5. realm = Anything   you want , but generally we use " %PROJECT_NAME% "    # 在用戯证界面上出现的提C?/span>

里面的”users.conf”就是刚才在W?步创建的用户文g?/p>

9.最后,重启SVN ServerQ什么?你不知道怎么重启Q关掉窗口再重新用命令行启动啦;包装成Service的话么就更加单了Q?/p>

现在已经可以使用客户端来q接SVN ServerQ进行import{操作了?br />q接Server的URL应该是类DL(fng)Q?/p>

  1. svn :// %SERVER_NAME_OR_IP %/ %PROJECT_NAME %

具体步骤Q请参阅W?0步?/p>


************************
* 以Apache的模块方式运?*
************************

10.首先要了解的是SVN设计的时候只考虑了兼容Apache2.xQ所以在Apache1.x下是不能正常工作的?/p>

11.安装Apache2
如果事先启动了IIS之类的其他webserverQ请先停止那些服务(端口被占用会DApache安装p|Q?br />其他问题可以参考Apache的安装手册?br />q里假设安装目录为:%APACHE_HOME%

12.查Apache2的安装是否成?br />打开览器,讉KQ?http://localhost/
如果出现的是默认的欢q页面,那就没有问题了。否则请仔细查,重新安装?/p>

13.打开Apache的配|文Ӟ ?APACHE_HOME%\conf\httpd.conf?br />查找”LoadModule”这个关键字Q找到导入模块的区块QsectionQ?br />反注释掉下面q样Q从而加载Subversion所需要的DAV模块Q?/p>

  1. # LoadModule dav_module modules/mod_dav.so

完成之后看v来应该是q样Q?/p>

  1. LoadModule dav_module modules / mod_dav . so

另外在这行下面再d两行Q请注意把\径中的”\”替换成?”)Q?/p>

  1. LoadModule dav_svn_module %SVN_HOME %/ bin / mod_dav_svn . so
  2. LoadModule   authz_svn_module %SVN_HOME %/ bin / mod_authz_svn . so

特别需要注意的是:׃模块依赖关系Q这三行的出现顺序千万不能颠?/font>?/p>

14.再来配置一下”httpd.conf”的其他部分Q告诉Apache2 SVN的数据仓库所在?br />Qؓ避免不必要的ȝQ所有\径中的”\”都h换成?”)
注意Q?/p>

  • 按照下述配置Q所有数据仓库将׃n密码文g及权限文?
  • 如果需要ؓ每个数据仓库创徏独立的设|,h阅SVN的文档(”Authorization Option”章节)

d下述内容Q?/p>

  1. < Location / svn>
  2.   DAV svn
  3.   SVNParentPath %SVN_REPO_PARENT%
  4.   #讄通过览器访问Repository时的XML格式文gQ可以省?/span>
  5.   SVNIndexXSLT " /s vnindex . xsl "
  6.   # 存取权限控制文g所在地
  7.   AuthzSVNAccessFile %SVN_REPO_PARENT%/AccessFile
  8.    
  9.   # 先尝试匿名操作,如有必要再{向用戯?/span>
  10.   Satisfy Any
  11.   Require valid-user
  12.    
  13.   # 如何验证用户
  14.   AuthType Basic
  15.   AuthName " Anything   you want , but generally we use %PROJECT_NAME % "
  16.   AuthUserFile %SVN_REPO_PARENT%/passwd
  17.   #输出时调用Apache的Deflate模块Q必L启用此模块才能这样配Q否则删除此?/span>
  18.   SetOutputFilter DEFLATE
  19. </Location>

q里涉及C个文? ?SVN_REPO_PARENT%/AccessFile???SVN_REPO_PARENT%/passwd?
q不一定非要放到?SVN_REPO_PARENT%”目录下Q我图方便而已。觉得不安全可以Ud另外地方?br />q两个文仉面具体内容的讄请参考第16?7步?/p>

15.保存”httpd.conf”ƈ退出,q里Apache2的配|告一D落?/p>

16.?SVN_REPO_PARENT%/AccessFile”文件的内容

  1. [ / ]
  2. * = r
  3. user1 = rw
  4. user2 = r
  5. admin = rw
  6. [ %PROJECT_NAME %:/ src / test ]
  7. user2 = rw

其中Q?/p>

  • [/] 指代所有数据仓库的根目录,匿名用户默认的权限ؓ只读?
  • 对于”user1‛_”admin”,他们Ҏ(gu)有数据仓库都有读写权限?
  • 对于”user2※I它对所有数据仓库仅有只L限。但是下方又额外指定了他对?PROJECT_NAME%:/src/test”目录具有读写权限?
  • lgQ他对’test’目录及其子目录Q自动承,除非特别指定Q?hd权限Q其他则均ؓ只读权限?

你可以根据需要来讑֮不同的权限,更详l的说明q需要参考SVN文档中的权限讄章节?/p>

17.?SVN_REPO_PARENT%/passwd”文件的内容
q个文g是通过?APACHE_HOME%\bin\htpasswd.exe”自动生成的Q?/p>

  1. cmd
  2. cd / D %APACHE_HOME%\bin
  3. # 参数c仅在W一ơ运行时使用Q用来创Z个新文g
  4. htpasswd –cm %SVN_REPO_PARENT%\passwd user1
  5. # 以后d用户可用此命令,参数m表明需要加?/span>
  6. htpasswd –m %SVN_REPO_PARENT%\passwd user2

此时用文本编辑器打开?SVN_REPO_PARENT%/passwd”,可以看到里面内容是类DL(fng)Q?/p>

  1. admin : $apr1$HLWV7 /.. $upZwVGvge 0 sc28fEp7mGM0
  2. user1 : $apr1$8 sbRo ... $hNMdkTvO4t8POVmOkV3Vg .
  3. user2 : $apr1$ZXzcE /.. $5 Ir0V8VQQtNYTNnnOp . EU1

18.把SVN自带的XSLT文g拯到网站根目录Q?br />然后讄合理权限Qwindowsq_则不必考虑Q?/p>

  1. #q里假设你的|站根目录是  /var/www/html
  2. mv / tmp /s ubversion - 1.2.3 / tools / xslt / svnindex * / var / www / html
  3. chown   apache : apache / var / www / html / svnindex *
  4. chmod   644 / var / www / html / svnindex *
  5. #讄所有者和权限(权限赋lapacheq行的用戯n?
  6. chown - R   apache : apache %SVN_REPO_PARENT %
  7. chmod - R   766 %SVN_REPO_PARENT %

19. 重启Apache2服务Q?/p>

  1. cmd
  2. net   stop Apache2
  3. net   start Apache2

20.打开览器,讉KQhttp://%SERVER_NAME_OR_IP%/svn/
如果q回的页面是?03 Forbidden”,可能是由于Apache2默认没有打开目录的浏览权限(Option IndexesQ参阅Apache2文档Q,但这q不影响使用?br />现在已经可以用客L(fng)导入目q开始用了?br />具体步骤Q请参阅W?0步?/p>


***********************************************
* 注意Q以下步?命o需要在装有SVN客户端的机器上执?*
* Windows下安装服务器端的时候已l同时安装了客户?*
* Linux下尚待查证?*
***********************************************

21.和CVS一PSVN在最初的时候需要将已有目导入到数据库中?br />从命令行执行以下命oQStand-aloneQ:

  1. svn import c :\ temp \ myproject svn :// %SERVER_NAME_OR_IP %/ %PROJECT_NAME % - m " initial import " -- username your_username -- password your_password

或者(Apache2 moduleQ:

  1. svn import c :\ temp \ myproject http :// %SERVER_NAME_OR_IP %/ svn / %PROJECT_NAME % - m " initial import " -- username your_username -- password your_password

其中Q?br />A) c:\temp\myproject里面包含了你所要导入的目文g的内?br />B) %SERVER_NAME_OR_IP%是SVN Server的名字或者IP地址Q上面存有第5步中创徏的数据仓?br />C) %PROJECT_NAME%是要导入到的数据仓库名称Q这里选择跟项目名一?br />D) 参数 m 表明此次导入操作的注释,SVN的注释是按每ơ提交来定义的,导入也是提交的一U?br />E) your_username和your_password是第7?7步创建的用户及密码,注意该用户必d上面?PROJECT_NAME%数据仓库有写权限才能成功?/p>

22.然后Q需要从Server端再ơcheckout到本圎ͼ
Q这Ҏ(gu)觉不是太方便Qؓ啥不做成import的时候有个选项Q本地目录可以自动生成版本信息呢Q)

  1. cmd
  2. cd / D anywhere_you_want_to_put_your_versioned_project_files
  3. svn co svn: / / myserver / myproject / trunk . -- username   your_username -- password your_password

注意Q?br />“co”是”checkout”的一个别?br />那个点[.]代表当前目录Qcheckout出来的文件会自动攑ֈq个目录下。也可以改ؓ某个l对路径?/p>

23.对于向SVN Serer增加Q移动,删除Q或者修改后提交某些文gQ参考用以下命令:

  1. Add :    svn add src / myfile . java - m " adding a file "
  2. Move :    svn   move src / myfile . java src / mynewfile . java - m " moved myfile.java to mynewfile.java "
  3. Delete :    svn   delete src / myfile . java - m " removing a file "
  4. Commit :    svn   commit src / myfile . java - m " the message "

对于上面的客L(fng)操作Q如果安装了TortoiseSVNQ一切就变得单多了?br />不过q个p抓图来说明了。等有空的时候再放上来?/p>

Lȝ?/font>

使用Eclipse的朋友还可以参考这里: http://subclipse.tigris.org/
它以插g的Ş式向Eclipse提供了SVN的支持?/p>

另外Q具体的讄Q参数说明等q是需要自己去查阅SVN的文档(在安装server端的时候已l附带)

参考文献及资料Q?br />_________________________________________

http://subversion.tigris.org/
http://www-128.ibm.com/developerworks/cn/opensource/os-subversion/
http://www.javayou.com/showlog.jspe?log_id=972



Fisher 2007-02-06 12:13 发表评论
]]>
破解囄验证码限制的一般思\http://m.tkk7.com/fisher/articles/93619.htmlFisherFisherSat, 13 Jan 2007 08:59:00 GMThttp://m.tkk7.com/fisher/articles/93619.htmlhttp://m.tkk7.com/fisher/comments/93619.htmlhttp://m.tkk7.com/fisher/articles/93619.html#Feedback0http://m.tkk7.com/fisher/comments/commentRss/93619.htmlhttp://m.tkk7.com/fisher/services/trackbacks/93619.html  验证码分为如下几c:数字型、字W型、符号型、综合型?/p>

  一般验证码属于数字型的Q不q有的图片中生成了不彩色和黑白的噪音点Q指验证囄上的斑点Q。那么我们应该怎么去识别呢Q传l的验证码识别方式很单,׃数字的位|是固定的,所以我们只需要提取每一q数字的囄Q没有噪音点的)然后把每一个特D数字独有的象素位置记录下来Q然后在|络上提取需要破解的特征码,除噪音点,对其位置和记录位|进行比对,那就是么p定相应的数字了?/p>

  ȝ一下传l的是Q?/p>

  1.先分析验证码,前景颜色是否不定

  2.然后把验证码的宽?验证码文字个?比如一验证码下载后宽度?0,?个数?那么?0/4=15,然后保存每个?如果只有数字保存0-9数字C图文?如果英文那更ȝ?0-9,A-Z都要保存C?位图的前景色都不?保持一U颜?背景随便你改不改

  3.如果前景要变则将文字l一为同U颜?每个数字0-9的点阵都有个公共?取该公共炚w色然后把前景全部l一成一U颜?比如白色{255,255,255},位图的结构是BGR,而不是RGB

  4.然后q行比较,如果验证码的一点ؓ白色,W?步保存的位图同一点也是白?那么频率增加1

  5.最后频率最高的是验证码了!

  接下来要做的是做个postE序了,q个太简单了Q代码你p己写吧!不过也要做到如下l节Q做成多U程E序q行发脓(chung)Q不然程序会失去响应的。最好是可以导入大量的代理IP的,然后是发脓(chung)的内Ҏ(gu)后加上几个随机字W,q样可以防止重复贴的qoQ最重要的,只是做测试,发脓(chung)量不要太多、不要ؕ发广告脓(chung)Q?/p>

  其实上述Ҏ(gu)已经不是只是寚w证码q行识别了,完全可以用到现实生活中去Q比如说手写体识别、R牌识别等{,但是现实生活中我们还要进行更多的加工Q比如说圆Ş,多边形检等{。所以说从网l安全技术中Q也有很多东西能造福C会Q还{待我们l箋创造!



Fisher 2007-01-13 16:59 发表评论
]]>
JSP彩色验证?/title><link>http://m.tkk7.com/fisher/articles/93590.html</link><dc:creator>Fisher</dc:creator><author>Fisher</author><pubDate>Sat, 13 Jan 2007 05:04:00 GMT</pubDate><guid>http://m.tkk7.com/fisher/articles/93590.html</guid><wfw:comment>http://m.tkk7.com/fisher/comments/93590.html</wfw:comment><comments>http://m.tkk7.com/fisher/articles/93590.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://m.tkk7.com/fisher/comments/commentRss/93590.html</wfw:commentRss><trackback:ping>http://m.tkk7.com/fisher/services/trackbacks/93590.html</trackback:ping><description><![CDATA[生成?个随机数字和杂ؕ背景的图片,数字和背景颜色会改变Q服务器端刷斎ͼ用history.go(-1)也会变)<br />原型参考ALIBABA  <a target="_blank">http://china.alibaba.com/member/showimage</a><br /><br />------------产生验证码图片的文g-----image.jsp-------------------------------------------<br /><br /><%@ page contentType="image/jpeg" import="java.awt.*,java.awt.image.*,java.util.*,javax.imageio.*" %><br /><%!<br />Color getRandColor(int fc,int bc){//l定范围获得随机颜色<br />        Random random = new Random();<br />        if(fc>255) fc=255;<br />        if(bc>255) bc=255;<br />        int r=fc+random.nextInt(bc-fc);<br />        int g=fc+random.nextInt(bc-fc);<br />        int b=fc+random.nextInt(bc-fc);<br />        return new Color(r,g,b);<br />        }<br />%><br /><%<br />//讄面不缓?br />response.setHeader("Pragma","No-cache");<br />response.setHeader("Cache-Control","no-cache");<br />response.setDateHeader("Expires", 0);<br /><br />// 在内存中创徏图象<br />int width=60, height=20;<br />BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);<br /><br />// 获取囑Ş上下?br />Graphics g = image.getGraphics();<br /><br />//生成随机c?br />Random random = new Random();<br /><br />// 讑֮背景?br />g.setColor(getRandColor(200,250));<br />g.fillRect(0, 0, width, height);<br /><br />//讑֮字体<br />g.setFont(new Font("Times New Roman",Font.PLAIN,18));<br /><br />//画边?br />//g.setColor(new Color());<br />//g.drawRect(0,0,width-1,height-1);<br /><br /><br />// 随机产生155条干扰线Q图象中的认证码不易被其它E序探测?br />g.setColor(getRandColor(160,200));<br />for (int i=0;i<155;i++)<br />{<br />        int x = random.nextInt(width);<br />        int y = random.nextInt(height);<br />        int xl = random.nextInt(12);<br />        int yl = random.nextInt(12);<br />        g.drawLine(x,y,x+xl,y+yl);<br />}<br /><br />// 取随Z生的认证?4位数?<br />String sRand="";<br />for (int i=0;i<4;i++){<br />    String rand=String.valueOf(random.nextInt(10));<br />    sRand+=rand;<br />    // 认证码昄到图象中<br />    g.setColor(new Color(20+random.nextInt(110),20+random.nextInt(110),20+random.nextInt(110)));//调用函数出来的颜色相同,可能是因为种子太接近Q所以只能直接生?br />    g.drawString(rand,13*i+6,16);<br />}<br /><br />// 认证码存入SESSION<br />session.setAttribute("rand",sRand);<br /><br /><br />// 图象生效<br />g.dispose();<br /><br />// 输出图象到页?br />ImageIO.write(image, "JPEG", response.getOutputStream());<br /><br /><br />%> <br /><br />---------------使用验证码图片的文g---------a.jsp------------------------------------<br /><br /><%@ page contentType="text/html;charset=gb2312" %><br /><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"><br /><html><br /><head><br /><title>认证码输入页?lt;/title><br /><meta http-equiv="Content-Type" content="text/html; charset=gb2312"><br /><META HTTP-EQUIV="Pragma" CONTENT="no-cache"> <br /><META HTTP-EQUIV="Cache-Control" CONTENT="no-cache"> <br /><META HTTP-EQUIV="Expires" CONTENT="0"> <br /></head><br /><body><br /><form method=post action="check.jsp"><br /><table><br /><tr><br /><td align=left>pȝ产生的认证码Q?lt;/td><br /><td><img border=0 src="image.jsp"></td><br /></tr><br /><tr><br /><td align=left>输入上面的认证码Q?lt;/td><br /><td><input type=text name=rand maxlength=4 value=""></td><br /></tr><br /><tr><br /><td colspan=2 align=center><input type=submit value="提交?></td><br /></tr><br /></form><br /></body><br /></html><br /><br />-----------------验证的页?---------check.jsp<br /><br /><%@ page contentType="text/html; charset=gb2312" language="java" import="java.sql.*" errorPage="" %><br /><html><br /><head><br /><title>认证码验证页?lt;/title><br /><meta http-equiv="Content-Type" content="text/html; charset=gb2312"><br /><META HTTP-EQUIV="Pragma" CONTENT="no-cache"> <br /><META HTTP-EQUIV="Cache-Control" CONTENT="no-cache"> <br /><META HTTP-EQUIV="Expires" CONTENT="0"> <br /></head><br /><br /><body><br /><% <br />String rand = (String)session.getAttribute("rand");<br />String input = request.getParameter("rand");<br />%><br />pȝ产生的认证码为: <%= rand %><br><br />(zhn)输入的认证码ؓQ?<%= input %><br><br /><br><br /><%<br />  if (rand.equals(input)) {<br />%><br /><font color=green>输入相同Q认证成功!</font><br /><%<br />  } else {<br />%><br /><font color=red>输入不同Q认证失败!</font><br /><%<br />  }<br />%><br /></body><br /></html><img src ="http://m.tkk7.com/fisher/aggbug/93590.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://m.tkk7.com/fisher/" target="_blank">Fisher</a> 2007-01-13 13:04 <a href="http://m.tkk7.com/fisher/articles/93590.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>EHCache 初步使用指南 http://m.tkk7.com/fisher/articles/93225.htmlFisherFisherThu, 11 Jan 2007 09:46:00 GMThttp://m.tkk7.com/fisher/articles/93225.htmlhttp://m.tkk7.com/fisher/comments/93225.htmlhttp://m.tkk7.com/fisher/articles/93225.html#Feedback0http://m.tkk7.com/fisher/comments/commentRss/93225.htmlhttp://m.tkk7.com/fisher/services/trackbacks/93225.html EHCache 初步使用指南   
Cc.Net BLoG 写的比较初,后箋加入对配置文g,内存/盘存储,优化,虚拟机宕?日志{的说明
1. EHCache 的特点,pȝ要求及安?br />是一个纯Java ,q程中(也可以理解成插入式)~存实现
Hibernate2.1,Spring支持EHcache嵌入,自我感觉Hibernate2.1 + EHCache 很过瘾。。(试l果比Hibernate+JCS 好多了)
支持多CPU服务?br />其版本发布前q行了品񔋹试
支持Q运行环境jdk1.2?版本Q源代码~译需1.4?.5 版本Q?br />jdk1.4?.5 版本,需加入apache ?commons-loggingcd http://jakarta.apache.org/commons/logging.html
jdk1.2?.3 版本,需加入commons-collections 2.1 版本 http://jakarta.apache.org/commons/collections.html
?xerces (xml-apis.jar and xercesImpl.jar), 2.5 版本 http://xml.apache.org/xerces2-j/

如果q行环境为IBM JDK1.4版本上的IBM Websphere 5.1,也需加入 commons-collections cd(如需?

单独安装Ehcache Q需把ehcache-X.X.jar 和相关类库方到classpath中?br />如项目已安装了Hibernate2.1 ,则不需要做什么。。直接可以用Ehcache

Cache 存储方式 Q内存或盘

2. 单独使用 EHCache

使用CacheManager 创徏q管理Cache
使用默认配置文g创徏
CacheManager manager = CacheManager.create();
使用指定配置文g创徏
CacheManager manager = CacheManager.create("src/config/ehcache.xml");
从classpathq扑֯配置文gq创?
URL url = getClass().getResource("/anothername.xml");
CacheManager manager = CacheManager.create(url);
通过输入创?br />InputStream fis = new FileInputStream(new File("src/config/ehcache.xml").getAbsolutePath());
try {
manager = CacheManager.create(fis);
} finally {
fis.close();
}

卸蝲CacheManager ,关闭Cache

manager.shutdown();

使用Caches

取得配置文g中预?定义的sampleCache1讄,生成一个Cache
Cache cache = manager.getCache("sampleCache1");


讄一个名为test 的新cache,test属性ؓ默认
CacheManager manager = CacheManager.create();
manager.addCache("test");

讄一个名为test 的新cache,q定义其属?
CacheManager manager = CacheManager.create();
Cache cache = new Cache("test", 1, true, false, 5, 2);
manager.addCache(cache);


往cache中加入元?br />Element element = new Element("key1", "value1");
cache.put(new Element(element);


从cache中取得元?br />Element element = cache.get("key1");



3. ?Hibernate 中运用EHCache

hibernate.cfg.xml中需讄如下Q?br />2.1版本加入
<property name="hibernate.cache.provider_class">net.sf.ehcache.hibernate.Provider</property>
2.1以下版本加入
<property name="hibernate.cache.provider_class">net.sf.hibernate.cache.EhCache</property>

?Hibernate 映射文g的每个需要Cache的Domain?br /><hibernate-mapping>
<class
name="com.somecompany.someproject.domain.Country"
table="ut_Countries"
dynamic-update="false"
dynamic-insert="false"
>
...

</hibernate-mapping>
加入cM如下格式信息Q?br /><cache usage="read-write|nonstrict-read-write|read-only" />
比如Q?br /><cache usage="read-write" />

然后在ehcache.xml中加?br /><ehcache>
<cache name="com.somecompany.someproject.domain.Country"
maxElementsInMemory="10000"
eternal="false"
timeToIdleSeconds="300"
timeToLiveSeconds="600"
overflowToDisk="false"
/>
</ehcache>


Fisher 2007-01-11 17:46 发表评论
]]>
Java中一些关于日期、日期格式、日期的解析和日期的计算[转脓(chung)]http://m.tkk7.com/fisher/articles/91765.htmlFisherFisherThu, 04 Jan 2007 07:30:00 GMThttp://m.tkk7.com/fisher/articles/91765.htmlhttp://m.tkk7.com/fisher/comments/91765.htmlhttp://m.tkk7.com/fisher/articles/91765.html#Feedback0http://m.tkk7.com/fisher/comments/commentRss/91765.htmlhttp://m.tkk7.com/fisher/services/trackbacks/91765.html

Java中一些关于日期、日期格式、日期的解析和日期的计算

Java 语言的Calendar(日历),Date(日期), 和DateFormat(日期格式)l成了Java标准的一个基本但是非帔R要的部分. 日期是商业逻辑计算一个关键的部分. 所有的开发者都应该能够计算未来的日? 定制日期的显C格? q将文本数据解析成日期对? 我们写了两篇文章, q是W一? 我们大概的学习日期, 日期格式, 日期的解析和日期的计?

我们讨Z面的c?

1、具体类(和抽象类相对)java.util.Date
2、抽象类java.text.DateFormat 和它的一个具体子c?java.text.SimpleDateFormat
3、抽象类java.util.Calendar 和它的一个具体子c?java.util.GregorianCalendar

具体cd以被实例? 但是抽象cd不能. 你首先必d现抽象类的一个具体子c?

Date cMJava 开发包(JDK) 1.0 开始进? 当时它只包含了几个取得或者设|一个日期数据的各个部分的方? 比如说月, ? 和年. q些Ҏ(gu)现在遭到了批评ƈ且已l被转移CCalendarc里M, 我们在本文中进一步讨论它. q种改进旨在更好的处理日期数据的国际化格? p在JDK 1.1中一? Date cd际上只是一个包裹类, 它包含的是一个长整型数据, 表示的是从GMT(格林治标准旉)1970q? 1 ?1?0:00:00q一M前或者是之后l历的毫U数.

一、创Z个日期对?

让我们看一个用系l的当前日期和时间创Z个日期对象ƈq回一个长整数的简单例? q个旉通常被称为Java 虚拟?JVM)L环境的系l时?
//------------------------------------------------------
import java.util.Date;

public class DateExample1
{
public static void main(String[] args)
{
// Get the system date/time
Date date = new Date();

System.out.println(date.getTime());
}
}
//------------------------------------------------------

在星期六, 2001q??9? 下午大约?:50的样? 上面的例子在pȝ输出讑֤上显C的l果?1001803809710. 在这个例子中,值得注意的是我们使用了Date 构造函数创Z个日期对? q个构造函数没有接受Q何参? 而这个构造函数在内部使用了System.currentTimeMillis() Ҏ(gu)来从pȝ获取日期.

那么, 现在我们已经知道了如何获取从1970q??日开始经历的毫秒C. 我们如何才能以一U用h白的格式来显C个日期呢? 在这里类java.text.SimpleDateFormat 和它的抽象基c?java.text.DateFormat 派得上用场?

二、日期数据的定制格式

假如我们希望定制日期数据的格? 比方星期?9?29?2001q? 下面的例子展CZ如何完成q个工作:

//------------------------------------------------------
import java.text.SimpleDateFormat;
import java.util.Date;

public class DateExample2
{

public static void main(String[] args)
{

SimpleDateFormat bartDateFormat =
new SimpleDateFormat("EEEE-MMMM-dd-yyyy");

Date date = new Date();

System.out.println(bartDateFormat.format(date));
}
}
//------------------------------------------------------

只要通过向SimpleDateFormat 的构造函C递格式字W串"EEE-MMMM-dd-yyyy", 我们p够指明自己想要的格式. 你应该可以看? 格式字符串中的ASCII 字符告诉格式化函C面显C日期数据的哪一个部? EEEE是星? MMMM是月, dd是日, yyyy是年. 字符的个数决定了日期是如何格式化?传?EE-MM-dd-yy"会显C?Sat-09-29-01. 请察看Sun 公司的Web 站点获取日期格式化选项的完整的指示.

三、将文本数据解析成日期对?

假设我们有一个文本字W串包含了一个格式化了的日期对象, 而我们希望解析这个字W串q从文本日期数据创徏一个日期对? 我们再ơ以格式化字W串"MM-dd-yyyy" 调用SimpleDateFormatc? 但是q一? 我们使用格式化解析而不是生成一个文本日期数? 我们的例? 昄在下? 解析文本字W串"9-29-2001"q创Z个gؓ001736000000 的日期对?

//------------------------------------------------------
import java.text.SimpleDateFormat;
import java.util.Date;

public class DateExample3
{

public static void main(String[] args)
{
// Create a date formatter that can parse dates of
// the form MM-dd-yyyy.
SimpleDateFormat bartDateFormat =
new SimpleDateFormat("MM-dd-yyyy");

// Create a string containing a text date to be parsed.
String dateStringToParse = "9-29-2001";

try {
// Parse the text version of the date.
// We have to perform the parse method in a
// try-catch construct in case dateStringToParse
// does not contain a date in the format we are expecting.
Date date = bartDateFormat.parse(dateStringToParse);

// Now send the parsed date as a long value
// to the system output.
System.out.println(date.getTime());
}
catch (Exception ex) {
System.out.println(ex.getMessage());
}
}
}
//------------------------------------------------------

四、用标准的日期格式化过E?

既然我们已经可以生成和解析定制的日期格式? 让我们来看一看如何用内建的格式化过E? Ҏ(gu) DateFormat.getDateTimeInstance() 让我们得以用几种不同的方法获得标准的日期格式化过E? 在下面的例子? 我们获取了四个内建的日期格式化过E? 它们包括一个短? 中等? 长的, 和完整的日期格式.

//------------------------------------------------------
import java.text.DateFormat;
import java.util.Date;

public class DateExample4
{

public static void main(String[] args)
{
Date date = new Date();

DateFormat shortDateFormat =
DateFormat.getDateTimeInstance(
DateFormat.SHORT,
DateFormat.SHORT);

DateFormat mediumDateFormat =
DateFormat.getDateTimeInstance(
DateFormat.MEDIUM,
DateFormat.MEDIUM);

DateFormat longDateFormat =
DateFormat.getDateTimeInstance(
DateFormat.LONG,
DateFormat.LONG);

DateFormat fullDateFormat =
DateFormat.getDateTimeInstance(
DateFormat.FULL,
DateFormat.FULL);

System.out.println(shortDateFormat.format(date));
System.out.println(mediumDateFormat.format(date));
System.out.println(longDateFormat.format(date));
System.out.println(fullDateFormat.format(date));
}
}
//------------------------------------------------------

注意我们在对 getDateTimeInstance的每ơ调用中都传递了两个? W一个参数是日期风格, 而第二个参数是时间风? 它们都是基本数据cdint(整型). 考虑到可L? 我们使用了DateFormat cL供的帔R: SHORT, MEDIUM, LONG, ?FULL. 要知道获取时间和日期格式化过E的更多的方法和选项, L(fng)Sun 公司Web 站点上的解释.

q行我们的例子程序的时? 它将向标准输备输Z面的内容:
9/29/01 8:44 PM
Sep 29, 2001 8:44:45 PM
September 29, 2001 8:44:45 PM EDT
Saturday, September 29, 2001 8:44:45 PM EDT

五、Calendar c?

我们现在已经能够格式化ƈ创徏一个日期对象了, 但是我们如何才能讄和获取日期数据的特定部分? 比如说小? ? 或者分? 我们又如何在日期的这些部分加上或者减d呢? {案是用Calendar c? 如我们前面提到的那? Calendar cM的方法替代了Date cM被hN的方?

假设你想要设|? 获取, 和操U一个日期对象的各个部分, 比方一个月的一天或者是一个星期的一? Z演示q个q程, 我们用具体的子类 java.util.GregorianCalendar. 考虑下面的例? 它计得C面的W十个星期五?3?

//------------------------------------------------------
import java.util.GregorianCalendar;
import java.util.Date;
import java.text.DateFormat;

public class DateExample5
{

public static void main(String[] args)
{
DateFormat dateFormat = DateFormat.getDateInstance(DateFormat.FULL);

// Create our Gregorian Calendar.
GregorianCalendar cal = new GregorianCalendar();

// Set the date and time of our calendar
// to the system&s date and time
cal.setTime(new Date());

System.out.println("System Date: " +
dateFormat.format(cal.getTime()));

// Set the day of week to FRIDAY
cal.set(GregorianCalendar.DAY_OF_WEEK,
GregorianCalendar.FRIDAY);
System.out.println("After Setting Day of Week to Friday: " +
dateFormat.format(cal.getTime()));

int friday13Counter = 0;

while (friday13Counter <= 10)
{

// Go to the next Friday by adding 7 days.
cal.add(GregorianCalendar.DAY_OF_MONTH, 7);

// If the day of month is 13 we have
// another Friday the 13th.
if (cal.get(GregorianCalendar.DAY_OF_MONTH) == 13)
{
friday13Counter++;
System.out.println(dateFormat.format(cal.getTime()));
}
}
}
}
//------------------------------------------------------

在这个例子中我们作了有趣的函数调?
cal.set(GregorianCalendar.DAY_OF_WEEK,
GregorianCalendar.FRIDAY);

?
cal.add(GregorianCalendar.DAY_OF_MONTH, 7);

set Ҏ(gu)能够让我们通过单的讄星期中的哪一天这个域来将我们的时间调整ؓ星期? 注意到这里我们用了帔R DAY_OF_WEEK ?FRIDAY来增Z码的可读? add Ҏ(gu)让我们能够在日期上加上数? 润年的所有复杂的计算都由q个Ҏ(gu)自动处理.

我们q个例子的输出结果是:
System Date: Saturday, September 29, 2001
当我们将它设|成星期五以后就成了: Friday, September 28, 2001
Friday, September 13, 2002
Friday, December 13, 2002
Friday, June 13, 2003
Friday, February 13, 2004
Friday, August 13, 2004
Friday, May 13, 2005
Friday, January 13, 2006
Friday, October 13, 2006
Friday, April 13, 2007
Friday, July 13, 2007
Friday, June 13, 2008

六、时间掌握在你的手里



Fisher 2007-01-04 15:30 发表评论
]]>
计算Java日期http://m.tkk7.com/fisher/articles/91763.htmlFisherFisherThu, 04 Jan 2007 07:27:00 GMThttp://m.tkk7.com/fisher/articles/91763.htmlhttp://m.tkk7.com/fisher/comments/91763.htmlhttp://m.tkk7.com/fisher/articles/91763.html#Feedback0http://m.tkk7.com/fisher/comments/commentRss/91763.htmlhttp://m.tkk7.com/fisher/services/trackbacks/91763.html 计算Java日期
学习怎样创徏和用日?
概要
    不管你是处理财务交易q是计划着下一步的行动Q你都要知道怎样在Java中徏立,使用和显C日期。这需要你单的查阅一下相应类的API参考:一个日期可以创?个相关类的对象。这文章告诉你你想要知道的内容。(3,000字)
作者:Robert Nielsen
译Q?/strong>Cocia Lin

    Javal计?970q??日v的毫U的数量表示日期。也是_例如Q?970q??日,是在1?日后?6Q?00Q?00毫秒。同L(fng)Q?969q?2?1日是?970q??日前86Q?00Q?00毫秒。Java的DatecM用longcdU录q些毫秒?因ؓlong是有W号整数Q所以日期可以在1970q??日之前,也可以在q之后。Longcd表示的最大正值和最大负值可以轻杄表示290Q?00Q?00q的旉Q这适合大多Ch的时间要求?br />Date c?br />   Datecd以在java.util包中扑ֈQ用一个longcd的DCZ个指定的时刻。它的一个有用的构造函数是Date(),它创Z个表C创建时ȝ对象。getTime()Ҏ(gu)q回Date对象的long倹{在下面的程序中Q我使用Date()构造函数创Z个表C程序运行时ȝ对象Qƈ且利用getTime()Ҏ(gu)扑ֈq个日期代表的毫U数量:

import java.util.*;


public class Now {
   public static void main(String[] args) {
      Date now = new Date();
      long nowLong = now.getTime();
      System.out.println("Value is " + nowLong);
   }
}

当我q行q个E序后,我得?72,568,255,150.快速确认一下这个数字,L(fng)在一个合理的范围Q它不到31q_q个数值相?970q??日到我写q篇文章的时间来_是合理的。计机是这个毫UDC时_Z可不愿意? 我将?96,321,998,34见到你?q运的是QJava提供了一个{换Date对象到字W串的途径Q表C成传统的Ş式。我们在下一节讨论DateFormatc,它直观的建立日期字符丌Ӏ?
DateFormatc?br /> DateFormatcȝ一个目标是建立一个h们能够识别的字符丌Ӏ然而,因ؓ语言的差别,不是所有的人希望看C格的相同格式的日期。法国h更喜Ƣ看?25 decembre 2000,",但是国Z惯看?December 25,2000."所以一个DateFormat的实例创Z后,q个对象包含了日期的昄格式的信息。如果用用L(fng)(sh)脑区域设|缺省的格式Q你可以象下面那P创徏DateFormat对象Q用getDateInstance()Ҏ(gu)Q?/p>

DateFormat df = DateFormat.getDateInstance();  

DateFormatcdjava.text包中可以扑ֈ?br />转换成字W串
你可以用format()Ҏ(gu)转换Date对象Z个字W串。下面的CZE序说明了这个问题:

import java.util.*;
import java.text.*;

public class NowString {
   public static void main(String[] args) {
      Date now = new Date();
      DateFormat df = DateFormat.getDateInstance();
      String s = df.format(now);
      System.out.println("Today is " + s);
   }


在上面的代码中,展示了没有参敎ͼ使用~省格式的getDateInstance()Ҏ(gu)。Javaq提供了几个选择日期格式Q你可以通过使用重蝲的getDateInstance(int style)获得。出于方便的原因QDateFormat提供了几U预|的帔RQ你可以使用q些帔R参数。下面是几个SHORT, MEDIUM, LONG, 和FULLcd的示例:

import java.util.*;
import java.text.*;

public class StyleDemo {
   public static void main(String[] args) {
      Date now = new Date();

      DateFormat df =  DateFormat.getDateInstance();
      DateFormat df1 = DateFormat.getDateInstance(DateFormat.SHORT);
      DateFormat df2 = DateFormat.getDateInstance(DateFormat.MEDIUM);
      DateFormat df3 = DateFormat.getDateInstance(DateFormat.LONG);
      DateFormat df4 = DateFormat.getDateInstance(DateFormat.FULL);
      String s =  df.format(now);
      String s1 = df1.format(now);
      String s2 = df2.format(now);
      String s3 = df3.format(now);
      String s4 = df4.format(now);

      System.out.println("(Default) Today is " + s);
      System.out.println("(SHORT)   Today is " + s1);
      System.out.println("(MEDIUM)  Today is " + s2);
      System.out.println("(LONG)    Today is " + s3);
      System.out.println("(FULL)    Today is " + s4);
   }
}

E序输出如下Q?/p>

(Default) Today is Nov 8, 2000
(SHORT)   Today is 11/8/00
(MEDIUM)  Today is Nov 8, 2000
(LONG)    Today is November 8, 2000
(FULL)    Today is Wednesday, November 8, 2000

同样的程序,在我的电(sh)脑上使用~省讄q行后,改变区域讄为瑞典,输出如下Q?/p>

(Default) Today is 2000-nov-08
(SHORT)   Today is 2000-11-08
(MEDIUM)  Today is 2000-nov-08
(LONG)    Today is den 8 november 2000
(FULL)    Today is den 8 november 2000    
 
从这里,你能看到Q瑞典的月䆾不是大写的(虽然Novemberq是novemberQ?q有QLONG和FULL版本在瑞典语中是一L(fng)Q但是美国英语却不同。另外,有趣的是Q瑞典语单词的星期三,onsdagQ没有包含在FULL日期里,p却包括?
注意你能够用getDateInstance()Ҏ(gu)改变DateFormat实例的语U;但是Q在上面的例子中Q是通过改变Windows98的控刉板的区域讄做到的。不同的地方的区域设|不同,l果׃同,q样有好处,也有不QJavaE序员应该了解这些。一个好处是JavaE序员可以只写一行代码就可以昄日期Q而且世界不同地区的电(sh)脑运行同L(fng)E序会有不用的日期格式?但是q也是一个缺点,当程序员希望昄同一U格式的?-q也有可取之处,举例来说Q在E序中؜合输出文本和日期Q如果文本是英文Q我们就不希望日期格式是其他的格式,象d文或是西班牙文。如果程序员依靠日期格式~程Q日期格式将Ҏ(gu)q行E序所在电(sh)脑的区域讄不用而不同?
解析字符?/strong>
 通过parse()Ҏ(gu)QDateFormat能够以一个字W串创立一个Date对象。这个方法能抛出ParseException异常Q所以你必须使用适当的异常处理技术。下面的例子E序通过字符串创建Date对象Q?/p>

import java.util.*;
import java.text.*;

public class ParseExample {
   public static void main(String[] args) {
      String ds = "November 1, 2000";
      DateFormat df = DateFormat.getDateInstance();
      try {
         Date d = df.parse(ds);
      }
      catch(ParseException e) {
         System.out.println("Unable to parse " + ds);
      }
   }
}

在创Z个Q意的日期时parse()Ҏ(gu)很有用。我通过另一U方法创Z个Q意得日期。同Ӟ你将看到怎样q行基本日期计算Q例如计?0天后的另一天。你可以使用GregorianCalendarcL完成q个d?
GregorianCalendarc?/strong>
 创徏一个代表Q意日期的一个途径使用GregorianCalendarcȝ构造函敎ͼ它包含在java.util包中Q?/p>

GregorianCalendar(int year, int month, int date)

注意月䆾的表C,一月是0Q二月是1Q以此类推,?2月是11。因为大多数Z惯于使用单词而不是用数字来表示月䆾Q这L(fng)序也许更易读Q父cCalendar使用帔R来表C月份:JANUARY, FEBRUARY,{等。所以,创徏Wilbur ?Orville刉第一架动力飞机的日期QDecember 17, 1903Q,你可以用:

GregorianCalendar firstFlight = new GregorianCalendar(1903, Calendar.DECEMBER, 17); 
Z清楚的考虑Q你应该使用前面的Ş式。但是,你也应该学习怎样阅读下面的短格式。下面的例子同样表示December 17,1903Q记住,在短格式中,11表示DecemberQ?/p>

GregorianCalendar firstFlight = new GregorianCalendar(1903, 11, 17);  

在上一节中Q你学习了{换Date对象到字W串。这里,你可以做同样的事情;但是首先Q你需要将GregorianCalendar对象转换到Date。要做到q一点,你可以用getTime()Ҏ(gu)Q从它得父类Calendarl承而来。GetTime()Ҏ(gu)q回GregorianCalendar相应的Date对象。你能够创徏GregorianCalendar对象Q{换到Date对象Q得到和输出相应的字W串q样一个过E。下面是例子Q?

import java.util.*;
import java.text.*;

public class Flight {

   public static void main(String[] args) {
      GregorianCalendar firstFlight = new GregorianCalendar(1903, Calendar.DECEMBER, 17);   
      Date d = firstFlight.getTime();
      DateFormat df = DateFormat.getDateInstance();
      String s = df.format(d);
      System.out.println("First flight was " + s);
   }
}

有时候创Z个代表当前时ȝGregorianCalendarcȝ实例是很有用的。你可以单的使用没有参数的GregorianCalendar构造函敎ͼ象这P

GregorianCalendar thisday = new GregorianCalendar();

一个输Z天日期的例子E序Q用GregorianCalendar对象Q?/p>

import java.util.*;
import java.text.*;

class Today {
   public static void main(String[] args) {
      GregorianCalendar thisday = new GregorianCalendar(); 
      Date d = thisday.getTime();
      DateFormat df = DateFormat.getDateInstance();
      String s = df.format(d);
      System.out.println("Today is " + s);
   }
}

注意刎ͼDate()构造函数和GregorianCalendar()构造函数很cMQ都创徏一个对象,条g单,代表今天?br />日期处理
GregorianCalendarcL供处理日期的Ҏ(gu)。一个有用的Ҏ(gu)是add().使用add()Ҏ(gu)Q你能够增加象年Q月敎ͼ天数到日期对象中。要使用add()Ҏ(gu)Q你必须提供要增加的字段Q要增加的数量。一些有用的字段是DATE, MONTH, YEAR, ?WEEK_OF_YEAR。下面的E序使用add()Ҏ(gu)计算未来80天的一个日期。在Jules?lt;环球80?gt;是一个重要的数字Q用这个程序可以计Phileas Fogg从出发的那一?872q?0?日后80天的日期Q?/p>

import java.util.*;
import java.text.*;

public class World {
   public static void main(String[] args) {
      GregorianCalendar worldTour = new GregorianCalendar(1872, Calendar.OCTOBER, 2);
      worldTour.add(GregorianCalendar.DATE, 80);
      Date d = worldTour.getTime();
      DateFormat df = DateFormat.getDateInstance();
      String s = df.format(d);
      System.out.println("80 day trip will end " + s);
   }
}

q个例子是想象的Q但在一个日期上增加天数是一个普遍的操作Q媄可以租3天,图书馆可以借书21天,商店l常需要将购买的物品在30天内卖出。下面的E序演示了用年计算Q?/p>

import java.util.*;
import java.text.*;

public class Mortgage {
   public static void main(String[] args) {
      GregorianCalendar mortgage = new GregorianCalendar(1997, Calendar.MAY, 18);
      mortgage.add(Calendar.YEAR, 15);
      Date d = mortgage.getTime();
      DateFormat df = DateFormat.getDateInstance();
      String s = df.format(d);
      System.out.println("15 year mortgage amortized on " + s);    }
}

    add()一个重要的副作用是它改变的原来的日期。有时候,拥有原始日期和修改后的日期很重要。不q的是,你不能简单的创徏一个GregorianCalendar对象Q设|它和原来的相等QequalQ。原因是两个变量指向同一个Date()对象地址。如果Date对象改变Q两个变量就指向改变后的日期对象。代替这U做法,应该创徏一个新对象。下面的E序C了这U做法:

import java.util.*;
import java.text.*;

public class ThreeDates {
   public static void main(String[] args) {
      GregorianCalendar gc1 = new GregorianCalendar(2000, Calendar.JANUARY, 1);
      GregorianCalendar gc2 = gc1;
      GregorianCalendar gc3 = new GregorianCalendar(2000, Calendar.JANUARY, 1);
      //Three dates all equal to January 1, 2000

      gc1.add(Calendar.YEAR, 1);
      file://gc1 and gc2 are changed

      DateFormat df = DateFormat.getDateInstance();

      Date d1 = gc1.getTime();
      Date d2 = gc2.getTime();
      Date d3 = gc3.getTime();

      String s1 = df.format(d1);
      String s2 = df.format(d2);
      String s3 = df.format(d3);

      System.out.println("gc1 is " + s1);
      System.out.println("gc2 is " + s2);
      System.out.println("gc3 is " + s3);
   }
}

    E序q行后,gc1和gc2被变?001q_因ؓ两个对象指向同一个DateQ而Date已经被改变了Q。对象gc3指向一个单独的DateQ它没有被改变?br />计算复习日期
在这节,你将看到一个依据现实世界的例子。这个详l的E序计算q去一个具体的日期。例如,你阅读这文章,你想要记住一个印象深ȝ知识炏V如果你没有照片一L(fng)记忆力,你就要定期的复习q些新资料,q将帮助你记住它。关于复习系l,Kurt Hanks ?Gerreld L. Pulsipher在他们的< Five Secrets to Personal Productivity个h能力?个秘?gt;中有讨论Q徏议看q第一眼后马上回顾一下,然后?天后Q?个星期后Q?个月后,3个月后,1q后。我的这文章,你要马上回顾一下,从现在算P再就是明天,然后?个星期,1个月Q?个月Q?q后。我们的E序计这些日期?br />q个E序非常有用的,它将是PIM(Personal Information Manager个h信息理?的一个组成部分,q将定复习旉。在下面的程序中QgetDates()Ҏ(gu)对一个返回日期数l(复习日期Q的?sh)子软g很有用。另外,你可以返回单独的一个日期,使用getFirstDay(),getOneDay(),getOneWeek(),getOnMonth()和getOneYear().当时间范围超个PIM的ReviewDates的计范围时ReviewDatescLCZ怎样计算旉Dc现在,你可以容易的修改它用来处理你需要的旉D,象图书馆借书Q录影带U赁和抵D。首先,ReviewDatescLC在下面Q?/p>

import java.util.*;
import java.text.*;

public class ReviewDates {
   private GregorianCalendar firstDay, oneDay, oneWeek, oneMonth, oneQuarter, oneYear;
   final int dateArraySize = 6;

   ReviewDates(GregorianCalendar gcDate) {
      int year = gcDate.get(GregorianCalendar.YEAR);
      int month = gcDate.get(GregorianCalendar.MONTH);
      int date = gcDate.get(GregorianCalendar.DATE);

      firstDay = new GregorianCalendar(year, month, date);
      oneDay = new GregorianCalendar(year, month, date);
      oneWeek = new GregorianCalendar(year, month, date);
      oneMonth = new GregorianCalendar(year, month, date);
      oneQuarter = new GregorianCalendar(year, month, date);
      oneYear = new GregorianCalendar(year, month, date);

      oneDay.add(GregorianCalendar.DATE, 1);
      oneWeek.add(GregorianCalendar.DATE, 7);
      oneMonth.add(GregorianCalendar.MONTH, 1);
      oneQuarter.add(GregorianCalendar.MONTH, 3);
      oneYear.add(GregorianCalendar.YEAR, 1);
   }

   ReviewDates() {
      this(new GregorianCalendar());
   }

   public void listDates() {
      DateFormat df = DateFormat.getDateInstance(DateFormat.LONG);
      Date startDate = firstDay.getTime();
      Date date1 = oneDay.getTime();
      Date date2 = oneWeek.getTime();
      Date date3 = oneMonth.getTime();
      Date date4 = oneQuarter.getTime();
      Date date5 = oneYear.getTime();

      String ss =  df.format(startDate);
      String ss1 = df.format(date1);
      String ss2 = df.format(date2);
      String ss3 = df.format(date3);
      String ss4 = df.format(date4);
      String ss5 = df.format(date5);

      System.out.println("Start date is " + ss);
      System.out.println("Following review dates are:");
      System.out.println(ss1);
      System.out.println(ss2);
      System.out.println(ss3);
      System.out.println(ss4);
      System.out.println(ss5);
      System.out.println();
   }

   public GregorianCalendar[] getDates() {
      GregorianCalendar[] memoryDates = new GregorianCalendar[dateArraySize];
      memoryDates[0] = firstDay;
      memoryDates[1] = oneDay;
      memoryDates[2] = oneWeek;
      memoryDates[3] = oneMonth;
      memoryDates[4] = oneQuarter;
      memoryDates[5] = oneYear;
      return memoryDates;
   }

   public GregorianCalendar getFirstDay() {
      return this.firstDay;
   }

   public GregorianCalendar getOneDay() {
      return this.oneDay;
   }

   public GregorianCalendar getOneWeek() {
      return this.oneWeek;
   }

   public GregorianCalendar getOneMonth() {
      return this.oneMonth;
   }

   public GregorianCalendar getOneQuarter() {
      return this.oneQuarter;
   }

   public GregorianCalendar getOneYear() {
      return this.oneYear;
   }


下面是用ReviewDatescd出复习日期的例子E序Q?/p>

import java.util.*;

public class ShowDates {
   public static void main(String[] args) {
      ReviewDates rd = new ReviewDates();
      rd.listDates();

      GregorianCalendar gc = new GregorianCalendar(2001, Calendar.JANUARY, 15);
      ReviewDates jan15 = new ReviewDates(gc);
      jan15.listDates();
   }
}

ȝ
 q篇文章介绍了关于日期处理的3个重要的c:Date,DateFormat,GregorianCalendar.q些c让你创建日期,转换成字W串Q和计算日期基本元素。处理Java中的日期问题Q这文章只是冰׃角。可是,我在q里介绍的类和方法不仅仅是你学习高技术的xQ这些类和方法本w就可以处理很多通常的日期相关的d



Fisher 2007-01-04 15:27 发表评论
]]>
关于java模拟ie 讉Kweb|站的解x?/title><link>http://m.tkk7.com/fisher/articles/86926.html</link><dc:creator>Fisher</dc:creator><author>Fisher</author><pubDate>Mon, 11 Dec 2006 07:55:00 GMT</pubDate><guid>http://m.tkk7.com/fisher/articles/86926.html</guid><wfw:comment>http://m.tkk7.com/fisher/comments/86926.html</wfw:comment><comments>http://m.tkk7.com/fisher/articles/86926.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://m.tkk7.com/fisher/comments/commentRss/86926.html</wfw:commentRss><trackback:ping>http://m.tkk7.com/fisher/services/trackbacks/86926.html</trackback:ping><description><![CDATA[ <p>在用Java的HttpURLConnection 来下载网,发现讉Kgoogle的网站时Q会被google拒绝掉?br /><br />       try<br />        {<br />            url = new URL(urlStr);<br />            httpConn = (HttpURLConnection) url.openConnection();<br />            HttpURLConnection.setFollowRedirects(true);</p> <p>            // logger.info(httpConn.getResponseMessage());<br />            in = httpConn.getInputStream();<br />            out = new FileOutputStream(new File(outPath));</p> <p>            chByte = in.read();<br />            while (chByte != -1)<br />            {<br />                out.write(chByte);<br />                chByte = in.read();<br />            }<br />        }<br />        catch (MalformedURLException e)<br />        {<br />         }<br />        }<br /><br /><br /><br />l过一D|间的研究和查找资料,发现是由于上面的代码~少了一些必要的信息DQ增加更加详l的属?br /><br />            httpConn.setRequestMethod("GET"); <br />            httpConn.setRequestProperty("User-Agent","Mozilla/4.0 (compatible; MSIE 6.0; Windows 2000)"); <br /><br />完整代码如下Q?br />   public static void DownLoadPages(String urlStr, String outPath)<br />    {<br />        int chByte = 0;<br />        URL url = null;<br />        HttpURLConnection httpConn = null;<br />        InputStream in = null;<br />        FileOutputStream out = null;</p> <p>        try<br />        {<br />            url = new URL(urlStr);<br />            httpConn = (HttpURLConnection) url.openConnection();<br />            HttpURLConnection.setFollowRedirects(true);<br />            httpConn.setRequestMethod("GET"); <br />            httpConn.setRequestProperty("User-Agent","Mozilla/4.0 (compatible; MSIE 6.0; Windows 2000)"); <br />            <br />            // logger.info(httpConn.getResponseMessage());<br />            in = httpConn.getInputStream();<br />            out = new FileOutputStream(new File(outPath));</p> <p>            chByte = in.read();<br />            while (chByte != -1)<br />            {<br />                out.write(chByte);<br />                chByte = in.read();<br />            }<br />        }<br />        catch (MalformedURLException e)<br />        {<br />            e.printStackTrace();<br />        }<br />        catch (IOException e)<br />        {<br />            e.printStackTrace();<br />        }<br />        finally<br />        {<br />            try<br />            {<br />                out.close();<br />                in.close();<br />                httpConn.disconnect();<br />            }<br />            catch (Exception ex)<br />            {<br />                ex.printStackTrace();<br />            }<br />        }<br />    }<br /><br />此外Q还有第二种Ҏ(gu)可以讉KGoogle的网站,是用apache的一个工具HttpClient 模仿一个浏览器来访问Google<br /><br />        Document document = null;<br />        HttpClient httpClient = new HttpClient();<br />        <br />        GetMethod getMethod = new GetMethod(url);<br />        getMethod.setFollowRedirects(true);<br />        int statusCode = httpClient.executeMethod(getMethod);<br />        <br />        if (statusCode == HttpStatus.SC_OK)<br />        {<br />            InputStream in = getMethod.getResponseBodyAsStream();<br />            InputSource is = new InputSource(in);</p> <p>            DOMParser domParser = new DOMParser();   //nekoHtml 取得的|页转换成dom<br />            domParser.parse(is);<br />            document = domParser.getDocument();<br />            <br />            System.out.println(getMethod.getURI());<br />            <br />        }<br />        return document;<br /><br />推荐使用W一U方式,使用HttpConnection 比较轻量U,速度也比W二UHttpClient 的快?/p> <img src ="http://m.tkk7.com/fisher/aggbug/86926.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://m.tkk7.com/fisher/" target="_blank">Fisher</a> 2006-12-11 15:55 <a href="http://m.tkk7.com/fisher/articles/86926.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss> <footer> <div class="friendship-link"> <p>лǵվܻԴȤ</p> <a href="http://m.tkk7.com/" title="亚洲av成人片在线观看">亚洲av成人片在线观看</a> <div class="friend-links"> </div> </div> </footer> վ֩ģ壺 <a href="http://goodwaysi.com" target="_blank">޳߹ۿ</a>| <a href="http://xxzyyj.com" target="_blank">ۺϾþϵ</a>| <a href="http://gzmkqp.com" target="_blank">ʮ˽վ</a>| <a href="http://www-993789.com" target="_blank">ۺϾƷһ</a>| <a href="http://lfhotline.com" target="_blank">Ʒ޳AV߹ۿ</a>| <a href="http://91tapp.com" target="_blank">Ʒһ߹ۿ </a>| <a href="http://1877808.com" target="_blank">ձ˳Ļ </a>| <a href="http://020iws.com" target="_blank">þþƷAV鶹</a>| <a href="http://800141.com" target="_blank">ӰԺ</a>| <a href="http://shrongshan.com" target="_blank">ҹҹƵ</a>| <a href="http://yhanalati.com" target="_blank">0588ӰֻѿƬ</a>| <a href="http://yutuzb.com" target="_blank">aëƬѹۿ</a>| <a href="http://hljjlhl.com" target="_blank">þùѾƷ</a>| <a href="http://maiertejx.com" target="_blank">gayˬˬƵ</a>| <a href="http://by3142.com" target="_blank">޳AƬ߲</a>| <a href="http://youweidianqi.com" target="_blank">ŷղ</a>| <a href="http://www-135888.com" target="_blank">ҹδʮ</a>| <a href="http://726zh.com" target="_blank">av뾫ƷϼӰӰԺ</a>| <a href="http://tyfinland.com" target="_blank">˳ۺ</a>| <a href="http://952268.com" target="_blank">ղϵ</a>| <a href="http://zxbj0471.com" target="_blank">av2018</a>| <a href="http://1880531.com" target="_blank">ִִӲˬƵ</a>| <a href="http://binz132.com" target="_blank">Ʒ鶹Ѱ</a>| <a href="http://520xiang.com" target="_blank">ѹۿaƬ</a>| <a href="http://yuntuzy.com" target="_blank">һ߹ۿѸ߹ۿ</a>| <a href="http://cqkalai.com" target="_blank">99re߾ƷƵ</a>| <a href="http://wwwy6x22.com" target="_blank">ƵƬ߹ۿ</a>| <a href="http://vastraje.com" target="_blank">þùƷѿ</a>| <a href="http://www09191z.com" target="_blank">ƷѴƬ</a>| <a href="http://528676.com" target="_blank">þþѾƷre6</a>| <a href="http://ninggelang.com" target="_blank">ҹƵѹۿ</a>| <a href="http://www-474749.com" target="_blank">޾Ʒѹۿ</a>| <a href="http://mlhcd.com" target="_blank">ѹۿɫƵվbd</a>| <a href="http://jjwgzx.com" target="_blank">91鶹˳ѹۿ</a>| <a href="http://gepuw.com" target="_blank">Ұ</a>| <a href="http://www-ttyx.com" target="_blank">߹ۿɫƬƵ</a>| <a href="http://iguasheng.com" target="_blank"></a>| <a href="http://2c06xyz.com" target="_blank">Ʒ</a>| <a href="http://116com.com" target="_blank">ձһߵӰ </a>| <a href="http://006dh.com" target="_blank">Ƭѹۿþ</a>| <a href="http://www-070755.com" target="_blank">޾ƷɫƵ߹ۿԴ </a>| <script> (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })(); </script> </body>