﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>BlogJava-微蓝领域-随笔分类-J2EE</title><link>http://www.blogjava.net/hilor/category/25382.html</link><description>我的学习档案馆</description><language>zh-cn</language><lastBuildDate>Wed, 02 Jan 2008 23:39:51 GMT</lastBuildDate><pubDate>Wed, 02 Jan 2008 23:39:51 GMT</pubDate><ttl>60</ttl><item><title>FCKeditor(JAVA版)配置详解</title><link>http://www.blogjava.net/hilor/archive/2008/01/02/172190.html</link><dc:creator>hilor</dc:creator><author>hilor</author><pubDate>Wed, 02 Jan 2008 06:29:00 GMT</pubDate><guid>http://www.blogjava.net/hilor/archive/2008/01/02/172190.html</guid><wfw:comment>http://www.blogjava.net/hilor/comments/172190.html</wfw:comment><comments>http://www.blogjava.net/hilor/archive/2008/01/02/172190.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/hilor/comments/commentRss/172190.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/hilor/services/trackbacks/172190.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;FCKeditor 2.3.1 是功能完善的可视化编辑器，文件上传管理部分功能已经支持asp,php,aspx...等等，唯独尚未支持jsp，幸运的是Simone Chiaretta制作了Java 的整合文件FCKeditor.Java。 <br />
1. 下载最新版的FCKeditor <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;http://www.fckeditor.net/download/ <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;目前最新版是：FCKeditor_2.3.2（我用的是2.3.1）和 FCKeditor.Java <br />
（FCKeditor-2.3） <br />
2. 简介 <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;解压FCKeditor 2.3.1.zip后得到如下目录结构： <br />
FCKeditor_2.3.1 <br />
---editor <br />
&nbsp;&nbsp;&nbsp;&nbsp;---_source (有的资料说要删除此文件夹，删除将会出现很多初始化js错误) <br />
&nbsp;&nbsp;&nbsp;&nbsp;---css(样式) <br />
&nbsp;&nbsp;&nbsp;&nbsp;---dialog(editor所有的网页对话框都在这里了) <br />
&nbsp;&nbsp;&nbsp;&nbsp;---filemanager(文件上传管理部分) <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;---browser(存放用于浏览选择上传到服务器的文件，创建文件夹的浏览器) <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;---defult <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ---connectors(asp、php 、aspx等实现文件浏览、创建文件夹的文件。java项目中用 connectorservlet.Java实现,所以可以删除下面所有文件) <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;---upload(asp、php、aspx等实现文件上传时的文件，java项目中用 servlet实现上传，所以可以删除下面所有文件) <br />
&nbsp;&nbsp;&nbsp;&nbsp;---images(editor使用到的图片) <br />
&nbsp;&nbsp;&nbsp;&nbsp;---js <br />
&nbsp;&nbsp;&nbsp;&nbsp;---lang (存放用于支持多语言的js文件) <br />
&nbsp;&nbsp;&nbsp;&nbsp;---plugins(扩展插件) <br />
&nbsp;&nbsp;&nbsp;&nbsp;---skins(editor皮肤，2.3.1版有default、office 2003和silvers三种) <br />
fckconfig.js <br />
fckeditor.js <br />
fckstyles.xml <br />
fcktemplates.xml <br />
&#8230;.其余文件删掉即可 <br />
解压FCKeditor 2.3.zip后得到如下目录结构： <br />
FCKeditor_2.3 <br />
---docs <br />
&nbsp;&nbsp;&nbsp;&nbsp;---api(api文档,介绍了类的功能和配置方法) <br />
---src(java源文件) <br />
---web <br />
&nbsp;&nbsp;&nbsp;&nbsp;---_samples <br />
&nbsp;&nbsp;&nbsp;&nbsp;---web-inf <br />
&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;---lib(存放FCKeditor-2.3.jar 和Apache文件上传开源项目commons-fileupload.jar) <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Web.xml <br />
Build.xml <br />
Readme.txt <br />
<br />
3. demo <br />
我的开发环境是eclipse3.1和Myeclipse4.1，jdk1.5，resin-pro-3.0.18 <br />
&nbsp;&nbsp;&nbsp;&nbsp;3.1 建立一个webproject，命名为FCKeditor <br />
&nbsp;&nbsp;&nbsp;&nbsp;3.2 将FCKeditor_2.3.1下的editor文件夹和fckeditor.js,fckconfig.js,fckstyles.xml,fcktemplates.xml拷贝到FCKeditor/webroot下。 <br />
&nbsp;&nbsp;&nbsp;&nbsp;3.3 FCKeditor.java 2.3解压后，把其中的web目录下的WEB-INF目录copy到FCKeditor/webroot下(里面有commons-fileupload.jar, FCKeditor-2.3.jar,web.xml等几个文件), 再把其中的src目录下的FCKeditor.tld文件copy到FCKeditor/webroot/WEB-INF/下,_samples文件夹拷贝到FCKeditor/webroot/下。 <br />
&nbsp;&nbsp;&nbsp;&nbsp;3.4 修改web.xml和FCKeditor/webroot/editor/fckconfig.js: <br />
&lt;web-app&gt; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;display-name&gt;FCKeditor Test Application&lt;/display-name&gt; <br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;servlet&gt; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;servlet-name&gt;Connector&lt;/servlet-name&gt; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;servlet-class&gt;com.fredck.FCKeditor.connector.ConnectorServlet&lt;/servlet-class&gt; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;init-param&gt; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;param-name&gt;baseDir&lt;/param-name&gt; <br />
<span style="color: darkred">将在FCKeditor/editor/下创建Image和Flash文件夹，用于存放上传文件</span> <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;param-value&gt;/editor/&lt;/param-value&gt; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/init-param&gt; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;init-param&gt; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;param-name&gt;debug&lt;/param-name&gt; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;param-value&gt;false&lt;/param-value&gt;<span style="color: darkred">调试时设为true</span> <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/init-param&gt; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;load-on-startup&gt;1&lt;/load-on-startup&gt; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/servlet&gt; <br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;servlet&gt; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;servlet-name&gt;SimpleUploader&lt;/servlet-name&gt; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;servlet-class&gt;com.fredck.FCKeditor.uploader.SimpleUploaderServlet&lt;/servlet-class&gt; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;init-param&gt; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;param-name&gt;baseDir&lt;/param-name&gt; <br />
<span style="color: darkred">将在FCKeditor/editor/下创建Image和Flash文件夹，用于存放上传文件</span> <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;param-value&gt;/editor/&lt;/param-value&gt; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/init-param&gt; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;init-param&gt; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;param-name&gt;debug&lt;/param-name&gt; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;param-value&gt;true&lt;/param-value&gt;<span style="color: darkred">调试时设为true</span> <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/init-param&gt; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;init-param&gt; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;param-name&gt;enabled&lt;/param-name&gt; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;param-value&gt;true&lt;/param-value&gt;<span style="color: darkred">修改成true</span> <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/init-param&gt; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;init-param&gt; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;param-name&gt;AllowedExtensionsFile&lt;/param-name&gt; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;param-value&gt;&lt;/param-value&gt; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/init-param&gt; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;init-param&gt; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;param-name&gt;DeniedExtensionsFile&lt;/param-name&gt; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;param-value&gt;php|php3|php5|phtml|asp|aspx|ascx|jsp|cfm|cfc|pl|bat|exe|dll|reg|cgi&lt;/param-value&gt; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/init-param&gt; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;init-param&gt; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;param-name&gt;AllowedExtensionsImage&lt;/param-name&gt; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;param-value&gt;jpg|gif|jpeg|png|bmp&lt;/param-value&gt; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/init-param&gt; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;init-param&gt; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;param-name&gt;DeniedExtensionsImage&lt;/param-name&gt; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;param-value&gt;&lt;/param-value&gt; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/init-param&gt; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;init-param&gt; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;param-name&gt;AllowedExtensionsFlash&lt;/param-name&gt; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;param-value&gt;swf|fla&lt;/param-value&gt; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/init-param&gt; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;init-param&gt; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;param-name&gt;DeniedExtensionsFlash&lt;/param-name&gt; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;param-value&gt;&lt;/param-value&gt; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/init-param&gt; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;load-on-startup&gt;1&lt;/load-on-startup&gt; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/servlet&gt; <br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;servlet-mapping&gt; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;servlet-name&gt;Connector&lt;/servlet-name&gt; <br />
<span style="color: darkred">和fckconfig.js的ImageBrowserURL等对应</span> <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;url-pattern&gt;/editor/filemanager/browser/default/connectors/jsp/connector&lt;/url-pattern&gt; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/servlet-mapping&gt; <br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;servlet-mapping&gt; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;servlet-name&gt;SimpleUploader&lt;/servlet-name&gt; <br />
<span style="color: darkred">这里你可以按自己应用具体配置，需要和fckconfig.js的ImageUploadUrl等对应</span> <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;url-pattern&gt;/editor/upload.do&lt;/url-pattern&gt; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/servlet-mapping&gt; <br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;welcome-file-list&gt;<span style="color: darkred">配置欢迎文件</span> <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;welcome-file&gt;_samples/index.jsp&lt;/welcome-file&gt; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/welcome-file-list&gt; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;taglib&gt; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;taglib-uri&gt;/etag&lt;/taglib-uri&gt;<span style="color: darkred">配置FCKeditor自定义标签</span> <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;taglib-location&gt;/web-inf/FCKeditor.tld&lt;/taglib-location&gt; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/taglib&gt; <br />
<br />
&lt;/web-app&gt; <br />
&nbsp;&nbsp; <br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: darkred">修改 fckconfig.js中:</span> <br />
FCKConfig.DefaultLanguage = 'zh-cn' ; <span style="color: darkred">修改默认语言为简体中文</span> <br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;把FCKConfig.LinkBrowserURL等的值替换成以下内容： <br />
<br />
FCKConfig.LinkBrowserURL = FCKConfig.BasePath + "filemanager/browser/default/browser.html?Connector=connectors/" + _FileBrowserLanguage + "/connector" <br />
<br />
FCKConfig.ImageBrowserURL = FCKConfig.BasePath + "filemanager/browser/default/browser.html?Type=Image&amp;Connector=connectors/" + _FileBrowserLanguage + "/connector"; <br />
<br />
FCKConfig.FlashBrowserURL = FCKConfig.BasePath + "filemanager/browser/default/browser.html?Type=Flash&amp;Connector=connectors/" + _FileBrowserLanguage + "/connector"; <br />
<br />
FCKConfig.LinkUploadURL = FCKConfig.BasePath + "filemanager/upload/" + _QuickUploadLanguage + "/connector?Type=File"; <br />
<br />
FCKConfig.ImageUploadURL=FCKConfig.BasePath + "upload.do?Type=Image"; <br />
<br />
FCKConfig.FlashUploadURL=FCKConfig.BasePath+ "upload.do?Type=Flash"; <br />
<span style="color: darkred">Connector参数的值完全可以修改，只要和web.xml中配置一致即可</span>&nbsp;<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;3.5&nbsp;&nbsp;&nbsp;&nbsp;有的例子说必须在FCKeditor/webroot/editor/下手工新建Image和Flash两个文件夹，FCKeditor不会自己创建文件上传的文件夹，否则无法上传文件，将提示无权操作，在java应用下无需自己创建，ConnectorServlet会在你第一次执行文件浏览时，根据url的type参数，判断baseDir下是否存在以type值为名字的文件夹，不存在就创建它。 <br />
<br />
3.6&nbsp; FCKConfig.TabSpaces = 0 ; 改为FCKConfig.TabSpaces = 1 ; 即在编辑器域内可以使用Tab键。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;找到： FCKConfig.FontNames = 'Arial;Comic Sans MS;Courier New;Tahoma;Times New Roman;Verdana' ;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 加上几种我们常用的字体 <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; FCKConfig.FontNames <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; = '宋体;黑体;隶书;楷体_GB2312;Arial;Comic Sans MS;Courier New;Tahoma;Times New Roman;Verdana' ;<br />
<br />
<img src ="http://www.blogjava.net/hilor/aggbug/172190.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/hilor/" target="_blank">hilor</a> 2008-01-02 14:29 <a href="http://www.blogjava.net/hilor/archive/2008/01/02/172190.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>引入外部JS发生错语的解决方法</title><link>http://www.blogjava.net/hilor/archive/2008/01/02/172137.html</link><dc:creator>hilor</dc:creator><author>hilor</author><pubDate>Wed, 02 Jan 2008 04:18:00 GMT</pubDate><guid>http://www.blogjava.net/hilor/archive/2008/01/02/172137.html</guid><wfw:comment>http://www.blogjava.net/hilor/comments/172137.html</wfw:comment><comments>http://www.blogjava.net/hilor/archive/2008/01/02/172137.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/hilor/comments/commentRss/172137.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/hilor/services/trackbacks/172137.html</trackback:ping><description><![CDATA[<p>今天碰到一个问题, 引入外部JS文件发生错误...&nbsp;&nbsp; 经过DBUG, 发现原来又是编码问题,&nbsp; JS文件里出现中文, 就要注意编码了..&nbsp; 把JS存为UTF-8, 然后导入时设置charset=UTF-8<br />
&lt;script language="javascript" type="text/javascript" src="/test/test.js" charset="UTF-8"&gt;&lt;/script&gt;</p>
<img src ="http://www.blogjava.net/hilor/aggbug/172137.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/hilor/" target="_blank">hilor</a> 2008-01-02 12:18 <a href="http://www.blogjava.net/hilor/archive/2008/01/02/172137.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>apache2.X版与Tomcat5.X整合</title><link>http://www.blogjava.net/hilor/archive/2007/11/01/157496.html</link><dc:creator>hilor</dc:creator><author>hilor</author><pubDate>Thu, 01 Nov 2007 07:05:00 GMT</pubDate><guid>http://www.blogjava.net/hilor/archive/2007/11/01/157496.html</guid><wfw:comment>http://www.blogjava.net/hilor/comments/157496.html</wfw:comment><comments>http://www.blogjava.net/hilor/archive/2007/11/01/157496.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/hilor/comments/commentRss/157496.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/hilor/services/trackbacks/157496.html</trackback:ping><description><![CDATA[下面来简述一下,我配置的过程,准备工作如下: &nbsp;关于apache2.X版与Tomcat5.X整合的技术文档,在网上找了两天,大部分都是指定使用apache2.08+tomcat5.0.16+mod_jk2.dll什么的,我用其它版本的怎样试也不行,无奈之余,就又到网上四处找tomcat5.0.16版,TOMCAT官方网站没有下载了,其实我是步入了一个误区,其实尽信书则不如无书,TOMCAT无论用哪个版本,高版本大部分都兼容低版本的功能.希望各位以后网上资料参考就好了,最主要是看开源的帮助文档才最重要,不过是E文的,慢慢看吧,带个金山词霸.^_^ 闲话少说,言归正传,下面介绍我的配置步骤吧! &nbsp; 前提准备工作及配置环境如下: 操作系统是,WINDOWS2K SERVICE版 jdk1.5(其实什么版本也无所谓了,1.4以上都行) TOMCAT5.0.19.exe文件,在TOMCAT官方网也没有下载了,我以前下载的,要的话,可以发邮件给我,(5.0版本都无所谓了) apache_2.0.49-win32-x86-no_ssl.msi apache服务器(这个apache版本,因apache我不太熟,限不限定版本号,没有测试过) 下载网址:http://archive.apache.org/dist/httpd/binaries/win32/ jakarta-tomcat-connectors-jk2.0.4-win32-apache2.0.49.zip(TOMCAT5与APACHE2 plus)//这个中间件在apache官方网有下载下载网址:http://archive.apache.org/dist/tomcat/tomcat-connectors/jk2/binaries/win32/ 1.&nbsp;&nbsp;&nbsp; 安装并测试Apache和TomCat5.0；注意事项： Apache默认端口为80，与IIS冲突，更改端口或关闭IIS, TomCat安装完后配置环境变量。 2.&nbsp;&nbsp;&nbsp; 开始整合；首先，先把jakarta-tomcat-connectors-jk2.0.4-win32-apache2.0.49.zip解压后,从modules目录中取出来mod_jk2.so文件,复制到,apache安装根目录/apache2/modules/目录下. 其次，编辑配置文件。具体的配置文件有四个，它们分别是：httpd.conf、jk2.properties、server.xml、workers2.properties。 我的配置如下: a、 修改ApacheRoot\Apache2\conf\httpd.conf 文件 1&gt;修改web 主目录，即将 DocumentRoot "D:/websrv/Apache2/htdocs" 改为自己的web主目录 eg:&nbsp;&nbsp;&nbsp;&nbsp; DocumentRoot&nbsp;&nbsp;&nbsp; "D:/test/jsptest" 2&gt;修改web 主目录对应的目录，即将 &lt;Directory "D:/websrv/Apache2/htdocs"&gt;改为 eg:&nbsp;&nbsp;&nbsp;&nbsp; &lt;Directory "D:/test/jsptest" &gt; 此目录块要与DocumentRoot的路径对应,块中的语法是对此块对应Web主目录的操作权限设置。 3&gt;修改目录缺省的web文件，即将 DirectoryIndex index.html index.html.var 改为 eg:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; DirectoryIndex index.html index.html.var index.jsp 语法说明：当向Apache 发出请求时容器将顺次去找index.html,如果没有，将接着找index.htm,最后找index.jsp。 4&gt;修改cgi-bin 所在目录，即将 ScriptAlias /cgi-bin/ "D:/websrv/Apache2/cgi-bin/"改为 ScriptAlias /cgi-bin/ "D:/test/jsptest/cgi-bin/" &lt;Directory "D:/websrv/Apache2/cgi-bin"&gt; 改为 &lt;Directory "D:/test/jsptest/cgi-bin"&gt; 如果程序中需要用到cgi时修改以上两处。 5&gt;添加指定的虚拟目录(别名)，及其对应目录的属性 #这是测试用的文件夹，能执行jsp 文件。 Alias&nbsp; /jmmis/&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "D:/test/jsptest/jmmis/" &lt;Directory&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "D:/test/jsptest/jmmis" &gt; AllowOverride None Options IncludesNoExec AddOutputFilter Includes html AddHandler type-map var Order allow,deny Allow from all &lt;/Directory&gt; &nbsp;&nbsp;&nbsp; #在web主目录jsptest中添加了jmmis目录语法说明： &nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Alias&nbsp; /web程序别名/&nbsp;&nbsp;&nbsp;&nbsp; "程序根目录/"&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ##别忘啦最后有&#8220;/&#8221; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;Directory&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "程序根目录" &gt; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; AllowOverride None &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Options IncludesNoExec &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; AddOutputFilter Includes html&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 对此程序的具体操作权限设置&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; AddHandler type-map var&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Order allow,deny &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Allow from all &lt;/Directory&gt; 注意： &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 程序根目录必须和%Tomcat5%\conf\server.xml中配置的虚拟目录相吻合。 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 6&gt;添加默认字符集的设置 &nbsp;&nbsp;AddDefaultCharset GB2312 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 7&gt;在文件最后添加如下内容，以加载jk2 模块 &nbsp;&nbsp;&nbsp; &lt;IfModule !mod_jk2.c&gt; LoadModule jk2_module modules/mod_jk2.so &lt;/IfModule&gt; 以上都是配置httpd.conf Apache服务器的东西! 接下来配JK2了 JK2指定一个worker2.properties文件存放路径为就是SERVERROOT/conf 这里的serverroot 是apache的安装目录原JK2帮助文档显示如下所示 workers2.properties is used on the webserver side. For the Apache servers the default path is in the ServerRoot/conf directory. worker2.properties文件如下: [shm] info=Scoreboard. Requried for reconfiguration and status with multiprocess servers. file=anon # Defines a load balancer named lb. Use even if you only have one machine. [lb:lb] # Example socket channel, override port and host. [channel.socket:localhost:8019] port=8019 host=127.0.0.1 # define the worker [ajp13:localhost:8019] channel=channel.socket:localhost:8019 group=lb # Map the Tomcat examples webapp to the Web server uri space [uri:/*.jsp] group=lb [uri:/Servlet/*] group=lb [status:] info=Status worker, displays runtime information [uri:/jkstatus/*] info=The Tomcat /jkstatus handler group=status: 接着修改JK2.properties文件,默认不用作什么修改, TOMCAT5/conf的jk2.properties文件不需太多修改, &nbsp;jk2的属性文件如下 &nbsp;## THIS FILE MAY BE OVERRIDEN AT RUNTIME. MAKE SURE TOMCAT IS STOPED ## WHEN YOU EDIT THE FILE. ## COMMENTS WILL BE _LOST_ ## DOCUMENTATION OF THE FORMAT IN JkMain javadoc. &nbsp;#Set the desired handler list &nbsp;handler.list=apr,request,channelJni # # Override the default port for the socketChannel &nbsp;channelSocket.port=8019 # Default: # channelUnix.file=${jkHome}/work/jk2.socket # Just to check if the the config&nbsp; is working # shm.file=${jkHome}/work/jk2.shm # In order to enable jni use any channelJni directive # channelJni.disabled = 0 # And one of the following directives: #apr.NativeSo=/home1/jakarta/jakarta-tomcat-connectors/jk/build/jk2/apache2/jkjni.so &nbsp;apr.jniModeSo=/ApacheRoot/apache2/modules/mod_jk2.so #apr.jniModeSo=C:/Apache/Apache2/modules/mod_jk2.so # If set to inprocess the mod_jk2 will Register natives itself # This will enable the starting of the Tomcat from mod_jk2 &nbsp;apr.jniModeSo=inprocess #Shared memory directive shm.file=C:/Apache/Apache2/logs/jk2.shm 修改TOMCAT下/conf目录下的server.xml文件 保持通信管道端口号一致与worker2.properties文件中, # define the worker [ajp13:localhost:8019] channel=channel.socket:localhost:8019 所定义的8019一致 &lt;Connector port="8019" &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; enableLookups="true" redirectPort="8443" debug="0" &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; protocol="AJP/1.3" /&gt; 同时在&lt;/host&gt;位置增加虚拟目录 &nbsp;&lt;Context path="/jmmis" docBase="D:/test/jsptest/jmmis" debug="0" reloadable="true" crossContext="true"&gt;&lt;/Context&gt; 这里也许会报警告信息,修改 TOMCAT/CONF/下的server-minimal.xml的文件,把默认的8009修改为8019 以上修改完成后,重启APACHE TOMCAT就大功告成了! <br />
<font face="Times New Roman" size="3">下面来简述一下,我配置的过程,准备工作如下:<br />
&nbsp;关于apache2.X版与Tomcat5.X整合的技术文档,在网上找了两天,大部分都是指定使用apache2.08+tomcat5.0.16+mod_jk2.dll什么的,我用其它版本的怎样试也不行,无奈之余,就又到网上四处找tomcat5.0.16版,TOMCAT官方网站没有下载了,其实我是步入了一个误区,其实尽信书则不如无书,TOMCAT无论用哪个版本,高版本大部分都兼容低版本的功能.希望各位以后网上资料参考就好了,最主要是看开源的帮助文档才最重要,不过是E文的,慢慢看吧,带个金山词霸.^_^ 闲话少说,言归正传,下面介绍我的配置步骤吧!<br />
&nbsp;<br />
前提准备工作及配置环境如下:<br />
操作系统是,WINDOWS2K SERVICE版<br />
jdk1.5(其实什么版本也无所谓了,1.4以上都行)<br />
TOMCAT5.0.19.exe文件,在TOMCAT官方网也没有下载了,我以前下载的,要的话,可以发邮件给我,(5.0版本都无所谓了)<br />
apache_2.0.49-win32-x86-no_ssl.msi apache服务器(这个apache版本,因apache我不太熟,限不限定版本号,没有测试过)<br />
下载网址:http://archive.apache.org/dist/httpd/binaries/win32/</font>
<pre><font face="Times New Roman" size="4">jakarta-tomcat-connectors-jk2.0.4-win32-apache2.0.49.zip(TOMCAT5与APACHE2 plus)//这个中间件在apache官方网有下载<br />
下载网址:http://archive.apache.org/dist/tomcat/tomcat-connectors/jk2/binaries/win32/<br />
1.&nbsp;&nbsp;&nbsp; 安装并测试Apache和TomCat5.0；<br />
注意事项： Apache默认端口为80，与IIS冲突，更改端口或关闭IIS,<br />
TomCat安装完后配置环境变量。<br />
2.&nbsp;&nbsp;&nbsp; 开始整合；<br />
首先，先把jakarta-tomcat-connectors-jk2.0.4-win32-apache2.0.49.zip解压后,从modules目录中取出来mod_jk2.so文件,复制到,apache安装根目录/apache2/modules/目录下.</font></pre>
<pre><font face="Times New Roman" size="4">其次，编辑配置文件。具体的配置文件有四个，<br />
它们分别是：httpd.conf、jk2.properties、server.xml、workers2.properties。</font></pre>
<pre><br />
<font face="Times New Roman" size="4">我的配置如下:</font></pre>
<pre><br />
<font face="Times New Roman" size="4">a、 修改ApacheRoot\Apache2\conf\httpd.conf 文件<br />
1&gt;修改web 主目录，即将<br />
DocumentRoot "D:/websrv/Apache2/htdocs" 改为自己的web主目录<br />
eg:&nbsp;&nbsp;&nbsp;&nbsp; DocumentRoot&nbsp;&nbsp;&nbsp; "D:/test/jsptest"<br />
2&gt;修改web 主目录对应的目录，即将<br />
&lt;Directory "D:/websrv/Apache2/htdocs"&gt;改为<br />
eg:&nbsp;&nbsp;&nbsp;&nbsp; &lt;Directory "D:/test/jsptest" &gt;<br />
此目录块要与DocumentRoot的路径对应,块中的语法是对此块对应Web主目录的操作权限设置。<br />
3&gt;修改目录缺省的web文件，即将<br />
DirectoryIndex index.html index.html.var 改为<br />
eg:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; DirectoryIndex index.html index.html.var index.jsp<br />
语法说明：当向Apache 发出请求时容器将顺次去找index.html,如果没有，将接着找index.htm,最后找index.jsp。<br />
4&gt;修改cgi-bin 所在目录，即将<br />
ScriptAlias /cgi-bin/ "D:/websrv/Apache2/cgi-bin/"改为<br />
ScriptAlias /cgi-bin/ "D:/test/jsptest/cgi-bin/"<br />
&lt;Directory "D:/websrv/Apache2/cgi-bin"&gt; 改为<br />
&lt;Directory "D:/test/jsptest/cgi-bin"&gt;<br />
如果程序中需要用到cgi时修改以上两处。<br />
5&gt;添加指定的虚拟目录(别名)，及其对应目录的属性<br />
#这是测试用的文件夹，能执行jsp 文件。<br />
Alias&nbsp; /jmmis/&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "D:/test/jsptest/jmmis/"<br />
&lt;Directory&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "D:/test/jsptest/jmmis" &gt;<br />
AllowOverride None<br />
Options IncludesNoExec<br />
AddOutputFilter Includes html<br />
AddHandler type-map var<br />
Order allow,deny<br />
Allow from all<br />
&lt;/Directory&gt;</font></pre>
<pre><font face="Times New Roman" size="4">&nbsp;&nbsp;&nbsp; <br />
#在web主目录jsptest中添加了jmmis目录<br />
语法说明：<br />
&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Alias&nbsp; /web程序别名/&nbsp;&nbsp;&nbsp;&nbsp; "程序根目录/"&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ##别忘啦最后有&#8220;/&#8221;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;Directory&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "程序根目录" &gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; AllowOverride None<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Options IncludesNoExec<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; AddOutputFilter Includes html&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 对此程序的具体操作权限设置&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; AddHandler type-map var&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Order allow,deny<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Allow from all<br />
&lt;/Directory&gt;<br />
注意：<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 程序根目录必须和%Tomcat5%\conf\server.xml中配置的虚拟目录相吻合。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 6&gt;添加默认字符集的设置<br />
&nbsp;&nbsp;AddDefaultCharset GB2312<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 7&gt;在文件最后添加如下内容，以加载jk2 模块<br />
&nbsp;&nbsp;&nbsp; <br />
&lt;IfModule !mod_jk2.c&gt;<br />
LoadModule jk2_module modules/mod_jk2.so<br />
&lt;/IfModule&gt;</font></pre>
以上都是配置httpd.conf Apache服务器的东西!</font>
<pre></pre>
<pre><font face="Times New Roman" size="4">接下来配JK2了<br />
JK2指定一个worker2.properties文件<br />
存放路径为就是SERVERROOT/conf<br />
这里的serverroot 是apache的安装目录<br />
原JK2帮助文档显示如下所示<br />
workers2.properties is used on the webserver side. For the Apache servers the default path is in the ServerRoot/conf directory. </font></pre>
<pre><font face="Times New Roman" size="4">worker2.properties文件如下:</font></pre>
<pre><font face="Times New Roman" size="4"></font></pre>
<pre><br />
<font face="Times New Roman" size="4">[shm]<br />
info=Scoreboard. Requried for reconfiguration and status with multiprocess servers.<br />
file=anon</font></pre>
<pre><font face="Times New Roman" size="4"># Defines a load balancer named lb. Use even if you only have one machine.<br />
[lb:lb]</font></pre>
<pre><font face="Times New Roman" size="4"># Example socket channel, override port and host.<br />
[channel.socket:localhost:8019]<br />
port=8019<br />
host=127.0.0.1</font></pre>
<pre><font face="Times New Roman" size="4"># define the worker<br />
[ajp13:localhost:8019]<br />
channel=channel.socket:localhost:8019<br />
group=lb</font></pre>
<pre><font face="Times New Roman" size="4"># Map the Tomcat examples webapp to the Web server uri space<br />
[uri:/*.jsp]<br />
group=lb<br />
[uri:/Servlet/*]<br />
group=lb<br />
[status:]<br />
info=Status worker, displays runtime information</font></pre>
<pre><font face="Times New Roman" size="4">[uri:/jkstatus/*]<br />
info=The Tomcat /jkstatus handler<br />
group=status:</font></pre>
<pre><font face="Times New Roman" size="4">接着修改JK2.properties文件,默认不用作什么修改,<br />
TOMCAT5/conf的jk2.properties文件不需太多修改,<br />
&nbsp;jk2的属性文件如下</font></pre>
<pre><font face="Times New Roman" size="4">&nbsp;## THIS FILE MAY BE OVERRIDEN AT RUNTIME. MAKE SURE TOMCAT IS STOPED<br />
## WHEN YOU EDIT THE FILE.</font></pre>
<pre><font face="Times New Roman" size="4">## COMMENTS WILL BE _LOST_</font></pre>
<pre><font face="Times New Roman" size="4">## DOCUMENTATION OF THE FORMAT IN JkMain javadoc.</font></pre>
<pre><font face="Times New Roman" size="4">&nbsp;#Set the desired handler list<br />
&nbsp;handler.list=apr,request,channelJni<br />
#<br />
# Override the default port for the socketChannel<br />
&nbsp;channelSocket.port=8019<br />
# Default: <br />
# channelUnix.file=${jkHome}/work/jk2.socket<br />
# Just to check if the the config&nbsp; is working<br />
# shm.file=${jkHome}/work/jk2.shm</font></pre>
<pre><font face="Times New Roman" size="4"># In order to enable jni use any channelJni directive<br />
# channelJni.disabled = 0<br />
# And one of the following directives:<br />
#apr.NativeSo=/home1/jakarta/jakarta-tomcat-connectors/jk/build/jk2/apache2/jkjni.so</font></pre>
<pre><font face="Times New Roman" size="4">&nbsp;apr.jniModeSo=/ApacheRoot/apache2/modules/mod_jk2.so<br />
#apr.jniModeSo=C:/Apache/Apache2/modules/mod_jk2.so<br />
# If set to inprocess the mod_jk2 will Register natives itself<br />
# This will enable the starting of the Tomcat from mod_jk2<br />
&nbsp;apr.jniModeSo=inprocess<br />
#Shared memory directive<br />
shm.file=C:/Apache/Apache2/logs/jk2.shm</font></pre>
<pre><font face="Times New Roman" size="4">修改TOMCAT下/conf目录下的server.xml文件</font></pre>
<pre><br />
<font face="Times New Roman" size="4">保持通信管道端口号一致<br />
与worker2.properties文件中,<br />
# define the worker<br />
[ajp13:localhost:8019]<br />
channel=channel.socket:localhost:8019<br />
所定义的8019一致<br />
&lt;Connector port="8019" <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; enableLookups="true" redirectPort="8443" debug="0"<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; protocol="AJP/1.3" /&gt;</font></pre>
<pre><font face="Times New Roman" size="4">同时在&lt;/host&gt;位置增加虚拟目录</font></pre>
<pre>&nbsp;&lt;Context path="/jmmis" docBase="D:/test/jsptest/jmmis" debug="0" reloadable="true"<br />
crossContext="true"&gt;&lt;/Context&gt;</pre>
<pre><font face="Times New Roman" size="4"></font></pre>
<pre><font face="Times New Roman" size="4">这里也许会报警告信息,修改 TOMCAT/CONF/下的server-minimal.xml的文件,把默认的8009修改为8019</font></pre>
<pre><font face="Times New Roman" size="4">以上修改完成后,重启APACHE TOMCAT就大功告成了!</font></pre>
<img src ="http://www.blogjava.net/hilor/aggbug/157496.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/hilor/" target="_blank">hilor</a> 2007-11-01 15:05 <a href="http://www.blogjava.net/hilor/archive/2007/11/01/157496.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>DES加密解密算法</title><link>http://www.blogjava.net/hilor/archive/2007/10/30/156986.html</link><dc:creator>hilor</dc:creator><author>hilor</author><pubDate>Tue, 30 Oct 2007 09:09:00 GMT</pubDate><guid>http://www.blogjava.net/hilor/archive/2007/10/30/156986.html</guid><wfw:comment>http://www.blogjava.net/hilor/comments/156986.html</wfw:comment><comments>http://www.blogjava.net/hilor/archive/2007/10/30/156986.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/hilor/comments/commentRss/156986.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/hilor/services/trackbacks/156986.html</trackback:ping><description><![CDATA[<p>import java.security.Key;<br />
import java.security.Security;</p>
<p>import javax.crypto.Cipher;</p>
<p>/**<br />
&nbsp;* @author aujlure<br />
&nbsp;*&nbsp;加密解密<br />
&nbsp;*/<br />
public class DESPlus {<br />
&nbsp;private static String strDefaultKey = "hilor";&nbsp;//默认密钥</p>
<p>&nbsp;private Cipher encryptCipher = null;</p>
<p>&nbsp;private Cipher decryptCipher = null;</p>
<p>&nbsp;/**<br />
&nbsp; * 将byte数组转换为表示16进制值的字符串， 如：byte[]{8,18}转换为：0813， 和public static byte[]<br />
&nbsp; * hexStr2ByteArr(String strIn) 互为可逆的转换过程<br />
&nbsp; * <br />
&nbsp; * @param arrB<br />
&nbsp; *&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 需要转换的byte数组<br />
&nbsp; * @return 转换后的字符串<br />
&nbsp; * @throws Exception<br />
&nbsp; *&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 本方法不处理任何异常，所有异常全部抛出<br />
&nbsp; */<br />
&nbsp;public static String byteArr2HexStr(byte[] arrB) throws Exception {<br />
&nbsp;&nbsp;int iLen = arrB.length;<br />
&nbsp;&nbsp;// 每个byte用两个字符才能表示，所以字符串的长度是数组长度的两倍<br />
&nbsp;&nbsp;StringBuffer sb = new StringBuffer(iLen * 2);<br />
&nbsp;&nbsp;for (int i = 0; i &lt; iLen; i++) {<br />
&nbsp;&nbsp;&nbsp;int intTmp = arrB[i];<br />
&nbsp;&nbsp;&nbsp;// 把负数转换为正数<br />
&nbsp;&nbsp;&nbsp;while (intTmp &lt; 0) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;intTmp = intTmp + 256;<br />
&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;// 小于0F的数需要在前面补0<br />
&nbsp;&nbsp;&nbsp;if (intTmp &lt; 16) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;sb.append("0");<br />
&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;sb.append(Integer.toString(intTmp, 16));<br />
&nbsp;&nbsp;}<br />
&nbsp;&nbsp;return sb.toString();<br />
&nbsp;}</p>
<p>&nbsp;/**<br />
&nbsp; * 将表示16进制值的字符串转换为byte数组， 和public static String byteArr2HexStr(byte[] arrB)<br />
&nbsp; * 互为可逆的转换过程<br />
&nbsp; * <br />
&nbsp; * @param strIn<br />
&nbsp; *&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 需要转换的字符串<br />
&nbsp; * @return 转换后的byte数组<br />
&nbsp; * @throws Exception<br />
&nbsp; *&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 本方法不处理任何异常，所有异常全部抛出<br />
&nbsp; * @author &lt;a href="mailto:leo841001@163.com"&gt;LiGuoQing&lt;/a&gt;<br />
&nbsp; */<br />
&nbsp;public static byte[] hexStr2ByteArr(String strIn) throws Exception {<br />
&nbsp;&nbsp;byte[] arrB = strIn.getBytes();<br />
&nbsp;&nbsp;int iLen = arrB.length;</p>
<p>&nbsp;&nbsp;// 两个字符表示一个字节，所以字节数组长度是字符串长度除以2<br />
&nbsp;&nbsp;byte[] arrOut = new byte[iLen / 2];<br />
&nbsp;&nbsp;for (int i = 0; i &lt; iLen; i = i + 2) {<br />
&nbsp;&nbsp;&nbsp;String strTmp = new String(arrB, i, 2);<br />
&nbsp;&nbsp;&nbsp;arrOut[i / 2] = (byte) Integer.parseInt(strTmp, 16);<br />
&nbsp;&nbsp;}<br />
&nbsp;&nbsp;return arrOut;<br />
&nbsp;}</p>
<p>&nbsp;/**<br />
&nbsp; * 默认构造方法，使用默认密钥<br />
&nbsp; * <br />
&nbsp; * @throws Exception<br />
&nbsp; */<br />
&nbsp;public DESPlus() throws Exception {<br />
&nbsp;&nbsp;this(strDefaultKey);<br />
&nbsp;}</p>
<p>&nbsp;/**<br />
&nbsp; * 指定密钥构造方法<br />
&nbsp; * <br />
&nbsp; * @param strKey<br />
&nbsp; *&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 指定的密钥<br />
&nbsp; * @throws Exception<br />
&nbsp; */<br />
&nbsp;public DESPlus(String strKey) throws Exception {<br />
&nbsp;&nbsp;Security.addProvider(new com.sun.crypto.provider.SunJCE());<br />
&nbsp;&nbsp;Key key = getKey(strKey.getBytes());</p>
<p>&nbsp;&nbsp;encryptCipher = Cipher.getInstance("DES");<br />
&nbsp;&nbsp;encryptCipher.init(Cipher.ENCRYPT_MODE, key);</p>
<p>&nbsp;&nbsp;decryptCipher = Cipher.getInstance("DES");<br />
&nbsp;&nbsp;decryptCipher.init(Cipher.DECRYPT_MODE, key);<br />
&nbsp;}</p>
<p>&nbsp;/**<br />
&nbsp; * 加密字节数组<br />
&nbsp; * <br />
&nbsp; * @param arrB<br />
&nbsp; *&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 需加密的字节数组<br />
&nbsp; * @return 加密后的字节数组<br />
&nbsp; * @throws Exception<br />
&nbsp; */<br />
&nbsp;public byte[] encrypt(byte[] arrB) throws Exception {<br />
&nbsp;&nbsp;return encryptCipher.doFinal(arrB);<br />
&nbsp;}</p>
<p>&nbsp;/**<br />
&nbsp; * 加密字符串<br />
&nbsp; * <br />
&nbsp; * @param strIn<br />
&nbsp; *&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 需加密的字符串<br />
&nbsp; * @return 加密后的字符串<br />
&nbsp; * @throws Exception<br />
&nbsp; */<br />
&nbsp;public String encrypt(String strIn) throws Exception {<br />
&nbsp;&nbsp;return byteArr2HexStr(encrypt(strIn.getBytes()));<br />
&nbsp;}</p>
<p>&nbsp;/**<br />
&nbsp; * 解密字节数组<br />
&nbsp; * <br />
&nbsp; * @param arrB<br />
&nbsp; *&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 需解密的字节数组<br />
&nbsp; * @return 解密后的字节数组<br />
&nbsp; * @throws Exception<br />
&nbsp; */<br />
&nbsp;public byte[] decrypt(byte[] arrB) throws Exception {<br />
&nbsp;&nbsp;return decryptCipher.doFinal(arrB);<br />
&nbsp;}</p>
<p>&nbsp;/**<br />
&nbsp; * 解密字符串<br />
&nbsp; * <br />
&nbsp; * @param strIn<br />
&nbsp; *&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 需解密的字符串<br />
&nbsp; * @return 解密后的字符串<br />
&nbsp; * @throws Exception<br />
&nbsp; */<br />
&nbsp;public String decrypt(String strIn) throws Exception {<br />
&nbsp;&nbsp;return new String(decrypt(hexStr2ByteArr(strIn)));<br />
&nbsp;}</p>
<p>&nbsp;/**<br />
&nbsp; * 从指定字符串生成密钥，密钥所需的字节数组长度为8位 不足8位时后面补0，超出8位只取前8位<br />
&nbsp; * <br />
&nbsp; * @param arrBTmp<br />
&nbsp; *&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 构成该字符串的字节数组<br />
&nbsp; * @return 生成的密钥<br />
&nbsp; * @throws java.lang.Exception<br />
&nbsp; */<br />
&nbsp;private Key getKey(byte[] arrBTmp) throws Exception {<br />
&nbsp;&nbsp;// 创建一个空的8位字节数组（默认值为0）<br />
&nbsp;&nbsp;byte[] arrB = new byte[8];</p>
<p>&nbsp;&nbsp;// 将原始字节数组转换为8位<br />
&nbsp;&nbsp;for (int i = 0; i &lt; arrBTmp.length &amp;&amp; i &lt; arrB.length; i++) {<br />
&nbsp;&nbsp;&nbsp;arrB[i] = arrBTmp[i];<br />
&nbsp;&nbsp;}</p>
<p>&nbsp;&nbsp;// 生成密钥<br />
&nbsp;&nbsp;Key key = new javax.crypto.spec.SecretKeySpec(arrB, "DES");</p>
<p>&nbsp;&nbsp;return key;<br />
&nbsp;}</p>
<p>&nbsp;public static void main(String[] args) {</p>
<p>&nbsp;&nbsp;String test = "username";<br />
&nbsp;&nbsp;// DESPlus des = new DESPlus();//默认密钥<br />
&nbsp;&nbsp;DESPlus des;<br />
&nbsp;&nbsp;try {<br />
&nbsp;&nbsp;&nbsp;des = new DESPlus();<br />
&nbsp;&nbsp;&nbsp;// 自定义密钥<br />
&nbsp;&nbsp;&nbsp;System.out.println("加密前的字符：" + test);<br />
&nbsp;&nbsp;&nbsp;System.out.println("加密后的字符：" + des.encrypt(test));<br />
&nbsp;&nbsp;&nbsp;System.out.println("解密后的字符：" + des.decrypt(des.encrypt(test)));<br />
&nbsp;&nbsp;} catch (Exception e) {<br />
&nbsp;&nbsp;&nbsp;e.printStackTrace();<br />
&nbsp;&nbsp;}</p>
<p>&nbsp;}<br />
}</p>
<img src ="http://www.blogjava.net/hilor/aggbug/156986.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/hilor/" target="_blank">hilor</a> 2007-10-30 17:09 <a href="http://www.blogjava.net/hilor/archive/2007/10/30/156986.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>ANT使用</title><link>http://www.blogjava.net/hilor/archive/2007/10/23/155238.html</link><dc:creator>hilor</dc:creator><author>hilor</author><pubDate>Tue, 23 Oct 2007 04:14:00 GMT</pubDate><guid>http://www.blogjava.net/hilor/archive/2007/10/23/155238.html</guid><wfw:comment>http://www.blogjava.net/hilor/comments/155238.html</wfw:comment><comments>http://www.blogjava.net/hilor/archive/2007/10/23/155238.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/hilor/comments/commentRss/155238.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/hilor/services/trackbacks/155238.html</trackback:ping><description><![CDATA[<div class="node">
<div class="content">
<p>　　ant是jakarta一个非常好的OpenSource子项目，是基于java的编译工具。下面简单介绍一下在linux环境中如何安装ant：</p>
<p>　　<strong>1.下载</strong><br />
　　从 <a href="http://ant.apache.org/bindownload.cgi" target="_blank">http://ant.apache.org/bindownload.cgi</a><br />
可以下载最新的tar包：apache-ant-1.6.2.tar.gz，如果是windows环境则是zip文件，解压后，在系统环境变量里设置<br />
ANT_HOME为f:\project\tools\apache-ant-1.6.2，并将f:\project\tools\apache-ant<br />
-1.6.2\bin目录添加到classpath中，然后就可以使用了</p>
<p>　　<strong>2.安装，解压到/usr/local下</strong><br />
&gt; tar zxpvf apache-ant-1.6.2.tar.gz<br />
&gt; ln -s apache-ant-1.6.2 ant</p>
<p>　　<strong>3.设置环境</strong><br />
　　将ANT_HOME设置到当前用户的.bash_profile文件/home/admin/.bash_profile</p>
<p>[admin@tangtang home]$ su - admin<br />
[admin@tangtang home]$ vi .bash_profile<br />
export ANT_HOME=/usr/local/ant<br />
export PATH=/usr/local/ant/bin:$PATH</p>
<p>　　如果是windows环境，需要设置%ANT_HOME%，并把%ANT_HOME%\bin目录全路径加入到%path%中</p>
<p>　　<strong>4.测试</strong><br />
　　用ant命令测试运行情况<br />
[admin@tangtang home]$ ant <br />
Buildfile: build.xml does not exist!<br />
Build failed</p>
<p>[admin@tangtang home]$ ant -version<br />
Apache Ant version 1.6.2 compiled on July 16 2004</p>
<p>　　若出现这样的错误：Exception in thread "main" java.lang.NoClassDefFoundError: org/apache/tools/ant/launch/Launcher <br />
　　这是linux系统默认安装了一些ant的lib，修改 /etc/ant.conf中 ANT_HOME=/usr/share/ant 为你正确安装ant的地址，如 /usr/local/ant</p>
<p>　　<strong>5、build脚本</strong><br />
　　如果是在linux环境中，下面是build脚本的一个范例：</p>
<pre class="codeStyle">#build脚本<br />
#! /bin/sh<br />
# 进入到上级目录<br />
cd `dirname $0`/..<br />
# 获取当前目录为PROJECT_HOME<br />
PROJECT_HOME=`pwd`<br />
# 设置JAVA_HOME<br />
export JAVA_HOME=/usr/cyber/java<br />
# 得到CLASSPATH<br />
CLASSPATH1=$CLASSPATH<br />
# 添加CLASSPATH<br />
CLASSPATH=${PROJECT_HOME}\webapps\WEB-INF\conf:${PROJECT_HOME}\webapps\WEB-INF\classes:$CLASSPATH<br />
# ant build，-buildfile <file>参数，是使用自定义的build.xml文件，$@是参数数组<br />
/usr/local/ant/bin/ant -buildfile ${PROJECT_HOME}/build/build.xml "$@"<br />
# build脚本结束</file></pre>
</div>
<p>　　如果是在windows环境中，下面是build.bat脚本的一个范例：</p>
<pre class="codeStyle"># build.bat <br />
# 关闭echo显示<br />
@echo off<br />
# 设置%JAVA_HOME%<br />
if "%JAVA_HOME%"=="" set JAVA_HOME=f:\tools\java<br />
# 设置%ANT_HOME%<br />
if "%ANT_HOME%"==""  set ANT_HOME=f:\tools\ant<br />
# 设置PROJECT_HOME<br />
set PROJECT_HOME = %CD%\..<br />
set CLASSPATH_BAK=%CLASSPATH%<br />
set CLASSPATH=<br />
# 执行build<br />
%ANT_HOME%\bin\ant.bat -buildfile ..\build\build.xml %1 %2 %3 %4 %5 %6 %7 %8 %9</pre>
</div>
<p>　　<strong>6、build配置文件</strong><br />
　　在${PROJECT_HOME}/build目录下面，需要定义两个文件，一个是build.properties，一个是build.xml<br />
　　build.properties文件定义了build的一些常量</p>
<pre class="codeStyle"># build.properties<br />
project        = tangtang<br />
version        = 1.1.1<br />
# 采用classic编译，即采用ant编译<br />
build.compiler = classic<br />
# 采用jikes编译<br />
#build.compiler = jikes<br />
<br />
year           = 2004<br />
debug          = on<br />
optimize       = on<br />
deprecation    = on<br />
<br />
os             = linux<br />
author         = tangtang<br />
email          = syvin_tom@hotmail.com<br />
url            = <a href="http://www.tangtang.org/" target="_blank">www.tangtang.org</a> <br />
company        = tangtang.org</pre>
<br />
build.xml文件是ant编译的主要配置文件，ant功能强大，需要通过相应的配置项来表现。
<pre class="codeStyle">&lt;?xml version="1.0" encoding="gb2312"?&gt;<br />
<br />
&lt;!-- Build file for project --&gt;<br />
<br />
&lt;project name="cyber" default="jar" basedir="."&gt;<br />
&lt;property file="${user.home}/.ant.properties" /&gt;<br />
&lt;!-- ant build properties --&gt;<br />
&lt;property file="build.properties"/&gt;<br />
<br />
&lt;property name="build.dir"  value=".."/&gt;<br />
&lt;property name="build.src"  value="${build.dir}/webapps/WEB-INF/src/java"/&gt;<br />
&lt;property name="build.dest" value="${build.dir}/webapps/WEB-INF/classes"/&gt;<br />
&lt;property name="build.lib"  value="${build.dir}/webapps/WEB-INF/lib"/&gt;<br />
&lt;property name="build.ext"  value="./lib"/&gt;<br />
&lt;property name="build.tpl"  value="${build.dir}/webapps/WEB-INF/templates"/&gt;<br />
&lt;property name="build.encoding" value="gb2312"/&gt;  <br />
<br />
&lt;property name="src.java.dir" value="../src/java"/&gt;<br />
&lt;property name="javadoc.destdir" value="../docs/api"/&gt;<br />
&lt;property name="javadoc.link" value="http://www.tangtang.org/java/docs/api/"/&gt;<br />
&lt;property name="final.name" value="${project}-${version}"/&gt;<br />
&lt;property name="dist.root" value="${build.dir}/dist"/&gt;<br />
&lt;property name="dist.dir" value="${dist.root}/${final.name}"/&gt;<br />
<br />
&lt;path id="classpath"&gt;    <br />
&lt;pathelement path="${java.class.path}/"/&gt;<br />
&lt;fileset dir="${build.lib}"&gt;    <br />
&lt;include name="*.jar"/&gt;<br />
&lt;/fileset&gt;    <br />
&lt;fileset dir="${build.ext}"&gt;    <br />
&lt;include name="*.jar"/&gt;<br />
&lt;/fileset&gt;    <br />
&lt;/path&gt;<br />
<br />
&lt;property name="classpath" refid="classpath"/&gt;<br />
&lt;!-- =================================================================== --&gt;<br />
&lt;!-- prints the environment                                        --&gt;<br />
&lt;!-- =================================================================== --&gt;<br />
&lt;target name="env"&gt;    <br />
&lt;echo message="build.compiler = ${build.compiler}"/&gt;<br />
&lt;echo message="java.home = ${java.home}"/&gt;<br />
&lt;echo message="user.home = ${user.home}"/&gt;<br />
&lt;!--echo message="java.class.path = ${java.class.path}"/--&gt;<br />
&lt;echo message="classpath = ${classpath}"/&gt;<br />
&lt;/target&gt;<br />
<br />
&lt;!-- =================================================================== --&gt;<br />
&lt;!-- Prepares the build directory                                        --&gt;<br />
&lt;!-- =================================================================== --&gt;<br />
&lt;target name="prepare" depends="env"&gt;<br />
<br />
&lt;tstamp/&gt;<br />
&lt;filter token="year" value="${year}"/&gt;<br />
&lt;filter token="version" value="${version}"/&gt;<br />
&lt;filter token="date" value="${DSTAMP}"/&gt;            <br />
&lt;!--<br />
&lt;mkdir dir="${build.dir}"/&gt;<br />
&lt;mkdir dir="${build.dest}"/&gt;<br />
&lt;mkdir dir="${build.src}"/&gt;<br />
--&gt;<br />
&lt;!--  chose a class that's from j2ee.jar --&gt;<br />
&lt;available  classname="javax.sql.DataSource"<br />
property="J2EE.present"&gt;<br />
&lt;classpath refid = "classpath"/&gt; <br />
&lt;/available&gt;<br />
&lt;/target&gt;<br />
&lt;target name="J2EE-error" depends="prepare"  unless="J2EE.present"&gt;<br />
<br />
&lt;echo&gt;<br />
********************************************************<br />
**<br />
**  J2EE has not been found and is needed for the target<br />
**  you have chosen<br />
**<br />
**  Since CLASSPATH is an evil idea, just link or drop<br />
**  a copy of your j2ee.jar into build/lib directory.<br />
**<br />
*********************************************************<br />
&lt;/echo&gt;<br />
&lt;/target&gt;<br />
<br />
&lt;target name="init"&gt;<br />
&lt;echo&gt;<br />
build init<br />
build compile<br />
&lt;/echo&gt;<br />
&lt;mkdir dir="${build.dir}/data"/&gt;      <br />
&lt;mkdir dir="${build.dir}/logs"/&gt;<br />
&lt;mkdir dir="${build.dir}/dist"/&gt;         <br />
&lt;/target&gt;<br />
<br />
&lt;target name="jar" depends="compile"&gt;<br />
&lt;mkdir dir="${dist.root}"/&gt;<br />
&lt;delete dir="${dist.root}/${project}-${version}.jar"/&gt;  <br />
&lt;jar jarfile="${dist.root}/${project}-${version}.jar"&gt;<br />
&lt;fileset dir="${build.dest}"&gt;<br />
&lt;include  name="org/tangtang/**"/&gt;<br />
&lt;exclude  name="org/tangtang/test/**"/&gt;        <br />
&lt;/fileset&gt;     <br />
&lt;/jar&gt;<br />
&lt;/target&gt;<br />
<br />
&lt;target name="srcjar" depends="prepare"&gt;<br />
&lt;delete dir="${dist.root}/${project}-${version}-src.jar"/&gt;<br />
&lt;jar jarfile="${dist.root}/${project}-${version}-src.jar"&gt;<br />
&lt;fileset dir="${build.src}"&gt;<br />
&lt;include  name="org/tangtang/**"/&gt;<br />
&lt;include  name="org/tangtang/test/**"/&gt;<br />
&lt;/fileset&gt;     <br />
&lt;/jar&gt;<br />
&lt;/target&gt;<br />
<br />
&lt;target name="tpl" depends="env"&gt;    <br />
&lt;jar jarfile="${dist.root}/${project}-${version}-tpl.jar"&gt;<br />
&lt;fileset dir="${build.tpl}"&gt;<br />
&lt;include  name="tangtang/**"/&gt;<br />
&lt;/fileset&gt;<br />
&lt;/jar&gt;<br />
&lt;/target&gt;<br />
<br />
&lt;target name="javadocs"&gt;<br />
&lt;mkdir dir="${build.dir}/docs/api"/&gt;<br />
&lt;javadoc<br />
sourcepath="${build.src}"<br />
overview="${build.dir}/docs/overview.html"<br />
packagenames="org.tangtang.*"<br />
destdir="${build.dir}/docs/api"<br />
encoding="${build.encoding}"<br />
author="true"<br />
version="true"<br />
use="true"<br />
link="${javadoc.link}"<br />
windowtitle="${project} ${version} API"<br />
doctitle="${project} ${version} API"<br />
bottom="Copyright &amp;copy; ${year} tangtang.org.  All Rights Reserved."<br />
&gt;<br />
&lt;tag name="todo" description="To Do:"/&gt;<br />
&lt;/javadoc&gt;<br />
&lt;/target&gt;<br />
<br />
&lt;target name="poolman" depends="prepare"&gt;<br />
&lt;jar jarfile="${dist.root}/poolman.jar"&gt;<br />
&lt;fileset dir="${build.dest}"&gt;<br />
&lt;include  name="com/codestudio/**"/&gt;<br />
&lt;/fileset&gt;     <br />
&lt;/jar&gt;<br />
&lt;/target&gt;      <br />
<br />
&lt;target name="nightly" depends="prepare"&gt;<br />
&lt;tstamp/&gt;        <br />
&lt;jar jarfile="${dist.root}/nightly/${project}-${version}-${DSTAMP}-src.jar"&gt;<br />
&lt;fileset dir="${build.src}"&gt;<br />
&lt;include  name="org/tangtang/**"/&gt;<br />
&lt;/fileset&gt;<br />
&lt;/jar&gt;<br />
&lt;/target&gt;  <br />
<br />
&lt;target name="compile" depends="prepare"&gt;    <br />
&lt;mkdir dir="${build.dest}"/&gt;<br />
<br />
&lt;!-- 检查依赖性 --&gt;<br />
&lt;depend srcdir="${build.src}"<br />
destdir="${build.dest}"<br />
cache="${build.dest}"&gt;<br />
&lt;classpath refid="classpath"/&gt;<br />
&lt;/depend&gt;<br />
<br />
&lt;javac srcdir="${build.src}"<br />
destdir="${build.dest}"<br />
debug="${debug}"<br />
deprecation="${deprecation}"<br />
optimize="${optimize}"&gt;      <br />
&lt;classpath refid="classpath"/&gt;<br />
&lt;/javac&gt;<br />
&lt;/target&gt;<br />
<br />
&lt;target name="clean"&gt;<br />
&lt;delete&gt;<br />
&lt;fileset dir="${build.dest}"&gt;<br />
&lt;include name="**/*.class"/&gt;<br />
&lt;/fileset&gt;<br />
&lt;/delete&gt;    <br />
&lt;/target&gt;<br />
<br />
&lt;target name="clean_dist"&gt;<br />
&lt;delete&gt;<br />
&lt;fileset dir="${dist.root}" includes="*"/&gt;<br />
&lt;/delete&gt;<br />
&lt;delete dir="${dist.dir}" quiet="false"/&gt;    <br />
&lt;/target&gt;<br />
<br />
&lt;target name="deploy" depends="jar"&gt;<br />
&lt;mkdir dir="${dist.dir}/data"/&gt;<br />
&lt;mkdir dir="${dist.dir}/logs"/&gt;    <br />
<br />
&lt;copy todir="${dist.dir}/bin"&gt;<br />
&lt;fileset dir="${build.dir}/bin"&gt;<br />
&lt;include name="*"/&gt;<br />
&lt;/fileset&gt;<br />
&lt;/copy&gt;    <br />
<br />
&lt;fixcrlf srcdir="${dist.dir}/bin" eol="lf" eof="remove"<br />
includes="**/*"<br />
excludes="**/*.bat"<br />
/&gt;<br />
<br />
&lt;copy todir="${dist.dir}/conf"&gt;<br />
&lt;fileset dir="${build.dir}/conf"&gt;<br />
&lt;include name="templates/*"/&gt;<br />
&lt;exclude name="*"/&gt;<br />
&lt;exclude name="**/*.bak"/&gt;<br />
&lt;exclude name="**/bak/**"/&gt; <br />
&lt;/fileset&gt;<br />
&lt;/copy&gt;    <br />
<br />
&lt;copy todir="${dist.dir}/build"&gt;<br />
&lt;fileset dir="${build.dir}/build"&gt;<br />
&lt;include name="*"/&gt;<br />
&lt;include name="lib/*"/&gt;<br />
&lt;exclude name="**/*.bak"/&gt;<br />
&lt;exclude name="**/bak/**"/&gt;        <br />
&lt;/fileset&gt;<br />
&lt;/copy&gt;              <br />
<br />
&lt;copy todir="${dist.dir}/templates"&gt;<br />
&lt;fileset dir="${build.dir}/templates"&gt;<br />
&lt;include name="**/*.vm"/&gt;<br />
&lt;exclude name="**/*.bak"/&gt;<br />
&lt;exclude name="**/bak/**"/&gt;<br />
&lt;/fileset&gt;<br />
&lt;/copy&gt;  <br />
<br />
&lt;copy todir="${dist.dir}/webapps/html"&gt;<br />
&lt;fileset dir="${build.dir}/webapps/html"&gt;<br />
&lt;include name="**/*"/&gt;<br />
&lt;exclude name="**/*.bak"/&gt;        <br />
&lt;exclude name="**/bak/**"/&gt;<br />
&lt;/fileset&gt;<br />
&lt;/copy&gt;<br />
<br />
&lt;copy todir="${dist.dir}/webapps/applet"&gt;<br />
&lt;fileset dir="${build.dir}/webapps/applet"&gt;<br />
&lt;include name="**/*"/&gt;<br />
&lt;exclude name="**/*.bak"/&gt;        <br />
&lt;exclude name="**/bak/**"/&gt;<br />
&lt;/fileset&gt;<br />
&lt;/copy&gt;<br />
<br />
&lt;copy todir="${dist.dir}/webapps/icons"&gt;<br />
&lt;fileset dir="${build.dir}/webapps/icons"&gt;<br />
&lt;include name="**/*.gif"/&gt;        <br />
&lt;include name="**/*.jpg"/&gt;<br />
&lt;exclude name="**/*.bak"/&gt;<br />
&lt;exclude name="**/bak/**"/&gt;<br />
&lt;/fileset&gt;<br />
&lt;/copy&gt;<br />
<br />
&lt;copy todir="${dist.dir}/webapps/images"&gt;<br />
&lt;fileset dir="${build.dir}/webapps/images"&gt;<br />
&lt;include name="**/*.gif"/&gt;        <br />
&lt;include name="**/*.jpg"/&gt;<br />
&lt;exclude name="**/*.bak"/&gt;<br />
&lt;exclude name="**/bak/**"/&gt;<br />
&lt;/fileset&gt;<br />
&lt;/copy&gt;  <br />
<br />
&lt;copy todir="${dist.dir}/webapps/WEB-INF/"&gt;<br />
&lt;fileset dir="${build.dir}/webapps/WEB-INF/"&gt;<br />
&lt;include name="**/*"/&gt;<br />
&lt;exclude name="classes/**"/&gt;      <br />
&lt;exclude name="conf/*"/&gt;<br />
&lt;exclude name="src/**"/&gt;<br />
&lt;/fileset&gt;<br />
&lt;/copy&gt;  <br />
<br />
&lt;jar jarfile="${dist.root}/${project}-${version}-war.jar"&gt;<br />
&lt;fileset dir="${dist.dir}"&gt;<br />
&lt;include  name="**/*"/&gt;<br />
&lt;/fileset&gt;<br />
&lt;/jar&gt;   <br />
&lt;/target&gt;<br />
<br />
&lt;target name="conf"&gt;<br />
&lt;delete&gt;<br />
&lt;fileset dir="${build.dir}/conf" includes="*"/&gt;<br />
&lt;fileset dir="${build.dir}/webapps/WEB-INF/conf" includes="*"/&gt;<br />
&lt;/delete&gt;<br />
&lt;filter filtersfile="deploy.properties"/&gt;<br />
&lt;copy todir="${build.dir}/conf" filtering="true"&gt;<br />
&lt;fileset dir="${build.dir}/conf/templates"&gt;<br />
&lt;include name="*"/&gt;<br />
&lt;/fileset&gt;<br />
&lt;/copy&gt;  <br />
&lt;copy todir="${build.dir}/webapps/WEB-INF/conf" filtering="true"&gt;<br />
&lt;fileset dir="${build.dir}/webapps/WEB-INF/conf/templates"&gt;<br />
&lt;include name="*"/&gt;<br />
&lt;/fileset&gt;<br />
&lt;/copy&gt;<br />
&lt;/target&gt;  <br />
&lt;/project&gt;<br />
</pre>
<img src ="http://www.blogjava.net/hilor/aggbug/155238.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/hilor/" target="_blank">hilor</a> 2007-10-23 12:14 <a href="http://www.blogjava.net/hilor/archive/2007/10/23/155238.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>抽象类与接口的区别</title><link>http://www.blogjava.net/hilor/archive/2007/08/29/141030.html</link><dc:creator>hilor</dc:creator><author>hilor</author><pubDate>Wed, 29 Aug 2007 09:55:00 GMT</pubDate><guid>http://www.blogjava.net/hilor/archive/2007/08/29/141030.html</guid><wfw:comment>http://www.blogjava.net/hilor/comments/141030.html</wfw:comment><comments>http://www.blogjava.net/hilor/archive/2007/08/29/141030.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/hilor/comments/commentRss/141030.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/hilor/services/trackbacks/141030.html</trackback:ping><description><![CDATA[<p>abstract class和interface是Java语言中对于抽象类定义进行支持的两种机制，正是由于这两种机制的存在，才赋予了Java强大的面向对象能力。abstract class和interface之间在对于抽象类定义的支持方面具有很大的相似性，甚至可以相互替换，因此很多开发者在进行抽象类定义时对于abstract class和interface的选择显得比较随意。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 其实，两者之间还是有很大的区别的，对于它们的选择甚至反映出对于问题领域本质的理解、对于设计意图的理解是否正确、合理。本文将对它们之间的区别进行一番剖析，试图给开发者提供一个在二者之间进行选择的依据。 <br>一、 理解抽象类<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; abstract class和interface在Java语言中都是用来进行抽象类（本文中的抽象类并非从abstract class翻译而来，它表示的是一个抽象体，而abstract class为Java语言中用于定义抽象类的一种方法，请读者注意区分）定义的，那么什么是抽象类，使用抽象类能为我们带来什么好处呢？<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 在面向对象的概念中，我们知道所有的对象都是通过类来描绘的，但是反过来却不是这样。并不是所有的类都是用来描绘对象的，如果一个类中没有包含足够的信息来描绘一个具体的对象，这样的类就是抽象类。抽象类往往用来表征我们在对问题领域进行分析、设计中得出的抽象概念，是对一系列看上去不同，但是本质上相同的具体概念的抽象。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 比如：如果我们进行一个图形编辑软件的开发，就会发现问题领域存在着圆、三角形这样一些具体概念，它们是不同的，但是它们又都属于形状这样一个概念，形状这个概念在问题领域是不存在的，它就是一个抽象概念。正是因为抽象的概念在问题领域没有对应的具体概念，所以用以表征抽象概念的抽象类是不能够实例化的。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 在面向对象领域，抽象类主要用来进行类型隐藏。我们可以构造出一个固定的一组行为的抽象描述，但是这组行为却能够有任意个可能的具体实现方式。这个抽象描述就是抽象类，而这一组任意个可能的具体实现则表现为所有可能的派生类。模块可以操作一个抽象体。由于模块依赖于一个固定的抽象体，因此它可以是不允许修改的；同时，通过从这个抽象体派生，也可扩展此模块的行为功能。熟悉OCP的读者一定知道，为了能够实现面向对象设计的一个最核心的原则OCP(Open-Closed Principle)，抽象类是其中的关键所在。 </p>
<p>二、从语法定义层面看abstract class和interface<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 在语法层面，Java语言对于abstract class和interface给出了不同的定义方式，下面以定义一个名为Demo的抽象类为例来说明这种不同。使用abstract class的方式定义Demo抽象类的方式如下：<br>abstract class Demo ｛ <br>&nbsp;abstract void method1(); <br>&nbsp;abstract void method2(); <br>&nbsp;&#8230; <br>｝<br>使用interface的方式定义Demo抽象类的方式如下： <br>interface Demo { <br>&nbsp;void method1(); <br>&nbsp;void method2(); <br>&nbsp;&#8230; <br>}<br>在abstract class方式中，Demo可以有自己的数据成员，也可以有非abstarct的成员方法，而在interface方式的实现中，Demo只能够有静态的不能被修改的数据成员（也就是必须是static final的，不过在interface中一般不定义数据成员），所有的成员方法都是abstract的。从某种意义上说，interface是一种特殊形式的abstract class。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 从编程的角度来看，abstract class和interface都可以用来实现"design by contract"的思想。但是在具体的使用上面还是有一些区别的。 <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 首先，abstract class在Java语言中表示的是一种继承关系，一个类只能使用一次继承关系。但是，一个类却可以实现多个interface。也许，这是Java语言的设计者在考虑Java对于多重继承的支持方面的一种折中考虑吧。 <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 其次，在abstract class的定义中，我们可以赋予方法的默认行为。但是在interface的定义中，方法却不能拥有默认行为，为了绕过这个限制，必须使用委托，但是这会 增加一些复杂性，有时会造成很大的麻烦。 <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 在抽象类中不能定义默认行为还存在另一个比较严重的问题，那就是可能会造成维护上的麻烦。因为如果后来想修改类的界面（一般通过abstract class或者interface来表示）以适应新的情况（比如，添加新的方法或者给已用的方法中添加新的参数）时，就会非常的麻烦，可能要花费很多的时间（对于派生类很多的情况，尤为如此）。但是如果界面是通过abstract class来实现的，那么可能就只需要修改定义在abstract class中的默认行为就可以了。 <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 同样，如果不能在抽象类中定义默认行为，就会导致同样的方法实现出现在该抽象类的每一个派生类中，违反了"one rule，one place"原则，造成代码重复，同样不利于以后的维护。因此，在abstract class和interface间进行选择时要非常的小心。 </p>
<p>二、 从设计理念层面看abstract class和interface <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 上面主要从语法定义和编程的角度论述了abstract class和interface的区别，这些层面的区别是比较低层次的、非本质的。本文将从另一个层面：abstract class和interface所反映出的设计理念，来分析一下二者的区别。作者认为，从这个层面进行分析才能理解二者概念的本质所在。 <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 前面已经提到过，abstarct class在Java语言中体现了一种继承关系，要想使得继承关系合理，父类和派生类之间必须存在"is a"关系，即父类和派生类在概念本质上应该是相同的。对于interface 来说则不然，并不要求interface的实现者和interface定义在概念本质上是一致的，仅仅是实现了interface定义的契约而已。为了使论述便于理解，下面将通过一个简单的实例进行说明。 <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 考虑这样一个例子，假设在我们的问题领域中有一个关于Door的抽象概念，该Door具有执行两个动作open和close，此时我们可以通过abstract class或者interface来定义一个表示该抽象概念的类型，定义方式分别如下所示：<br>使用abstract class方式定义Door： </p>
<p>abstract class Door { <br>&nbsp;abstract void open(); <br>&nbsp;abstract void close()； <br>} </p>
<p>使用interface方式定义Door： </p>
<p>interface Door { <br>&nbsp;void open(); <br>&nbsp;void close(); <br>}<br>其他具体的Door类型可以extends使用abstract class方式定义的Door或者implements使用interface方式定义的Door。看起来好像使用abstract class和interface没有大的区别。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 如果现在要求Door还要具有报警的功能。我们该如何设计针对该例子的类结构呢（在本例中，主要是为了展示abstract class和interface反映在设计理念上的区别，其他方面无关的问题都做了简化或者忽略）下面将罗列出可能的解决方案，并从设计理念层面对这些不同的方案进行分析。 </p>
<p>解决方案一：<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 简单的在Door的定义中增加一个alarm方法，如下：<br>abstract class Door { <br>&nbsp;abstract void open(); <br>&nbsp;abstract void close()； <br>&nbsp;abstract void alarm(); <br>} </p>
<p>或者 </p>
<p>interface Door { <br>&nbsp;void open(); <br>&nbsp;void close(); <br>&nbsp;void alarm(); <br>} </p>
<p>那么具有报警功能的AlarmDoor的定义方式如下： <br>class AlarmDoor extends Door { <br>&nbsp;void open() { &#8230; } <br>&nbsp;void close() { &#8230; } <br>&nbsp;void alarm() { &#8230; } <br>} </p>
<p>或者 </p>
<p>class AlarmDoor implements Door ｛ <br>&nbsp;void open() { &#8230; } <br>&nbsp;void close() { &#8230; } <br>&nbsp;void alarm() { &#8230; } <br>｝ </p>
<p>这种方法违反了面向对象设计中的一个核心原则ISP（Interface Segregation Priciple），在Door的定义中把Door概念本身固有的行为方法和另外一个概念"报警器"的行为方法混在了一起。这样引起的一个问题是那些仅仅依赖于Door这个概念的模块会因为"报警器"这个概念的改变（比如：修改alarm方法的参数）而改变，反之依然。 </p>
<p>解决方案二： <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 既然open、close和alarm属于两个不同的概念，根据ISP原则应该把它们分别定义在代表这两个概念的抽象类中。定义方式有：这两个概念都使用abstract class方式定义；两个概念都使用interface方式定义；一个概念使用abstract class方式定义，另一个概念使用interface方式定义。 显然，由于Java语言不支持多重继承，所以两个概念都使用abstract class方式定义是不可行的。后面两种方式都是可行的，但是对于它们的选择却反映出对于问题领域中的概念本质的理解、对于设计意图的反映是否正确、合理。我们一一来分析、说明。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 如果两个概念都使用interface方式来定义，那么就反映出两个问题： <br>1、 我们可能没有理解清楚问题领域，AlarmDoor在概念本质上到底是Door还是报警器？ <br>2、如果我们对于问题领域的理解没有问题，比如：我们通过对于问题领域的分析发现AlarmDoor在概念本质上和Door是一致的，那么我们在实现时就没有能够正确的揭示我们的设计意图，因为在这两个概念的定义上（均使用interface方式定义）反映不出上述含义。 如果我们对于问题领域的理解是：AlarmDoor在概念本质上是Door，同时它有具有报警的功能。我们该如何来设计、实现来明确的反映出我们的意思呢？前面已经说过，abstract class在Java语言中表示一种继承关系，而继承关系在本质上是"is a"关系。所以对于Door这个概念，我们应该使用abstarct class方式来定义。另外，AlarmDoor又具有报警功能，说明它又能够完成报警概念中定义的行为，所以报警概念可以通过interface方式定义。如下所示： <br>abstract class Door { <br>&nbsp;abstract void open(); <br>&nbsp;abstract void close()； <br>} <br>interface Alarm { <br>&nbsp;void alarm(); <br>} <br>class AlarmDoor extends Door implements Alarm { <br>&nbsp;void open() { &#8230; } <br>&nbsp;void close() { &#8230; } <br>&nbsp;&nbsp;&nbsp; void alarm() { &#8230; } <br>} </p>
<p>这种实现方式基本上能够明确的反映出我们对于问题领域的理解，正确的揭示我们的设计意图。其实abstract class表示的是"is a"关系，interface表示的是"like a"关系，大家在选择时可以作为一个依据，当然这是建立在对问题领域的理解上的，比如：如果我们认为AlarmDoor在概念本质上是报警器，同时又具有Door的功能，那么上述的定义方式就要反过来了。 <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; abstract class和interface是Java语言中的两种定义抽象类的方式，它们之间有很大的相似性。但是对于它们的选择却又往往反映出对于问题领域中的概念本质的理解、对于设计意图的反映是否正确、合理，因为它们表现了概念间的不同的关系（虽然都能够实现需求的功能）。这其实也是语言的一种的惯用法，希望读者朋友能够细细体会。</p>
<img src ="http://www.blogjava.net/hilor/aggbug/141030.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/hilor/" target="_blank">hilor</a> 2007-08-29 17:55 <a href="http://www.blogjava.net/hilor/archive/2007/08/29/141030.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>