﻿<?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/24650.html</link><description>我的学习档案馆</description><language>zh-cn</language><lastBuildDate>Tue, 22 Jan 2008 07:20:54 GMT</lastBuildDate><pubDate>Tue, 22 Jan 2008 07:20:54 GMT</pubDate><ttl>60</ttl><item><title>用oscache+lucene2.2.0加快页面访问速度(转)</title><link>http://www.blogjava.net/hilor/articles/176971.html</link><dc:creator>hilor</dc:creator><author>hilor</author><pubDate>Tue, 22 Jan 2008 03:38:00 GMT</pubDate><guid>http://www.blogjava.net/hilor/articles/176971.html</guid><wfw:comment>http://www.blogjava.net/hilor/comments/176971.html</wfw:comment><comments>http://www.blogjava.net/hilor/articles/176971.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/hilor/comments/commentRss/176971.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/hilor/services/trackbacks/176971.html</trackback:ping><description><![CDATA[大家都知道用lucene2.2.0全文检索速度很快,但是当并发量的大的时候,lucene也会吃不消的,所以我们可以用到缓存,我给大家介绍的是oscache-2.4.1,先到官方网站下载一个.,然后把oscache-2.4.1.jar导入你的工程中.然后在下载解压后的文件里有个重要的文件,那就是oscache.properties,oscache.tld文件,oscache.properties是对oscache的配置,这两个文件放在classes文件下.,打开oscache.properties文件,里面可以自己进行相关配置.<br />
&nbsp;&nbsp; 先介绍用硬盘缓存.<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1.打开oscache.properties文件.&nbsp;改成,cache.memory=false(表示硬盘缓存.true表示内存缓存),然后是路径,cache.path=/home/search/index/cache(我这个不是win下)然后cache.persistence.class=com.opensymphony.oscache.plugins.diskpersistence.DiskPersistenceListener<br />
&nbsp;cache.persistence.class=com.opensymphony.oscache.plugins.diskpersistence.HashDiskPersistenceListener选一个,第一会当缓存数据在硬盘后,会产品一个文件夹.第二是存数据在硬盘后,会产生分步的件夹,不会像第一种那样把缓存数据放在一个文件夹里.<br />
2.写方法进行缓存.<br />
1.写个类extends GeneralCacheAdministrator,<br />
&nbsp;&nbsp;
<p>public class BaseCache extends GeneralCacheAdministrator {<br />
//&nbsp;过期时间(单位为秒);<br />
&nbsp;private int refreshPeriod;<br />
&nbsp;</p>
<p>&nbsp;public BaseCache(int refreshPeriod){<br />
&nbsp;&nbsp;&nbsp; super();<br />
&nbsp;&nbsp;&nbsp; this.refreshPeriod=refreshPeriod;<br />
&nbsp;}<br />
//&nbsp;添加被缓存的对象;<br />
&nbsp;public void put(String key,Object value){<br />
&nbsp;&nbsp;&nbsp; this.putInCache(key,value);<br />
&nbsp;}<br />
//&nbsp;删除被缓存的对象;<br />
&nbsp;public void remove(String key){<br />
&nbsp;&nbsp;&nbsp; this.flushEntry(key);<br />
&nbsp;}<br />
//&nbsp;删除所有被缓存的对象;<br />
&nbsp;public void removeAll(Date date){<br />
&nbsp;&nbsp;&nbsp; this.flushAll(date);<br />
&nbsp;}</p>
<p>&nbsp;public void removeAll(){<br />
&nbsp;&nbsp;&nbsp; this.flushAll();<br />
&nbsp;&nbsp;&nbsp; <br />
&nbsp;}<br />
//&nbsp;获取被缓存的对象;<br />
&nbsp;public Object get(String key) throws Exception{<br />
&nbsp;&nbsp;&nbsp; try{<br />
&nbsp;&nbsp;&nbsp;&nbsp; return this.getFromCache(key,this.refreshPeriod);<br />
&nbsp;&nbsp;&nbsp; } catch (NeedsRefreshException e) {<br />
&nbsp;&nbsp;&nbsp;&nbsp; this.cancelUpdate(key);<br />
&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; throw e;<br />
&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp; }<br />
}<br />
2.执行方法:<br />
在方法里,indexCache = new BaseCache(3600),hii = new cache.Hits(hits),这个类是自己写的,下面的详细代码,然后调用put(String key,Object value)方法,key是关键字.下次取的时候就直接get(key),key我是用的查询参数组成的,只要下次当别人用到相同条件搜索时,就可以直接从缓存读数据,这里所提到的是org.apache.lucene.search.Hits这个对像是不能被缓存的,没有被序例化,我查了下源码,也不能被继承,所以大家自己写个类implements Serializable</p>
<p>public class Hits implements Serializable&nbsp;&nbsp; {<br />
&nbsp; private&nbsp; org.apache.lucene.search.Hits hits;<br />
&nbsp; private&nbsp; Document[] docs=null;<br />
&nbsp; private boolean flag=true;<br />
&nbsp; <br />
&nbsp;/**<br />
&nbsp; *&nbsp;sundc 2007-11-20<br />
&nbsp; */<br />
&nbsp;public Hits(org.apache.lucene.search.Hits hits) {<br />
&nbsp;&nbsp;this.docs=new Document[hits.length()];<br />
&nbsp;&nbsp;int length=0;<br />
//我这里是定义记录有只缓存前710多记录,如果大于710还是查lucene,大家都知道搜索用户访问都是几页,大家可以针对自己项目进行规化..<br />
if(hits.length()&gt;=710){<br />
&nbsp;&nbsp;&nbsp;length=710;<br />
&nbsp;&nbsp;}<br />
&nbsp;&nbsp;else{<br />
&nbsp;&nbsp;&nbsp;length=hits.length();&nbsp;<br />
&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;for(int i=0;i&lt;length;i++){<br />
&nbsp;&nbsp;&nbsp;try {<br />
&nbsp;&nbsp;&nbsp;&nbsp;this.docs[i]=hits.doc(i);<br />
&nbsp;&nbsp;&nbsp;} catch (CorruptIndexException e) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;e.printStackTrace();<br />
&nbsp;&nbsp;&nbsp;} catch (IOException e) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;e.printStackTrace();<br />
&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;}<br />
&nbsp;}</p>
<p>&nbsp;<br />
&nbsp;public Hits( Document[] doc){<br />
&nbsp;&nbsp;this.docs=doc;<br />
&nbsp;}<br />
&nbsp;public&nbsp; Document doc(int i){<br />
&nbsp;&nbsp;if(!this.flag){<br />
&nbsp;&nbsp;&nbsp;try {<br />
&nbsp;&nbsp;&nbsp;&nbsp;return this.hits.doc(i);<br />
&nbsp;&nbsp;&nbsp;} catch (CorruptIndexException e) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;// TODO Auto-generated catch block<br />
&nbsp;&nbsp;&nbsp;&nbsp;e.printStackTrace();<br />
&nbsp;&nbsp;&nbsp;} catch (IOException e) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;// TODO Auto-generated catch block<br />
&nbsp;&nbsp;&nbsp;&nbsp;e.printStackTrace();<br />
&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;}<br />
&nbsp;&nbsp;return this.docs[i];<br />
&nbsp;}</p>
<p>&nbsp;public&nbsp; int length(){<br />
&nbsp;&nbsp;if(this.flag){<br />
&nbsp;&nbsp;&nbsp;return&nbsp; docs.length;<br />
&nbsp;&nbsp;}<br />
&nbsp;&nbsp;return this.hits.length();<br />
&nbsp;}<br />
&nbsp;<br />
&nbsp;public&nbsp; Document[] getDocs() {<br />
&nbsp;&nbsp;return this.docs;<br />
&nbsp;}</p>
<p>&nbsp;public&nbsp; void setDocs(Document[] docs) {<br />
&nbsp;&nbsp;this.docs = docs;<br />
&nbsp;}</p>
<p>&nbsp;public org.apache.lucene.search.Hits getHits() {<br />
&nbsp;&nbsp;return this.hits;<br />
&nbsp;}</p>
<p>&nbsp;public void setHits(org.apache.lucene.search.Hits hits) {<br />
&nbsp;&nbsp;this.hits = hits;<br />
&nbsp;}<br />
}<br />
我这里是如果有缓存数据,就读缓存,没有,就lucene然后放在缓存里.大家可以调用indexCache.get(key),大家每一次访问的时候会相对很慢.如果缓存已经建立了,那么速度会很快,大家在用的时候,针对自己项目的数据要求,进行缓存.下面介绍内存缓存.<br />
&nbsp; 2.内存缓存可以相对要快点.但是针对服务器的本身内存大小,大家针对自己的项目和服务器的配置选择好的缓存方式.,把cache.memory=true,这样就可以了.<br />
3.还可以实现页面级缓存<br />
你可以在web.xml中定义缓存过滤器，定义特定资源的缓存。<br />
&lt;filter&gt;<br />
&lt;filter-name&gt;CacheFilter&lt;/filter-name&gt;<br />
&lt;filter-class&gt;com.opensymphony.oscache.web.filter.CacheFilter&lt;/filter-class&gt;<br />
&lt;init-param&gt;<br />
&lt;param-name&gt;time&lt;/param-name&gt;<br />
&lt;param-value&gt;60&lt;/param-value&gt;<br />
&lt;/init-param&gt;<br />
&lt;init-param&gt;<br />
&lt;param-name&gt;scope&lt;/param-name&gt;<br />
&lt;param-value&gt;session&lt;/param-value&gt;<br />
&lt;/init-param&gt;<br />
&lt;/filter&gt;<br />
&lt;filter-mapping&gt;<br />
&lt;filter-name&gt;CacheFilter&lt;/filter-name&gt;<br />
&lt;url-pattern&gt;*.jsp&lt;/url-pattern&gt;<br />
&lt;/filter-mapping&gt;<br />
上面定义将缓存所有.jsp页面，缓存刷新时间为60秒，缓存作用域为Session,<br />
注意，CacheFilter只捕获Http头为200的页面请求，即只对无错误请求作缓存，<br />
而不对其他请求（如500,404,400）作缓存处理.<br />
我这里介绍的不全,只是我在项目中用到了这些.如果有什么问题,虚心接受....</p>
<img src ="http://www.blogjava.net/hilor/aggbug/176971.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-22 11:38 <a href="http://www.blogjava.net/hilor/articles/176971.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>jsp中的include乱码问题 </title><link>http://www.blogjava.net/hilor/articles/165993.html</link><dc:creator>hilor</dc:creator><author>hilor</author><pubDate>Fri, 07 Dec 2007 03:23:00 GMT</pubDate><guid>http://www.blogjava.net/hilor/articles/165993.html</guid><wfw:comment>http://www.blogjava.net/hilor/comments/165993.html</wfw:comment><comments>http://www.blogjava.net/hilor/articles/165993.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/hilor/comments/commentRss/165993.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/hilor/services/trackbacks/165993.html</trackback:ping><description><![CDATA[解决方法：<br />
1. 问题描述：&lt;%@ include file="*.html" %&gt; 的中文乱码问题<br />
<br />
要解决这个问题，当然最简单的就是在每个被 include 的文件第一行，加上<br />
<br />
&lt;%@ page contentType="text/html;charset=gb2312" %&gt;<br />
这样一定可以确保中文 jsp 档不会出现乱码，只不过，一旦程序修改成这样的模式，这种程序就无法在旧的 <br />
jsp/servlet container 上执行了，因为旧的规格是不允被 include 档案中再出现 &lt;%@ page ... %&gt; 这样的定义的。<br />
<br />
况且，就算你愿意为了 Tomcat 5.0.x 特别维护一套不同版本的 Source Code，你会遇到重大的挫折，因为 Tomcat 5.0.x 版在 charset 的设定上，会特别检查include 别人的程序与被人include 的程序，这二个程序中所定义的 charset 是不是一样，如果不一样，在编译时就会产生错误。更恐怖的是，竟然还分大小写，比如说："gb2312" "GB2312" 这样的定义，在 Tomcat 的认定上是不同的。<br />
<br />
更好的解决方案<br />
在 Tomcat 5.0.x 中，Tomcat 支持了 JSP 2.0 的规格，同时也支持了部分 J2EE 1.4 的规格，在 J2EE 1.4 的规格中，有关 JSP 的部份，有一个 &lt;jsp-config&gt; 的 XML Tag，这个 XML 区块用来定义与 JSP 相关的特殊属性，包含采用的 taglib 与 以下说明的 &lt;jsp-property-group&gt; ，而解决 include 档中文问题的方法就定义在 &lt;jsp-roperty-group&gt; 中。<br />
<br />
在当前应用系统的web.xml里加入jsp-config代码：<br />
<br />
&lt;web-app xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee&nbsp; http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd" version="2.4"&gt;<br />
&lt;jsp-config&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;jsp-property-group&gt;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;description&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Special property group for JSP Configuration JSP example.&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/description&gt;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;display-name&gt;JSPConfiguration&lt;/display-name&gt;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;url-pattern&gt;*.jsp&lt;/url-pattern&gt;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;el-ignored&gt;true&lt;/el-ignored&gt;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;page-encoding&gt;GB2312&lt;/page-encoding&gt;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;scripting-invalid&gt;false&lt;/scripting-invalid&gt;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;include-prelude&gt;&lt;/include-prelude&gt;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;include-coda&gt;&lt;/include-coda&gt;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp; &lt;description&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Special property group for JSP Configuration JSP example.&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/description&gt;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;display-name&gt;JSPConfiguration&lt;/display-name&gt;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;url-pattern&gt;*.html&lt;/url-pattern&gt;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;el-ignored&gt;true&lt;/el-ignored&gt;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;page-encoding&gt;GB2312&lt;/page-encoding&gt;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;scripting-invalid&gt;false&lt;/scripting-invalid&gt;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;include-prelude&gt;&lt;/include-prelude&gt;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;include-coda&gt;&lt;/include-coda&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;/jsp-property-group&gt;<br />
&lt;/jsp-config&gt;<br />
<br />
&nbsp; &lt;welcome-file-list&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;welcome-file&gt;index.jsp&lt;/welcome-file&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;welcome-file&gt;index.html&lt;/welcome-file&gt; <br />
&nbsp; &lt;/welcome-file-list&gt;&nbsp;&nbsp; <br />
<br />
... ...<br />
<br />
&lt;/webapp&gt;<br />
<br />
&nbsp;<br />
<br />
说明：&lt;jsp-config&gt;里的定义，就是通知当前应用服务器，当前应用系统下，所有的 .jsp, .html 文件，若是没有定义contentType="text/html;charset=gb2312" 时，就会采用预设的 "GB2312" 字符集去处理，如此，就不须要在每个 include 的档案第一行加上 contentType="text/html;charset=gb2312" 了。<br />
<br />
注：<br />
<br />
＜jsp-config＞标签使用详解<br />
<br />
&lt;jsp-config&gt; 包括&lt;taglib&gt; 和&lt;jsp-property-group&gt; 两个子元素。<br />
&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; 其中&lt;taglib&gt;元素在JSP 1.2时就已经存在；而&lt;jsp-property-group&gt;是JSP 2.0 新增的元素。<br />
&nbsp;&nbsp;&nbsp; &lt;jsp-property-group&gt;元素主要有八个子元素，它们分别为：<br />
&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; 1.&lt;description&gt;：设定的说明；<br />
&nbsp;&nbsp;&nbsp; 2.&lt;display-name&gt;：设定名称；<br />
&nbsp;&nbsp;&nbsp; 3.&lt;url-pattern&gt;：设定值所影响的范围，如：/CH2 或 /*.jsp；<br />
&nbsp;&nbsp;&nbsp; 4.&lt;el-ignored&gt;：若为true，表示不支持EL 语法；<br />
&nbsp;&nbsp;&nbsp; 5.&lt;scripting-invalid&gt;：若为true，表示不支持&lt;% scripting %&gt;语法；<br />
&nbsp;&nbsp;&nbsp; 6.&lt;page-encoding&gt;：设定JSP 网页的编码；<br />
&nbsp;&nbsp;&nbsp; 7.&lt;include-prelude&gt;：设置JSP 网页的抬头，扩展名为.jspf；<br />
&nbsp;&nbsp;&nbsp; 8.&lt;include-coda&gt;：设置JSP 网页的结尾，扩展名为.jspf。<br />
&nbsp;<br />
tomcat 5中include页面乱码问题<br />
&lt;?xml version="1.0" encoding="ISO-8859-1"?&gt;<br />
&lt;web-app xmlns="http://java.sun.com/xml/ns/j2ee"<br />
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"<br />
xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"<br />
version="2.4"&gt;<br />
<br />
&lt;jsp-config&gt;<br />
&lt;jsp-property-group&gt;<br />
&lt;description&gt;Special property group for JSP Configuration JSP example.&lt;/description&gt;<br />
&lt;display-name&gt;JSPConfiguration&lt;/display-name&gt;<br />
&lt;url-pattern&gt;*.jsp&lt;/url-pattern&gt;<br />
&lt;el-ignored&gt;true&lt;/el-ignored&gt;<br />
&lt;page-encoding&gt;GBK&lt;/page-encoding&gt;<br />
&lt;scripting-invalid&gt;false&lt;/scripting-invalid&gt;<br />
&lt;include-prelude&gt;&lt;/include-prelude&gt;<br />
&lt;include-coda&gt;&lt;/include-coda&gt;<br />
<br />
&lt;description&gt;Special property group for JSP Configuration JSP example.&lt;/description&gt;<br />
&lt;display-name&gt;JSPConfiguration&lt;/display-name&gt;<br />
&lt;url-pattern&gt;*.html&lt;/url-pattern&gt;<br />
&lt;el-ignored&gt;true&lt;/el-ignored&gt;<br />
&lt;page-encoding&gt;GBK&lt;/page-encoding&gt;<br />
&lt;scripting-invalid&gt;false&lt;/scripting-invalid&gt;<br />
&lt;include-prelude&gt;&lt;/include-prelude&gt;<br />
&lt;include-coda&gt;&lt;/include-coda&gt;<br />
&lt;/jsp-property-group&gt;<br />
&lt;/jsp-config&gt;<br />
<br />
2.关于中文出现乱码的解决办法<br />
&nbsp;<br />
&nbsp;<br />
&nbsp;<br />
在一个编码为utf-8的页面中，使用&lt;jsp:include&gt;包含另一个.jsp/.html文件时，被包含的页面单独浏览正常，但被包含后就会遇到乱码问题。解决的办法是，在每个被包含的页面开始加上下面一行&lt;% page contentType="text/html;charset=utf-8" %&gt;这个方法可以解决jsp include jsp的中文乱码问题。也就是说，被包含的页面必须改成.jsp，哪怕它的内容只有静态html，否则的话还是会出现乱码，如何解决include .html文件中文乱码的问题，还在寻找中。<br />
<br />
http://blog.csdn.net/szliszt/archive
<img src ="http://www.blogjava.net/hilor/aggbug/165993.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-12-07 11:23 <a href="http://www.blogjava.net/hilor/articles/165993.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Java中static、this、super、final用法简谈</title><link>http://www.blogjava.net/hilor/articles/161269.html</link><dc:creator>hilor</dc:creator><author>hilor</author><pubDate>Sat, 17 Nov 2007 12:55:00 GMT</pubDate><guid>http://www.blogjava.net/hilor/articles/161269.html</guid><wfw:comment>http://www.blogjava.net/hilor/comments/161269.html</wfw:comment><comments>http://www.blogjava.net/hilor/articles/161269.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/hilor/comments/commentRss/161269.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/hilor/services/trackbacks/161269.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 本篇旨在帮助准备学习Java以及刚接触Java的朋友认识、掌握和使用static、this、super、final这几个关键字的使用。Java博大精深，我也是一位正在学习和使用Java的爱好者，文中难免有不妥之处，欢迎指正。一、static&nbsp;&nbsp;&nbsp;&nbsp;请先看下面这段程序：    &nbsp;&nbsp;     &nbsp;&nbsp;&nb...&nbsp;&nbsp;<a href='http://www.blogjava.net/hilor/articles/161269.html'>阅读全文</a><img src ="http://www.blogjava.net/hilor/aggbug/161269.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-17 20:55 <a href="http://www.blogjava.net/hilor/articles/161269.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>JAVA的可变类与不可变类</title><link>http://www.blogjava.net/hilor/articles/150610.html</link><dc:creator>hilor</dc:creator><author>hilor</author><pubDate>Fri, 05 Oct 2007 13:33:00 GMT</pubDate><guid>http://www.blogjava.net/hilor/articles/150610.html</guid><wfw:comment>http://www.blogjava.net/hilor/comments/150610.html</wfw:comment><comments>http://www.blogjava.net/hilor/articles/150610.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/hilor/comments/commentRss/150610.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/hilor/services/trackbacks/150610.html</trackback:ping><description><![CDATA[<ol>
    <li>可变类和不可变类(Mutable and Immutable Objects)的初步定义：<br />
    可变类：当你获得这个类的一个实例引用时，你可以改变这个实例的内容。<br />
    不可变类：当你获得这个类的一个实例引用时，你不可以改变这个实例的内容。不可变类的实例一但创建，其内在成员变量的值就不能被修改。
    <li>如何创建一个自己的不可变类：<br />
    .所有成员都是private<br />
    .不提供对成员的改变方法，例如：setXXXX<br />
    .确保所有的方法不会被重载。手段有两种：使用final Class(强不可变类)，或者将所有类方法加上final(弱不可变类)。<br />
    .如果某一个类成员不是原始变量(primitive)或者不可变类，必须通过在成员初始化(in)或者get方法(out)时通过深度clone方法，来确保类的不可变。
    <li>一个示例 </li>
</ol>
<p>&nbsp;import java.util.Date;&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;&nbsp; <br />
&nbsp;public final class BrokenPerson&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;&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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;private String firstName;&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; <br />
&nbsp;&nbsp;private String lastName;&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; <br />
&nbsp;&nbsp;private Date dob;&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;&nbsp;&nbsp;&nbsp; <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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;public BrokenPerson( String firstName,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;public BetterPerson( String firstName, <br />
&nbsp;&nbsp;&nbsp; String lastName, Date dob)&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;&nbsp; &nbsp;String lastName, Date dob)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <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;&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;&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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;this.firstName = firstName;&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;&nbsp;&nbsp; this.firstName = firstName;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;this.lastName = lastName;&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;&nbsp; &nbsp;this.lastName = lastName;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;<strong><font color="#ff0000">this.dob = dob;&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#ff0000">&nbsp;//error</font>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </strong><font color="#ff0000"><strong>&nbsp;this.dob = new Date( dob.getTime() ); //correct<br />
</strong></font>&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;&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;&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;&nbsp;&nbsp;<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;&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;<br />
&nbsp;&nbsp;public String getFirstName()<br />
&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;return this.firstName;<br />
&nbsp;&nbsp;}<br />
&nbsp;&nbsp;public String getLastName()<br />
&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;return this.lastName;<br />
&nbsp;&nbsp;}<br />
&nbsp;&nbsp;public Date getDOB()&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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public Date getDOB()&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;&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;&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;&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;<font color="#ff0000"><strong>&nbsp;return this.dob;&nbsp;&nbsp;&nbsp;&nbsp;//error&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return new Date( this.dob.getTime() );//correct<br />
</strong></font>&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;&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;&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;&nbsp;&nbsp; <br />
&nbsp;}<br />
&nbsp;&nbsp;4. jdk的可变类和不可变类</p>
<p>primitive变量: boolean,byte, char, double ,float, integer, long, short <br />
jdk的不可变类：jdk的java.lang包中 Boolean, Byte, Character, Double, Float, Integer, Long, Short, String. <br />
&nbsp; <br />
&nbsp; StringBuffer 可变类<br />
&nbsp; java.util.Date 可变类<br />
<br />
<hr />
</p>
对于这个系列里的问题，每个学Java的人都应该搞懂。当然，如果只是学Java玩玩就无所谓了。如果你认为自己已经超越初学者了，却不很懂这些问题，请将你自己重归初学者行列。内容均来自于CSDN的经典老贴。<br />
<br />
<strong>问题一：</strong><span style="color: red">我声明了什么！</span><br />
<br />
String s = "Hello world!";<br />
<br />
许多人都做过这样的事情，但是，我们到底声明了什么？回答通常是：一个String，内容是&#8220;Hello world!&#8221;。这样模糊的回答通常是概念不清的根源。如果要准确的回答，一半的人大概会回答错误。<br />
这个语句声明的是一个指向对象的引用，名为&#8220;s&#8221;，可以指向类型为String的任何对象，目前指向"Hello world!"这个String类型的对象。这就是真正发生的事情。我们并没有声明一个String对象，我们只是声明了一个只能指向String对象的引用变量。所以，如果在刚才那句语句后面，如果再运行一句：<br />
<br />
String string = s;<br />
<br />
我们是声明了另外一个只能指向String对象的引用，名为string，并没有第二个对象产生，string还是指向原来那个对象，也就是，和s指向同一个对象。<br />
<br />
<strong>问题二：</strong><span style="color: red">"=="和equals方法究竟有什么区别？</span><br />
<br />
==操作符专门用来比较变量的值是否相等。比较好理解的一点是：<br />
int a=10;<br />
int b=10;<br />
则a==b将是true。<br />
但不好理解的地方是：<br />
String a=new String("foo");<br />
String b=new String("foo");<br />
则a==b将返回false。<br />
<br />
根据前一帖说过，对象变量其实是一个引用，它们的值是指向对象所在的内存地址，而不是对象本身。a和b都使用了new操作符，意味着将在内存中产生两个内容为"foo"的字符串，既然是&#8220;两个&#8221;，它们自然位于不同的内存地址。a和b的值其实是两个不同的内存地址的值，所以使用"=="操作符，结果会是false。诚然，a和b所指的对象，它们的内容都是"foo"，应该是&#8220;相等&#8221;，但是==操作符并不涉及到对象内容的比较。<br />
对象内容的比较，正是equals方法做的事。<br />
<br />
看一下Object对象的equals方法是如何实现的：<br />
boolean equals(Object o){<br />
<br />
return this==o;<br />
<br />
}<br />
Object对象默认使用了==操作符。所以如果你自创的类没有覆盖equals方法，那你的类使用equals和使用==会得到同样的结果。同样也可以看出，Object的equals方法没有达到equals方法应该达到的目标：比较两个对象内容是否相等。因为答案应该由类的创建者决定，所以Object把这个任务留给了类的创建者。<br />
<br />
看一下一个极端的类：<br />
Class Monster{<br />
private String content;<br />
...<br />
boolean equals(Object another){ return true;}<br />
<br />
}<br />
我覆盖了equals方法。这个实现会导致无论Monster实例内容如何，它们之间的比较永远返回true。<br />
<br />
所以当你是用equals方法判断对象的内容是否相等，请不要想当然。因为可能你认为相等，而这个类的作者不这样认为，而类的equals方法的实现是由他掌握的。如果你需要使用equals方法，或者使用任何基于散列码的集合（HashSet,HashMap,HashTable），请察看一下java doc以确认这个类的equals逻辑是如何实现的。<br />
<br />
<strong>问题三：</strong><span style="color: red">String到底变了没有？</span><br />
<br />
没有。因为String被设计成不可变(immutable)类，所以它的所有对象都是不可变对象。请看下列代码：<br />
<br />
String s = "Hello";<br />
s = s + " world!";<br />
<br />
s所指向的对象是否改变了呢？从本系列第一篇的结论很容易导出这个结论。我们来看看发生了什么事情。在这段代码中，s原先指向一个String对象，内容是"Hello"，然后我们对s进行了+操作，那么s所指向的那个对象是否发生了改变呢？答案是没有。这时，s不指向原来那个对象了，而指向了另一个String对象，内容为"Hello world!"，原来那个对象还存在于内存之中，只是s这个引用变量不再指向它了。<br />
通过上面的说明，我们很容易导出另一个结论，如果经常对字符串进行各种各样的修改，或者说，不可预见的修改，那么使用String来代表字符串的话会引起很大的内存开销。因为String对象建立之后不能再改变，所以对于每一个不同的字符串，都需要一个String对象来表示。这时，应该考虑使用StringBuffer类，它允许修改，而不是每个不同的字符串都要生成一个新的对象。并且，这两种类的对象转换十分容易。<br />
同时，我们还可以知道，如果要使用内容相同的字符串，不必每次都new一个String。例如我们要在构造器中对一个名叫s的String引用变量进行初始化，把它设置为初始值，应当这样做：<br />
public class Demo {<br />
&nbsp;&nbsp;private String s;<br />
&nbsp;&nbsp;...<br />
&nbsp;&nbsp;public Demo {<br />
&nbsp;&nbsp;&nbsp;&nbsp;s = "Initial Value";<br />
&nbsp;&nbsp;}<br />
&nbsp;&nbsp;...<br />
}<br />
而非<br />
s = new String("Initial Value");<br />
后者每次都会调用构造器，生成新对象，性能低下且内存开销大，并且没有意义，因为String对象不可改变，所以对于内容相同的字符串，只要一个String对象来表示就可以了。也就说，多次调用上面的构造器创建多个对象，他们的String类型属性s都指向同一个对象。<br />
上面的结论还基于这样一个事实：对于字符串常量，如果内容相同，Java认为它们代表同一个String对象。而用关键字new调用构造器，总是会创建一个新的对象，无论内容是否相同。<br />
至于为什么要把String类设计成不可变类，是它的用途决定的。其实不只String，很多Java标准类库中的类都是不可变的。在开发一个系统的时候，我们有时候也需要设计不可变类，来传递一组相关的值，这也是面向对象思想的体现。不可变类有一些优点，比如因为它的对象是只读的，所以多线程并发访问也不会有任何问题。当然也有一些缺点，比如每个不同的状态都要一个对象来代表，可能会造成性能上的问题。所以Java标准类库还提供了一个可变版本，即StringBuffer。<br />
<br />
<strong>问题四：</strong><span style="color: red">final关键字到底修饰了什么？</span><br />
<br />
final使得被修饰的变量"不变"，但是由于对象型变量的本质是&#8220;引用&#8221;，使得&#8220;不变&#8221;也有了两种含义：引用本身的不变，和引用指向的对象不变。<br />
<br />
引用本身的不变：<br />
final StringBuffer a=new StringBuffer("immutable");<br />
final StringBuffer b=new StringBuffer("not immutable");<br />
a=b;//编译期错误<br />
<br />
引用指向的对象不变：<br />
final StringBuffer a=new StringBuffer("immutable");<br />
a.append(" broken!"); //编译通过<br />
<br />
可见，final只对引用的&#8220;值&#8221;(也即它所指向的那个对象的内存地址)有效，它迫使引用只能指向初始指向的那个对象，改变它的指向会导致编译期错误。至于它所指向的对象的变化，final是不负责的。这很类似==操作符：==操作符只负责引用的&#8220;值&#8221;相等，至于这个地址所指向的对象内容是否相等，==操作符是不管的。<br />
<br />
理解final问题有很重要的含义。许多程序漏洞都基于此----final只能保证引用永远指向固定对象，不能保证那个对象的状态不变。在多线程的操作中,一个对象会被多个线程共享或修改，一个线程对对象无意识的修改可能会导致另一个使用此对象的线程崩溃。一个错误的解决方法就是在此对象新建的时候把它声明为final，意图使得它&#8220;永远不变&#8221;。其实那是徒劳的。<br />
<br />
<strong>问题五：</strong><span style="color: red">到底要怎么样初始化！</span><br />
<br />
本问题讨论变量的初始化，所以先来看一下Java中有哪些种类的变量。<br />
1. 类的属性，或者叫值域<br />
2. 方法里的局部变量<br />
3. 方法的参数<br />
<br />
对于第一种变量，Java虚拟机会自动进行初始化。如果给出了初始值，则初始化为该初始值。如果没有给出，则把它初始化为该类型变量的默认初始值。<br />
<br />
int类型变量默认初始值为0<br />
float类型变量默认初始值为0.0f<br />
double类型变量默认初始值为0.0<br />
boolean类型变量默认初始值为false<br />
char类型变量默认初始值为0(ASCII码)<br />
long类型变量默认初始值为0<br />
所有对象引用类型变量默认初始值为null，即不指向任何对象。注意数组本身也是对象，所以没有初始化的数组引用在自动初始化后其值也是null。<br />
<br />
对于两种不同的类属性，static属性与instance属性，初始化的时机是不同的。instance属性在创建实例的时候初始化，static属性在类加载，也就是第一次用到这个类的时候初始化，对于后来的实例的创建，不再次进行初始化。这个问题会在以后的系列中进行详细讨论。<br />
<br />
对于第二种变量，必须明确地进行初始化。如果再没有初始化之前就试图使用它，编译器会抗议。如果初始化的语句在try块中或if块中，也必须要让它在第一次使用前一定能够得到赋值。也就是说，把初始化语句放在只有if块的条件判断语句中编译器也会抗议，因为执行的时候可能不符合if后面的判断条件，如此一来初始化语句就不会被执行了，这就违反了局部变量使用前必须初始化的规定。但如果在else块中也有初始化语句，就可以通过编译，因为无论如何，总有至少一条初始化语句会被执行，不会发生使用前未被初始化的事情。对于try-catch也是一样，如果只有在try块里才有初始化语句，编译部通过。如果在catch或finally里也有，则可以通过编译。总之，要保证局部变量在使用之前一定被初始化了。所以，一个好的做法是在声明他们的时候就初始化他们，如果不知道要出事化成什么值好，就用上面的默认值吧！<br />
<br />
其实第三种变量和第二种本质上是一样的，都是方法中的局部变量。只不过作为参数，肯定是被初始化过的，传入的值就是初始值，所以不需要初始化。<br />
<br />
<strong>问题六：</strong><span style="color: red">instanceof是什么东东？</span><br />
<br />
instanceof是Java的一个二元操作符，和==，&gt;，&lt;是同一类东东。由于它是由字母组成的，所以也是Java的保留关键字。它的作用是测试它左边的对象是否是它右边的类的实例，返回boolean类型的数据。举个例子：<br />
<br />
String s = "I AM an Object!";<br />
boolean isObject = s instanceof Object;<br />
<br />
我们声明了一个String对象引用，指向一个String对象，然后用instancof来测试它所指向的对象是否是Object类的一个实例，显然，这是真的，所以返回true，也就是isObject的值为True。<br />
instanceof有一些用处。比如我们写了一个处理账单的系统，其中有这样三个类：<br />
<br />
public class Bill {//省略细节}<br />
public class PhoneBill extends Bill {//省略细节}<br />
public class GasBill extends Bill {//省略细节}<br />
<br />
在处理程序里有一个方法，接受一个Bill类型的对象，计算金额。假设两种账单计算方法不同，而传入的Bill对象可能是两种中的任何一种，所以要用instanceof来判断：<br />
<br />
public double calculate(Bill bill) {<br />
&nbsp;&nbsp;if (bill instanceof PhoneBill) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;//计算电话账单<br />
&nbsp;&nbsp;}<br />
&nbsp;&nbsp;if (bill instanceof GasBill) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;//计算燃气账单<br />
&nbsp;&nbsp;}<br />
&nbsp;&nbsp;...<br />
}<br />
这样就可以用一个方法处理两种子类。<br />
<br />
然而，这种做法通常被认为是没有好好利用面向对象中的多态性。其实上面的功能要求用方法重载完全可以实现，这是面向对象变成应有的做法，避免回到结构化编程模式。只要提供两个名字和返回值都相同，接受参数类型不同的方法就可以了：<br />
<br />
public double calculate(PhoneBill bill) {<br />
&nbsp;&nbsp;//计算电话账单<br />
}<br />
<br />
public double calculate(GasBill bill) {<br />
&nbsp;&nbsp;//计算燃气账单<br />
}<br />
<br />
所以，使用instanceof在绝大多数情况下并不是推荐的做法，应当好好利用多态<img src ="http://www.blogjava.net/hilor/aggbug/150610.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-05 21:33 <a href="http://www.blogjava.net/hilor/articles/150610.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Dom4j的CRUD操作</title><link>http://www.blogjava.net/hilor/articles/142107.html</link><dc:creator>hilor</dc:creator><author>hilor</author><pubDate>Sun, 02 Sep 2007 10:57:00 GMT</pubDate><guid>http://www.blogjava.net/hilor/articles/142107.html</guid><wfw:comment>http://www.blogjava.net/hilor/comments/142107.html</wfw:comment><comments>http://www.blogjava.net/hilor/articles/142107.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/hilor/comments/commentRss/142107.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/hilor/services/trackbacks/142107.html</trackback:ping><description><![CDATA[<p>用Dom4j增删改XML文件</p>
<p>本示例代码引用了以下两个包：<br />
dom4j-1.6.1.jar<br />
jaxen-1.1-beta-6.jar</p>
<p>下载与安装<br />
&nbsp; dom4j是sourceforge.net上的一个开源项目，主要用于对XML的解析。dom4j专门针对Java开发，使用起来非常简单、直观。<br />
&nbsp; 可以到<a href="http://sourceforge.net/projects/dom4j"><font color="#286ea0">http://sourceforge.net/projects/dom4j</font></a>下载其最新版。<br />
&nbsp;
dom4j1.6解压后有一个dom4j-1.6.1.jar文件，这就是应用时需要引入的类包，另外还有一个jaxen-1.1-beta-6.jar
文件，需要引入，否则执行时可能抛java.lang.NoClassDefFoundError:
org/jaxen/JaxenException异常<br />
<br />
代码如下:<br />
package com.tl.common.util;</p>
<p>import java.io.File;<br />
import java.io.FileWriter;<br />
import java.io.IOException;<br />
import java.util.Iterator;<br />
import java.util.List;</p>
<p>import org.dom4j.Attribute;<br />
import org.dom4j.Document;<br />
import org.dom4j.DocumentException;<br />
import org.dom4j.Element;<br />
import org.dom4j.io.OutputFormat;<br />
import org.dom4j.io.SAXReader;<br />
import org.dom4j.io.XMLWriter;</p>
<p>/**<br />
&nbsp;* @author zhangql<br />
&nbsp;* <br />
&nbsp;* To change this generated comment edit the template variable "typecomment":<br />
&nbsp;* Window&gt;Preferences&gt;Java&gt;Templates. To enable and disable the creation of type<br />
&nbsp;* comments go to Window&gt;Preferences&gt;Java&gt;Code Generation.<br />
&nbsp;*/<br />
public final class ConfigtUtil<br />
{<br />
&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; /**<br />
&nbsp;&nbsp;&nbsp;&nbsp; * 空方法，未实现 <br />
&nbsp;&nbsp;&nbsp;&nbsp; */<br />
&nbsp;&nbsp;&nbsp; public void getRootNodeAttribute()<br />
&nbsp;&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //TODO<br />
&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; /** 返回节点路径<br />
&nbsp;&nbsp;&nbsp;&nbsp; * @param rootNodeName<br />
&nbsp;&nbsp;&nbsp;&nbsp; * @param childNodeName<br />
&nbsp;&nbsp;&nbsp;&nbsp; * @return String<br />
&nbsp;&nbsp;&nbsp;&nbsp; */<br />
&nbsp;&nbsp;&nbsp; public String getNodePath(String rootNodeName,String childNodeName)<br />
&nbsp;&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String result = null;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(rootNodeName== "" || rootNodeName == null ||<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; childNodeName == "" || childNodeName == null)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return result;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; result = getNodePath(rootNodeName,childNodeName,null);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return result;<br />
&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; /** <br />
&nbsp;&nbsp;&nbsp;&nbsp; * 返回节点路径<br />
&nbsp;&nbsp;&nbsp;&nbsp; * @param rootNodeName<br />
&nbsp;&nbsp;&nbsp;&nbsp; * @param childNodeName<br />
&nbsp;&nbsp;&nbsp;&nbsp; * @param childAttributeName<br />
&nbsp;&nbsp;&nbsp;&nbsp; * @return String<br />
&nbsp;&nbsp;&nbsp;&nbsp; */<br />
&nbsp;&nbsp;&nbsp; public String getNodePath(String rootNodeName,String childNodeName,String childAttributeName)<br />
&nbsp;&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String result = null;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(rootNodeName== "" || rootNodeName == null ||<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; childNodeName == "" || childNodeName == null )<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return result;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String dima = "/";<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; StringBuffer nodePath = new StringBuffer();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; nodePath.append(rootNodeName);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; nodePath.append(dima).append(childNodeName);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(childAttributeName != null &amp;&amp; childAttributeName != "")<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; nodePath.append(dima).append("@");<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; nodePath.append(childAttributeName);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; result = nodePath.toString();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return result;<br />
&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; /** <br />
&nbsp;&nbsp;&nbsp;&nbsp; * 更新子节点属性值<br />
&nbsp;&nbsp;&nbsp;&nbsp; * @param filePathAndName<br />
&nbsp;&nbsp;&nbsp;&nbsp; * @param rootNodeName<br />
&nbsp;&nbsp;&nbsp;&nbsp; * @param childNodeName<br />
&nbsp;&nbsp;&nbsp;&nbsp; * @param childAttributeName<br />
&nbsp;&nbsp;&nbsp;&nbsp; * @param childAttributeValue<br />
&nbsp;&nbsp;&nbsp;&nbsp; * @return boolean<br />
&nbsp;&nbsp;&nbsp;&nbsp; * @throws DocumentException<br />
&nbsp;&nbsp;&nbsp;&nbsp; * @throws IOException<br />
&nbsp;&nbsp;&nbsp;&nbsp; */<br />
&nbsp;&nbsp;&nbsp; public boolean updateChildNodeAttributeValue(String filePathAndName, String rootNodeName,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String childNodeName,String childAttributeName,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String childAttributeValue) throws DocumentException, IOException<br />
&nbsp;&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; boolean result = false;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(filePathAndName == "" || filePathAndName == null ||<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; rootNodeName== "" || rootNodeName == null ||<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; childNodeName == "" || childNodeName == null ||<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; childAttributeName == "" || childAttributeName == null ||<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; childAttributeValue == "" || childAttributeValue == null)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return result;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String nodePath = getNodePath(rootNodeName,childNodeName,childAttributeName); <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Document document = getDocument(filePathAndName);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; List list = getListByDocument(document,nodePath);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for(Iterator iter = list.iterator();iter.hasNext();)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Attribute attribute = (Attribute) iter.next();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; attribute.setValue(childAttributeValue);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; result = writerConfigFileByFormat(filePathAndName,document);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return result;<br />
&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; /**<br />
&nbsp;&nbsp;&nbsp;&nbsp; * 取得Document中指定节点下的所有节点集合<br />
&nbsp;&nbsp;&nbsp;&nbsp; * @param document<br />
&nbsp;&nbsp;&nbsp;&nbsp; * @param nodeName<br />
&nbsp;&nbsp;&nbsp;&nbsp; * @return List<br />
&nbsp;&nbsp;&nbsp;&nbsp; */<br />
&nbsp;&nbsp;&nbsp; public List getListByDocument(Document document,String nodeName)<br />
&nbsp;&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(document == null || nodeName == null || nodeName == "")<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return null;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; List list = null;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; list = document.selectNodes(nodeName);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return list;<br />
&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; /**<br />
&nbsp;&nbsp;&nbsp;&nbsp; *&nbsp; 获取Document<br />
&nbsp;&nbsp;&nbsp;&nbsp; * @param filePathAndName<br />
&nbsp;&nbsp;&nbsp;&nbsp; * @return Document<br />
&nbsp;&nbsp;&nbsp;&nbsp; * @throws DocumentException<br />
&nbsp;&nbsp;&nbsp;&nbsp; */<br />
&nbsp;&nbsp;&nbsp; public Document getDocument(String filePathAndName)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; throws DocumentException<br />
&nbsp;&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Document document = null;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (filePathAndName == null || filePathAndName == "")<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return document;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SAXReader saxReader = new SAXReader();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; document = saxReader.read(new File(filePathAndName));<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return document;<br />
&nbsp;&nbsp;&nbsp; }</p>
<p>&nbsp;&nbsp;&nbsp; /**<br />
&nbsp;&nbsp;&nbsp;&nbsp; * 获取根节点下的子节点集合<br />
&nbsp;&nbsp;&nbsp;&nbsp; * @param filePathAndName<br />
&nbsp;&nbsp;&nbsp;&nbsp; * @param rootNodeName<br />
&nbsp;&nbsp;&nbsp;&nbsp; * @param childNodeName<br />
&nbsp;&nbsp;&nbsp;&nbsp; * @return List<br />
&nbsp;&nbsp;&nbsp;&nbsp; * @throws DocumentException<br />
&nbsp;&nbsp;&nbsp;&nbsp; */<br />
&nbsp;&nbsp;&nbsp; public List getRootListByChildNode(String filePathAndName, String rootNodeName,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String childNodeName) throws DocumentException<br />
&nbsp;&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; List&nbsp; result = null;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (filePathAndName == null || filePathAndName == "" || <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; rootNodeName == null || rootNodeName == "" ||<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; childNodeName == null || childNodeName =="")<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return result;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String nodePath = getNodePath(rootNodeName,childNodeName);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; result = getRootNodeList(filePathAndName,nodePath);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return result;<br />
&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; /**<br />
&nbsp;&nbsp;&nbsp;&nbsp; * 获取根节点集合<br />
&nbsp;&nbsp;&nbsp;&nbsp; * @param filePathAndName<br />
&nbsp;&nbsp;&nbsp;&nbsp; * @param rootNodeName<br />
&nbsp;&nbsp;&nbsp;&nbsp; * @return List<br />
&nbsp;&nbsp;&nbsp;&nbsp; * @throws DocumentException<br />
&nbsp;&nbsp;&nbsp;&nbsp; */<br />
&nbsp;&nbsp;&nbsp; public List getRootNodeList(String filePathAndName, String rootNodeName)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; throws DocumentException<br />
&nbsp;&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; List list = null;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (filePathAndName == null || filePathAndName == "" || <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; rootNodeName == null || rootNodeName == "")<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return list;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; list = getNodeList(filePathAndName,rootNodeName);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return list;<br />
&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; /**<br />
&nbsp;&nbsp;&nbsp;&nbsp; * 取得节点集合<br />
&nbsp;&nbsp;&nbsp;&nbsp; * @param filePathAndName<br />
&nbsp;&nbsp;&nbsp;&nbsp; * @param nodePath<br />
&nbsp;&nbsp;&nbsp;&nbsp; * @return List<br />
&nbsp;&nbsp;&nbsp;&nbsp; * @throws DocumentException<br />
&nbsp;&nbsp;&nbsp;&nbsp; */<br />
&nbsp;&nbsp;&nbsp; public List getNodeList(String filePathAndName, String nodePath) throws DocumentException<br />
&nbsp;&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; List list = null;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (filePathAndName == null || filePathAndName == "" || <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; nodePath == null || nodePath == "")<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return list;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; list = getListByDocument(getDocument(filePathAndName),nodePath);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return list;<br />
&nbsp;&nbsp;&nbsp; }</p>
<p>&nbsp;&nbsp;&nbsp; /**<br />
&nbsp;&nbsp;&nbsp;&nbsp; * 获取节点的值<br />
&nbsp;&nbsp;&nbsp;&nbsp; * @param filePathAndName<br />
&nbsp;&nbsp;&nbsp;&nbsp; * @param rootNodeName<br />
&nbsp;&nbsp;&nbsp;&nbsp; * @param nodeName<br />
&nbsp;&nbsp;&nbsp;&nbsp; * @return String<br />
&nbsp;&nbsp;&nbsp;&nbsp; * @throws DocumentException<br />
&nbsp;&nbsp;&nbsp;&nbsp; */<br />
&nbsp;&nbsp;&nbsp; public String getNodeValue(String filePathAndName, String rootNodeName,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String nodeName) throws DocumentException<br />
&nbsp;&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String result = null;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (filePathAndName == null || filePathAndName == ""<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; || rootNodeName == null || rootNodeName == ""<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; || nodeName == null || nodeName == "")<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return result;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; List list = getRootNodeList(filePathAndName, rootNodeName);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; result = getNodeValue(list, nodeName);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return result;<br />
&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; /** <br />
&nbsp;&nbsp;&nbsp;&nbsp; * 获取子节点值<br />
&nbsp;&nbsp;&nbsp;&nbsp; * @param list<br />
&nbsp;&nbsp;&nbsp;&nbsp; * @param childNodeName<br />
&nbsp;&nbsp;&nbsp;&nbsp; * @return String<br />
&nbsp;&nbsp;&nbsp;&nbsp; */<br />
&nbsp;&nbsp;&nbsp; public String getChildNodeValue(List list,String childNodeName)<br />
&nbsp;&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String result = null;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(list.isEmpty() || childNodeName == "" || childNodeName == null)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return result;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; result = getNodeValue(list,childNodeName);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return result;<br />
&nbsp;&nbsp;&nbsp; }</p>
<p>&nbsp;&nbsp;&nbsp; /**<br />
&nbsp;&nbsp;&nbsp;&nbsp; * 获取子节点值<br />
&nbsp;&nbsp;&nbsp;&nbsp; * @param list<br />
&nbsp;&nbsp;&nbsp;&nbsp; * @return String<br />
&nbsp;&nbsp;&nbsp;&nbsp; */<br />
&nbsp;&nbsp;&nbsp; public String getChildNodeValue(List list)<br />
&nbsp;&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String result = null;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(list.isEmpty())<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return result;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for(Iterator iter = list.iterator();iter.hasNext();)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Element element = (Element)iter.next();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; result = element.getText();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return result;<br />
&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; /**<br />
&nbsp;&nbsp;&nbsp;&nbsp; * 取得子节点的属性值<br />
&nbsp;&nbsp;&nbsp;&nbsp; * @param filePathAndName<br />
&nbsp;&nbsp;&nbsp;&nbsp; * @param rootNodeName<br />
&nbsp;&nbsp;&nbsp;&nbsp; * @param childNodeName<br />
&nbsp;&nbsp;&nbsp;&nbsp; * @param childAttributeName<br />
&nbsp;&nbsp;&nbsp;&nbsp; * @return String<br />
&nbsp;&nbsp;&nbsp;&nbsp; * @throws DocumentException<br />
&nbsp;&nbsp;&nbsp;&nbsp; */<br />
&nbsp;&nbsp;&nbsp; public String getChildNodeAttributeValue(String filePathAndName,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String rootNodeName, String childNodeName, String childAttributeName)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; throws DocumentException<br />
&nbsp;&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String result = null;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(filePathAndName == "" || filePathAndName == null || <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; rootNodeName == "" || rootNodeName == null || <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; childNodeName == "" || childNodeName == null || <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; childAttributeName == null || childAttributeName == "")<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return result;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String nodePath = getNodePath(rootNodeName, childNodeName,childAttributeName);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; List list = getNodeList(filePathAndName, nodePath);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; result = getChildNodeAttributeValue(list);</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return result;<br />
&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; /**<br />
&nbsp;&nbsp;&nbsp;&nbsp; * 此方法未实现<br />
&nbsp;&nbsp;&nbsp;&nbsp; * @param list<br />
&nbsp;&nbsp;&nbsp;&nbsp; * @param nodeName<br />
&nbsp;&nbsp;&nbsp;&nbsp; * @param attributeName<br />
&nbsp;&nbsp;&nbsp;&nbsp; * @return<br />
&nbsp;&nbsp;&nbsp;&nbsp; */<br />
&nbsp;&nbsp;&nbsp; public String getChildNodeAttributeValue(List list,String nodeName,String attributeName)<br />
&nbsp;&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String result = null;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(list.isEmpty() || nodeName == null || nodeName =="" || <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; attributeName == null || attributeName =="")<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return result;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //TODO<br />
//&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String nodePath = getNodePath(nodeName,attributeName);<br />
//&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
//&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for (Iterator iter = list.iterator(); iter.hasNext();)<br />
//&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br />
//&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Element element = (Element) iter.next();<br />
//&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println("----&gt;"+element.selectNodes(nodeName).size());<br />
//&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println("----&gt;"+element.selectNodes(nodePath).size());<br />
//&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for(Iterator elementIter = element.selectNodes(nodeName).iterator();elementIter.hasNext();)<br />
//&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br />
//&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Attribute attribute = (Attribute)elementIter.next();<br />
//&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println("----&gt;"+attribute.getValue());<br />
//&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
////&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; result = getChildNodeAttributeValue(element.selectNodes(nodeName));&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
//&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return result;<br />
&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; /**<br />
&nbsp;&nbsp;&nbsp;&nbsp; * 获取子节点属性的值<br />
&nbsp;&nbsp;&nbsp;&nbsp; * @param list<br />
&nbsp;&nbsp;&nbsp;&nbsp; * @param childNodeAttributeName<br />
&nbsp;&nbsp;&nbsp;&nbsp; * @return String<br />
&nbsp;&nbsp;&nbsp;&nbsp; */<br />
&nbsp;&nbsp;&nbsp; public String getChildNodeAttributeValue(List list,String childNodeAttributeName)<br />
&nbsp;&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String result = null;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(list.isEmpty() || childNodeAttributeName == null || childNodeAttributeName =="")<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return result;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; result = getNodeValue(list,childNodeAttributeName);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return result;<br />
&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; /**<br />
&nbsp;&nbsp;&nbsp;&nbsp; * 获取子节点属性的值<br />
&nbsp;&nbsp;&nbsp;&nbsp; * @param list<br />
&nbsp;&nbsp;&nbsp;&nbsp; * @return String<br />
&nbsp;&nbsp;&nbsp;&nbsp; */<br />
&nbsp;&nbsp;&nbsp; public String getChildNodeAttributeValue(List list)<br />
&nbsp;&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String result = null;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(list.isEmpty())<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return result;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for(Iterator iter = list.iterator();iter.hasNext();)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Attribute attribute = (Attribute)iter.next();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; result = attribute.getValue();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return result;<br />
&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; /**<br />
&nbsp;&nbsp;&nbsp;&nbsp; * 获取节点值<br />
&nbsp;&nbsp;&nbsp;&nbsp; * @param nodeList<br />
&nbsp;&nbsp;&nbsp;&nbsp; * @param nodeName<br />
&nbsp;&nbsp;&nbsp;&nbsp; * @return String<br />
&nbsp;&nbsp;&nbsp;&nbsp; */<br />
&nbsp;&nbsp;&nbsp; public String getNodeValue(List nodeList, String nodeName)<br />
&nbsp;&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String result = null;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (nodeList.isEmpty())<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return result;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for (Iterator iter = nodeList.iterator(); iter.hasNext();)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Element element = (Element) iter.next();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for (Iterator it = element.selectNodes(nodeName).iterator(); it.hasNext();)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; result = ((Element) it.next()).getText();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return result;<br />
&nbsp;&nbsp;&nbsp; }</p>
<p>&nbsp;&nbsp;&nbsp; /**<br />
&nbsp;&nbsp;&nbsp;&nbsp; * 更新节点值<br />
&nbsp;&nbsp;&nbsp;&nbsp; * @param filePathAndName<br />
&nbsp;&nbsp;&nbsp;&nbsp; * @param rootNodeName<br />
&nbsp;&nbsp;&nbsp;&nbsp; * @param nodeName<br />
&nbsp;&nbsp;&nbsp;&nbsp; * @param NodeVlaue<br />
&nbsp;&nbsp;&nbsp;&nbsp; * @return boolean<br />
&nbsp;&nbsp;&nbsp;&nbsp; * @throws Exception<br />
&nbsp;&nbsp;&nbsp;&nbsp; */<br />
&nbsp;&nbsp;&nbsp; public boolean updateNodeValue(String filePathAndName, String rootNodeName,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String nodeName, String NodeVlaue) throws Exception<br />
&nbsp;&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; boolean result = false;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Document document = getDocument(filePathAndName);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; List list = document.selectNodes(rootNodeName);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for (Iterator iter = list.iterator(); iter.hasNext();)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Element element = (Element) iter.next();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for (Iterator childIterator = element.selectNodes(nodeName)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; .iterator(); childIterator.hasNext();)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Element childElement = (Element) childIterator.next();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; childElement.setText(NodeVlaue);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /** 将document中的内容写入文件中 */<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; result = writerConfigFileByFormat(filePathAndName,document);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return result;<br />
&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; /**<br />
&nbsp;&nbsp;&nbsp;&nbsp; * 创建XMLWriter<br />
&nbsp;&nbsp;&nbsp;&nbsp; * @param filePathAndName<br />
&nbsp;&nbsp;&nbsp;&nbsp; * @return XMLWriter<br />
&nbsp;&nbsp;&nbsp;&nbsp; * @throws IOException<br />
&nbsp;&nbsp;&nbsp;&nbsp; */<br />
&nbsp;&nbsp;&nbsp; private XMLWriter createXMLWriter(String filePathAndName) throws IOException<br />
&nbsp;&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; XMLWriter writer = null;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; writer = new XMLWriter(new FileWriter(new File(filePathAndName)));<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return writer;<br />
&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; /**<br />
&nbsp;&nbsp;&nbsp;&nbsp; * 创建XMLWriter<br />
&nbsp;&nbsp;&nbsp;&nbsp; * @param filePathAndName<br />
&nbsp;&nbsp;&nbsp;&nbsp; * @param outputFormat<br />
&nbsp;&nbsp;&nbsp;&nbsp; * @return XMLWriter<br />
&nbsp;&nbsp;&nbsp;&nbsp; * @throws IOException<br />
&nbsp;&nbsp;&nbsp;&nbsp; */<br />
&nbsp;&nbsp;&nbsp; private XMLWriter createXMLWriter(String filePathAndName,OutputFormat outputFormat) throws IOException<br />
&nbsp;&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; XMLWriter writer = null;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; writer = new XMLWriter(new FileWriter(new File(filePathAndName)), outputFormat);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return writer;<br />
&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; /**<br />
&nbsp;&nbsp;&nbsp;&nbsp; * 以GBK格式化写文件<br />
&nbsp;&nbsp;&nbsp;&nbsp; * @param filePathAndName<br />
&nbsp;&nbsp;&nbsp;&nbsp; * @param document<br />
&nbsp;&nbsp;&nbsp;&nbsp; * @return boolean<br />
&nbsp;&nbsp;&nbsp;&nbsp; */<br />
&nbsp;&nbsp;&nbsp; public boolean writerConfigFileByFormat(String filePathAndName,Document document)<br />
&nbsp;&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; boolean result = false;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; try<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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; result = writerConfigFileByFormat(filePathAndName,document,"GBK");<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; catch (Exception ex)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ex.printStackTrace();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return result;<br />
&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; /**<br />
&nbsp;&nbsp;&nbsp;&nbsp; * 格式化写文件<br />
&nbsp;&nbsp;&nbsp;&nbsp; * @param filePathAndName<br />
&nbsp;&nbsp;&nbsp;&nbsp; * @param document<br />
&nbsp;&nbsp;&nbsp;&nbsp; * @param encoding<br />
&nbsp;&nbsp;&nbsp;&nbsp; * @return boolean<br />
&nbsp;&nbsp;&nbsp;&nbsp; */<br />
&nbsp;&nbsp;&nbsp; public boolean writerConfigFileByFormat(String filePathAndName,Document document,String encoding)<br />
&nbsp;&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; boolean result = false;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; try<br />
&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;&nbsp;&nbsp;&nbsp;&nbsp; XMLWriter writer = null;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; OutputFormat format = OutputFormat.createPrettyPrint();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; format.setEncoding(encoding);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; writer = createXMLWriter(filePathAndName, format);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; writerConfigFile(writer,document);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; result = true;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; catch (Exception ex)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ex.printStackTrace();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return result;<br />
&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; /**<br />
&nbsp;&nbsp;&nbsp;&nbsp; * 写文件<br />
&nbsp;&nbsp;&nbsp;&nbsp; * @param filePathAndName<br />
&nbsp;&nbsp;&nbsp;&nbsp; * @param document<br />
&nbsp;&nbsp;&nbsp;&nbsp; * @return boolean<br />
&nbsp;&nbsp;&nbsp;&nbsp; * @throws IOException<br />
&nbsp;&nbsp;&nbsp;&nbsp; */<br />
&nbsp;&nbsp;&nbsp; public boolean writerConfigFile(String filePathAndName,Document document) throws IOException<br />
&nbsp;&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; boolean result = false;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; XMLWriter writer = createXMLWriter(filePathAndName);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; writerConfigFile(writer,document);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; result = true;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return result;<br />
&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; /**<br />
&nbsp;&nbsp;&nbsp;&nbsp; * 写文件&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp; * @param xmlWriter<br />
&nbsp;&nbsp;&nbsp;&nbsp; * @param document<br />
&nbsp;&nbsp;&nbsp;&nbsp; * @return boolean<br />
&nbsp;&nbsp;&nbsp;&nbsp; * @throws IOException<br />
&nbsp;&nbsp;&nbsp;&nbsp; */<br />
&nbsp;&nbsp;&nbsp; public boolean&nbsp; writerConfigFile(XMLWriter xmlWriter,Document document) throws IOException<br />
&nbsp;&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; boolean result = false;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; xmlWriter.write(document);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; xmlWriter.close();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; result = true;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return result;<br />
&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; /**<br />
&nbsp;&nbsp;&nbsp;&nbsp; * 此方法为网上转载，临时加入到本类，未作代码验证<br />
&nbsp;&nbsp;&nbsp;&nbsp; * 建立一个XML文档,文档名由输入属性决定<br />
&nbsp;&nbsp;&nbsp;&nbsp; * @param filename 需建立的文件名<br />
&nbsp;&nbsp;&nbsp;&nbsp; * @return 返回操作结果, 0表失败, 1表成功<br />
&nbsp;&nbsp;&nbsp;&nbsp; */<br />
&nbsp;&nbsp;&nbsp; public int createXMLFile(String filename)<br />
&nbsp;&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /** 返回操作结果, 0表失败, 1表成功 */<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int returnValue = 0;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /** 建立document对象 */<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Document document = DocumentHelper.createDocument();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /** 建立XML文档的根books */<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Element booksElement = document.addElement("books");<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /** 加入一行注释 */<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; booksElement.addComment("This is a test for dom4j, holen, 2004.9.11");<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /** 加入第一个book节点 */<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Element bookElement = booksElement.addElement("book");<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /** 加入show属性内容 */<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; bookElement.addAttribute("show","yes");<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /** 加入title节点 */<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Element titleElement = bookElement.addElement("title");<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /** 为title设置内容 */<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; titleElement.setText("Dom4j Tutorials");&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /** 类似的完成后两个book */<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; bookElement = booksElement.addElement("book");<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; bookElement.addAttribute("show","yes");<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; titleElement = bookElement.addElement("title");<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; titleElement.setText("Lucene Studing");<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; bookElement = booksElement.addElement("book");<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; bookElement.addAttribute("show","no");<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; titleElement = bookElement.addElement("title");<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; titleElement.setText("Lucene in Action");&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /** 加入owner节点 */<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Element ownerElement = booksElement.addElement("owner");<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ownerElement.setText("O'Reilly");<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; try<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /** 将document中的内容写入文件中 */<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; XMLWriter writer = new XMLWriter(new FileWriter(new File(filename)));<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; writer.write(document);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; writer.close();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /** 执行成功,需返回1 */<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; returnValue = 1;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; catch(Exception ex)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ex.printStackTrace();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return returnValue;<br />
&nbsp;&nbsp;&nbsp; }&nbsp; <br />
}<br />
</p>
&nbsp;<br />
<br />
<p id="TBPingURL">Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=959095</p>
<h3></h3>
<img src ="http://www.blogjava.net/hilor/aggbug/142107.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-09-02 18:57 <a href="http://www.blogjava.net/hilor/articles/142107.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Java实用经验总结--日期、数字篇</title><link>http://www.blogjava.net/hilor/articles/142017.html</link><dc:creator>hilor</dc:creator><author>hilor</author><pubDate>Sat, 01 Sep 2007 18:07:00 GMT</pubDate><guid>http://www.blogjava.net/hilor/articles/142017.html</guid><wfw:comment>http://www.blogjava.net/hilor/comments/142017.html</wfw:comment><comments>http://www.blogjava.net/hilor/articles/142017.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/hilor/comments/commentRss/142017.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/hilor/services/trackbacks/142017.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: Java实用经验总结--日期、数字篇1.&nbsp;&nbsp; 日期部分对于像日期、时间和钱这样的对象来说，不同的国家、地区都有不同的显示格式。即便是同一地区，也可能存在差异。但是在不考虑国家化，时间格式相对固定的情形下，对于时间的处理还是相对比较简单的。在我最近所作的一个小程序里面，遇到了一些与日期有关的且不考虑国际化和复杂格式的问题。例如如何求两个日期所差的天数，所差的月数；将日期类...&nbsp;&nbsp;<a href='http://www.blogjava.net/hilor/articles/142017.html'>阅读全文</a><img src ="http://www.blogjava.net/hilor/aggbug/142017.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-09-02 02:07 <a href="http://www.blogjava.net/hilor/articles/142017.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>FCKEDITOR中文配置手册</title><link>http://www.blogjava.net/hilor/articles/139989.html</link><dc:creator>hilor</dc:creator><author>hilor</author><pubDate>Mon, 27 Aug 2007 08:04:00 GMT</pubDate><guid>http://www.blogjava.net/hilor/articles/139989.html</guid><wfw:comment>http://www.blogjava.net/hilor/comments/139989.html</wfw:comment><comments>http://www.blogjava.net/hilor/articles/139989.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/hilor/comments/commentRss/139989.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/hilor/services/trackbacks/139989.html</trackback:ping><description><![CDATA[FCKEDITOR的性能是非常好的,用户只需很少的时间就可以载入FCKEDITOR所需文件.对于其他在线编辑器来说,这几乎是个很难解决的难题,因为在开启编辑器时需要装载太多的文件.比如CUTEEDITOR,虽然功能比FCKEDITOR还要强大,可是,它本身也够庞大了,至于FREETEXTBOX等,其易用性与FCKEDITOR相比,尚有差距,可以说,FCKEDITOR是一个别具匠心的在线编辑器,它里面融入了作者高深的面向对象的JAVASCRIPT功力,集易用性与强大的功能与一体.<br><br>.与编辑器相关的所有图像,脚本以及调用页<br>.语言文件<br>.编辑器的皮肤文件<br>.工具样的贴图等<br><br>这些将导致在服务器和客户端间产生相当的流量.如果有许多文件被调用,那么即便每个文件很小.也会让用户等得不耐烦.<br><br>在2.0版中,开发人员有两种方法来解决这个问题.<br>那就是指定装载顺序和脚本压缩<br><br>装载顺序<br>从2.0版开始,编辑器按以下步骤装载资源:<br>.基本页(就是编辑器所在页)以及装入编辑器的JS脚本<br>.用来建立编辑器的脚本<br>.编辑器的语言和皮肤.<br>.建立编辑器.<br>.载入预置的编辑文档内容.<br>.从现在开始,用户可以阅读和编辑文档了,不过,拖拽支持以及工具栏都是不可用的<br>.载入编辑器引擎脚本<br>.建立工具栏,并且可用<br>.从现在开始,编辑器的所有功能都已经完整<br>.载入工具栏图标<br><br>脚本压缩<br><br>在打包任何新版本时,编辑器的JS脚本将会进行预处理.预处理步骤如下:<br>.移除所有代码注释<br>.移除所有无用的空白字符.<br>.将脚本合并成几个文件<br><br>使用上面的方法,我们可以将脚本文件的大小压缩到原来的50%.<br>压缩后,原始的代码仍然存在于一个名为_Source的文件夹中<br><br>如何打包?<br>编辑器已经自带了打包程序,它位于FCKEDITOR的根文件夹中_PACKAGER文件夹中,名为Fckeditor.Packager.exe,将其复制到FCKEDITOR根文件夹中并运行,即可自动将JS脚本打包并压缩<br>需要注意的是该程序是一个.NET程序,必须安装.NET FRAMEWORK才能使用<br><br>想要获取支持?<br>如果你捐赠15000欧元,你就可以获得1年的免费技术支持(比较贵的说,相当于人民币15万,不过西欧的费用相当惊人)<br><br>如何安装?<br><br>1.下载最新版的FCKEDITOR<br>2.解压缩到你的站点根文件夹中名为FCKEDITOR的文件夹中(名称必须为FCKEDITOR,因为配置文件中已经使用此名称来标示出FCKEDITOR的位置)<br>3.现在,编辑器就可以使用了,如果想要查看演示,可以按下面方法访问:<br><a title=http:// href="http:///" target=_blank><u><font color=#0000ff>http://</font></u></a>&lt;your-site&gt;/FCKeditor/_samples/default.html<br><br>注意:你可以将FCKEDITOR放置到任何文件夹,默认情况下,将其放入到FCKEDITOR文件夹是最为简单的方法.如果你放入的文件夹使用别的名称,请修改配置文件夹中编辑器BasePath参数,如下所示:<br>oFckeditor.BasePath="/Components/fckeditor/";<br><br>另外,FCKEDITOR文件夹中所有以下划线开头的文件夹及文件,都是可选的,可以安全的从你的发布中删除.它们并不是编辑器运行时必需的<br><br>如何将FCKEDITOR整合进我的页面?<br><br>由于目前的版本提供的FCKEDITOR仅提供了JAVASCRIPT式的整合,因此,这里仅讲述如何应用JAVASCRIPT来整合FCKEDITOR到站点中,当然,其他各种语言的整合,你可以参考_samples文件夹中的例子来完成<br>1,假如编辑器已经安装在你的站点的/FCKEDITOR/文件夹下.那么,第一步我们需要做的就是在页面的HEAD段中放入SCRIPT标记以引入JAVASCRIPT整合模块.例如:<br>&lt;script type="text/javascript" src="/fckeditor/fckeditor.js"&gt;&lt;/script&gt;<br><br>其中路径是可更改的<br><br>2,现在,FCKEDITOR类已经可以使用了.有两个方法在页面中建立一个FCKEDITOR编辑器:<br>方法1:内联方式(建议使用):在页面的FORM标记内需要插入编辑器的地方置入以下代码:<br>script type="text/javascript"&gt;<br>var oFCKeditor = new FCKeditor( 'FCKeditor1' ) ;<br>oFCKeditor.Create() ;<br>&lt;/script&gt;<br><br>方法2:TEXTAREA标记替换法(不建议使用):在页面的ONLOAD事件中,添加以下代码以替换一个已经存在的TEXTAREA标记<br><br>&lt;html&gt;<br>&lt;head&gt;<br>&lt;script type="text/javascript"&gt;<br>window.onload = function()<br>{<br>var oFCKeditor = new FCKeditor( 'MyTextarea' ) ;<br>oFCKeditor.ReplaceTextarea() ;<br>}<br>&lt;/script&gt;<br>&lt;/head&gt;<br>&lt;body&gt;<br>&lt;textarea id="MyTextarea" name="MyTextarea"&gt;This is &lt;b&gt;the&lt;/b&gt; initial value.&lt;/textarea&gt;<br>&lt;/body&gt;<br>&lt;/html&gt;<br><br>3.现在,编辑器可以使用了<br><br>FCKEDITOR类参考:<br>下面是用来在页面中建立编辑器的FCKEDITOR类的说明<br><br>构造器:<br>FCKeditor( instanceName[, width, height, toolbarSet, value] )<br>instanceName:编辑器的唯一名称(相当于ID)<br>WIDTH:宽度<br>HEIGHT:高度<br>toolbarSet:工具条集合的名称<br>value:编辑器初始化内容<br><br>属性:<br>instanceName:编辑器实例名<br>width:宽度,默认值为100%<br>height:高度,默认值是200<br>ToolbarSet:工具集名称,参考FCKCONFIG.JS,默认值是Default<br>value:初始化编辑器的HTML代码,默认值为空<br>BasePath:编辑器的基路径,默认为/Fckeditor/文件夹,注意,尽量不要使用相对路径.最好能用相对于站点根路径的表示方法,要以/结尾<br>CheckBrowser:是否在显示编辑器前检查浏览器兼容性,默认为true<br>DisplayErrors:是否显示提示错误,默为true;<br><br>集合:<br>Config[Key]=value;<br>这个集合用于更改配置中某一项的值,如<br>oFckeditor.Config["DefaultLanguage"]="pt-br";<br><br>方法:<br>Create()<br>建立并输出编辑器<br><br>RepaceTextArea(TextAreaName)<br>用编辑器来替换对应的文本框<br><br>如何配置FCKEDITOR?<br>FCKEDITOR提供了一套用于定制其外观,特性及行为的设置集.主配置文件名为Fckconfig.js<br>你既可以编辑主配置文件,也可以自己定义单独的配置文件.配置文件使用JAVASCRIPT语法.<br><br>修改后,在建立编辑器时,可以使用以下语法:<br>var oFCKeditor = new FCKeditor( 'FCKeditor1' ) ;<br>oFCKeditor.Config['CustomConfigurationsPath'] = '/myconfig.js' ;<br>oFCKeditor.Create() ;<br><br>提醒:当你修改配置后,请清空浏览器缓存以查看效果<br><br>配置选项:<br><br>AutoDetectLanguage=true/false 自动检测语言<br>Basehref="" _fcksavedurl="""" 相对链接的基地址<br>ContentLangDirection="ltr/rtl" 默认文字方向<br>ContextMenu=字符串数组,右键菜单的内容<br>CustomConfigurationsPath="" 自定义配置文件路径和名称<br>Debug=true/false 是否开启调试功能,这样,当调用FCKDebug.Output()时,会在调试窗中输出内容<br>DefaultLanguage="" 缺省语言<br>EditorAreaCss="" 编辑区的样式表文件<br>EnableSourceXHTML=true/false 为TRUE时,当由可视化界面切换到代码页时,把HTML处理成XHTML<br>EnableXHTML=true/false 是否允许使用XHTML取代HTML<br>FillEmptyBlocks=true/false 使用这个功能,可以将空的块级元素用空格来替代<br>FontColors="" 设置显示颜色拾取器时文字颜色列表<br>FontFormats="" 设置显示在文字格式列表中的命名<br>FontNames="" 字体列表中的字体名<br>FontSizes="" 字体大小中的字号列表<br>ForcePasteAsPlainText=true/false 强制粘贴为纯文本<br>ForceSimpleAmpersand=true/false 是否不把&amp;符号转换为XML实体<br>FormatIndentator="" 当在源码格式下缩进代码使用的字符<br>FormatOutput=true/false 当输出内容时是否自动格式化代码<br>FormatSource=true/false 在切换到代码视图时是否自动格式化代码<br>FullPage=true/false 是否允许编辑整个HTML文件,还是仅允许编辑BODY间的内容<br>GeckoUseSPAN=true/false 是否允许SPAN标记代替B,I,U标记<br>IeSpellDownloadUrl=""下载拼写检查器的网址<br>ImageBrowser=true/false 是否允许浏览服务器功能<br>ImageBrowserURL="" 浏览服务器时运行的URL<br>ImageBrowserWindowHeight="" 图像浏览器窗口高度<br>ImageBrowserWindowWidth="" 图像浏览器窗口宽度<br>LinkBrowser=true/false 是否允许在插入链接时浏览服务器<br>LinkBrowserURL="" 插入链接时浏览服务器的URL<br>LinkBrowserWindowHeight=""链接目标浏览器窗口高度<br>LinkBrowserWindowWidth=""链接目标浏览器窗口宽度<br>Plugins=object 注册插件<br>PluginsPath="" 插件文件夹<br>ShowBorders=true/false 合并边框<br>SkinPath="" 皮肤文件夹位置<br>SmileyColumns=12 图符窗列数<br>SmileyImages=字符数组 图符窗中图片文件名数组<br>SmileyPath="" 图符文件夹路径<br>SmileyWindowHeight 图符窗口高度<br>SmileyWindowWidth 图符窗口宽度<br>SpellChecker="ieSpell/Spellerpages" 设置拼写检查器<br>StartupFocus=true/false 开启时FOCUS到编辑器<br>StylesXmlPath="" 设置定义CSS样式列表的XML文件的位置<br>TabSpaces=4 TAB键产生的空格字符数<br>ToolBarCanCollapse=true/false 是否允许展开/折叠工具栏<br>ToolbarSets=object 允许使用TOOLBAR集合<br>ToolbarStartExpanded=true/false 开启是TOOLBAR是否展开<br>UseBROnCarriageReturn=true/false 当回车时是产生BR标记还是P或者DIV标记<br><br>如何自定义样式列表呢?<br>FCKEDITOR的样式工具栏中提供了预定义的样式,样式是通过XML文件定义的,默认的XML样式文件存在于FCkEditor根文件夹下的FckStyls.xml文件中<br>这个XML文件的结构分析如下:<br>&lt;?xml version="1.0" encoding="utf-8" ?&gt;<br>&lt;Styles &gt;<br>&lt;Style name="My Image" element="img"&gt;<br>&lt;Attribute name="style" value="padding: 5px" /&gt;<br>&lt;Attribute name="border" value="2" /&gt;<br>&lt;/Style &gt;<br>&lt;Style name="Italic" element="em" /&gt;<br>&lt;Style name="Title" element="span"&gt;<br>&lt;Attribute name="class" value="Title" /&gt;<br>&lt;/Style &gt;<br>&lt;Style name="Title H3" element="h3" /&gt;<br>&lt;/Styles&gt;<br><br>每一个STYLE标记定义一种样式,NAME是显示在下拉列表中的样式名,ELEMENT属性指定此样式所适用的对象,因为FCKEDITOR中的样式是上下文敏感的,也就是说,选择不同的对象,仅会显示针对这类对象定义的样式<br><br>拼写检查<br><br>FCKEDITOR带了两种拼写检查工具,一种是ieSpell,默认情况下使用这种,使用这种方式的拼写检查,要求客户下载并安装iespell这个小软件,另外,也提供SpellPager的方式来进行拼写检查,不过,由于SPELLPAGER是由PHP编写的服务器端脚本,因此,要求你的WEB服务器必须支持PHP脚本语言方可<br>更改拼写检查器的方式请参见有关配置文件的详细说明<br><br>压缩脚本<br><br>为了提供脚本载入的效率,FCKEDITOR采用以下方法对脚本尽量压缩以减少脚本尺寸:<br>1,移除掉脚本中的注释<br>2.移除掉脚本中所有无意义的空白<br>另外,FCKEDITOR还提供了一个专门用于压缩脚本的工具以便 你在发布时能减小文件尺寸,<br>你可以将_Packager文件夹中的Fckeditor.Packager.exe复制到FCKEDITOR根文件夹来运行并压缩脚本<br><br>本地化FCKEDITOR<br>如果FCKEDITOR没有提供您所需要的语言(实际上全有了),你也可以自行制作新的语言<br>,你只需要复制出EN.JS,然后在其基础上进行翻译.另外,语言名称与对应的脚本文件名必须遵循RFC 3066标准,但是,需要小写,例如:Portuguess Language对应的脚本文件名必须为pt.js<br>如果需要针对某个国家的某种语系,则可以在语系缩写后加上横线及国家缩写即可<br><br>在使用时,系统会自动侦测客户端语系及国别而运用适当的界面语言.<br><br>当建立一种新的语言后,你必须在"Edit/lang/fcklanguagemanager.js"中为其建立一个条目,如下所示:<br>FCKLanguageManager.AvailableLanguages = <br>{<br><br>en : 'English',<br>pt : 'Portuguese' <br>} <br><br>需要提醒的是,文件必须保存为UTF-8格式<br><br>如何与服务器端脚本进行交互?<br>请查看例子以得到相关内容<br><br>另外,在ASP.NET中以以下步骤使用<br>1.把FCKEDITOR添中到工具箱<br>2.托拽FCKEDITOR控件到页面<br>3.为其指定名称<br>4.FCKEDITOR类的所有属性不光可以在代码中使用,而且可以作为FCKEDITOR控件的属性直接使用,例如,要改变皮肤,可以在UI页面中指定SkinPath="/fckeditor/editor/skins/office2003"即可,其实FCKEDITOR的ASP.NET版本可以做得更好,你可以找到FCKEDITOR ASP.NET 2.1的源文件,然后修改该控件的设计,为其暴露更多有用的属性,重新编译即可<br>5,POSTBACK后的数据,使用FCKEDITOR控件的value属性获得<br>6.由于默认状态下,ASP.NET不允许提交含有HTML及JAVASCRIPT的内容,因此,你必须将使用FCKEDITOR的页面的ValidateRequest设为false.(&lt;%@page validteRequest="false" %&gt;即可)<br>
<p>--------------------------------------------------------</p>
<p>附：</p>
<p>一、如何设置上传文件语言</p>
<p>把FCKeditor根目录下面的fckconfig.js文件里<br><br>var&nbsp;_FileBrowserLanguage&nbsp;&nbsp;&nbsp;&nbsp;=&nbsp;'asp'&nbsp;;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;asp&nbsp;|&nbsp;aspx&nbsp;|&nbsp;cfm&nbsp;|&nbsp;lasso&nbsp;|&nbsp;perl&nbsp;|&nbsp;php&nbsp;|&nbsp;py<br>var&nbsp;_QuickUploadLanguage&nbsp;&nbsp;&nbsp;&nbsp;=&nbsp;'asp'&nbsp;;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;asp&nbsp;|&nbsp;aspx&nbsp;|&nbsp;cfm&nbsp;|&nbsp;lasso&nbsp;|&nbsp;php<br><br>这两行中改成您所需要调用的编辑器语言，如用asp.net则改为aspx；<br></p>
<p>二、解决中文的问题:<br>在web.config中加入:<br>&lt;globalization requestEncoding="GB2312" responseEncoding="GB2312"/&gt;<br>这样设置后可以显示中文的文件，但URL地址也是中文的；<br>如果服务器对中文地址的解析不好，可能导致图片无法浏览；<br>所以修改：editor\filemanager\browser\default\frmresourceslist.html<br>中的OpenFile函数，把<br>window.top.opener.SetUrl( fileUrl ) ; <br>修改为:<br>window.top.opener.SetUrl( escape(fileUrl) ) ;</p>
<p><br>三.设置上传的目录：<br>1:在web.config中设置:<br>&nbsp;&lt;appSettings&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp; &lt;add key="FCKeditor:UserFilesPath" value="/fck/UpLoad/" /&gt;<br>&nbsp;&lt;/appSettings&gt;</p>
<p>2:在Session中设置:<br>在editor\filemanager\browser\default\connectors\aspx\connector.aspx中加入以下代码:<br>&lt;script runat="server" language="C#"&gt;<br>&nbsp;protected override void OnInit(EventArgs e)<br>&nbsp;{<br>&nbsp;&nbsp;Session["FCKeditor:UserFilesPath"] = "/fck/UpLoad1/";<br>&nbsp;}<br>&lt;/script&gt;</p>
<p>附：如何在asp.net中动态设置上传图片的路径？</p>
<p><font face=Arial>1.在javascript中修改FCKConfig.ImageBrowserURL的值，修改方式如下：<br>&nbsp;FCKConfig.ImageBrowserURL += "?Path=要上传的文件路径";<br>&nbsp;如:要把文件上传到站点根目录的UploadFile文件夹中，则设置为：<br>&nbsp;FCKConfig.ImageBrowserURL += "?Path=/UploadFile";<br>2.在"editor\filemanager\browser\default\connectors\aspx\connector.aspx"文件最后中增加以下程序：<br>&lt;script runat="server" language="C#"&gt;<br>&nbsp;&nbsp;&nbsp; protected override void OnInit(EventArgs e)<br>&nbsp;&nbsp;&nbsp; {<br>&nbsp;if( Request.QueryString["Path"]==null ){<br>&nbsp;&nbsp;Session["FCKeditor:UserFilesPath"] = "/UpLoadFiles/";&nbsp;//设置默认值<br>&nbsp;}else{<br>&nbsp;&nbsp;Session["FCKeditor:UserFilesPath"] = Request.QueryString["Path"];<br>&nbsp;}<br>&nbsp;&nbsp;&nbsp; }<br>&lt;/script&gt;</font></p>
<!--end-->
<p class=postfoot>posted on 2007-08-22 10:56 <a href="http://aspxcsharp.cnblogs.com/"><u><font color=#0000ff>春风依旧</font></u></a> 阅读(13) <a href="http://www.cnblogs.com/aspxcsharp/archive/2007/08/22/865007.html#Post"><u><font color=#800080>评论(1)</font></u></a> &nbsp;<a href="http://www.cnblogs.com/aspxcsharp/admin/EditPosts.aspx?postid=865007"><u><font color=#0000ff>编辑</font></u></a>&nbsp;<a href="http://www.cnblogs.com/aspxcsharp/AddToFavorite.aspx?id=865007"><u><font color=#0000ff>收藏</font></u></a> <a href="http://www.cnblogs.com/aspxcsharp/services/trackbacks/865007.aspx"><u><font color=#0000ff>引用</font></u></a> <a href="javascript:d=document;t=d.selection?(d.selection.type!='None'?d.selection.createRange().text:''):(d.getSelection?d.getSelection():'');void(saveit=window.open('http://wz.csdn.net/storeit.aspx?t='+escape(d.title)+'&amp;u='+escape(d.location.href)+'&amp;c='+escape(t),'saveit','scrollbars=no,width=590,height=300,left=75,top=20,status=no,resizable=yes'));saveit.focus();"><u><font color=#0000ff>网摘</font></u></a> 所属分类: <a href="http://www.cnblogs.com/aspxcsharp/category/94477.html"><u><font color=#0000ff>前台脚本</font></u></a> </p>
<img height=1 src="http://www.cnblogs.com/aspxcsharp/aggbug/865007.html?webview=1" width=1> <!--
<rdf:rdf xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/">
<rdf:description
rdf:about="http://www.cnblogs.com/aspxcsharp/archive/2007/08/22/865007.html"
dc:identifier="http://www.cnblogs.com/aspxcsharp/archive/2007/08/22/865007.html"
dc:title="FckEditor中文配置手册详细说明"
trackback:ping="http://www.cnblogs.com/aspxcsharp/services/trackbacks/865007.aspx" />
</rdf:rdf>
-->
<div id=AjaxHolder_UpdatePanel1><a name=pagedcomment></a><a name=评论>
<div id=comments>
<h3>评论</h3>
<h4><a title="permalink: re: FckEditor中文配置手册详细说明" href="http://www.cnblogs.com/aspxcsharp/archive/2007/08/22/865007.html#865523"><u><font color=#800080>#</font></u></a>&nbsp;<a name=865523></a>re: FckEditor中文配置手册详细说明<a name=Post></a> <span>2007-08-22 15:45 </span><a id=AjaxHolder_Comments_CommentList_ctl00_NameLink href="http://aspxcsharp.cnblogs.com/" target=_blank><u><font color=#0000ff>春风依旧</font></u></a> </h4>
<p>javascript调用方式： <br>－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－ <br>&lt;script. type=&#8221;text/javascript&#8221; src=&#8221;FCKeditor/fckeditor.js&#8221;&gt;&lt;/scrīpt&gt; <br>&lt;textarea name=&#8221;content&#8221; cols=&#8221;80〃 rows=&#8221;4〃&gt; <br>&lt;/textarea&gt; <br>&lt;script. type=&#8221;text/javascript&#8221;&gt; <br>var FCKeditor = new FCKeditor(&#8221;content&#8221;); <br>oFCKeditor.BasePath = &#8220;FCKeditor/&#8221;; <br>oFCKeditor.Height = 400; <br>oFCKeditor.ToolbarSet = &#8220;Default&#8221;; <br>oFCKeditor.ReplaceTextarea(); <br>&lt;/script&gt; <br>－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－ <br>如果想要使用从数据库读来的文本数据或者是后台来自文件的txt/html文本数据。 <br>只要在 <br>－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－ <br>&lt;textarea name=&#8221;content&#8221; cols=&#8221;80〃 rows=&#8221;4〃&gt; <br>&lt;/textarea&gt; <br>－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－ <br>中加入自己的显示内容的formbean对应字段即可 <br>－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－ <br>&lt;textarea name=&#8221;content&#8221; cols=&#8221;80〃 rows=&#8221;4〃&gt; <br>&lt;c:out value=&#8221;${contentData}&#8221; /&gt; <br>&lt;/textarea&gt; <br>－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－ <br>这样内容就会被显示在FCKeditor编辑框中了，点击提交按钮以后就可以在后台的相应java action中得到content参数中的内容就是页面上FCKeditor中的内容数据了。可以在struts/jsf中使用。 <br>＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝ <br>由于给FCKeditor瘦身，所以常会报缺少对象支持等错误，只要在FCKeditor/editor/lang中加上相应的js语言文件即可。如果加载页面失败（FCKeditor未定义）还有一个可能就是引用FCKeditor/fckeditor.js文件路径不对！ <br>关于FCKeditor瘦身要点如下： <br>1.将FCKeditor目录下及子目录下所有以&#8220;_&#8221;下划线开头的文件夹删除 <br>2.FCKeditor根目录下只保留fckconfig.js, fckeditor.js, fckstyles.xml, fcktemplates.xml，其余全部删除 <br>3.将editor/filemanager/upload目录下文件及文件夹清空 <br>4.将/editor/filemanager/browser/default/connectors/下的所有文件删除 <br>5.还可以将editor/skins目录下的皮肤文件删除，只留下default一套皮肤（如果你不需要换皮肤的话） <br>6.还可以将editor/lang目录下文件删除，只保留en.js, fcklanguagemanager.js, zh-cn.js, zh.js文件 <br>7.如果你是使用javascrīpt来调用加载FCKeditor，那么就不需要在web.xml中配置fckeditor的tag文件。 <br>8.还有一个问题刚开始使用FCKeditor的人常会遇到就怎么控制它的toolbar的大小和元素排列，其实很简单。 <br>在fckconfig.js中用这样的标签[]来划分每行的元素的多少，这样就可以控制toolbar的长短和大小了，具体示例参看：fckconfig.js中的toolbarset[&#8221;Default&#8221;] <br>＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝ <br>用fckconfig.js中的一些选项来控制toolbarset中控件的功能，实现功能裁剪： <br>1)：取消超链接中的浏览服务器和上传功能，方法如下： <br>－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－ <br>FCKConfig.LinkBrowser = true; <br>FCKConfig.LinkUpload = true; <br>改为： <br>FCKConfig.LinkBrowser = false; <br>FCKConfig.LinkUpload = false; <br>－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－ <br>2)：取消图片链接中的浏览服务器和上传功能，方法如下： <br>－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－ <br>FCKConfig.ImageUpload = true; <br>FCKConfig.ImageBrowser = true; <br>改为： <br>FCKConfig.ImageUpload = false; <br>FCKConfig.ImageBrowser = false; <br>－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－ <br>3)：Dlg Button中取消高级功能，方法如下： <br>FCKConfig.LinkDlgHideAdvanced = false ; <br>FCKConfig.ImageDlgHideAdvanced = false ; <br>改为： <br>FCKConfig.ImageDlgHideAdvanced = true ; <br>FCKConfig.LinkDlgHideTarget = true ; <br>－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－ <br>下一篇介绍FCKeditor的上传和浏览服务器功能，以及如何在里面实现动态 <br>超连接，转发到servlet经过filter以后去调用服务器的action <br>如何实现对应用户浏览自己的图片的列表实现！ <br>＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝ <br>FCKeditor集成java servlet可以实现文件的上传和服务器端列表读取功能FCKeditor自己提供了两个servlet来分别实现上传文件功能，和读取服务器端文件列表功能，这两个servlet分别为： <br>com.fredck.FCKeditor.connector.ConnectorServlet（读取文件列表） <br>com.fredck.FCKeditor.uploader.SimpleUploaderServlet（实现文件上传） <br>1.浏览服务器端文件列表 <br>－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－ <br>web.xml文件中，比如：ConnectorServlet中的配置选项： <br>&lt;init-param&gt; <br>&lt;param-name&gt;baseDir&lt;/param-name&gt; <br>&lt;param-value&gt;/UserFiles/&lt;/param-value&gt; <br>&lt;/init-param&gt; <br>意思是在浏览服务器上的baseDir配置指定里面的所有文件及其目录结构列表。 <br>如果你的baseDir没有配置，Connector将会自动创建一个默认的文件夹 <br>UserFiles，对应的ConnectorServlet中init()方法中代码如下： <br>－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－ <br>baseDir = getInitParameter(&#8221;baseDir&#8221;); <br>if (baseDir == null) <br>baseDir = &#8220;/UserFiles/&#8221;; <br>－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－ <br>还想说一下的是，FCKeditor的client调用server的servlet方法采用的是Ajax思想来实现。当你点击浏览服务器(browser server)的时候就会触发一个异步的javascrīpt + xmlhttp的调用响应，后台的servlet会去完成你要请求的事件，然后数据以xml方式返回给client来解析。很明显，你要实现去数据库或者其他的文件系统请求列表，你只要修改 <br>ConnectorServlet中两个私有方法：getFolders 和 getFiles <br>让它去你指定的地方得到文件列表即可，这样你的文件可以放在任何你指定目录下。多说一句，很多人都想知道个人blog系统中怎么实现上传文件以后对应用户浏览自己的列表的，我的做法很简单，建立你用户名的文件夹，你上传只能上传到你的目录夹，浏览可以通过程序指定浏览对应用户下的文件夹即可，这个时候你要修改Connectorservlet中的路径即可！ <br>－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－ <br>2.超连接重定位问题 <br>－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－ <br>FCKeditor可以插入超连接，实现对文件的预览功能，只要我们稍微改变我们可以使FCKeditor编辑器支持对任意文件系统下的任意文件的客户端浏览和下载保存！FCKeditor本来提供的是相对URL超链接，只要我们修改ConnectorServlet中传递给客户端的地址的时候，把它改写成绝对URL然后再通过我们自己的filter的servlet实现重定向去一个下载/浏览文件的struts的action方法就可以实现在客户端对超连接文件的下载和浏览！说一下具体做法吧： <br>1)：修改ConnectorServlet传递给客户端javascrīpt的路径，代码如下： <br>String currentUrl = &#8220;http://&#8221; + request.getserver +request.getServerPort + request.getContextPath + resourcePath; <br>以上代码请在ConnectorServlet的doGet()里面拼装！在调用CreateCommonXml()私有方法的时候参数传入： <br>myEl.setAttribute(&#8221;path&#8221;,currentPath); <br>myEl.setAttribute(&#8221;url&#8221;,currentUrl); <br>提醒一下resourcePath为在web.xml配置文件中ConnectorServlet中的一个初始化参数配置，等一下利用filter实现对超连接的重定位就提取URL中的这个配置参数来判断，配置如下： <br>&lt;init-param&gt; <br>&lt;param-name&gt;resourcePath&lt;/param-name&gt; <br>&lt;param-value&gt;/fileSystem/&lt;/param-value&gt; <br>&lt;/init-param&gt; <br>2)：建立你的filter servlet，实现对URL的截获，对符合要求的URL进行重定位到你的对应action中去即可 <br>3)：实现你的对应action来实现文件的上传和下载功能即可！ <br>4)：扩展功能－实现对URL的加密，对连接的URL中加上一串字符，最后几位作为算法校验，对不符合要求的URL连接,filter将会拒绝重定位到指定action。此外利用自己写的扩展类还可以实现对超连接的文件类型进行限制，比如你只能超连接JPG|GIF|DOC|TXT|HTML等几种后缀名的文件，对其他文件即使你指定超连接也让你浏览和下载，这些都可以在web.xml中通过修改对应servlet的配置文件的初始化参数实现。 <br>3.页面javascrīpt修改 <br>－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－ <br>浏览服务器的功能对应的html/javascrīpt相关的文件为：browser.html和frmresourcelist.html对应你想传递的信息你可以append在文件名的字符串后面，在GetFileRowHtml（）的javascrīpt函数中实现对文件名的截取，这样client只会显示文件名，而你可以得到文件的数据库唯一标识，任何你想要的信息你都可以通过修改ConnectorServlet中的私有方法getFiles()来实现，只要修改页面frmresurcelist.html中的GetFileRowHtml（）中传入变量fileName即可。你还可以在点击选中文件的时候实现一个你自己的Ajax调用，一切取决你的项目需要！ <br>4.我不是一个javascrīpt高手，其实如果我对javascrīpt了解多一些也许对客户端的代码修改以后做出更眩的功能。可以更好的完成对FCKeditor裁剪。 <br>－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－ <br>5.注意点 <br>－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－ <br>无论怎么修改别人的东西，请一定尊重开源精神！ <br>很多人配置好了FCKeditor的上传功能以后常会遇到xmlhttp request 404 error,后面是一串路径，其实就是你的servlet-mapping中的路径不对，你只要把xmlhttp request errot 404 后面跟的路径，copy到你的web.xml中对应红色文字的位置，如下： <br>&lt;servlet-mapping&gt; <br>&lt;servlet-name&gt;Connector&lt;/servlet-name&gt; <br>&lt;url-pattern&gt;/FCKeditor/editor/filemanager/browser/default/connectors/jsp/connector&lt;/url-pattern&gt; <br>&lt;/servlet-mapping&gt; <br>别忘了SimpleUploader的servlet－mapping也要做同样的修改！ <br>还有一个错误就是http 500错误，这个可能是你的URL请求不对，应该和FCKeditor没关系的! <br>＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝ <br>fckconfig.js总配置文件，可用记录本打开，修改后将文件存为utf-8 编码格式。找到： <br>－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－ <br>FCKConfig.TabSpaces = 0; <br>改为： <br>FCKConfig.TabSpaces = 1; <br>即在编辑器域内可以使用Tab键。 <br>如果你的编辑器还用在网站前台的话，比如说用于留言本或是日记回复时，那就不得不考虑安全了， <br>在前台千万不要使用Default的toolbar，要么自定义一下功能，要么就用系统已经定义好的Basic， <br>也就是基本的toolbar，找到： <br>－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－ <br>FCKConfig.ToolbarSets[&#8221;Basic&#8221;] = [ <br>[&#8217;Bold&#8217;,'Italic&#8217;,'-&#8217;,'OrderedList&#8217;,'UnorderedList&#8217;,'-&#8217;,/*&#8217;Link&#8217;,*/&#8217;Unlink&#8217;,'-&#8217;,'Style&#8217;,'FontSize&#8217;,'TextColor&#8217;,'BGColor&#8217;,'-&#8217;, <br>&#8216;Smiley&#8217;,'SpecialChar&#8217;,'Replace&#8217;,'Preview&#8217;] ]; <br>这是改过的Basic，把图像功能去掉，把添加链接功能去掉，因为图像和链接和flash和图像按钮添加功能都能让前台页直接访问和上传文件， fckeditor还支持编辑域内的鼠标右键功能。 <br>FCKConfig.ContextMenu = [&#8217;Generic&#8217;,/*&#8217;Link&#8217;,*/&#8217;Anchor&#8217;,/*&#8217;Image&#8217;,*/&#8217;Flash&#8217;,'Select&#8217;,'Textarea&#8217;,'Checkbox&#8217;,'Radio&#8217;,'TextField&#8217;,'HiddenField&#8217;, <br>/*&#8217;ImageButton&#8217;,*/&#8217;Button&#8217;,'BulletedList&#8217;,'NumberedList&#8217;,'TableCell&#8217;,'Table&#8217;,'Form&#8217;]; <br>这也是改过的把鼠标右键的&#8220;链接、图像，FLASH，图像按钮&#8221;功能都去掉。 <br>找到： <br>FCKConfig.FontNames = &#8216;Arial;Comic Sans MS;Courier New;Tahoma;Times New Roman;Verdana&#8217;; <br>加上几种我们常用的字体 <br>FCKConfig.FontNames = &#8216;宋体;黑体;隶书;楷体_GB2312;Arial;Comic Sans MS;Courier New;Tahoma;Times New Roman;Verdana&#8217;; <br>添加文件 /TestFCKeditor/test.jsp: <br>－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－ <br>&lt;%@ page language=&#8221;java&#8221; import=&#8221;com.fredck.FCKeditor.*&#8221; %&gt; <br>&lt;%@ taglib uri=&#8221;/TestFCKeditor&#8221; prefix=&#8221;FCK&#8221; %&gt; <br>&lt;script. type=&#8221;text/javascript&#8221; src=&#8221;/TestFCKeditor/FCKeditor/fckeditor.js&#8221;&gt;&lt;/script&gt; <br>&lt;%&#8211; <br>三种方法调用FCKeditor <br>1.FCKeditor自定义标签 (必须加头文件 &lt;%@ taglib uri=&#8221;/TestFCKeditor&#8221; prefix=&#8221;FCK&#8221; %&gt; ) <br>2.script脚本语言调用 (必须引用 脚本文件 &lt;script. type=&#8221;text/javascript&#8221; src=&#8221;/TestFCKeditor/FCKeditor/fckeditor.js&#8221;&gt;&lt;/script&gt; ) <br>3.FCKeditor API 调用 (必须加头文件 &lt;%@ page language=&#8221;java&#8221; import=&#8221;com.fredck.FCKeditor.*&#8221; %&gt; ) <br>&#8211;%&gt; <br>&lt;%&#8211; <br>&lt;form. action=&#8221;show.jsp&#8221; method=&#8221;post&#8221; target=&#8221;_blank&#8221;&gt; <br>&lt;FCK:editor id=&#8221;content&#8221; basePath=&#8221;/TestFCKeditor/FCKeditor/&#8221; <br>width=&#8221;700〃 height=&#8221;500〃 skinPath=&#8221;/TestFCKeditor/FCKeditor/editor/skins/silver/&#8221; <br>toolbarSet = &#8220;Default&#8221;&gt; <br>内容 <br>&lt;/FCK:editor&gt; <br>&lt;input type=&#8221;submit&#8221; value=&#8221;Submit&#8221;&gt; <br>&lt;/form&gt; <br>&#8211;%&gt; <br>&lt;form. action=&#8221;show.jsp&#8221; method=&#8221;post&#8221; target=&#8221;_blank&#8221;&gt; <br>&lt;table border=&#8221;0〃 width=&#8221;700〃&gt; <br>&lt;tr&gt; <br>&lt;td&gt; <br>&lt;textarea id=&#8221;content&#8221; name=&#8221;content&#8221; style=&#8221;WIDTH: 100%; HEIGHT: 400px&#8221;&gt;input&lt;/textarea&gt; <br>&lt;script. type=&#8221;text/javascript&#8221;&gt; <br>var FCKeditor = new FCKeditor(&#8217;content? ; <br>oFCKeditor.BasePath = &#8220;/TestFCKeditor/FCKeditor/&#8221; ; <br>oFCKeditor.Height = 400; <br>oFCKeditor.ToolbarSet = &#8220;Default&#8221; ; <br>oFCKeditor.ReplaceTextarea(); <br>&lt;/script&gt; <br>&lt;input type=&#8221;submit&#8221; value=&#8221;Submit&#8221;&gt; <br>&lt;/td&gt; <br>&lt;/tr&gt; <br>&lt;/table&gt; <br>&lt;/form&gt; <br>&lt;%&#8211; <br>&lt;form. action=&#8221;show.jsp&#8221; method=&#8221;post&#8221; target=&#8221;_blank&#8221;&gt; <br>&lt;% <br>FCKeditor oFCKeditor ; <br>oFCKeditor = new FCKeditor( request, &#8220;content&#8221; ) ; <br>oFCKeditor.setBasePath( &#8220;/TestFCKeditor/FCKeditor/&#8221; ) ; <br>oFCKeditor.setValue( &#8220;input&#8221; ); <br>out.println( oFCKeditor.create() ) ; <br>%&gt; <br>&lt;br&gt; <br>&lt;input type=&#8221;submit&#8221; value=&#8221;Submit&#8221;&gt; <br>&lt;/form&gt; <br>&#8211;%&gt; <br>添加文件/TestFCKeditor/show.jsp: <br>&lt;% <br>String content = request.getParameter(&#8221;content&#8221;); <br>out.print(content); <br>%&gt; <br>＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝ <br>1、适时打开编辑器 <br>－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－ <br>很多时候，我们在打开页面的时候不需要直接打开编辑器，而在用到的时候才打开，这样一来有很好的用户体验，另一方面可以消除FCK在加载时对页面打开速度的影响，点击&#8220;Open Editor&#8221;按钮后才打开编辑器界面。 <br>实现原理： <br>使用JAVASCRIPT版的FCK，在页面加载时（未打开FCK），创建一个隐藏的TextArea域，这个TextArea <br>的name和ID要和创建的FCK实例名称一致，然后点击&#8221;Open Editor&#8221;按钮时，通过调用一段函数，使用 <br>FCK的ReplaceTextarea()方法来创建FCKeditor，代码如下： <br>－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－ <br>&lt;script. type=&#8221;text/javascript&#8221;&gt; <br>&lt;!&#8211; <br>function showFCK(){ <br>var FCKeditor = new FCKeditor( &#8216;fbContent&#8217; ) ; <br>oFCKeditor.BasePath = &#8216;/FCKeditor/&#8217; ; <br>oFCKeditor.ToolbarSet = &#8216;Basic&#8217; ; <br>oFCKeditor.Width = &#8216;100%&#8217; ; <br>oFCKeditor.Height = &#8216;200&#8242; ; <br>oFCKeditor.ReplaceTextarea() ; <br>} <br>//&#8211;&gt; <br>&lt;/script&gt; <br>&lt;textarea name=&#8221;fbContent&#8221; id=&#8221;fbContent&#8221;&gt;&lt;/textarea&gt; <br>2、使用FCKeditor 的 API <br>－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－ <br>FCKeditor编辑器，提供了非常丰富的API，用于给End User实现很多想要定制的功能，比如最基本的数据验证，如何在提交的时候用JS判断当前编辑器区域内是否有内容，FCK的API提供了GetLength()方法； <br>再比如如何通过脚本向FCK里插入内容，使用InsertHTML()等； <br>还有，在用户定制功能时，中间步骤可能要执行FCK的一些内嵌操作，那就用ExecuteCommand()方法。 <br>详细的API列表，请查看FCKeditor的Wiki。而常用的API，请查看FCK压缩包里的_samples/html/sample08.html。此处就不贴代码了。 <br>3、外联编辑条（多个编辑域共用一个编辑条） <br>－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－ <br>这个功能是2.3版本才开始提供的，以前版本的FCKeditor要在同一个页面里用多个编辑器的话，得一个个创建，现在有了这个外联功能，就不用那么麻烦了，只需要把工具条放在一个适当的位置，后面就可以无限制的创建编辑域了。 <br>要实现这种功能呢，需要先在页面中定义一个工具条的容器：&lt;div id=&#8221;xToolbar&#8221;&gt;&lt;/div&gt;，然后再根据这个容器的id属性进行设置。 <br>JAVASCRIPT实现代码： <br>－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－ <br>&lt;div id=&#8221;xToolbar&#8221;&gt;&lt;/div&gt; <br>FCKeditor 1: <br>&lt;script. type=&#8221;text/javascript&#8221;&gt; <br>&lt;!&#8211; <br>// Automatically calculates the editor base path based on the _samples directory. <br>// This is usefull only for these samples. A real application should use something like this: <br>// oFCKeditor.BasePath = &#8216;/fckeditor/&#8217;; // &#8216;/fckeditor/&#8217; is the default value. <br>var sBasePath = document.location.pathname.substring(0,document.location.pathname.lastIndexOf(&#8217;_samples&#8217;)); <br>var FCKeditor = new FCKeditor( &#8216;FCKeditor_1&#8242; ); <br>oFCKeditor.BasePath = sBasePath; <br>oFCKeditor.Height = 100; <br>oFCKeditor.Config[ &#8216;ToolbarLocation&#8217; ] = &#8216;Out:parent(xToolbar)&#8217;; <br>oFCKeditor.Value= &#8216;This is some &lt;strong&gt;sample text&lt;/strong&gt;. You are using FCKeditor.&#8217;; <br>oFCKeditor.Create(); <br>//&#8211;&gt; <br>&lt;/script&gt; <br>&lt;br /&gt; <br>FCKeditor 2: <br>&lt;script. type=&#8221;text/javascript&#8221;&gt; <br>&lt;!&#8211; <br>FCKeditor = new FCKeditor( &#8216;FCKeditor_2&#8242; ); <br>oFCKeditor.BasePath = sBasePath; <br>oFCKeditor.Height = 100; <br>oFCKeditor.Config[ &#8216;ToolbarLocation&#8217; ] = &#8216;Out:parent(xToolbar)&#8217;;&nbsp;<br><strong><font style="BACKGROUND-COLOR: #ffff66">oFCKeditor.Value</font></strong> = &#8216;This is some &lt;strong&gt;sample text&lt;/strong&gt;. You are using FCKeditor.&#8217;; <br>oFCKeditor.Create(); <br>//&#8211;&gt; <br>&lt;/script&gt; <br>－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－ <br>此部分的详细DEMO请参照_samples/html/sample11.html，_samples/html/sample11_frame.html <br>4、文件管理功能、文件上传的权限问题 <br>－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－ <br>一直以来FCKeditor的文件管理部分的安全是个值得注意，但很多人没注意到的地方，虽然FCKeditor在各个Release版本中一直存在的一个功能就是对上传文件类型进行过滤，但是她没考虑过另一个问题：到底允许谁能上传？到底谁能浏览服务器文件？ <br>之前刚开始用FCKeditor时，我就出现过这个问题，还好NetRube（FCKeditor中文化以及FCKeditor ASP版上传程序的作者）及时提醒了我，做法是去修改FCK上传程序，在里面进行权限判断，并且再在fckconfig.js里把相应的一些功能去掉。但随之FCK版本的不断升级，每升一次都要去改一次配置程序fckconfig.js，我发觉厌烦了，就没什么办法能更好的控制这种配置么？事实上，是有的。 <br>在fckconfig.js里面，有关于是否打开上传和浏览服务器的设置，在创建FCKeditor时，通过程序来判断是否创建有上传浏览功能的编辑器。首先，我先在fckconfig.js里面把所有的上传和浏览设置全设为false，接着我使用的代码如下： <br>JAVASCRIPT版本： <br>－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－ <br>&lt;script. type=&#8221;text/javascript&#8221;&gt; <br>var FCKeditor = new FCKeditor( &#8216;fbContent&#8217; ); <br>&lt;% if power = powercode then %&gt; <br>oFCKeditor.Config[&#8217;LinkBrowser&#8217;] = true; <br>oFCKeditor.Config[&#8217;ImageBrowser&#8217;] = true; <br>oFCKeditor.Config[&#8217;FlashBrowser&#8217;] = true; <br>oFCKeditor.Config[&#8217;LinkUpload&#8217;] = true; <br>oFCKeditor.Config[&#8217;ImageUpload&#8217;] = true; <br>oFCKeditor.Config[&#8217;FlashUpload&#8217;] = true; <br>&lt;% end if %&gt; <br>oFCKeditor.ToolbarSet = &#8216;Basic&#8217;; <br>oFCKeditor.Width = &#8216;100%&#8217;; <br>oFCKeditor.Height = &#8216;200&#8242;; <br><strong style="COLOR: black; BACKGROUND-COLOR: #ffff66">oFCKeditor.Value</strong> = &#8216;&#8217;; <br>oFCKeditor.Create(); <br>&lt;/script&gt; <br>－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－ <br>在按钮旁边加文字 <br>－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－ <br>打开 editor/js/ 两个js文件 <br>fckeditorcode_gecko.js <br>fckeditorcode_ie.js <br>第一个是支持非ie浏览器的 <br>第二个文件是支持ie浏览器的 <br>搜索 FCKToolbarButton，可以看到许多类似这样的语句： <br>case &#8216;Save&#8217;:B = new FCKToolbarButton(&#8217;Save&#8217;,