﻿<?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;, FCKLang.Save, null, null, true, null, 3); break; <br>&#8216;Save&#8217;是按钮英文名字 <br>FCKToolbarButton 的四个参数分别是： <br>按钮命令名称，按钮标签文字，按钮工具提示，按钮样式，按钮是否在源代码模式可见，按钮下拉菜单其中将第4项参数设置为 FCK_TOOLBARITEM_ICONTEXT 即可使按钮旁边出现文字，注意没有引号。 <br>例如： <br>case &#8216;Preview&#8217;:B = new FCKToolbarButton(&#8217;Preview&#8217;, FCKLang.Preview, null, FCK_TOOLBARITEM_ICONTEXT, true, null, 5); <br>这样我们就可以将 我们经常用的3种模式源代码、预览、全屏编辑按钮都加上文字了。 <br>解释fck样式的工作原理 <br>－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－ <br>fck的样式设置涉及到了两个文件，一个是你定义好的样式表文件.css，另一个是告诉fck样式表如何使用的xml文件，两个文件确一不可。 <br>css文件的位置是不做要求的，但是需要你在应用的编辑器的页面上插入样式表文件的链接。这样才能显示出来样式。 <br>fckstyles.xml 在与editor目录同级的目录下。该文件定义了那些样式可以使用在那些标签里面。 <br>这就是fck自带的样式xml定义： <br>&lt;?xml version=&#8221;1.0〃 encoding=&#8221;utf-8〃 ?&gt; <br>&lt;Styles&gt; <br>&lt;Style name=&#8221;Image on Left&#8221; element=&#8221;img&#8221;&gt; <br>&lt;Attribute name=&#8221;style&#8221; value=&#8221;padding: 5px; margin-right: 5px&#8221; /&gt; <br>&lt;Attribute name=&#8221;border&#8221; value=&#8221;2〃 /&gt; <br>&lt;Attribute name=&#8221;align&#8221; value=&#8221;left&#8221; /&gt; <br>&lt;/Style&gt; <br>&lt;Style name=&#8221;Image on Right&#8221; element=&#8221;img&#8221;&gt; <br>&lt;Attribute name=&#8221;style&#8221; value=&#8221;padding: 5px; margin-left: 5px&#8221; /&gt; <br>&lt;Attribute name=&#8221;border&#8221; value=&#8221;2〃 /&gt; <br>&lt;Attribute name=&#8221;align&#8221; value=&#8221;right&#8221; /&gt; <br>&lt;/Style&gt; <br>&lt;Style name=&#8221;Custom Bold&#8221; element=&#8221;span&#8221;&gt; <br>&lt;Attribute name=&#8221;style&#8221; value=&#8221;font-weight: bold;&#8221; /&gt; <br>&lt;/Style&gt; <br>&lt;Style name=&#8221;Custom Italic&#8221; element=&#8221;em&#8221; /&gt; <br>&lt;Style name=&#8221;Title&#8221; element=&#8221;span&#8221;&gt; <br>&lt;Attribute name=&#8221;class&#8221; value=&#8221;Title&#8221; /&gt; <br>&lt;/Style&gt; <br>&lt;Style name=&#8221;Code&#8221; element=&#8221;span&#8221;&gt; <br>&lt;Attribute name=&#8221;class&#8221; value=&#8221;Code&#8221; /&gt; <br>&lt;/Style&gt; <br>&lt;Style name=&#8221;Title H3〃 element=&#8221;h3〃 /&gt; <br>&lt;Style name=&#8221;Custom Ruler&#8221; element=&#8221;hr&#8221;&gt; <br>&lt;Attribute name=&#8221;size&#8221; value=&#8221;1〃 /&gt; <br>&lt;Attribute name=&#8221;color&#8221; value=&#8221;#ff0000〃 /&gt; <br>&lt;/Style&gt; <br>&lt;/Styles&gt; <br>每一个&lt;style&gt;将来会生成一个样式的菜单项。name名称就是显示在菜单里的文字；element定义了该样式可以应用在那种html标签上，&lt;Attribute&gt;的 name 指定了将会修改标签的哪个属性来应用样式，value则是修改成的值。 <br>看这个： <br>&lt;Style name=&#8221;Title&#8221; element=&#8221;span&#8221;&gt; <br>&lt;Attribute name=&#8221;class&#8221; value=&#8221;Title&#8221; /&gt; <br>&lt;/Style&gt; <br>如果你在fck选定了文字 &#8220;经典论坛 》 前台制作与脚本专栏 》 FCKeditor 实战技巧 - 1 》 编辑帖子&#8221; 应用该样式 则原来文字就会变成&lt;span class=&#8221;Title&#8221;&gt;经典论坛 》 前台制作与脚本专栏 》 FCKeditor 实战技巧 - 1 》 编辑帖子&lt;/span&gt; <br>注意：如果编辑器呈整页编辑状态，那么整页里面也需要插入样式表链接才能显示出来样式。 <br>＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝ <br>FCKeditor JavaScript. API（翻译整理） <br>原文地址：<a href="http://wiki.fckeditor.net/Developer%27s_Guide/Javascript_API" target=_new><u><font color=#0000ff>http://wiki.fckeditor.net/Developer%27s_Guide/Javascript_API</font></u></a> <br>－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－ <br>FCK 编辑器加载后，将会注册一个全局的 FCKeditorAPI 对象。 <br>FCKeditorAPI 对象在页面加载期间是无效的，直到页面加载完成。如果需要交互式地知道 FCK 编辑器已经加载完成，可使用&#8220;FCKeditor_OnComplete&#8221;函数。 <br>&lt;script. type=&#8221;text/javascript&#8221;&gt; <br>function FCKeditor_OnComplete(editorInstance) { <br>FCKeditorAPI.GetInstance(&#8217;FCKeditor1&#8242;).Commands.GetCommand(&#8217;FitWindow&#8217;).Execute(); <br>} <br>&lt;/script&gt; <br>在当前页获得 FCK 编辑器实例： <br>var Editor = FCKeditorAPI.GetInstance(&#8217;InstanceName&#8217;); <br>从 FCK 编辑器的弹出窗口中获得 FCK 编辑器实例： <br>var Editor = window.parent.InnerDialogLoaded().FCK; <br>从框架页面的子框架中获得其它子框架的 FCK 编辑器实例： <br>var Editor = window.FrameName.FCKeditorAPI.GetInstance(&#8217;InstanceName&#8217;); <br>从页面弹出窗口中获得父窗口的 FCK 编辑器实例： <br>var Editor = opener.FCKeditorAPI.GetInstance(&#8217;InstanceName&#8217;); <br>获得 FCK 编辑器的内容： <br>oEditor.GetXHTML(formatted); // formatted 为：true|false，表示是否按HTML格式取出 <br>也可用： <br>oEditor.GetXHTML(); <br>设置 FCK 编辑器的内容： <br>oEditor.SetHTML(&#8221;content&#8221;, false); // 第二个参数为：true|false，是否以所见即所得方式设置其内容。此方法常用于&#8220;设置初始值&#8221;或&#8220;表单重置&#8221;操作。 <br>插入内容到 FCK 编辑器： <br>oEditor.InsertHtml(&#8221;html&#8221;); // &#8220;html&#8221;为HTML文本 <br>检查 FCK 编辑器内容是否发生变化： <br>oEditor.IsDirty(); <br>在 FCK 编辑器之外调用 FCK 编辑器工具条命令： <br>命令列表如下： <br>－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－ <br>DocProps, Templates, Link, Unlink, Anchor, BulletedList, NumberedList, About, Find, Replace, Image, Flash, SpecialChar, Smiley, Table, TableProp, TableCellProp, UniversalKey, Style, FontName, FontSize, FontFormat, Source, Preview, Save, NewPage, PageBreak, TextColor, BGColor, PasteText, PasteWord, TableInsertRow, TableDeleteRows, TableInsertColumn, TableDeleteColumns, TableInsertCell, TableDeleteCells, TableMergeCells, TableSplitCell, TableDelete, Form, Checkbox, Radio, TextField, Textarea, HiddenField, Button, Select, ImageButton, SpellCheck, FitWindow, Undo, Redo <br>－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－ <br>使用方法如下： <br>－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－ <br>oEditor.Commands.GetCommand(&#8217;FitWindow&#8217;).Execute(); <br>－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－</p>
</div>
</div>
<img src ="http://www.blogjava.net/hilor/aggbug/139989.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/hilor/" target="_blank">hilor</a> 2007-08-27 16:04 <a href="http://www.blogjava.net/hilor/articles/139989.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[转帖]较为全面的JSP中文解决之道</title><link>http://www.blogjava.net/hilor/articles/139079.html</link><dc:creator>hilor</dc:creator><author>hilor</author><pubDate>Fri, 24 Aug 2007 04:48:00 GMT</pubDate><guid>http://www.blogjava.net/hilor/articles/139079.html</guid><wfw:comment>http://www.blogjava.net/hilor/comments/139079.html</wfw:comment><comments>http://www.blogjava.net/hilor/articles/139079.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/hilor/comments/commentRss/139079.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/hilor/services/trackbacks/139079.html</trackback:ping><description><![CDATA[以前林林总总的也看过一些关于中文乱码的文章，或只是解决之道，或只是原因分析。这篇转贴的文章倒是比较全面地分析了其缘由和解决之道。值得一看，不敢独享，现和各位J友们共享。<br>-------------------------------------------------------------<br><br>自从接触Java和JSP以来，就不断与Java的中文乱码问题打交道，现在终于得到了彻底的解决，现将我们的解决心得与大家共享。<br><br>一、Java中文问题的由来<br><br>Java的内核和class文件是基于unicode的，这使Java程序具有良好的跨平台性，但也带来了一些中文乱码问题的麻烦。原因主要有两方面，Java和JSP文件本身编译时产生的乱码问题和Java程序于其他媒介交互产生的乱码问题。<br>首先Java（包括JSP）源文件中很可能包含有中文，而Java和JSP源文件的保存方式是基于字节流的，如果Java和JSP编译成class文件过程中，使用的编码方式与源文件的编码不一致，就会出现乱码。基于这种乱码，建议在Java文件中尽量不要写中文（注释部分不参与编译，写中文没关系），如果必须写的话，尽量手动带参数－ecoding GBK或－ecoding gb2312编译；对于JSP，在文件头加上&lt;%@ page contentType=&#8221;text/html;charset=GBK&#8221;%&gt;或&lt;%@ page contentType=&#8221;text/html;charset=gb2312&#8243;%&gt;基本上就能解决这类乱码问题。<br>本文要重点讨论的是第二类乱码，即Java程序与其他存储媒介交互时产生的乱码。很多存储媒介，如数据库，文件，流等的存储方式都是基于字节流的，Java程序与这些媒介交互时就会发生字符(char)与字节(byte)之间的转换，具体情况如下：<br><br>从页面form提交数据到java程序 byte－&gt;char<br>从java程序到页面显示 char—&gt;byte<br>从数据库到java程序 byte—&gt;char<br>从java程序到数据库 char—&gt;byte<br>从文件到java程序 byte－&gt;char<br>从java程序到文件 char－&gt;byte<br>从流到java程序 byte－&gt;char<br>从java程序到流 char－&gt;byte<br><br>如果在以上转换过程中使用的编码方式与字节原有的编码不一致，很可能就会出现乱码。<br><br>二、解决方法<br><br>前面已经提到了Java程序与其他媒介交互时字符和字节的转换过程，如果这些转换过程中容易产生乱码。解决这些乱码问题的关键在于确保转换时使用的编码方式与字节原有的编码方式保持一致，下面分别论述（Java或JSP自身产生的乱码请参看第一部分）。<br><br>1、JSP与页面参数之间的乱码<br><br>JSP获取页面参数时一般采用系统默认的编码方式，如果页面参数的编码类型和系统默认的编码类型不一致，很可能就会出现乱码。解决这类乱码问题的基本方法是在页面获取参数之前，强制指定request获取参数的编码方式：request.setCharacterEncoding(&#8221;GBK&#8221;)或request.setCharacterEncoding(&#8221;gb2312&#8243;)。<br>如果在JSP将变量输出到页面时出现了乱码，可以通过设置response.setContentType(&#8221;text/html;charset=GBK&#8221;)或response.setContentType(&#8221;text/html;charset=gb2312&#8243;)解决。<br>如果不想在每个文件里都写这样两句话，更简洁的办法是使用Servlet规范中的过虑器指定编码，过滤器的在web.xml中的典型配置和主要代码如下：<br><br>web.xml:<br>&lt;filter&gt;<br>&lt;filter-name&gt;CharacterEncodingFilter&lt;/filter-name&gt;<br>&lt;filter-class&gt;net.vschool.web.CharacterEncodingFilter&lt;/filter-class&gt;<br>&lt;init-param&gt;<br>&lt;param-name&gt;encoding&lt;/param-name&gt;<br>&lt;param-value&gt;GBK&lt;/param-value&gt;<br>&lt;/init-param&gt;<br>&lt;/filter&gt;<br>&lt;filter-mapping&gt;<br>&lt;filter-name&gt;CharacterEncodingFilter&lt;/filter-name&gt;<br>&lt;url-pattern&gt;/*&lt;/url-pattern&gt;<br>&lt;/filter-mapping&gt;<br>CharacterEncodingFilter.java:<br>public class CharacterEncodingFilter implements Filter<br>{<br>protected String encoding = null;<br>public void init(FilterConfig filterConfig) throws ServletException<br>{<br>this.encoding = filterConfig.getInitParameter(&#8221;encoding&#8221;);<br>}<br>public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException<br>{<br>request.setCharacterEncoding(encoding);<br>response.setContentType(&#8221;text/html;charset=&#8221;+encoding);<br>chain.doFilter(request, response);<br>}<br>}<br><br>2、Java与数据库之间的乱码<br><br>大部分数据库都支持以unicode编码方式，所以解决Java与数据库之间的乱码问题比较明智的方式是直接使用unicode编码与数据库交互。很多数据库驱动自动支持unicode，如Microsoft的SQLServer驱动。其他大部分数据库驱动，可以在驱动的url参数中指定，如如mm的mysql驱动：jdbc:mysql://localhost/WEBCLDB?useUnicode=true&amp;characterEncoding=GBK。<br><br>3、Java与文件/流之间的乱码<br><br>Java读写文件最常用的类是FileInputStream/FileOutputStream和FileReader/FileWriter。其中FileInputStream和FileOutputStream是基于字节流的，常用于读写二进制文件。读写字符文件建议使用基于字符的FileReader和FileWriter，省去了字节与字符之间的转换。但这两个类的构造函数默认使用系统的编码方式，如果文件内容与系统编码方式不一致，可能会出现乱码。在这种情况下，建议使用FileReader和FileWriter的父类：InputStreamReader/OutputStreamWriter，它们也是基于字符的，但在构造函数中可以指定编码类型：InputStreamReader(InputStream in, Charset cs) 和OutputStreamWriter(OutputStream out, Charset cs)。<br><br>4、其他<br><br>上面提到的方法应该能解决大部分乱码问题，如果在其他地方还出现乱码，可能需要手动修改代码。解决Java乱码问题的关键在于在字节与字符的转换过程中，你必须知道原来字节或转换后的字节的编码方式，转换时采用的编码必须与这个编码方式保持一致。我们以前使用Resin服务器，使用smartUpload组件上传文件，上传文件同时传递的中文参数获取没有乱码问题。当在Linux中把Resin设置成服务后，上传文件同时的中文参数获取出现了乱码。这个问题困扰了我们很久，后来我们分析smartUpload组件的源文件，因为文件上传采用的是字节流的方式，里面包含的参数名称和值也是字节流的方式传递的。smartUpload组件读取字节流后再将参数名称和值从字节流中解析出来，问题就出现在smartUpload将字节流转换成字符串时采用了系统默认的编码，而将Resin设置成服务后，系统默认的编码可能发生了改变，因此出现了乱码。后来，我们更改了smartUpload的源文件，增加了一个属性charset和setCharset(String)方法，将upload()方法中提取参数语句：<br>String value = new String(m_binArray, m_startData, (m_endData - m_startData) + 1 );<br>改成了<br>String value = new String(m_binArray, m_startData, (m_endData - m_startData) + 1, charset );<br>终于解决了这个乱码问题。<br><br>三、后记<br><br>接触Java和JSP已经有一年多了，这一年来最大的收获是越来越喜欢上了Java，开始把问题当作乐事去研究，没有了以前的恐惧心理，我相信我会继续坚持下去。这一年来，从网上学习了很多同行的宝贵经验，在此表示感谢。这是我第一篇自己总结的Java学习心得，由于水平有限，本文中偏颇和错误之处，欢迎指正。如果对你有些价值，在保留作者信息和文章原始出处的前提下可以随处转载。<br>撰写该文之前已参考了很多关于Java中文问题的文章，其中影响比较大的有owen1944在&#8220;Java研究组织&#8221;中发表的《这是我们公司总结的一些关于中文乱码问题的一些解决方案和经验和大家分享！》等。本文谈到的解决方法已应用到&#8220;基于网络的协作学习系统－WebCL&#8221;等项目中，并通过资源绑定的方式实现了该平台中文文两个版本的即时切换。Google根据浏览器自动选择语言，一个页面同时显示多种语言的国际化应用和车东的《Java中文处理学习笔记——Hello Unicode》一文引起了我极大的兴趣，日后想将继续探讨Java的国际化问题，欢迎大家一起讨论。
<img src ="http://www.blogjava.net/hilor/aggbug/139079.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/hilor/" target="_blank">hilor</a> 2007-08-24 12:48 <a href="http://www.blogjava.net/hilor/articles/139079.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>java实现FTP文件上传出现的问题</title><link>http://www.blogjava.net/hilor/articles/138769.html</link><dc:creator>hilor</dc:creator><author>hilor</author><pubDate>Thu, 23 Aug 2007 03:33:00 GMT</pubDate><guid>http://www.blogjava.net/hilor/articles/138769.html</guid><wfw:comment>http://www.blogjava.net/hilor/comments/138769.html</wfw:comment><comments>http://www.blogjava.net/hilor/articles/138769.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/hilor/comments/commentRss/138769.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/hilor/services/trackbacks/138769.html</trackback:ping><description><![CDATA[昨天用JAVA写了一个实现FTP文件上传功能的类（是通过sun.net.ftp包实现的，此包为SUN的私有类包，所以官方没有提供相关API文档），然后进行了简单的测试。
<div>具体类代码如下（此类的部分方法还未完善）：</div>
<div>package com.tools;</div>
<div>import java.io.FileInputStream;<br>import java.io.IOException;<br>import sun.net.TelnetOutputStream;<br>import sun.net.ftp.FtpClient;</div>
<div>/**<br>&nbsp;* @author&nbsp;simplelife&nbsp;<br>&nbsp;* @version 1.0<br>&nbsp;* <br>&nbsp;*/<br>public class FtpTool{<br>&nbsp;<br>&nbsp;private FtpClient ftp;&nbsp;<br>&nbsp;<br>&nbsp;/**<br>&nbsp; * 构造方法，新建一个FtpClient对象，并打开FTP服务器<br>&nbsp; * @param host FTP服务器地址；port FTP服务端口<br>&nbsp; * <br>&nbsp; */<br>&nbsp;public FtpTool(String host,int port)throws IOException{<br>&nbsp;&nbsp;ftp = new FtpClient();<br>&nbsp;&nbsp;<a href="ftp://ftp.openserver(host/"><u><font color=#0000ff>ftp.openServer(host</font></u></a>, port);<br>&nbsp;}<br>&nbsp;<br>&nbsp;/**<br>&nbsp; * 登陆方法，通过用户名密码登陆到指定的FTP服务器上去，并返回欢迎信息<br>&nbsp; * @param username FTP用户名；password 密码<br>&nbsp; * <br>&nbsp; */<br>&nbsp;public String login(String username,String password)throws IOException{<br>&nbsp;&nbsp;this.ftp.login(username, password);<br>&nbsp;&nbsp;return this.ftp.welcomeMsg;<br>&nbsp;}<br>&nbsp;<br>&nbsp;/**<br>&nbsp; * 此方法用来上传文件。<br>&nbsp; * @param pathname 本地路径；filename 要上传的文件名称<br>&nbsp; * <br>&nbsp; */<br>&nbsp;public void upload(String pathname,String filename)throws IOException{<br>&nbsp;&nbsp;&nbsp; if(!this.ftp.serverIsOpen()){<br>&nbsp;&nbsp;&nbsp;&nbsp; System.out.println("服务器连接不可用！");<br>&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; this.ftp.binary();<br>&nbsp;&nbsp;&nbsp; TelnetOutputStream os = null;<br>&nbsp;&nbsp;&nbsp; FileInputStream is = null;<br>&nbsp;&nbsp;&nbsp; try {<br>&nbsp;&nbsp;&nbsp;&nbsp; //用ftp上传后的文件名与原文件名相同，同为filename变量内容<br>&nbsp;&nbsp;&nbsp;&nbsp; os = this.ftp.put(filename);<br>&nbsp;&nbsp;&nbsp;&nbsp; java.io.File file_in = new java.io.File(pathname+"<a href="file://%22+filename/"><u><font color=#0000ff>\\"+filename</font></u></a>);<br>&nbsp;&nbsp;&nbsp;&nbsp; if (file_in.length()==0) {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println("上传文件为空!");<br>&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp; is = new FileInputStream(file_in);<br>&nbsp;&nbsp;&nbsp;&nbsp; byte[] bytes = new byte[1024];<br>&nbsp;&nbsp;&nbsp;&nbsp; int c;<br>&nbsp;&nbsp;&nbsp;&nbsp; while ((c = is.read(bytes)) != -1) {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; os.write(bytes, 0, c);<br>&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; } finally {<br>&nbsp;&nbsp;&nbsp;&nbsp; if (is != null) {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; is.close();<br>&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp; if (os != null) {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; os.close();<br>&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; System.out.println("上传文件成功!");<br>&nbsp;&nbsp;&nbsp; this.ftp.ascii();<br>&nbsp;}<br>&nbsp;<br>&nbsp;/**<br>&nbsp; * 此方法用来下载文件。<br>&nbsp; * @param pathname 本地路径；filename 要上传的文件名称<br>&nbsp; * <br>&nbsp; */<br>&nbsp;public void download(String pathname,String filename)throws IOException{<br>&nbsp;&nbsp;<br>&nbsp;}<br>&nbsp;<br>&nbsp;<br>&nbsp;public static void main(String[] args){<br>&nbsp;&nbsp;try{<br>&nbsp;&nbsp;&nbsp;FtpTool ftpt = new FtpTool("128.14.9.13",21);<br>&nbsp;&nbsp;&nbsp;String welstr = ftpt.login("xxxx", "xxxxxxxx");<br>&nbsp;&nbsp;&nbsp;System.out.println(welstr);<br>&nbsp;&nbsp;&nbsp;ftpt.upload("C:", "111.txt");<br>&nbsp;&nbsp;}catch(IOException ioe){<br>&nbsp;&nbsp;&nbsp;ioe.printStackTrace();<br>&nbsp;&nbsp;}<br>&nbsp;}<br>}<br></div>
<div>在测试过程中抛出一个异常，具体信息如下：</div>
<div>User at logged in.</div>
<div>&nbsp;</div>
<div><span style="COLOR: #ff0000">sun.net.ftp.FtpProtocolException: STOR 111.txt:425 Can't build data connection: Connection timed out.</span></div>
<div><span style="COLOR: #ff0000">&nbsp;at sun.net.ftp.FtpClient.openDataConnection(Unknown Source)<br>&nbsp;at sun.net.ftp.FtpClient.put(Unknown Source)<br>&nbsp;at com.tools.FtpTool.upload(FtpTool.java:56)<br>&nbsp;at com.tools.FtpTool.main(FtpTool.java:94)<br></span></div>
<div><span style="COLOR: #000000">抛出此异常的具体表现为：在FTP服务器上已经创建了该文件，但文件大小为0。在网上搜索相关异常描述也很少，经过仔细分析发现，此问题与FTP客户端防火墙有关。然后我关闭防火墙软件，再进行测试，一切OK！</span></div>
<div><span style="COLOR: #000000"></span>&nbsp;</div>
<div><span style="COLOR: #000000">在网上也发现另一个常见异常，我将它重现并做说明。其主要原因是很多FTP服务没有使用默认端口，在代码实现中，连接端口不正确所导致异常出现的。</span></div>
<div><span style="COLOR: #ff0000">sun.net.ftp.FtpProtocolException: Welcome message: ??$<br>&nbsp;at sun.net.ftp.FtpClient.openServer(Unknown Source)<br>&nbsp;at com.tools.FtpTool.&lt;init&gt;(FtpTool.java:29)<br>&nbsp;at com.tools.FtpTool.main(FtpTool.java:91)</span></div>
<span style="COLOR: #ff0000">
<div><span style="COLOR: #000000"></span>&nbsp;</div>
<div><span style="COLOR: #000000">第三种异常就是由于FTP服务器端的FTP服务没有开启，连接被拒绝所导致的。具体异常如下：</span></div>
<div><span style="COLOR: #ff0000">java.net.ConnectException: Connection refused: connect<br>&nbsp;at java.net.PlainSocketImpl.socketConnect(Native Method)<br>&nbsp;at java.net.PlainSocketImpl.doConnect(Unknown Source)<br>&nbsp;at java.net.PlainSocketImpl.connectToAddress(Unknown Source)<br>&nbsp;at java.net.PlainSocketImpl.connect(Unknown Source)</span></div>
<div><span style="COLOR: #ff0000"><span style="COLOR: #ff0000">&nbsp;
<div><span style="COLOR: #000000"></span>&nbsp;</div>
<div><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 最后，如果大家遇到什么新的相关问题，可以在这里留言，我们来共同解决问题、学习提高。</span></div>
</span></span></div>
</span>
<img src ="http://www.blogjava.net/hilor/aggbug/138769.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/hilor/" target="_blank">hilor</a> 2007-08-23 11:33 <a href="http://www.blogjava.net/hilor/articles/138769.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>利用commons-email实现邮件发送</title><link>http://www.blogjava.net/hilor/articles/138767.html</link><dc:creator>hilor</dc:creator><author>hilor</author><pubDate>Thu, 23 Aug 2007 03:31:00 GMT</pubDate><guid>http://www.blogjava.net/hilor/articles/138767.html</guid><wfw:comment>http://www.blogjava.net/hilor/comments/138767.html</wfw:comment><comments>http://www.blogjava.net/hilor/articles/138767.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/hilor/comments/commentRss/138767.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/hilor/services/trackbacks/138767.html</trackback:ping><description><![CDATA[<p>commons-email是Apache提供的邮件相关的工具包，简化了JAVA邮件功能的实现。这里举个简单的例子给大家介绍下。</p>
<p>先完成代码编写，如下：</p>
<p>package com.emailtest;</p>
<p><br>import org.apache.commons.logging.Log;<br>import org.apache.commons.logging.LogFactory;<br>import org.apache.commons.mail.EmailException;<br>import org.apache.commons.mail.SimpleEmail;</p>
<p>public class EmailUtil {<br>&nbsp;Log log = LogFactory.getLog("Send E-mail");<br>&nbsp;public static String charsetname = "ISO8859_1";//字符集，用于中文处理<br>&nbsp;public static String fromeaddr = "<a href='&#109;&#97;&#105;&#108;&#116;&#111;&#58;&#115;&#105;&#109;&#112;&#108;&#101;&#108;&#105;&#102;&#101;&#64;&#49;&#50;&#54;&#46;&#99;&#111;&#109;&#34;&#59;&#47;&#47;'><u><font color=#0000ff>simplelife@126.com";//</font></u></a>发件人邮箱地址<br>&nbsp;public static String username = "simplelife";//发件人邮箱用户名<br>&nbsp;public static String password = "xxxxxx";//发件人邮箱密码<br>&nbsp;public static String sendname = "hilor";//发件人名称<br>&nbsp;public static String emailServer = "smtp.126.com";//邮件服务器<br>&nbsp;<br>&nbsp;/**<br>&nbsp; * <br>&nbsp; * @param emailaddr 收件人邮箱地址<br>&nbsp; * @param ename 收件人姓名<br>&nbsp; * @param subject&nbsp;邮件主题<br>&nbsp; * @param mailcontent&nbsp;邮件内容<br>&nbsp; * @return 邮件发送是否成功<br>&nbsp; * <br>&nbsp; */<br>&nbsp;public boolean sendMail(String emailaddr,String ename,String subject,String mailcontent) throws Exception {<br>&nbsp;&nbsp;SimpleEmail email = new SimpleEmail();<br>&nbsp;&nbsp;<br>&nbsp;&nbsp;//设置发件人用户名、密码认证<br>&nbsp;&nbsp;email.setAuthentication(EmailUtil.username,EmailUtil.password);<br>&nbsp;&nbsp;<br>&nbsp;&nbsp;//设置发送邮件所使用的邮件服务器<br>&nbsp;&nbsp;email.setHostName(EmailUtil.emailServer);<br>&nbsp;&nbsp;try{<br>&nbsp;&nbsp;&nbsp;//添加收件人信息<br>&nbsp;&nbsp;&nbsp;email.addTo(emailaddr, ename);<br>&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;//添加发件人信息<br>&nbsp;&nbsp;&nbsp;email.setFrom(EmailUtil.fromeaddr, EmailUtil.sendname);<br>&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;//添加邮件主题<br>&nbsp;&nbsp;&nbsp;email.setSubject(subject);<br>&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;//添加邮件内容<br>&nbsp;&nbsp;&nbsp;email.setMsg(mailcontent);<br>&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;//发送邮件<br>&nbsp;&nbsp;&nbsp;email.send();<br>&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;//记录日志<br>&nbsp;&nbsp;&nbsp;log.info("Send Mail Successfully!");<br>&nbsp;&nbsp;&nbsp;return true;<br>&nbsp;&nbsp;}catch(EmailException e){<br>&nbsp;&nbsp;&nbsp;log.error(e.getMessage());<br>&nbsp;&nbsp;&nbsp;return false;<br>&nbsp;&nbsp;}<br>&nbsp;}<br>&nbsp;/**<br>&nbsp; * <br>&nbsp; * 测试主程序<br>&nbsp; */<br>&nbsp;public static void main(String[] args) {<br>&nbsp;&nbsp;EmailUtil email = new EmailUtil();<br>&nbsp;&nbsp;try{<br>&nbsp;&nbsp;&nbsp;email.sendMail("<a href='&#109;&#97;&#105;&#108;&#116;&#111;&#58;&#120;&#120;&#120;&#64;&#120;&#120;&#120;&#120;&#120;&#46;&#99;&#111;&#109;&#34;&#44;&#34;&#120;&#120;&#120;'><u><font color=#0000ff>xxx@xxxxx.com","xxx</font></u></a>","测试邮件",new String("发送测试邮件！\n发送测试邮件！\n发送测试邮件！\n发送测试邮件!".getBytes(),EmailUtil.charsetname));<br>&nbsp;<br>&nbsp;&nbsp;}catch(Exception e){<br>&nbsp;&nbsp;&nbsp;e.printStackTrace();<br>&nbsp;&nbsp;}<br>&nbsp;}</p>
<p>}</p>
<p><br>这个EmailUtil类只实现了一个用来发送邮件的方法，还有一个是静态的main()测试主程序。在这个例子中只用到commons-email包里的SimpleEmail类。利用commons-email实现邮件功能，在类路径中不但要包含commons-email提供的jar包，还必须包含sun的javamail提供的两个与邮件相关的jar包（activation.jar，mail.jar）。</p>
<p>程序中日志记录是利用commons-logging和log4j结合来实现的，需要加入两个jar包（log4j-1.2.11.jar，commons-logging-1.0.4.jar）。然后添加log4j.properties配置文件，文件内容如下：</p>
<p><font color=#ff0000>log4j.rootLogger=info, dest1</font></p>
<p><font color=#ff0000>log4j.appender.dest1=org.apache.log4j.ConsoleAppender<br>log4j.appender.dest1.layout=org.apache.log4j.PatternLayout<br>log4j.appender.dest1.layout.ConversionPattern=%d %-5p %-5c{3} %x -&gt; %m%n</font><br></p>
<p>log4j配置文件细节请参考log4j参考手册，在这里不做太多解释。</p>
<p>如果只是想做测试，也可以把程序中相关部分用System.out.print()替换掉，无须加入日志相关的jar包和log4j配置文件。</p>
<img src ="http://www.blogjava.net/hilor/aggbug/138767.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/hilor/" target="_blank">hilor</a> 2007-08-23 11:31 <a href="http://www.blogjava.net/hilor/articles/138767.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>通过JSP生成静态页面</title><link>http://www.blogjava.net/hilor/articles/138084.html</link><dc:creator>hilor</dc:creator><author>hilor</author><pubDate>Mon, 20 Aug 2007 04:22:00 GMT</pubDate><guid>http://www.blogjava.net/hilor/articles/138084.html</guid><wfw:comment>http://www.blogjava.net/hilor/comments/138084.html</wfw:comment><comments>http://www.blogjava.net/hilor/articles/138084.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/hilor/comments/commentRss/138084.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/hilor/services/trackbacks/138084.html</trackback:ping><description><![CDATA[<font face=宋体>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 生成静态页面技术解决方案系列（一） <br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2006-10-26&nbsp;<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 相信很多人都希望自己的页面越快越好，最好是能静态的，提高客户访问速度。也便于搜索引擎搜索。所以，就希望我们的动态读取数据库的页面，尽可能的生成静态页面。一下系列文章，介绍一下个人的解决方案。 <br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 本系列将介绍个人的一种方法，在不改变原来jsp文件的基础上，只需要加入少量的代码，就让你的新闻发布系统，很容易就完全变成静态的页面。 <br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 本文假设你是用java开发的web动态页面。 <br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 第一步，加入servlet.代码如下。 <br><br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public class ToHtml extends HttpServlet { <br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public void service(HttpServletRequest request, HttpServletResponse response) <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; throws ServletException, IOException { <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String url = ""; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String name = ""; <br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ServletContext sc = getServletContext(); <br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String file_name = request.getParameter("file_name");// 你要访问的jsp文件名,如index，不包括扩展名 <br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // 则你访问这个servlet时加参数.如http://localhost/test/toHtml?file_name=index <br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; url = "/" + file_name + ".jsf";// 你要生成的页面的文件名。我的扩展名为jsf . <br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; name = ConfConstants.CONTEXT_PATH+"\\"+ file_name + ".htm";// 这是生成的html文件名,如index.htm.文件名字与源文件名相同。扩展名为htm <br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //ConfConstants.CONTEXT_PATH为你的应用的上下文路径。 <br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; RequestDispatcher rd = sc.getRequestDispatcher(url); <br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; final ByteArrayOutputStream ōs = new ByteArrayOutputStream(); <br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; final ServletOutputStream stream = new ServletOutputStream() { <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public void write(byte[] data, int offset, int length) { <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; os.write(data, offset, length); <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } <br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public void write(int b) throws IOException { <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; os.write(b); <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }; <br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; final PrintWriter pw = new PrintWriter(new OutputStreamWriter(os)); <br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; HttpServletResponse rep = new HttpServletResponseWrapper(response) { <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public ServletOutputStream getOutputStream() { <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return stream; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } <br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public PrintWriter getWriter() { <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return pw; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; rd.include(request, rep); <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; pw.flush(); <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; FileOutputStream fos = new FileOutputStream(name); // 把jsp输出的内容写到xxx.htm <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; os.writeTo(fos); <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; fos.close(); <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; PrintWriter ōut = response.getWriter(); <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; out <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; .print("&lt;p align=center&gt;&lt;font size=3 color=red&gt;页面已经成功生成！single&lt;br&gt;http://www.agilejava.org/space/? 233&lt;/font&gt;&lt;/p&gt;"); <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } <br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 第二步、配置你的web.xml <br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;servlet&gt; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;servlet-name&gt;toHtml&lt;/servlet-name&gt; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;servlet-class&gt;mj.util.html.ToHtml&lt;/servlet-class&gt;//你的servlet的类。 <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/servlet&gt; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;servlet-mapping&gt; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;servlet-name&gt;toHtml&lt;/servlet-name&gt; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;url-pattern&gt;/toHtml&lt;/url-pattern&gt; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/servlet-mapping&gt; <br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 第三步、运行servlet。如：http://localhost:8080/test/toHtml?file_name=index <br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; OK,这就在你的test项目的根目录下，生成了一个index.htm的静态文件。　 <br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 局限性：本文只能生成一个文件！访问一次，生成一个文件。并且生成的文件名也与原来的文件名相同。 <br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 比较适合主页生成静态页面。 <br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 本系列的后续文章将解决更多的问题。使之在新闻发布系统中，很容易就集成应用。 <br><br><br>&nbsp;&nbsp;&nbsp; * <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 生成静态页面技术解决方案系列（二） <br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2006-10-28 <br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 注意：转贴本文，请加上本文链接http://www.agilejava.org/space/?233/action_viewspace_itemid_21.html&nbsp; <br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 在上一篇文章中，生成静态页面，是有一定的局限性的。生成主页是很方便，但要生成二级页面，就不方便了。 <br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 本文假设一个新闻发布系统。希望后台发布的，前台显示的是静态的文档。这就涉及，主页要是静态的，同时二级列表也是静态的，新闻内容也是静态的。也就是说， 在发布一篇新闻的时候，可能涉及到三个地方生成静态文档。并且，要生成一个网页，必须访问一个servlet。在大量生成静态网页的时候， <br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 以下方法，可以解决这些问题。 <br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 一、加入一下servelet <br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /** <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; * @file_name 文件名及文件之后的参数.最好为a.jsf?fileId=aaaa <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; * @path 文件所在的路径.相对于根目录而言的. <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; * @realName文件要保存的名字 <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; * @realPath文件要保存的真实路径。默认与文件所在的目录相同。 <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; */ <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public class ToHtmlPath extends HttpServlet { <br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public void service(HttpServletRequest request, HttpServletResponse response) <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; throws ServletException, IOException { <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String url = ""; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String name = ""; <br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ServletContext sc = getServletContext(); <br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String file_name = request.getParameter("file_name");// 你要访问的jsp文件,如news.jsf。 <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // file_name如：fileDetail.jsf?fileId=56.要是有参数， 只有一个参数。并且以参数名作为文件名。 <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String realName = request.getParameter("realName");// 要保存的文件名。如aaa;注意可以没有这个参数。 <br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String path = request.getParameter("path");// 你要访问的jsp文件路径。如news。注意可以没有这个参数。 <br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String realPath = request.getParameter("realPath");// 你要保存的文件路径,如htmlNews.注意可以没有这个参数。 <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // 下面确定要保存的文件名字。 <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (realName == null || realName == "") { <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int a = 0; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; a = file_name.indexOf("=") + 1; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; realName = file_name.substring(a); <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (realName.indexOf(".")&gt;0) { <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; realName = file_name.substring(0, file_name.indexOf(".")); <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // 下面构造要访问的页面。 <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (path == null || path == "") { <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; url = "/" + file_name;// 这是你要生成HTML的jsp文件,如 <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } else { <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; url = "/" + path + "/" + file_name;// 这是你要生成HTML的jsp文件,如 <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // 下面构造要保存的文件名，及路径。 <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // 1、如果有realPath，则保存在realPath下。 <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // 2、如果有path则保存在path下。 <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // 3、否则，保存在根目录下。 <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (realPath == null || realPath == "") { <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (path == null || path == "") { <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; name = ConfConstants.CONTEXT_PATH + "\\" + realName + ".htm";// 这是生成的html文件名,如index.htm.说明： ConfConstants.CONTEXT_PATH为你的上下文路径。 <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } else { <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; name = ConfConstants.CONTEXT_PATH + "\\" + path + "\\" <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; + realName + ".htm";// 这是生成的html文件名,如index.htm. <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } else { <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; name = ConfConstants.CONTEXT_PATH + "\\" + realPath + "\\" <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; + realName + ".htm";// 这是生成的html文件名,如index.htm. <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } <br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // 访问请求的页面，并生成指定的文件。 <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; RequestDispatcher rd = sc.getRequestDispatcher(url); <br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; final ByteArrayOutputStream ōs = new ByteArrayOutputStream(); <br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; final ServletOutputStream stream = new ServletOutputStream() { <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public void write(byte[] data, int offset, int length) { <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; os.write(data, offset, length); <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } <br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public void write(int b) throws IOException { <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; os.write(b); <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }; <br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; final PrintWriter pw = new PrintWriter(new OutputStreamWriter(os)); <br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; HttpServletResponse rep = new HttpServletResponseWrapper(response) { <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public ServletOutputStream getOutputStream() { <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return stream; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } <br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public PrintWriter getWriter() { <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return pw; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; rd.include(request, rep); <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; pw.flush(); <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; FileOutputStream fos = new FileOutputStream(name); // 把jsp输出的内容写到xxx.htm <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; os.writeTo(fos); <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; fos.close(); <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; PrintWriter ōut = response.getWriter(); <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; out.print("&lt;p align=center&gt;&lt;font size=3 color=red&gt;success！&lt;/font&gt;&lt;/p&gt;"); <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } <br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 二、在web.xml里面配置你的servlet <br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;servlet&gt; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;servlet-name&gt;toHtmlPath&lt;/servlet-name&gt; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;servlet-class&gt;mj.util.html.ToHtmlPath&lt;/servlet-class&gt; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/servlet&gt; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;servlet-mapping&gt; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;servlet-name&gt;toHtmlPath&lt;/servlet-name&gt; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;url-pattern&gt;/toHtmlPath&lt;/url-pattern&gt; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/servlet-mapping&gt; <br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 三、写一个通用的方法，　供调用。 <br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public class CallHtml { <br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public static void callOnePage(String fileName, String path, <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String realName, String realPath) { <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; try { <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String str = "http://localhost:8080/test/toHtmlPath?file_name=" <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; + fileName + "&amp;&amp;path=" + path + "&amp;&amp;realName=" + realName <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; + "&amp;&amp;realPath=" + realPath; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int httpResult; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; URL url = new URL(str); <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; URLConnection connection = url.openConnection(); <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; connection.connect(); <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; HttpURLConnection httpURLConnection = (HttpURLConnection) connection; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; httpResult = httpURLConnection.getResponseCode(); <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (httpResult != HttpURLConnection.HTTP_OK) { <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println("没有连接成功"); <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } else { <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println("连接成功了　"); <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } catch (Exception e) { <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // TODO: handle exception <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } <br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //这个方法适当重载，就可以省去一些参数传递。 <br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } <br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 四、在你的新闻发布save时，调用方法。 <br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1、CallHtml.callOnePage("info.jsf?file_id=aaa",news,"", "");//将在news目录下生成一个aaa.htm的静态文件 <br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2、CallHtml.callOnePage("newsList.jsf",news,"", "");//将在news目录下生成一个newsList.htm的静态文件,显示最新的新闻。 <br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ３、CallHtml.callOnePage("index.jsf","","", "");//生成主页。 <br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 好了，这就保持了，主页、列表、新闻内容都是最新的静态页面了。&nbsp;</font><br>
<img src ="http://www.blogjava.net/hilor/aggbug/138084.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/hilor/" target="_blank">hilor</a> 2007-08-20 12:22 <a href="http://www.blogjava.net/hilor/articles/138084.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>JSP生成静态页面(连接数据库)</title><link>http://www.blogjava.net/hilor/articles/137761.html</link><dc:creator>hilor</dc:creator><author>hilor</author><pubDate>Sat, 18 Aug 2007 01:39:00 GMT</pubDate><guid>http://www.blogjava.net/hilor/articles/137761.html</guid><wfw:comment>http://www.blogjava.net/hilor/comments/137761.html</wfw:comment><comments>http://www.blogjava.net/hilor/articles/137761.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/hilor/comments/commentRss/137761.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/hilor/services/trackbacks/137761.html</trackback:ping><description><![CDATA[主要原理请参考<a href="http://blog.hunan2s.com/article.asp?id=233" target=_blank><u><font color=#0000ff>http://blog.hunan2s.com/article.asp?id=233</font></u></a><br><br>经过一翻调试，成功了。。呵<br><br>附上源码。。<br><br><br>JDK&nbsp;1.5&nbsp;+ECLIPSE&nbsp;+TOMCAT&nbsp;5.0.28&nbsp;+&nbsp;MYSQL&nbsp;5.0&nbsp;<br><br>数据库TEST　，表名news&nbsp;<br>字段：　id&nbsp;&nbsp;&nbsp;int&nbsp;自动增长　,&nbsp;Title&nbsp;&nbsp;varchar(20)&nbsp;,&nbsp;Content&nbsp;&nbsp;varchar(200)&nbsp;&nbsp;,&nbsp;Author&nbsp;&nbsp;varchar(10)&nbsp;<br><br>makeFile.jsp<br><br>&nbsp;&lt;%<br>&nbsp;&nbsp;Connection&nbsp;conn&nbsp;=&nbsp;DBconn.getConnection();<br>&nbsp;&nbsp;Statement&nbsp;stmt&nbsp;=&nbsp;conn.createStatement();<br>&nbsp;&nbsp;ResultSet&nbsp;Rs&nbsp;=&nbsp;stmt.executeQuery("select&nbsp;*&nbsp;from&nbsp;news");<br>&nbsp;&nbsp;System.out.println("success");<br><br>&nbsp;%&gt;<br>&nbsp;<br>&nbsp;&nbsp;&lt;%<br>&nbsp;&nbsp;<br>&nbsp;&nbsp;String&nbsp;filePath&nbsp;=&nbsp;request.getRealPath("/")+"template.htm";<br><br>&nbsp;&nbsp;System.out.println(filePath);<br>&nbsp;&nbsp;<br>&nbsp;&nbsp;String&nbsp;templateContent;<br>&nbsp;&nbsp;FileInputStream&nbsp;fileinputstream&nbsp;=&nbsp;new&nbsp;FileInputStream(filePath);<br>&nbsp;&nbsp;int&nbsp;lenght&nbsp;=&nbsp;fileinputstream.available();&nbsp;//available()&nbsp;返回可以不受阻塞地从此文件输入流中读取的字节数。<br>&nbsp;&nbsp;<br>byte&nbsp;bytes[]&nbsp;=&nbsp;new&nbsp;byte[lenght];<br><br>fileinputstream.read(bytes);&nbsp;//read(byte[]&nbsp;b)&nbsp;从此输入流中将最多&nbsp;b.length&nbsp;个字节的数据读入一个字节数组中。<br><br>fileinputstream.close();<br>//templateContent&nbsp;=&nbsp;new&nbsp;String(bytes);<br>String&nbsp;title;<br>String&nbsp;content;<br>String&nbsp;author;<br>while(Rs.next())<br>{<br>templateContent&nbsp;=&nbsp;new&nbsp;String(bytes);//如果不用这句，则替换一次之后，templateContent中就没有#**#标志了。所以要重新生成<br>&nbsp;title&nbsp;=&nbsp;Rs.getString("Title");<br>&nbsp;content&nbsp;=&nbsp;Rs.getString("Content");<br>&nbsp;author&nbsp;=&nbsp;Rs.getString("Author");<br>out.println(title+"********"+content+"****"+author);<br>out.print("以下是模板内容：&lt;br&gt;"+templateContent+"&lt;br&gt;&nbsp;以下是置换以后的html内容&lt;br&gt;&lt;hr&gt;");<br>templateContent=templateContent.replaceAll("#title#",title);<br>templateContent=templateContent.replaceAll("#author#",author);//替换掉模块中相应的地方<br>templateContent=templateContent.replaceAll("#content#",content);<br><br>//&nbsp;根据时间得文件名<br>Calendar&nbsp;calendar&nbsp;=&nbsp;Calendar.getInstance();<br>String&nbsp;fileame&nbsp;=&nbsp;String.valueOf(calendar.getTimeInMillis())&nbsp;+".html";<br>fileame&nbsp;=&nbsp;request.getRealPath("/")+"Html/"+fileame;//生成的html文件保存路径<br><br><br>out.print(templateContent);<br>FileOutputStream&nbsp;fileoutputstream&nbsp;=&nbsp;new&nbsp;FileOutputStream(fileame);//建立文件输出流<br>byte&nbsp;tag_bytes[]&nbsp;=&nbsp;templateContent.getBytes();<br>fileoutputstream.write(tag_bytes);<br>fileoutputstream.close();<br><br>}<br><br>if(conn!=null)<br>&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;conn.close();<br>&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;if(stmt!=null)<br>&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;stmt.close();<br>&nbsp;&nbsp;&nbsp;&nbsp;}<br><br><br>&nbsp;&nbsp;<br>&nbsp;&nbsp;%&gt;<br><br>//数据库连接文件<br><br>import&nbsp;java.sql.*;<br>public&nbsp;class&nbsp;DBconn&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;DBconn()&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;TODO&nbsp;Auto-generated&nbsp;constructor&nbsp;stub<br>&nbsp;&nbsp;&nbsp;&nbsp;}<br><br>&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;static&nbsp;Connection&nbsp;getConnection()&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Connection&nbsp;conn&nbsp;=&nbsp;null;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;try&nbsp;{&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Class.forName("org.gjt.mm.mysql.Driver");&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;conn&nbsp;=&nbsp;DriverManager.getConnection("jdbc:mysql://"&nbsp;+&nbsp;"localhost"&nbsp;+&nbsp;"/"&nbsp;+&nbsp;"test"&nbsp;+<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"?useUnicode=true&amp;characterEncoding=GB2312","root","111111");&nbsp;<br>&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;}<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;catch(Exception&nbsp;e)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;e.printStackTrace();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;conn;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;/*public&nbsp;static&nbsp;void&nbsp;main(String[]&nbsp;args)&nbsp;throws&nbsp;Exception<br>&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Connection&nbsp;con=getConnection();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(con.isClosed());<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;}<br>*/<br>}<br><br><br><br>//　模板文件<br><br>template.htm<br>&lt;!DOCTYPE&nbsp;html&nbsp;PUBLIC&nbsp;"-//W3C//DTD&nbsp;XHTML&nbsp;1.0&nbsp;Transitional//EN"&nbsp;"<a href="http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd" target=_blank><u><font color=#0000ff>http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd</font></u></a>"&gt;<br>&lt;html&nbsp;xmlns="<a href="http://www.w3.org/1999/xhtml" target=_blank><u><font color=#0000ff>http://www.w3.org/1999/xhtml</font></u></a>"&gt;<br>&lt;head&gt;<br>&lt;meta&nbsp;http-equiv="Content-Type"&nbsp;content="text/html;&nbsp;charset=gb2312"&nbsp;/&gt;<br>&lt;title&gt;#title#&lt;/title&gt;<br>&lt;/head&gt;<br><br>&lt;body&gt;<br>&lt;table&nbsp;width="380"&nbsp;height="107"&nbsp;border="0"&nbsp;cellpadding="0"&nbsp;cellspacing="1"&nbsp;bgcolor="#FFCC99"&gt;<br>&nbsp;&nbsp;&lt;tr&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&lt;td&nbsp;height="16"&nbsp;bgcolor="#FFCC99"&gt;&lt;div&nbsp;align="center"&gt;#title#&lt;/div&gt;&lt;/td&gt;<br>&nbsp;&nbsp;&lt;/tr&gt;<br>&nbsp;&nbsp;&lt;tr&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&lt;td&nbsp;bgcolor="#FFFFFF"&gt;#content#&lt;/td&gt;<br>&nbsp;&nbsp;&lt;/tr&gt;<br>&nbsp;&nbsp;&lt;tr&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&lt;td&nbsp;height="13"&nbsp;align="right"&nbsp;bgcolor="#FFFFFF"&gt;#author#&lt;/td&gt;<br>&nbsp;&nbsp;&lt;/tr&gt;<br>&lt;/table&gt;<br>&lt;/body&gt;<br>&lt;/html&gt;
<img src ="http://www.blogjava.net/hilor/aggbug/137761.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/hilor/" target="_blank">hilor</a> 2007-08-18 09:39 <a href="http://www.blogjava.net/hilor/articles/137761.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>JSP生成HTML静态页面</title><link>http://www.blogjava.net/hilor/articles/137758.html</link><dc:creator>hilor</dc:creator><author>hilor</author><pubDate>Sat, 18 Aug 2007 01:21:00 GMT</pubDate><guid>http://www.blogjava.net/hilor/articles/137758.html</guid><wfw:comment>http://www.blogjava.net/hilor/comments/137758.html</wfw:comment><comments>http://www.blogjava.net/hilor/articles/137758.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/hilor/comments/commentRss/137758.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/hilor/services/trackbacks/137758.html</trackback:ping><description><![CDATA[<p>&lt;%@ page contentType="text/html; charset=gb2312"%&gt;<br>&lt;%@ page import="java.util.*"%&gt;<br>&lt;%@ page import="java.sql.*"%&gt;<br>&lt;%@ page import="java.io.*"%&gt;<br>&lt;%@ page import="org.apache.commons.fileupload.*" %&gt;<br>&lt;%@ page import="java.text.*" %&gt;<br>&lt;%@ page import="javax.servlet.*,javax.servlet.http.*"%&gt;<br>&lt;jsp:useBean id="conn" scope="page" class="DBLink.DBSQL"/&gt;<br>&lt;jsp:useBean id="ReadTemplates" scope="page" class="ball.news.ReadTemplates"/&gt;<br>&lt;jsp:useBean id="WriteHtml" scope="page" class="ball.news.WriteHtml"/&gt;<br>&lt;jsp:useBean id="ReplaceAll" scope="page" class="ball.news.ReplaceAll"/&gt;<br>&lt;%<br>&nbsp;&nbsp;&nbsp; //request.setCharacterEncoding("gb2312");<br>&nbsp;&nbsp;&nbsp; <br>&nbsp; try{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String dir=request.getRealPath(".");<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; DiskFileUpload fu = new DiskFileUpload();<br>&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; fu.setSizeMax(4194304);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //设置文件大小.&nbsp; 这里文件只能上传4M以内的</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; fu.setSizeThreshold(4096);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //设置缓冲大小.</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; fu.setRepositoryPath(dir+"/ball/news/images");&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //设置临时目录.<br>&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; List fileItems = fu.parseRequest(request);&nbsp; //解析请求,返回一个集合.<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Iterator i = fileItems.iterator();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String fieldvalue="";<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String ff = "";<br>&nbsp;&nbsp;String picname="false";<br>&nbsp;&nbsp;Object tt = "";<br>&nbsp;&nbsp;Vector v = new Vector();<br>&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; while(i.hasNext()) <br>&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; FileItem fi = (FileItem)i.next();<br>&nbsp; <br>&nbsp;&nbsp;&nbsp; if(fi.isFormField())&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; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp; String fieldName = fi.getFieldName();&nbsp;&nbsp;&nbsp;&nbsp; //这里取得表单名<br>&nbsp;&nbsp;&nbsp;&nbsp; fieldvalue=fi.getString();&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //这里取得表单值<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp; v.addElement(fieldvalue);<br>&nbsp; &nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp; else&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&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;<br>&nbsp;&nbsp; File fullFile = new File(fi.getName()); <br>&nbsp;&nbsp; ff = fullFile.getName();<br>&nbsp;&nbsp; String rr = "";</p>
<p><br>&nbsp;&nbsp; java.util.Date date2 = new java.util.Date();<br>&nbsp;&nbsp; SimpleDateFormat formatter = new SimpleDateFormat ("yyyyMMddHHmmss");&nbsp;&nbsp; //取得时间<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String str2 = formatter.format(date2);<br>&nbsp;&nbsp; StringTokenizer st = new StringTokenizer(ff,".");<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;if (st.hasMoreTokens()){<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;String test12 = st.nextToken();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;rr = st.nextToken();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;//System.out.println(rr);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (rr.equals("")&amp;&amp;!rr.equals("gif")&amp;&amp;!rr.equals("jpg")&amp;&amp;!rr.equals("jpeg")) <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;picname = "false";<br>&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;else<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; picname = str2+"."+rr;&nbsp;&nbsp;&nbsp;&nbsp; //以时间为图片名称</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; File savedFile = new File(getServletContext().getRealPath("/ball/news/images/"),picname);<br>&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; fi.write(savedFile);&nbsp;&nbsp;&nbsp;&nbsp; //上传到服务器<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;//System.out.println("picname------------------------"+picname);<br>&nbsp;&nbsp;&nbsp;&nbsp; } <br>&nbsp;&nbsp;//System.out.println("v------------------------"+v);<br>&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; String[] flag = {"&lt;temp_title&gt;","&lt;temp_date&gt;","&lt;temp_author&gt;","&lt;temp_content&gt;","&lt;str_Temp&gt;","&lt;temp_picture&gt;"};</p>
<p>&nbsp;&nbsp;&nbsp; //将数据写入到数据库<br>&nbsp;&nbsp;&nbsp; Object newtype1 = v.elementAt(0);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String t = newtype1.toString();<br>&nbsp;&nbsp;&nbsp; int newtype = Integer.parseInt(t);<br>&nbsp;&nbsp;&nbsp; Object rowid1 = v.elementAt(1);<br>&nbsp;&nbsp;&nbsp; String rowid = rowid1.toString();<br>&nbsp;&nbsp;&nbsp; Object title1 = v.elementAt(2);<br>&nbsp;&nbsp;&nbsp; String title = title1.toString();<br>&nbsp;&nbsp;&nbsp; Object content1 = v.elementAt(3);<br>&nbsp;&nbsp;&nbsp; String content = content1.toString();<br>&nbsp;&nbsp; // System.out.println(down);<br>&nbsp;&nbsp;&nbsp; java.util.Date date = new java.util.Date();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String strdate = date.toLocaleString(); </p>
<p>&nbsp;java.util.Date StrDate1 = new java.util.Date();<br>&nbsp;String StrDate = StrDate1.toLocaleString();&nbsp;&nbsp; // 新闻发布时间<br>&nbsp;//String newtype="0";<br>&nbsp;conn.openDB();<br>&nbsp;String sql = "select top 5 * from b_news where newtype="+newtype+" order by id desc";<br>&nbsp;String strTemp="&lt;tr&gt;&lt;td&gt;相关新闻&lt;/td&gt;&lt;/tr&gt;";<br>&nbsp;ResultSet rs = conn.executeQuery(sql);<br>&nbsp;while (rs.next())<br>&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;String t2 = rs.getString(2);<br>&nbsp;&nbsp;&nbsp;String t4 = rs.getString(4);<br>&nbsp;&nbsp;&nbsp;strTemp += "&lt;tr&gt;&lt;td&gt;";<br>&nbsp;&nbsp;&nbsp;strTemp +="&lt;a href=../../../"+t4+"&gt;";<br>&nbsp;&nbsp;&nbsp;strTemp += t2;<br>&nbsp;&nbsp;&nbsp;strTemp +="&lt;/a&gt;";<br>&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; strTemp +="&lt;/td&gt;&lt;/tr&gt;";<br>&nbsp;&nbsp;&nbsp; rs.close();</p>
<p>&nbsp;<br>&nbsp;//读取模板</p>
<p>&nbsp;String filePath = "";<br>&nbsp;filePath = request.getRealPath("<a href="file://ball//news//pnews.template"><u><font color=#0000ff>\\ball\\news\\pnews.template</font></u></a>");<br>&nbsp;String templateContent = null;<br>&nbsp;try{<br>&nbsp;&nbsp;templateContent = ReadTemplates.getTlpContent(filePath);<br>&nbsp;&nbsp;System.out.println(templateContent);<br>&nbsp;}<br>&nbsp;catch(Exception e)<br>&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;System.out.println("error to template!");<br>&nbsp;&nbsp;}<br>&nbsp;//替换模板中的内容<br>&nbsp;//System.out.println("picname--------------------------------"+picname);<br>&nbsp;&nbsp;&nbsp; <br>&nbsp;templateContent = ReplaceAll.replace(templateContent,flag[0],title);<br>&nbsp;templateContent = ReplaceAll.replace(templateContent,flag[1],StrDate);<br>&nbsp;//templateContent = ReplaceAll.replace(templateContent,flag[2],editer);<br>&nbsp;templateContent = ReplaceAll.replace(templateContent,flag[3],content);<br>&nbsp;templateContent = ReplaceAll.replace(templateContent,flag[4],strTemp);<br>&nbsp;templateContent = ReplaceAll.replace(templateContent,flag[5],picname);</p>
<p>&nbsp;// 根据时间得文件名与路径名<br>&nbsp;<br>&nbsp;Calendar calendar = Calendar.getInstance();<br>&nbsp;String fileName = String.valueOf(calendar.getTimeInMillis()) +".html";<br>&nbsp;String pathName = request.getRealPath("ball/news")+"\\"+ calendar.get(Calendar.YEAR) + "\\"+ (calendar.get(Calendar.MONTH)+1) +"\\"+ calendar.get(Calendar.DAY_OF_MONTH)+"\\";&nbsp;<br>&nbsp;String url = calendar.get(Calendar.YEAR) + "/"+ (calendar.get(Calendar.MONTH)+1) +"/"+ calendar.get(Calendar.DAY_OF_MONTH)+"/";<br>&nbsp;url +=fileName;<br>&nbsp;//System.out.println(url);</p>
<p>&nbsp;try{<br>&nbsp;&nbsp;WriteHtml.save(templateContent,pathName,fileName);<br>&nbsp;}catch(Exception e){<br>&nbsp;System.out.println("error to html!-----------"+e.getMessage());<br>&nbsp;}</p>
<p>&nbsp;<br>&nbsp;&nbsp; //写入数据库<br>&nbsp;&nbsp; String sqlInsert = null;<br>&nbsp;&nbsp;&nbsp; if (!picname.equals("false")){<br>&nbsp;&nbsp;&nbsp;&nbsp; sqlInsert = "insert into b_news (title,content,url,picture,newtype,addtime,rowid) values ('"+title+"','"+content+"','"+url+"','"+picname+"','"+newtype+"',getdate(),'"+rowid+"')";<br>&nbsp;&nbsp;&nbsp; }<br>&nbsp;else<br>&nbsp;{<br>&nbsp;&nbsp; picname="images/"+picname;<br>&nbsp;&nbsp; sqlInsert = "insert into b_news (title,content,url,newtype,addtime,rowid) values ('"+title+"','"+content+"','"+url+"','"+newtype+"',getdate(),'"+rowid+"')";<br>&nbsp;}<br>&nbsp;//System.out.println("sql insert---------------"+sqlInsert);<br>&nbsp;conn.executeUpdate (sqlInsert);<br>&nbsp;&nbsp; } <br>&nbsp;&nbsp; catch(Exception e)<br>&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;System.out.println("upload error------------------"+e.getMessage());<br>&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; <br>&nbsp; <br>&nbsp;&nbsp;&nbsp; <br>%&gt;<br>&lt;%out.println("新闻生成html成功了！");%&gt;</p>
<img src ="http://www.blogjava.net/hilor/aggbug/137758.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/hilor/" target="_blank">hilor</a> 2007-08-18 09:21 <a href="http://www.blogjava.net/hilor/articles/137758.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Jsp生成静态页面 </title><link>http://www.blogjava.net/hilor/articles/137757.html</link><dc:creator>hilor</dc:creator><author>hilor</author><pubDate>Sat, 18 Aug 2007 01:16:00 GMT</pubDate><guid>http://www.blogjava.net/hilor/articles/137757.html</guid><wfw:comment>http://www.blogjava.net/hilor/comments/137757.html</wfw:comment><comments>http://www.blogjava.net/hilor/articles/137757.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/hilor/comments/commentRss/137757.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/hilor/services/trackbacks/137757.html</trackback:ping><description><![CDATA[<p>为了减轻服务器压力，将原来的文章管理系统由JSP文件的从数据库中取数据显示改为由jsp生成静态html文件后直接访问html文件。下面是一个简单的示例</p>
<p><strong>1.buildhtml.jsp</strong></p>
<p>&lt;%@ page contentType="text/html; charset=gb2312" import="java.util.*,java.io.*"%&gt;<br>&lt;%<br>try{<br>&nbsp;String title="This is Title";<br>&nbsp;String content="This is Content Area";<br>&nbsp;String editer="LaoMao";<br>&nbsp;String filePath = "";<br>&nbsp;filePath = request.getRealPath("/")+"test/template.htm";<br>&nbsp;//out.print(filePath+"&lt;br&gt;");<br>&nbsp;String templateContent="";<br>&nbsp;FileInputStream fileinputstream = new FileInputStream(filePath);//读取模块文件<br>&nbsp;int lenght = fileinputstream.available();<br>&nbsp;byte bytes[] = new byte[lenght];<br>&nbsp;fileinputstream.read(bytes);<br>&nbsp;fileinputstream.close();<br>&nbsp;templateContent = new String(bytes);<br>&nbsp;//out.print(templateContent);<br>&nbsp;templateContent=templateContent.replaceAll("###title###",title);<br>&nbsp;templateContent=templateContent.replaceAll("###content###",content);<br>&nbsp;templateContent=templateContent.replaceAll("###author###",editer);//替换掉模块中相应的地方<br>&nbsp;//out.print(templateContent);<br>&nbsp;// 根据时间得文件名<br>&nbsp;Calendar calendar = Calendar.getInstance();<br>&nbsp;String fileame = String.valueOf(calendar.getTimeInMillis()) +".html";<br>&nbsp;fileame = request.getRealPath("/")+fileame;//生成的html文件保存路径<br>&nbsp;FileOutputStream fileoutputstream = new FileOutputStream(fileame);//建立文件输出流<br>&nbsp;byte tag_bytes[] = templateContent.getBytes();<br>&nbsp;fileoutputstream.write(tag_bytes);<br>&nbsp;fileoutputstream.close();<br>}<br>catch(Exception e){<br>&nbsp;out.print(e.toString());<br>}</p>
<p>%&gt;</p>
<p><strong>2. template.htm</strong></p>
<p>&lt;html&gt;<br>&lt;head&gt;<br>&lt;title&gt;###title###&lt;/title&gt;<br>&lt;meta http-equiv="Content-Type" content="text/html; charset=gb2312"&gt;<br>&lt;LINK href="../css.css" rel=stylesheet type=text/css&gt;<br>&lt;/head&gt;</p>
<p>&lt;body&gt;<br>&lt;table width="500" border="0" align="center" cellpadding="0" cellspacing="2"&gt;<br>&nbsp; &lt;tr&gt; <br>&nbsp;&nbsp;&nbsp; &lt;td align="center"&gt;###title###&lt;/td&gt;<br>&nbsp; &lt;/tr&gt;<br>&nbsp; &lt;tr&gt; <br>&nbsp;&nbsp;&nbsp; &lt;td align="center"&gt;author：###author###&amp;nbsp;&amp;nbsp;&lt;/td&gt;<br>&nbsp; &lt;/tr&gt;<br>&nbsp; &lt;tr&gt;<br>&nbsp;&nbsp;&nbsp; &lt;td&gt;###content###<br>&nbsp;&lt;/td&gt;<br>&nbsp;<br>&nbsp; &lt;/tr&gt;</p>
<p>&lt;/table&gt;<br>&lt;/body&gt;<br>&lt;/html&gt;</p>
<img src ="http://www.blogjava.net/hilor/aggbug/137757.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/hilor/" target="_blank">hilor</a> 2007-08-18 09:16 <a href="http://www.blogjava.net/hilor/articles/137757.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Tomcat虚拟目录配置</title><link>http://www.blogjava.net/hilor/articles/137295.html</link><dc:creator>hilor</dc:creator><author>hilor</author><pubDate>Thu, 16 Aug 2007 07:52:00 GMT</pubDate><guid>http://www.blogjava.net/hilor/articles/137295.html</guid><wfw:comment>http://www.blogjava.net/hilor/comments/137295.html</wfw:comment><comments>http://www.blogjava.net/hilor/articles/137295.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/hilor/comments/commentRss/137295.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/hilor/services/trackbacks/137295.html</trackback:ping><description><![CDATA[<div>1&nbsp;编辑server文件（x:\tomcat\conf\server.xml）</div>
<div>2&nbsp;只要在server.xml文件中加入如下代码即可：</div>
<div>注意<font color=#ff0000>：（在server.xml中，此语句&nbsp;&lt;Host&nbsp;name="localhost"&nbsp;appBase="webapps"<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;unpackWARs="true"&nbsp;autoDeploy="true"<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;xmlValidation="false"&nbsp;xmlNamespaceAware="false"&gt;<br>后面添加如下语句：）</font></div>
<div><br>&lt;!--&nbsp;This&nbsp;is&nbsp;my&nbsp;site&nbsp;path,power&nbsp;by&nbsp;aaa&nbsp;--&gt;<br>&lt;Context&nbsp;path="/aaa"&nbsp;docBase="C:\Program&nbsp;Files\Apache&nbsp;Software&nbsp;Foundation\Tomcat&nbsp;5.0\webapps\aaa"&nbsp;debug="0"<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;reloadable="true"&nbsp;crossContext="true"&gt;<br>&lt;/Context&gt;&nbsp;<br>&lt;!--&nbsp;Site&nbsp;setup&nbsp;end&nbsp;--&gt;</div>
<div>3&nbsp;因为在tomcat启动时要读取server文件的信息，所以更改server文件后，一定要重新启动tomcat。&nbsp;<br></div>
<p><span>－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－</span></p>
<p><span>tomcat&nbsp;安装好之后，只需要把你的程序包放到$Tomcat_Home$/webapps下就可以直接使用了。这样会使webapps越来越大就需要设置虚拟目录：<br>1.单个应用设置：<br>&nbsp;在&lt;Host&gt;和&lt;/host&gt;之间加上<br>&nbsp;&lt;Context&nbsp;path="/site"&nbsp;docBase="d:\site"&nbsp;reloadable="true"&nbsp;debug="0"&gt;<br>&nbsp;&lt;/Context&gt;<br>&nbsp;参数:path&nbsp;表示在浏览器中输入<a href="http://localhost:8080/site"><font color=#73af1d><u>http://localhost:8080/site</u></font></a><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;docBase表示你的程序包的物理绝对路径，默认的绝对路径是$Tomcat_Home$/webapps<br>&nbsp;这样设定了之后会在$tomcat_home$/conf/catalina/localhost目录下生成一个site.xml文件，此文件的内容就是刚才设置的内容。<br>2.&nbsp;通过前面我们知道了在$tomcat_home$/conf/catalina/localhost目录下会生成相应的配置文件，因此我们可以直接在$&nbsp;tomcat_home$/conf/catalina/localhost目录下写配置文件文件名任意取，最好是跟你的web应用相同便于管理，如&nbsp;site.xml内容同上<br>&lt;Context&nbsp;path="/site"&nbsp;docBase="d:\site"&nbsp;reloadable="true"&nbsp;debug="0"&gt;<br>&nbsp;&lt;/Context&gt;<br>3.更改整个根目录：<br>&nbsp;&nbsp;找到&lt;Host&nbsp;name="localhost"&nbsp;debug="0"&nbsp;appBase="webapps"&nbsp;<br>&nbsp;&nbsp;unpackWARs="true"&nbsp;autoDeploy="true"&gt;<br>&nbsp;将appBase的设置成期望的路径（绝对路径）<br>&nbsp;出现的问题：输入：<a href="http://localhost:8080/"><font color=#73af1d><u>http://localhost:8080/</u></font></a>没有出现默认的页面<br>&nbsp;原因当然是更改了路径造成的。解决也很简单了，把文件拷过来，或者再把原来默认的设成虚拟路径。</span></p>
<img src ="http://www.blogjava.net/hilor/aggbug/137295.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/hilor/" target="_blank">hilor</a> 2007-08-16 15:52 <a href="http://www.blogjava.net/hilor/articles/137295.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>JSTL简介</title><link>http://www.blogjava.net/hilor/articles/137258.html</link><dc:creator>hilor</dc:creator><author>hilor</author><pubDate>Thu, 16 Aug 2007 06:45:00 GMT</pubDate><guid>http://www.blogjava.net/hilor/articles/137258.html</guid><wfw:comment>http://www.blogjava.net/hilor/comments/137258.html</wfw:comment><comments>http://www.blogjava.net/hilor/articles/137258.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.blogjava.net/hilor/comments/commentRss/137258.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/hilor/services/trackbacks/137258.html</trackback:ping><description><![CDATA[<p><strong>JSTL简介<br></strong>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;JSTL是一个不断完善的开放源代码的JSP标签库，是由apache的jakarta小组来维护的。JSTL只能运行在支持JSP1.2和Servlet2.3规范的容器上，如tomcat 4.x。但是在即将推出的JSP 2.0中是作为标准支持的。<br><br>&nbsp;&nbsp; JSTL包含两个部分：标签库和EL（Expression Language表达式语言）语言。标签库目前支持四种标签： <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; URI&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;前 缀&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&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><font size=4>Core</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; <font size=4>http://java.sun.com/jstl/core</font>&nbsp;<font size=4>&nbsp;&nbsp;&nbsp;c</font>&nbsp;<font size=4>&nbsp;&nbsp;&nbsp;&lt;c:tagname ...&gt;</font></p>
<p><font size=4>XML processing</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;<font size=4>http://java.sun.com/jstl/xml</font>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<font size=4>x</font>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<font size=4>&lt;x:tagname ...&gt;</font></p>
<p>&nbsp;<font size=4>I18N capable formatting&nbsp; </font>&nbsp;<font size=4>http://java.sun.com/jstl/fmt</font>&nbsp;&nbsp;&nbsp;&nbsp; <font size=4>fmt</font>&nbsp;&nbsp;&nbsp;&nbsp; <font size=4>&lt;fmt:tagname ...&gt;</font> <font size=4></font></p>
<p><font size=4>Database access (SQL)&nbsp; </font>&nbsp;<font size=4>http://java.sun.com/jstl/sql</font>&nbsp;&nbsp;&nbsp;&nbsp; <font size=4>sql</font>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <font size=4>&lt;sql:tagname ...&gt;</font> <font size=4><br><br>Core支持JSP中的一些基本的操作；<br>XML processing支持XML文档的处理；<br>I18N capable formatting支持对JSP页面的国际化；<br>Database access (SQL)支持JSP对数据库的操作。<br><br>由于本人水平有限，本文仅介绍Core标签，如有兴趣，可一起探讨其它三种标签的使用与扩充。<br><br><strong>EL语言介绍</strong><br><br>EL语言是JSTL输出（输入）一个JAVA表达式的表示形式。<br>在JSTL中，EL语言只能在属性值中使用。EL语言只能通过建立表达式来进行调用。在属性值中使用表达式有三种方式。<br><br>1、 value属性包含一个表达式<br>&lt;some:tag value=""/&gt;<br>在这种情况下，表达式值被计算出来并根据类型转换规则赋值给value属性。比如：&lt;c:out value="" /&gt;中的就是一个EL，它相当于JSP语句&lt;%=request.getAttribute(&#8220;username&#8221;)%&gt;或&lt;% =session.getAttribute(&#8220;username&#8221;)%&gt;<br><br>2、 value属性包含一个或多个属性，这些属性被文本分割或围绕<br>&lt;some:tag value="sometext"/&gt;<br>在这种情况下，表达式从左到右进行计算，并将结果转换为字符串型（根据类型转换规则），并将结果赋值给value属性<br><br>3、 value属性仅仅包含文本<br>&lt;some:tag value="sometext"/&gt;<br>在这种情况下，字符串型属性value将根据类型转换规则转换为标签所希望的类型。<br><br><strong>EL语言的操作符</strong><br>取得某个对象或集合中的属性值<br>为了获得集合中的属性，EL支持以下两种操作<br>1． 使用.操作符来获得有名字的属性。例如表达式表明对象user的username属性<br>2． 使用[]操作符来获得有名字或按数字排列的属性。<br>表达式和表达式含义相同<br>表达式 表明row集合的第一个条目。<br>在这里user是一个类的对象，它的属性username必须符合标准JavaBean的规范，即必须为username属性定义相应的getter、setter方法。<br><br>Empty操作符(空值检查)<br><br>使用empty操作符来决定对象、集合或字符串变量是否为空或null。例如：<br>true<br>如果request的参数列表中的username值为null，则表达式的值为true。 EL也可以直接使用比较操作符与null进行比较。如true。<br>比较操作符 </font></p>
<table class=ubb cellSpacing=0>
    <tbody>
        <tr>
            <td class=ubb><font size=4>操作符</font></td>
            <td class=ubb><font size=4>描述</font></td>
        </tr>
        <tr>
            <td class=ubb><font size=4>==或eq</font></td>
            <td class=ubb><font size=4>相等检查</font></td>
        </tr>
        <tr>
            <td class=ubb><font size=4>!=或ne</font></td>
            <td class=ubb><font size=4>不等检查</font></td>
        </tr>
        <tr>
            <td class=ubb><font size=4>&lt;或lt</font></td>
            <td class=ubb><font size=4>小于检查</font></td>
        </tr>
        <tr>
            <td class=ubb><font size=4>&gt;或gt</font></td>
            <td class=ubb><font size=4>大于检查</font></td>
        </tr>
        <tr>
            <td class=ubb><font size=4>&lt;=或le</font></td>
            <td class=ubb><font size=4>小于等于检查</font></td>
        </tr>
        <tr>
            <td class=ubb><font size=4>&gt;=或ge</font></td>
            <td class=ubb><font size=4>大于等于检查</font></td>
        </tr>
    </tbody>
</table>
<font size=4><br>数字运算符与逻辑运算符均与JAVA语言相同，不再列表。<br><br><strong>Core标签库</strong><br><br><strong>1、 通用标签</strong><br><br><strong>&lt;c:out&gt;</strong><br>&lt;c:out&gt;标签用于在JSP中显示数据，它有如下属性 </font>
<table class=ubb cellSpacing=0>
    <tbody>
        <tr>
            <td class=ubb><font size=4>属 性</font></td>
            <td class=ubb><font size=4>描 述</font></td>
            <td class=ubb><font size=4>是否必须</font></td>
            <td class=ubb><font size=4>缺省值</font></td>
        </tr>
        <tr>
            <td class=ubb><font size=4>value</font></td>
            <td class=ubb><font size=4>输出的信息，可以是EL表达式或常量</font></td>
            <td class=ubb><font size=4>是</font></td>
            <td class=ubb><font size=4>无</font></td>
        </tr>
        <tr>
            <td class=ubb><font size=4>default </font></td>
            <td class=ubb><font size=4>value为空时显示信息</font></td>
            <td class=ubb><font size=4>否</font></td>
            <td class=ubb><font size=4>无</font></td>
        </tr>
        <tr>
            <td class=ubb><font size=4>escapeXml</font></td>
            <td class=ubb><font size=4>为true则避开特殊的xml字符集</font></td>
            <td class=ubb><font size=4>否</font></td>
            <td class=ubb><font size=4>true</font></td>
        </tr>
    </tbody>
</table>
<font size=4><br><br><br>例子: </font>
<table class=ubb cellSpacing=0>
    <tbody>
        <tr>
            <td class=ubb><font size=4>您的用户名是: &lt;c:out value=&#8221;&#8221; default=&#8221;guest&#8221;/&gt;</font></td>
        </tr>
    </tbody>
</table>
<font size=4><br>显示用户的用户名，如为空则显示guest<br></font>
<table class=ubb cellSpacing=0>
    <tbody>
        <tr>
            <td class=ubb><font size=4>&lt;c:out value=""/&gt;</font></td>
        </tr>
    </tbody>
</table>
<font size=4><br>指定从session中获取username的值显示；<br></font>
<table class=ubb cellSpacing=0>
    <tbody>
        <tr>
            <td class=ubb><font size=4>&lt;c:out value="" /&gt;</font></td>
        </tr>
    </tbody>
</table>
<font size=4><br>显示username的值，默认是从request(page)中取，如果request中没有名为username的对象则从session中取， session中没有则从application(servletContext)中取，如果没有取到任何值则不显示。<br><br><strong>&lt;c:set&gt;</strong><br>&lt;c:set&gt;标签用于保存数据，它有如下属性 </font>
<table class=ubb cellSpacing=0>
    <tbody>
        <tr>
            <td class=ubb><font size=4>属 性</font></td>
            <td class=ubb><font size=4>描 述</font></td>
            <td class=ubb><font size=4>是否必须</font></td>
            <td class=ubb><font size=4>缺省值</font></td>
        </tr>
        <tr>
            <td class=ubb><font size=4>value</font></td>
            <td class=ubb><font size=4>要保存的信息，可以是EL表达式或常量</font></td>
            <td class=ubb><font size=4>否</font></td>
            <td class=ubb><font size=4><br></font></td>
        </tr>
        <tr>
            <td class=ubb><font size=4>target</font></td>
            <td class=ubb><font size=4>需要修改属性的变量名，一般为javabean的实例</font></td>
            <td class=ubb><font size=4>否</font></td>
            <td class=ubb><font size=4>无</font></td>
        </tr>
        <tr>
            <td class=ubb><font size=4>property</font></td>
            <td class=ubb><font size=4>需要修改的javabean属性</font></td>
            <td class=ubb><font size=4>否</font></td>
            <td class=ubb><font size=4>无</font></td>
        </tr>
        <tr>
            <td class=ubb><font size=4>var</font></td>
            <td class=ubb><font size=4>需要保存信息的变量</font></td>
            <td class=ubb><font size=4>否</font></td>
            <td class=ubb><font size=4>无</font></td>
        </tr>
        <tr>
            <td class=ubb><font size=4>scope</font></td>
            <td class=ubb><font size=4>保存信息的变量的范围</font></td>
            <td class=ubb><font size=4>否</font></td>
            <td class=ubb><font size=4>page</font></td>
        </tr>
    </tbody>
</table>
<font size=4><br>如果指定了target属性, 那么property属性也必须指定。<br>例子： </font>
<table class=ubb cellSpacing=0>
    <tbody>
        <tr>
            <td class=ubb><font size=4>&lt;c:set value="" var="test2" scope=&#8221;session&#8221; /&gt;</font></td>
        </tr>
    </tbody>
</table>
<font size=4><br>将test.testinfo的值保存到session的test2中，其中test是一个javabean的实例，testinfo是test对象的属性。<br></font>
<table class=ubb cellSpacing=0>
    <tbody>
        <tr>
            <td class=ubb><font size=4>&lt;c:set target="" property="city" value=""/&gt;</font></td>
        </tr>
    </tbody>
</table>
<font size=4><br>将对象cust.address的city属性值保存到变量city中<br><br><strong>&lt;c:remove&gt;</strong><br>&lt;c:remove&gt;标签用于删除数据，它有如下属性 </font>
<table class=ubb cellSpacing=0>
    <tbody>
        <tr>
            <td class=ubb><font size=4>属 性</font></td>
            <td class=ubb><font size=4>描 述</font></td>
            <td class=ubb><font size=4>是否必须</font></td>
            <td class=ubb><font size=4>缺省值</font></td>
        </tr>
        <tr>
            <td class=ubb><font size=4>var</font></td>
            <td class=ubb><font size=4>要删除的变量</font></td>
            <td class=ubb><font size=4>是</font></td>
            <td class=ubb><font size=4>无</font></td>
        </tr>
        <tr>
            <td class=ubb><font size=4>scope</font></td>
            <td class=ubb><font size=4>被删除变量的范围</font></td>
            <td class=ubb><font size=4>否</font></td>
            <td class=ubb><font size=4>所有范围，包括page、request、session、application等</font></td>
        </tr>
    </tbody>
</table>
<font size=4><br>例子: </font>
<table class=ubb cellSpacing=0>
    <tbody>
        <tr>
            <td class=ubb><font size=4>&lt;c:remove var="test2" scope="session"/&gt;</font></td>
        </tr>
    </tbody>
</table>
<font size=4><br>从session中删除test2变量。<br><br><strong>2、 流控制标签</strong><br><br><strong>&lt;c:if&gt;</strong><br><br>&lt;c:if&gt;标签有如下属性 </font>
<table class=ubb cellSpacing=0>
    <tbody>
        <tr>
            <td class=ubb><font size=4>属 性</font></td>
            <td class=ubb><font size=4>描 述</font></td>
            <td class=ubb><font size=4>是否必须</font></td>
            <td class=ubb><font size=4>缺省值</font></td>
        </tr>
        <tr>
            <td class=ubb><font size=4>test</font></td>
            <td class=ubb><font size=4>需要评价的条件，相当于if (...){}语句中的条件</font></td>
            <td class=ubb><font size=4>是</font></td>
            <td class=ubb><font size=4>无</font></td>
        </tr>
        <tr>
            <td class=ubb><font size=4>var</font></td>
            <td class=ubb><font size=4>要求保存条件结果的变量名</font></td>
            <td class=ubb><font size=4>否</font></td>
            <td class=ubb><font size=4>无</font></td>
        </tr>
        <tr>
            <td class=ubb><font size=4>scope</font></td>
            <td class=ubb><font size=4>保存条件结果的变量范围</font></td>
            <td class=ubb><font size=4>否</font></td>
            <td class=ubb><font size=4>page</font></td>
        </tr>
    </tbody>
</table>
<font size=4><br><br><strong>&lt;c:choose&gt;</strong><br>这个标签不接受任何属性<br><br><strong>&lt;c:when&gt;</strong><br>&lt;c:when&gt;标签有以下属性 </font>
<table class=ubb cellSpacing=0>
    <tbody>
        <tr>
            <td class=ubb><font size=4>属 性</font></td>
            <td class=ubb><font size=4>描 述</font></td>
            <td class=ubb><font size=4>是否必须</font></td>
            <td class=ubb><font size=4>缺省值</font></td>
        </tr>
        <tr>
            <td class=ubb><font size=4>test</font></td>
            <td class=ubb><font size=4>需要评价的条件</font></td>
            <td class=ubb><font size=4>是</font></td>
            <td class=ubb><font size=4>无</font></td>
        </tr>
    </tbody>
</table>
<font size=4><br><br><strong>&lt;c:otherwise&gt;</strong><br>这个标签同样不接受任何属性<br><br>例子： </font>
<table class=ubb cellSpacing=0>
    <tbody>
        <tr>
            <td class=ubb><font size=4>&lt;c:if test=""&gt;<br>user.wealthy is true.<br>&lt;/c:if&gt;</font></td>
        </tr>
    </tbody>
</table>
<font size=4><br>如果user.wealthy值true，则显示user.wealthy is true.<br><br></font>
<table class=ubb cellSpacing=0>
    <tbody>
        <tr>
            <td class=ubb><font size=4>&lt;c:choose&gt;<br>&lt;c:when test=""&gt;<br>user.generous　is true.<br>&lt;/c:when&gt; <br>&lt;c:when test=""&gt;<br>user.stingy is true.<br>&lt;/c:when&gt;<br>&lt;c:otherwise&gt;<br>user.generous and user.stingy are false.<br>&lt;/c:otherwise&gt;<br>&lt;/c:choose&gt;</font></td>
        </tr>
    </tbody>
</table>
<font size=4><br>只有当条件user.generous返回值是true时，才显示user.generous　is true.<br>只有当条件user.stingy返回值是true时，才显示user.stingy　is true.<br>其它所有的情况（即user.generous和user.stingy的值都不为true）全部显示user.generous and user.stingy are false.<br><br>由于JSTL没有形如if (){&#8230;} else {&#8230;}的条件语句，所以这种形式的语句只能用&lt;c:choose&gt;、&lt;c:when&gt;和&lt;c:otherwise&gt;标签共同来完成了。<br><br><strong>3、 循环控制标签</strong><br><br><strong>&lt;c:forEach&gt;</strong><br>&lt;c:forEach&gt;标签用于通用数据，它有以下属性 </font>
<table class=ubb cellSpacing=0>
    <tbody>
        <tr>
            <td class=ubb><font size=4>属 性</font></td>
            <td class=ubb><font size=4>描 述</font></td>
            <td class=ubb><font size=4>是否必须</font></td>
            <td class=ubb><font size=4>缺省值</font></td>
        </tr>
        <tr>
            <td class=ubb><font size=4>items</font></td>
            <td class=ubb><font size=4>进行循环的项目</font></td>
            <td class=ubb><font size=4>否</font></td>
            <td class=ubb><font size=4>无</font></td>
        </tr>
        <tr>
            <td class=ubb><font size=4>begin</font></td>
            <td class=ubb><font size=4>开始条件</font></td>
            <td class=ubb><font size=4>否</font></td>
            <td class=ubb><font size=4>0</font></td>
        </tr>
        <tr>
            <td class=ubb><font size=4>end</font></td>
            <td class=ubb><font size=4>结束条件</font></td>
            <td class=ubb><font size=4>否</font></td>
            <td class=ubb><font size=4>集合中的最后一个项目</font></td>
        </tr>
        <tr>
            <td class=ubb><font size=4>step</font></td>
            <td class=ubb><font size=4>步长</font></td>
            <td class=ubb><font size=4>否</font></td>
            <td class=ubb><font size=4>1</font></td>
        </tr>
        <tr>
            <td class=ubb><font size=4>var</font></td>
            <td class=ubb><font size=4>代表当前项目的变量名</font></td>
            <td class=ubb><font size=4>否</font></td>
            <td class=ubb><font size=4>无</font></td>
        </tr>
        <tr>
            <td class=ubb><font size=4>varStatus</font></td>
            <td class=ubb><font size=4>显示循环状态的变量</font></td>
            <td class=ubb><font size=4>否</font></td>
            <td class=ubb><font size=4>无</font></td>
        </tr>
    </tbody>
</table>
<font size=4><br><br>例子： </font>
<table class=ubb cellSpacing=0>
    <tbody>
        <tr>
            <td class=ubb><font size=4>&lt;c:forEach items="" var="vector"&gt;<br>&lt;c:out value=""/&gt;<br>&lt;/c:forEach&gt;</font></td>
        </tr>
    </tbody>
</table>
<font size=4><br>相当于java语句 </font>
<table class=ubb cellSpacing=0>
    <tbody>
        <tr>
            <td class=ubb><font size=4>for (int i=0;i&lt;vectors.size();i++) {<br>out.println(vectors.get(i));<br>}</font></td>
        </tr>
    </tbody>
</table>
<font size=4><br>在这里vectors是一个java.util.Vector对象，里面存放的是String数据，vector是当前循环条件下String对象。实际上这里的vectors可以是任何实现了java.util. Collection接口的对象。 </font>
<table class=ubb cellSpacing=0>
    <tbody>
        <tr>
            <td class=ubb><font size=4><br>&lt;c:forEach begin="0" end="100" var="i" step="1"&gt;<br>count=&lt;c:out value=""/&gt;&lt;br&gt;<br>&lt;/c:forEach&gt;<br></font></td>
        </tr>
    </tbody>
</table>
<font size=4><br>输出:<br>count=0<br>...<br>count=100<br><br><strong>&lt;c:forTokens&gt;</strong><br>&lt;c:forTokens&gt;标签有以下属性 </font>
<table class=ubb cellSpacing=0>
    <tbody>
        <tr>
            <td class=ubb><font size=4>属 性</font></td>
            <td class=ubb><font size=4>描 述</font></td>
            <td class=ubb><font size=4>是否必须</font></td>
            <td class=ubb><font size=4>缺省值</font></td>
        </tr>
        <tr>
            <td class=ubb><font size=4>items</font></td>
            <td class=ubb><font size=4>进行循环的项目</font></td>
            <td class=ubb><font size=4>是</font></td>
            <td class=ubb><font size=4>无</font></td>
        </tr>
        <tr>
            <td class=ubb><font size=4>delims</font></td>
            <td class=ubb><font size=4>分割符</font></td>
            <td class=ubb><font size=4>是</font></td>
            <td class=ubb><font size=4>无</font></td>
        </tr>
        <tr>
            <td class=ubb><font size=4>begin</font></td>
            <td class=ubb><font size=4>开始条件</font></td>
            <td class=ubb><font size=4>否</font></td>
            <td class=ubb><font size=4>0</font></td>
        </tr>
        <tr>
            <td class=ubb><font size=4>end</font></td>
            <td class=ubb><font size=4>结束条件</font></td>
            <td class=ubb><font size=4>否</font></td>
            <td class=ubb><font size=4>集合中的最后一个项目</font></td>
        </tr>
        <tr>
            <td class=ubb><font size=4>step</font></td>
            <td class=ubb><font size=4>步长</font></td>
            <td class=ubb><font size=4>否</font></td>
            <td class=ubb><font size=4>1</font></td>
        </tr>
        <tr>
            <td class=ubb><font size=4>var</font></td>
            <td class=ubb><font size=4>代表当前项目的变量名</font></td>
            <td class=ubb><font size=4>否</font></td>
            <td class=ubb><font size=4>无</font></td>
        </tr>
        <tr>
            <td class=ubb><font size=4>varStatus</font></td>
            <td class=ubb><font size=4>显示循环状态的变量</font></td>
            <td class=ubb><font size=4>否</font></td>
            <td class=ubb><font size=4>无</font></td>
        </tr>
    </tbody>
</table>
<font size=4><br><br>例子 </font>
<table class=ubb cellSpacing=0>
    <tbody>
        <tr>
            <td class=ubb><font size=4><br>&lt;c:forTokens items="a:b:c:d" delims=":" var="token"&gt;<br>&lt;c:out value=""/&gt;<br>&lt;/c:forTokens&gt;<br></font></td>
        </tr>
    </tbody>
</table>
<font size=4><br>这个标签的使用相当于java.util.StringTokenizer类。在这里将字符串a:b:c:d以：分开循环四次，token是循环到当前分割到的字符串。<br><br><strong>4.导入文件和URL</strong><br><br>JSTL核心标签库支持使用&lt;c:import&gt;来包含文件，使用&lt;c:url&gt;来打印和格式化URL,使用&lt;c:redirect&gt;来重定向URL。<br><br><strong>&lt;c:import&gt;</strong><br>&lt;c:import&gt;标签包含另外一个页面代码到当前页，它有以下属性 </font>
<table class=ubb cellSpacing=0>
    <tbody>
        <tr>
            <td class=ubb><font size=4>属 性</font></td>
            <td class=ubb><font size=4>描 述</font></td>
            <td class=ubb><font size=4>是否必须</font></td>
            <td class=ubb><font size=4>缺省值</font></td>
        </tr>
        <tr>
            <td class=ubb><font size=4>url</font></td>
            <td class=ubb><font size=4>需要导入页面的url</font></td>
            <td class=ubb><font size=4>是</font></td>
            <td class=ubb><font size=4>无</font></td>
        </tr>
        <tr>
            <td class=ubb><font size=4>context</font></td>
            <td class=ubb><font size=4>/后跟本地web应用程序的名字</font></td>
            <td class=ubb><font size=4>否</font></td>
            <td class=ubb><font size=4>当前应用程序</font></td>
        </tr>
        <tr>
            <td class=ubb><font size=4>charEncoding</font></td>
            <td class=ubb><font size=4>用于导入数据的字符集</font></td>
            <td class=ubb><font size=4>否</font></td>
            <td class=ubb><font size=4>ISO-8859-1</font></td>
        </tr>
        <tr>
            <td class=ubb><font size=4>var</font></td>
            <td class=ubb><font size=4>接受导入文本的变量名</font></td>
            <td class=ubb><font size=4>否</font></td>
            <td class=ubb><font size=4>page</font></td>
        </tr>
        <tr>
            <td class=ubb><font size=4>scope</font></td>
            <td class=ubb><font size=4>接受导入文本的变量的变量范围</font></td>
            <td class=ubb><font size=4>否</font></td>
            <td class=ubb><font size=4>1</font></td>
        </tr>
        <tr>
            <td class=ubb><font size=4>varReader</font></td>
            <td class=ubb><font size=4>用于接受导入文本的java.io.Reader变量名</font></td>
            <td class=ubb><font size=4>否</font></td>
            <td class=ubb><font size=4>无</font></td>
        </tr>
        <tr>
            <td class=ubb><font size=4>varStatus</font></td>
            <td class=ubb><font size=4>显示循环状态的变量</font></td>
            <td class=ubb><font size=4>否</font></td>
            <td class=ubb><font size=4>无</font></td>
        </tr>
    </tbody>
</table>
<font size=4><br><br><strong>&lt;c:url&gt;</strong><br>&lt;c:url&gt;标签输出一个url地址，它有以下属性 </font>
<table class=ubb cellSpacing=0>
    <tbody>
        <tr>
            <td class=ubb><font size=4>属 性</font></td>
            <td class=ubb><font size=4>描 述</font></td>
            <td class=ubb><font size=4>是否必须</font></td>
            <td class=ubb><font size=4>缺省值</font></td>
        </tr>
        <tr>
            <td class=ubb><font size=4>url</font></td>
            <td class=ubb><font size=4>url地址</font></td>
            <td class=ubb><font size=4>是</font></td>
            <td class=ubb><font size=4>无</font></td>
        </tr>
        <tr>
            <td class=ubb><font size=4>context</font></td>
            <td class=ubb><font size=4>/后跟本地web应用程序的名字</font></td>
            <td class=ubb><font size=4>否</font></td>
            <td class=ubb><font size=4>当前应用程序</font></td>
        </tr>
        <tr>
            <td class=ubb><font size=4>charEncoding</font></td>
            <td class=ubb><font size=4>用于导入数据的字符集</font></td>
            <td class=ubb><font size=4>否</font></td>
            <td class=ubb><font size=4>ISO-8859-1</font></td>
        </tr>
        <tr>
            <td class=ubb><font size=4>var</font></td>
            <td class=ubb><font size=4>接受处理过的url变量名，该变量存储url</font></td>
            <td class=ubb><font size=4>否</font></td>
            <td class=ubb><font size=4>输出到页</font></td>
        </tr>
        <tr>
            <td class=ubb><font size=4>scope</font></td>
            <td class=ubb><font size=4>存储url的变量名的变量范围</font></td>
            <td class=ubb><font size=4>否</font></td>
            <td class=ubb><font size=4>page</font></td>
        </tr>
    </tbody>
</table>
<font size=4><br><br>例子： </font>
<table class=ubb cellSpacing=0>
    <tbody>
        <tr>
            <td class=ubb><font size=4><br>&lt;c:import url="http://www.url.com/edit.js" var="newsfeed"/&gt;<br></font></td>
        </tr>
    </tbody>
</table>
<font size=4><br>将url http://www.url.com/edit.js包含到当前页的当前位置，并将url保存到newsfeed变量中 </font>
<table class=ubb cellSpacing=0>
    <tbody>
        <tr>
            <td class=ubb><font size=4><br>&lt;a href="&lt;c:url url="/index.jsp"/&gt;"/&gt;<br></font></td>
        </tr>
    </tbody>
</table>
<font size=4><br>在当前页的当前位置输出&lt;a href="http://www.yourname.com/index.jsp"/&gt;，http://www.yourname.com是当前页的所在的位置。<br><br><br><strong>&lt;c:redirect&gt;</strong><br>&lt;c:redirect&gt;标签将请求重新定向到另外一个页面，它有以下属性 </font>
<table class=ubb cellSpacing=0>
    <tbody>
        <tr>
            <td class=ubb><font size=4>属 性</font></td>
            <td class=ubb><font size=4>描 述</font></td>
            <td class=ubb><font size=4>是否必须</font></td>
            <td class=ubb><font size=4>缺省值</font></td>
        </tr>
        <tr>
            <td class=ubb><font size=4>url</font></td>
            <td class=ubb><font size=4>url地址</font></td>
            <td class=ubb><font size=4>是</font></td>
            <td class=ubb><font size=4>无</font></td>
        </tr>
        <tr>
            <td class=ubb><font size=4>context</font></td>
            <td class=ubb><font size=4>/后跟本地web应用程序的名字</font></td>
            <td class=ubb><font size=4>否</font></td>
            <td class=ubb><font size=4>当前应用程序</font></td>
        </tr>
    </tbody>
</table>
<font size=4><br>例子： </font>
<table class=ubb cellSpacing=0>
    <tbody>
        <tr>
            <td class=ubb><font size=4><br>&lt;c:redirect url="http://www.yourname.com/login.jsp"/&gt;<br></font></td>
        </tr>
    </tbody>
</table>
<font size=4><br>将请求重新定向到http://www.yourname.com/login.jsp页，相当于response.setRedirect("http://www.yourname.com/login.jsp");<br><br><strong>&lt;c:param&gt;</strong><br>&lt;c:param&gt;标签用来传递参数给一个重定向或包含页面，它有以下属性 </font>
<table class=ubb cellSpacing=0>
    <tbody>
        <tr>
            <td class=ubb><font size=4>属 性</font></td>
            <td class=ubb><font size=4>描 述</font></td>
            <td class=ubb><font size=4>是否必须</font></td>
            <td class=ubb><font size=4>缺省值</font></td>
        </tr>
        <tr>
            <td class=ubb><font size=4>name</font></td>
            <td class=ubb><font size=4>在request参数中设置的变量名</font></td>
            <td class=ubb><font size=4>是</font></td>
            <td class=ubb><font size=4>无</font></td>
        </tr>
        <tr>
            <td class=ubb><font size=4>value</font></td>
            <td class=ubb><font size=4>在request参数中设置的变量值</font></td>
            <td class=ubb><font size=4>否</font></td>
            <td class=ubb><font size=4>无</font></td>
        </tr>
    </tbody>
</table>
<font size=4><br>例子： </font>
<table class=ubb cellSpacing=0>
    <tbody>
        <tr>
            <td class=ubb><font size=4><br>&lt;c:redirect url="login.jsp"&gt;<br>&lt;c:param name="id" value="888"/&gt;<br>&lt;/c:redirect&gt;<br></font></td>
        </tr>
    </tbody>
</table>
<font size=4><br>将参数888以id为名字传递到login.jsp页面，相当于login.jsp?id=888<br><br><br><strong>JSTL的优点</strong><br>1、 在应用程序服务器之间提供了一致的接口，最大程序地提高了WEB应用在各应用服务器之间的移植。<br>2、 简化了JSP和WEB应用程序的开发。<br>3、 以一种统一的方式减少了JSP中的scriptlet代码数量，可以达到没有任何scriptlet代码的程序。在我们公司的项目中是不允许有任何的scriptlet代码出现在JSP中。<br>4、 允许JSP设计工具与WEB应用程序开发的进一步集成。相信不久就会有支持JSTL的IDE开发工具出现。<br><br><strong>总结</strong><br>上面介绍的仅仅是JSTL的一部分，如果要使用JSTL，则必须将jstl.jar和 standard.jar文件放到classpath中，如果你还需要使用XML processing及Database access (SQL)标签，还要将相关JAR文件放到classpath中，这些JAR文件全部存在于下载回来的zip文件中。这个zip文件可以从<a href="http://jakarta.apache.org/builds/jakarta-taglibs/releases/standard/jakarta-taglibs-standard-1.0.zip" target=_blank>http://jakarta.apache.org/builds/jakarta-taglibs/releases/standard/jakarta-taglibs-standard-1.0.zip</a>下载。<br><br><strong>参考资料</strong><br>1、 <a href="http://java.sun.com/products/jsp/jstl/" target=_blank>http://java.sun.com/products/jsp/jstl/</a><br>sun公司的JSTL站点<br>2、 <a href="http://jakarta.apache.org/taglibs/doc/standard-doc/intro.html" target=_blank>http://jakarta.apache.org/taglibs/doc/standard-doc/intro.html</a><br>jakarta小组的JSTL站点<br>3、 <a href="http://www.manning.com/bayern/appendixA.pdf" target=_blank>http://www.manning.com/bayern/appendixA.pdf</a><br>JSTL的参考文档，本文很多内容都是从这个PDF文件里翻译的。<br>4、 ＜＜J2EE编程指南（1.3版）＞＞<br>介绍了JSTL的雏形，wrox的书都是精品。</font>
<img src ="http://www.blogjava.net/hilor/aggbug/137258.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/hilor/" target="_blank">hilor</a> 2007-08-16 14:45 <a href="http://www.blogjava.net/hilor/articles/137258.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>在Tomcat中安装JSTL并测试</title><link>http://www.blogjava.net/hilor/articles/137196.html</link><dc:creator>hilor</dc:creator><author>hilor</author><pubDate>Thu, 16 Aug 2007 05:02:00 GMT</pubDate><guid>http://www.blogjava.net/hilor/articles/137196.html</guid><wfw:comment>http://www.blogjava.net/hilor/comments/137196.html</wfw:comment><comments>http://www.blogjava.net/hilor/articles/137196.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/hilor/comments/commentRss/137196.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/hilor/services/trackbacks/137196.html</trackback:ping><description><![CDATA[<p>前提&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp; tomcat已经配置好(tomcat可以到<a href="http://jakarta.apache.org/tomcat"><u><font color=#0000ff>http://jakarta.apache.org/tomcat</font></u></a> 下载)<br>开始实战啦<br><strong>1.准备jstl<br></strong>&nbsp;&nbsp; 到<a href="http://apache.towardex.com/jakarta/taglibs/standard/"><u><font color=#0000ff>http://apache.towardex.com/jakarta/taglibs/standard/</font></u></a>下载jakarta-taglibs-standard-current.zip<br>解压后成为jakarta-taglibs-standard-1.1.1</p>
<p><strong>2.准备web开发目录<br></strong>&nbsp;&nbsp; 比如我的web目录为h:\webapp\myweb\(当然可以把你的web应用放在%tomcat_home%\webapps\)，称为工作目录Working folder,在工作目录h:\webapp\myweb\下建立WEB-INF\lib,WEB-INF\classes</p>
<p><strong>3.拷贝.jar文件<br></strong>&nbsp;&nbsp; 将jakarta-taglibs-standard-1.1.1\lib\下的两个jar文件：standard.jar和jstl.jar文件拷贝到\WEB-INF\lib\下</p>
<p><strong>4.拷贝.tld文件<br></strong>&nbsp;将jakarta-taglibs-standard-1.1.1\tld\下的8个tld类型文件拷到"Working folder\WEB-INF\"下</p>
<p><strong>5.在\WEB-INF\下建立web.xml文件：<br></strong>&nbsp;<font color=#000080> &lt;?xml version="1.0" encoding="ISO-8859-1"?&gt;</font></p>
<p><font color=#000080>&lt;web-app xmlns="</font><a href="http://java.sun.com/xml/ns/j2ee"><font color=#000080><u>http://java.sun.com/xml/ns/j2ee</u></font></a><font color=#000080>"<br>&nbsp;&nbsp;&nbsp; xmlns:xsi="</font><a href="http://www.w3.org/2001/XMLSchema-instance"><font color=#000080><u>http://www.w3.org/2001/XMLSchema-instance</u></font></a><font color=#000080>"<br>&nbsp;&nbsp;&nbsp; xsi:schemaLocation="</font><a href="http://java.sun.com/xml/ns/j2ee"><font color=#000080><u>http://java.sun.com/xml/ns/j2ee</u></font></a><font color=#000080> </font><a href="http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"><font color=#000080><u>http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd</u></font></a><font color=#000080>"<br>&nbsp;&nbsp;&nbsp; version="2.4"&gt;<br>&nbsp;<br>&nbsp; &lt;taglib&gt;<br>&nbsp;&nbsp;&nbsp; &lt;taglib-uri&gt;http://java.sun.com/jstl/fmt&lt;/taglib-uri&gt;<br>&nbsp;&nbsp;&nbsp; &lt;taglib-location&gt;/WEB-INF/fmt.tld&lt;/taglib-location&gt;<br>&lt;/taglib&gt;</font></p>
<p><font color=#000080>&lt;taglib&gt;<br>&nbsp;&nbsp;&nbsp; &lt;taglib-uri&gt;http://java.sun.com/jstl/fmt-rt&lt;/taglib-uri&gt;<br>&nbsp;&nbsp;&nbsp; &lt;taglib-location&gt;/WEB-INF/fmt-rt.tld&lt;/taglib-location&gt;<br>&lt;/taglib&gt;</font></p>
<p><font color=#000080>&lt;taglib&gt;<br>&nbsp;&nbsp;&nbsp; &lt;taglib-uri&gt;http://java.sun.com/jstl/core&lt;/taglib-uri&gt;<br>&nbsp;&nbsp;&nbsp; &lt;taglib-location&gt;/WEB-INF/c.tld&lt;/taglib-location&gt;<br>&lt;/taglib&gt;</font></p>
<p><font color=#000080>&lt;taglib&gt;<br>&nbsp;&nbsp;&nbsp; &lt;taglib-uri&gt;http://java.sun.com/jstl/core-rt&lt;/taglib-uri&gt;<br>&nbsp;&nbsp;&nbsp; &lt;taglib-location&gt;/WEB-INF/c-rt.tld&lt;/taglib-location&gt;<br>&lt;/taglib&gt;</font></p>
<p><font color=#000080>&lt;taglib&gt;<br>&nbsp;&nbsp;&nbsp; &lt;taglib-uri&gt;http://java.sun.com/jstl/sql&lt;/taglib-uri&gt;<br>&nbsp;&nbsp;&nbsp; &lt;taglib-location&gt;/WEB-INF/sql.tld&lt;/taglib-location&gt;<br>&lt;/taglib&gt;</font></p>
<p><font color=#000080>&lt;taglib&gt;<br>&nbsp;&nbsp;&nbsp; &lt;taglib-uri&gt;http://java.sun.com/jstl/sql-rt&lt;/taglib-uri&gt;<br>&nbsp;&nbsp;&nbsp; &lt;taglib-location&gt;/WEB-INF/sql-rt.tld&lt;/taglib-location&gt;<br>&lt;/taglib&gt;</font></p>
<p><font color=#000080>&lt;taglib&gt;<br>&nbsp;&nbsp;&nbsp; &lt;taglib-uri&gt;http://java.sun.com/jstl/x&lt;/taglib-uri&gt;<br>&nbsp;&nbsp;&nbsp; &lt;taglib-location&gt;/WEB-INF/x.tld&lt;/taglib-location&gt;<br>&lt;/taglib&gt;</font></p>
<p><font color=#000080>&lt;taglib&gt;<br>&nbsp;&nbsp;&nbsp; &lt;taglib-uri&gt;http://java.sun.com/jstl/x-rt&lt;/taglib-uri&gt;<br>&nbsp;&nbsp;&nbsp; &lt;taglib-location&gt;/WEB-INF/x-rt.tld&lt;/taglib-location&gt;<br>&lt;/taglib&gt;</font><br><font color=#000080>&lt;/web-app&gt;<br></font><strong>6.建立一个名为test.jsp文件</strong><br><font color=#000080>&lt;!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"&gt;<br>&lt;%@ page contentType="text/html;charset=GB2312" %&gt;<br>&lt;%@ taglib prefix="c" uri="</font><a href='http://java.sun.com/jsp/jstl/core"%' href_cetemp='http://java.sun.com/jsp/jstl/core"%'><font color=#000080><u>http://java.sun.com/jsp/jstl/core"%</u></font></a><font color=#000080>&gt;<br>&lt;html&gt;<br>&lt;head&gt;<br>&lt;title&gt;测试你的第一个使用到JSTL 的网页&lt;/title&gt;<br>&lt;/head&gt;<br>&lt;body&gt;<br>&lt;c:out value="欢迎测试你的第一个使用到JSTL 的网页"/&gt;<br>&lt;/br&gt;你使用的浏览器是：&lt;/br&gt;<br>&lt;c:out value="${header['User-Agent']}"/&gt;<br>&lt;c:set var="a" value="David O'Davies" /&gt;<br>&lt;c:out value="David O'Davies" escapeXml="true"/&gt;<br>&lt;/body&gt;<br>&lt;/html&gt;</font></p>
<p><strong>7.开启tomcat,进行调试，我的输出结果是</strong></p>
<p><font color=#000080>欢迎测试你的第一个使用到JSTL 的网页 <br>你使用的浏览器是：<br>Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0) David O'Davies</font> <br><br>注：如果你的tld文件个数为15个，在上面的web.xml中<font color=#000080>&lt;taglib-location&gt;中更改。<br><br></font>=======================================<br>相关文件,不但要知道它是用来干什么的(what),还要知道把它放在那里(where).相关文件放到哪里,如何进行注册与配置对与jstl,JNDI,servlet,javabeans. </p>
<p>WEB-INF\:包含
<p>\lib目录<br>web.xml配置描述符文件<br>\classes目录<br>8个tld文件WEB-INF\lib\:所有的jar包文件,包括standard.jar和jstl.jarWEB-INF\classes\:Servlet和JavaBeans文件编译后类文件<br>=======================================<br><br>备注:<br>1: 如果没有配置web.xml的话就要使用 &lt;%@ taglib prefix="c" uri="http://java.sun.com/jstl/core" %&gt; .其中这个tld是在 standard.jar找到的..<br>而配置了web.xml就要把tld文件也放到WEB-INF/目录下指定了<br>2: 其实不升级1.1的jar包也是可以的,只要把&lt;%@ taglib uri="http://java.sun.com/jstl/core" prefix='c'%&gt;改成&lt;%@ taglib uri="http://java.sun.com/jstl/core_rt" prefix='c'%&gt; 注意core和core_rt的变动 就OK了.&nbsp; 大家使用前请看好版本</p>
3: &lt;%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix='c'%&gt;和&lt;%@ taglib uri="http://java.sun.com/jstl/core" prefix='c'%&gt;, 前者是新版本使用的,&nbsp; 后者是老版本使用的,经测试后者可以在新版本中使用
<img src ="http://www.blogjava.net/hilor/aggbug/137196.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/hilor/" target="_blank">hilor</a> 2007-08-16 13:02 <a href="http://www.blogjava.net/hilor/articles/137196.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>BLOB完全实践：在Oracle中存取BLOB对象实现文件的上传和下载</title><link>http://www.blogjava.net/hilor/articles/137035.html</link><dc:creator>hilor</dc:creator><author>hilor</author><pubDate>Wed, 15 Aug 2007 12:49:00 GMT</pubDate><guid>http://www.blogjava.net/hilor/articles/137035.html</guid><wfw:comment>http://www.blogjava.net/hilor/comments/137035.html</wfw:comment><comments>http://www.blogjava.net/hilor/articles/137035.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/hilor/comments/commentRss/137035.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/hilor/services/trackbacks/137035.html</trackback:ping><description><![CDATA[<div class=t_msgfont id=message594292 style="FONT-SIZE: 14px">最近做一个J2EE项目，需要在JSP页面实现对文件的上传和下载。很早以前就知道JDBC支持大对象（LOB）的存取，以为很容易，做起来才发现问题多多，读了一大堆文章，反而没有什么头绪了。正如一位网友文章所讲：&#8220;&#8230;网络上的教程99%都是行不通的，连SUN自己的文档都一直错误&#8230;&#8230;&#8221;，实际情况大致如此了。 <br>存取BLOB出现这么多问题，我认为大半是由数据库开发商、应用服务器商在JDBC驱动上的不兼容性带来的。而实际应用中，每个人的开发运行环境不同，使得某个网友的solution没有办法在别人的应用中重现，以至于骂声一片。至于为什么会不兼容、有哪些问题，我没有时间去弄清，这里只说说我们怎样解决了问题的。 <br>基于上述原因，先列出我们的开发环境，免得有人配不出来，招人唾骂。 <br>数据库 Oracle 9i <br>应用服务器 BEA Weblogic 8.11 <br>开发工具 JBuilder X <br>在JSP实现文件Upload/Download可以分成这样几块：文件提交到形成InputSteam；InputSteam以BLOB格式入库；数据从库中读出为InputSteam；InputStream输出到页面形成下载文件。先说BLOB吧。 <br>1． BLOB入库 <br>（1） 直接获得数据库连接的情况 <br>这是Oracle提供的标准方式，先插入一个空BLOB对象，然后Update这个空对象。代码如下： <br>//得到数据库连接（驱动包是weblogic的，没有下载任何新版本） <br>Class.forName("oracle.jdbc.driver.OracleDriver"); <br>Connection con = DriverManager.getConnection( <br>"jdbc:oracle:thin:@localhost:1521:testdb", "test", "test"); <br>//处理事务 <br>con.setAutoCommit(false); <br>Statement st = con.createStatement(); <br>//插入一个空对象 <br>st.executeUpdate("insert into BLOBIMG values(103,empty_blob())"); <br>//用for update方式锁定数据行 <br>ResultSet rs = st.executeQuery( <br>"select contents from BLOBIMG where id=103 for update"); <br>if (rs.next()) { <br>//得到java.sql.Blob对象，然后Cast为oracle.sql.BLOB <br>oracle.sql.BLOB blob = (oracle.sql.BLOB) rs.getBlob(1).; <br>//到数据库的输出流 <br>OutputStream outStream = blob.getBinaryOutputStream(); <br>//这里用一个文件模拟输入流 <br>File file = new File("d:\\proxy.txt"); <br>InputStream fin = new FileInputStream(file); <br>//将输入流写到输出流 <br>byte[] b = new byte[blob.getBufferSize()]; <br>int len = 0; <br>while ( (len = fin.read(b)) != -1) { <br>outStream.write(b, 0, len); <br>//blob.putBytes(1,b); <br>} <br>//依次关闭（注意顺序） <br>fin.close(); <br>outStream.flush(); <br>outStream.close(); <br>con.commit(); <br>con.close(); <br>（2） 通过JNDI获得数据库连接 <br>在Weblogic中配置到Oracle的JDBC Connection Pool和DataSource，绑定到Context中，假定绑定名为&#8221;orads&#8221;。 <br>为了得到数据库连接，做一个连接工厂，主要代码如下： <br>Context context = new InitialContext(); <br>ds = (DataSource) context.lookup("orads"); <br>return ds.getConnection(); <br>以下是BLOB写入数据库的代码： <br>Connection con = ConnectionFactory.getConnection(); <br>con.setAutoCommit(false); <br>Statement st = con.createStatement(); <br>st.executeUpdate("insert into BLOBIMG values(103,empty_blob())"); <br>ResultSet rs = st.executeQuery( <br>"select contents from BLOBIMG where id=103 for update"); <br>if (rs.next()) { <br>//上面代码不变 <br>//这里不能用oracle.sql.BLOB，会报ClassCast 异常 <br>weblogic.jdbc.vendor.oracle.OracleThinBlobblob = (weblogic.jdbc.vendor.oracle.OracleThinBlob) rs.getBlob(1); <br>//以后代码也不变 <br>OutputStream outStream = blob.getBinaryOutputStream(); <br>File file = new File("d:\\proxy.txt"); <br>InputStream fin = new FileInputStream(file); <br>byte[] b = new byte[blob.getBufferSize()]; <br>int len = 0; <br>while ( (len = fin.read(b)) != -1) { <br>outStream.write(b, 0, len); <br>} <br>fin.close(); <br>outStream.flush(); <br>outStream.close(); <br>con.commit(); <br>con.close(); <br>2． BLOB出库 <br>从数据库中读出BLOB数据没有上述由于连接池的不同带来的差异，只需要J2SE的标准类java.sql.Blob就可以取得输出流（注意区别java.sql.Blob和oracle.sql.BLOB）。代码如下： <br>Connection con = ConnectionFactory.getConnection(); <br>con.setAutoCommit(false); <br>Statement st = con.createStatement(); <br>//这里的SQL语句不再需要&#8221;for update&#8221; <br>ResultSet rs = st.executeQuery( <br>"select contents from BLOBIMG where id=103 "); <br>if (rs.next()) { <br>java.sql.Blob blob = rs.getBlob(1); <br>InputStream ins = blob.getBinaryStream(); <br>//用文件模拟输出流 <br>File file = new File("d:\\output.txt"); <br>OutputStream fout = new FileOutputStream(file); <br>//下面将BLOB数据写入文件 <br>byte[] b = new byte[1024]; <br>int len = 0; <br>while ( (len = ins.read(b)) != -1) { <br>fout.write(b, 0, len); <br>} <br>//依次关闭 <br>fout.close(); <br>ins.close(); <br>con.commit(); <br>con.close(); <br>3． 从JSP页面提交文件到数据库 <br>（1） 提交页面的代码如下： <br>&lt;form action="handle.jsp" enctype="multipart/form-data" method="post" &gt; <br>&lt;input type="hidden" name="id" value="103"/&gt; <br>&lt;input type="file" name="fileToUpload"&gt; <br>&lt;input type="submit" value="Upload"&gt; <br>&lt;/form&gt; <br>（2） 由于JSP没有提供文件上传的处理能力，只有使用第三方的开发包。网络上开源的包有很多，我们这里选择Apache Jakarta的FileUpload，在 <a href="http://jakarta.apache.org/commons/fileupload/index.html" target=_blank><font color=#0000ff><u>http://jakarta.apache.org/commons/fileupload/index.html </u></font></a>可以得到下载包和完整的API文档。法奥为adajspException <br>处理页面（handle.jsp）的代码如下 <br>&lt;% <br>boolean isMultipart = FileUpload.isMultipartContent(request); <br>if (isMultipart) { <br>// 建立一个新的Upload对象 <br>DiskFileUpload upload = new DiskFileUpload(); <br>// 设置上载文件的参数 <br>//upload.setSizeThreshold(yourMaxMemorySize); <br>//upload.setSizeMax(yourMaxRequestSize); <br>String rootPath = getServletConfig().getServletContext().getRealPath("/") ; <br>upload.setRepositoryPath(rootPath+"\\uploads"); <br>// 分析request中的传来的文件流，返回Item的集合， <br>// 轮询Items，如果不是表单域，就是一个文件对象。 <br>List items = upload.parseRequest(request); <br>Iterator iter = items.iterator(); <br>while (iter.hasNext()) { <br>FileItem item = (FileItem) iter.next(); <br>//如果是文件对象 <br>if (!item.isFormField()) { <br>//如果是文本文件，可以直接显示 <br>//out.println(item.getString()); <br>//将上载的文件写到服务器的\WEB-INF\webstart\下，文件名为test.txt <br>//File uploadedFile = new File(rootPath+"\\uploads\\test.txt"); <br>//item.write(uploadedFile); <br>//下面的代码是将文件入库（略）： <br>//注意输入流的获取 <br>&#8230; <br>InputStream uploadedStream = item.getInputStream(); <br>&#8230; <br>} <br>//否则是普通表单 <br>else{ <br>out.println("FieldName: " + item.getFieldName()+"&lt;br&gt;"); <br>out.println("Value: "+item.getString()+"&lt;br&gt;"); } <br>} <br>} <br>%&gt; <br>4． 从数据库读取BLOB然后保存到客户端磁盘上 <br>这段代码有点诡异，执行后将会弹出文件保存对话窗口，将BLOB数据读出保存到本地文件。全文列出如下： <br>&lt;%@ page c import="java.io.*" import="java.sql.*" import="test.global.ConnectionFactory"%&gt;&lt;% <br>Connection con = ConnectionFactory.getConnection(); <br>con.setAutoCommit(false); <br>Statement st = con.createStatement(); <br>ResultSet rs = st.executeQuery( <br>"select contents from BLOBIMG where id=103 "); <br>if (rs.next()) { <br>Blob blob = rs.getBlob(1); <br>InputStream ins = blob.getBinaryStream(); <br>response.setContentType("application/unknown"); <br>response.addHeader("Content-Disposition", "attachment; filename="+"output.txt"); <br>OutputStream outStream = response.getOutputStream(); <br>byte[] bytes = new byte[1024]; <br>int len = 0; <br>while ((len=ins.read(bytes))!=-1) { <br>outStream.write(bytes,0,len); <br>} <br>ins.close(); <br>outStream.close(); <br>outStream = null; <br>con.commit(); <br>con.close(); <br>} <br>%&gt; <br>注意，在&lt;% &#8230; &#8230; %&gt;之外，绝对不能有任何字符，空格或回车都不行，不然会导致outputStream出错，对非ASCII输出文件来说就是格式错误不可读。 <br>5． 最后一个问题就是把以BLOB形式存放的图像文件直接显示到JSP页面上 <br>解决办法是：首先将图像文件从数据库中读出形成InputStream，然后用Servlet写到页面输出流上。最后，将这个servlet包含到JSP页面适当的图像位置上。 <br>Servlet代码如下： <br>public void doGet(HttpServletRequest request, HttpServletResponse response) throws <br>ServletException, IOException { <br>int id = Integer.parseInt(request.getParameter("id")); <br>try { <br>Connection con = ConnectionFactory.getConnection(); <br>con.setAutoCommit(false); <br>String sql = "select contents from BLOBIMG where id= ? "; <br>PreparedStatement psmt = con.prepareStatement(sql); <br>psmt.setInt(1, id); <br>ResultSet rs = psmt.executeQuery(); <br>if (rs.next()) { <br>Blob bb = rs.getBlob(1); <br>InputStream ins = bb.getBinaryStream(); <br>response.setContentType("image/gif"); <br>OutputStream outStream = response.getOutputStream(); <br>byte[] bytes = new byte[1024]; <br>int len = 0; <br>while ( (len = ins.read(bytes)) != -1) { <br>outStream.write(bytes, 0, len); <br>} <br>ins.close(); <br>outStream.close(); <br>outStream = null; <br>con.commit(); <br>con.close(); <br>} <br>} <br>catch (Exception ex) {} <br>} <br>JSP代码如下： <br>&lt;img src="showimgae?id=110"&gt; <br>注意在web.xml中配置好Servlet Mapping。 <br>这样，BLOB在JSP中的基本应用就完整了。 <br>本文参考了大量网友文章，特此表示感谢。 <br>1． 通过JDBC操纵Oracle数据库LOB字段的几种情况分析 <a href="http://dev.csdn.net/develop/article/26/26786.shtm" target=_blank><font color=#0000ff><u>http://dev.csdn.net/develop/article/26/26786.shtm </u></font></a><br>2． 关于将文件用java.sql.Blob类型的blob操作写入oracle数据库中的blob <a href="http://community.csdn.net/Expert/FAQ/FAQ_Index.asp?id=197116" target=_blank><font color=#0000ff><u>http://community.csdn.net/Expert/FAQ/FAQ_Index.asp?id=197116 </u></font></a><br>3． weblogic7可以操作Oracle9i的大字段,Weblogic8为什么不可以? <a href="http://dev2dev.bea.com.cn/bbs/thread.jspa?forumID=123&amp;threadID=5390&amp;messageID=23598" target=_blank><font color=#0000ff><u>http://dev2dev.bea.com.cn/bbs/thread.jspa?forumID=123&amp;threadID=5390&amp;messageID=23598 </u></font></a><br>4． How to show file download dialog box in IE 6.0 <a href="http://www.experts-exchange.com/Web/Web_Languages/JSP/Q_20842012.html" target=_blank><font color=#0000ff><u>http://www.experts-exchange.com/Web/Web_Languages/JSP/Q_20842012.html </u></font></a><br>5． SQL SERVER 2000中的JPEG图片在Jsp上显示乱码问题 <a href="http://search.csdn.net/Expert/topic/2462/2462925.xml?temp=3.071231E-02" target=_blank><font color=#0000ff><u>http://search.csdn.net/Expert/topic/2462/2462925.xml?temp=3.071231E-02 </u></font></a></div>
<img src ="http://www.blogjava.net/hilor/aggbug/137035.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/hilor/" target="_blank">hilor</a> 2007-08-15 20:49 <a href="http://www.blogjava.net/hilor/articles/137035.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>JSP学习总结</title><link>http://www.blogjava.net/hilor/articles/137031.html</link><dc:creator>hilor</dc:creator><author>hilor</author><pubDate>Wed, 15 Aug 2007 12:34:00 GMT</pubDate><guid>http://www.blogjava.net/hilor/articles/137031.html</guid><wfw:comment>http://www.blogjava.net/hilor/comments/137031.html</wfw:comment><comments>http://www.blogjava.net/hilor/articles/137031.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/hilor/comments/commentRss/137031.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/hilor/services/trackbacks/137031.html</trackback:ping><description><![CDATA[<div class=t_msgfont id=message594289 style="FONT-SIZE: 14px">说明：以下所描述的环境是jdk1.5、tomcat5.5、 jsp2.0、 servlet2.4、JSTL1.1.2 <br>一、基本配置 <br>基本的重要的配置在web.xml 文件中。 <br><br>1、Jsp属性组 <br>&lt;jsp-property-group&gt; <br>&lt;url-pattern&gt;/pages/*&lt;/url-pattern&gt; <br>&lt;el-ignore&gt;true&lt;/el-ignore&gt; <br>&lt;page-encoding&gt;UTF-8&lt;/page-encoding&gt; <br>&lt;include-prelude&gt;/include/header.jspf&lt;/include-prelude&gt; <br>&lt;include-coda&gt;/include/copyright.jspf&lt;/include-coda&gt; <br>&lt;/jsp-property-group&gt; <br>这个设置可以指定页面编码，页头页脚等等。 <br>设置 &lt;page-encoding&gt;UTF-8&lt;/page-encoding&gt; 的好处是不用在每个页面像这样指定编码：&lt;%@page c %&gt; <br>而设置 &lt;include-prelude&gt;/include/header.jspf&lt;/include-prelude&gt; 使得每个页面都在头部包含header.jspf文件（通常把对标签的包含放在这里）。 <br><br>2、数据库资源的引用 <br>&lt;resource-ref&gt; <br>&lt;description&gt;CourseDesign JDNI datasource&lt;/description&gt; <br>&lt;res-ref-name&gt;jdbc/test&lt;/res-ref-name&gt; <br>&lt;res-type&gt;javax.sql.DataSource&lt;/res-type&gt; <br>&lt;res-auth&gt;Container&lt;/res-auth&gt; <br>&lt;/resource-ref&gt; <br>前提是要在TOMCAT的中配置 <br>&lt;Context path="/Course" docBase="Course" debug="0" crossc reloadable="true"&gt; <br>&lt;Resource name="jdbc/test" auth="Container" type="javax.sql.DataSource" <br>maxActive="100" maxIdle="30" maxWait="10000" <br>username="root" password="123456" <br>driverClassName="com.mysql.jdbc.Driver" <br>url="jdbc:mysql://localhost:3306/databaseName?useUnicode=true&amp;characterEncoding=UTF-8" /&gt; <br>&lt;/Context&gt; <br>在程序中可以这样获取连接 <br>public static Connection getConnection() <br>...{ <br>Connection conn=null; <br>try <br>...{ <br>Context initContext = new InitialContext(); <br>Context envContext = (Context)initContext.lookup("java:/comp/env"); <br>DataSource ds = (DataSource)envContext.lookup("jdbc/test"); <br>conn = ds.getConnection(); <br>}catch(Exception e)...{ } <br>return conn; <br>} <br>3、过滤器 <br>一般来说，字符编码的处理，我们会写一个过滤器。这个过滤器的JAVA类在TOMCAT的例子中有提供，可以按需来更改再拿来用。只要在配置文件中设置： <br>&lt;filter-name&gt;setCharacterEncoding&lt;/filter-name&gt; <br>&lt;filter-class&gt;powerwind.filter.SetCharacterEncodingFilter&lt;/filter-class&gt; <br>&lt;init-param&gt; <br>&lt;param-name&gt;encoding&lt;/param-name&gt; <br>&lt;param-value&gt;UTF-8&lt;/param-value&gt; <br>&lt;/init-param&gt; <br>&lt;/filter&gt; <br><br>&lt;filter-mapping&gt; <br>&lt;filter-name&gt;setCharacterEncoding&lt;/filter-name&gt; <br>&lt;url-pattern&gt;/pages/*&lt;/url-pattern&gt; <br>&lt;/filter-mapping&gt; <br>4、标签的URI <br>JSTL是个东西，里面提供了很好用的标签（Tag），但也不一定满足我们的要求，就自己写标签了。把 *.tld 文件直接放到WEB-INF下，在自己定义的tld文件中加上&lt;uri&gt;元素，如：&lt;uri&gt; <a href="http://powerwind/course%3C/uri%3E" target=_blank><font color=#0000ff><u>http://powerwind/course&lt;/uri&gt; </u></font></a>。 <br><br>5、日志 <br>只用过log4j这个日志包。首先是配置文件 log4j.properties （比较完整的配置，应根据情况选择）： <br>log4j.rootLogger = DEBUG,INFO, A1, A2,A3 <br>log4j.appender.A1 = org.apache.log4j.ConsoleAppender <br>log4j.appender.A1.layout = org.apache.log4j.PatternLayout <br>log4j.appender.A1.layout.ConversionPattern = %4p [%t] (%F:%L) - %m%n <br><br>log4j.appender.A2 = org.apache.log4j.RollingFileAppender <br>log4j.appender.A2.File =../../log/test.log <br>log4j.appender.A2.MaxFileSize = 1KB <br>log4j.appender.A2.MaxBackupIndex = 3 <br>log4j.appender.A2.layout = org.apache.log4j.PatternLayout <br>log4j.appender.A2.layout.ConversionPattern = %d{yyyy-MM-dd hh:mm:ss}:%p %t %c - %m%n <br><br>log4j.appender.A3=org.apache.log4j.jdbc.JDBCAppender <br>log4j.appender.A3.URL= jdbc:mysql://localhost:3306/log4jTest <br>log4j.appender.A3.driver= com.mysql.jdbc.Driver <br>log4j.appender.A3.user= root <br>log4j.appender.A3.password= 123456 <br>log4j.appender.A3.layout = org.apache.log4j.PatternLayout <br>log4j.appender.A3.layout.ConversionPattern = INSERT INTO log4j (createDate, thread, level, class, message) values('%d', '%t', '%-5p', '%c', '%m') <br>接着写个Servlet来加载log4j： <br><br>package powerwind.servlet; <br><br>import org.apache.log4j.Logger; <br>import org.apache.log4j.PropertyConfigurator; <br><br>import javax.servlet.*; <br>import javax.servlet.http.*; <br><br>public class Log4jInit extends HttpServlet { <br>public void init(ServletConfig config) throws ServletException { <br>super.init(config); <br>String prefix = getServletContext().getRealPath("/"); <br>String file = getInitParameter("log4j"); <br>System.out.println("init log4j..."); <br>if (file != null){ <br>PropertyConfigurator.configure(prefix+file); <br>}else <br>{ <br>PropertyConfigurator.configure(prefix+"log4j.properties"); <br>} <br>} <br>} <br>然后同时要在web.xml下配置： <br><br>&lt;servlet&gt; <br>&lt;servlet-name&gt;log4jInit&lt;/servlet-name&gt; <br>&lt;servlet-class&gt;powerwind.servlet.Log4jInit&lt;/servlet-class&gt; <br>&lt;init-param&gt; <br>&lt;param-name&gt;log4j&lt;/param-name&gt; <br>&lt;param-value&gt;WEB-INF/classes/log4j.properties&lt;/param-value&gt; <br>&lt;/init-param&gt; <br>&lt;load-on-startup&gt;1&lt;/load-on-startup&gt; <br>&lt;/servlet&gt; <br>6、国际化 <br><br>#test_zh_CN.properties <br>#login page <br>login.title=登录页面 <br>小型的应用中，我们并不常需要国际化。但是，如果网站要中文版和英文版的话，这个就不错啦。使用时很简单，把资源test_zh_CN.properties文件放到classes目录下，然后用JSTL的fmt标签调用。 <br>&lt;fmt:setLocale value="zh_CN" scope=&#8221;session&#8221; /&gt; <br>&lt;fmt:setBundle basename="test" scope=&#8221;session&#8221; var=&#8221;hehe&#8221; /&gt; <br>&lt;fmt:message key="login.title" bundle=&#8221;${hehe}&#8221; scope=&#8221;session&#8221; /&gt; <br>其中var和scope属性不是必需的。三者结合，就可以实现国际化了。 <br><br>二、极限与安全 <br>资源放在WEB-INF下是安全的，因为这个目录对于客户端是不存在的。权限控制并不是仅仅这样就可以了。如果只是简单地判断用户是否登录，可用一个过滤器检查Session对象即可。若需要级别控制的话，就在Session中保存级别信息，然后加以判断。 <br>一般把权限的控制做成一个标签（tag）。如： <br>public int doEndTag() throws JspException { <br>HttpSession session = pageContext.getSession(); <br>if ((session != null) &amp;&amp; (session.getAttribute("user") != null)) { <br>String t = ((UserBean) session.getAttribute("user")).getType(); <br>if (t == null || role == null) { <br>invalid(); <br>return (SKIP_PAGE); <br>} <br>String[] roles = role.split(delimiter); <br>for (int i = 0; i &lt; roles.length; i++) { <br>if (roles<em>.equalsIgnoreCase(role)) <br></em>return (EVAL_PAGE); <br>} <br>} else { <br>invalid(); <br>return (SKIP_PAGE); <br>} <br>return (EVAL_PAGE); <br>} <br>三、上传与下载 <br><br>上传的话，一般使用已有的组件，如commons-fileupload 或者欧莱礼的cos （可能会遇到中文编码的问题）。而下载，比较简单，就自己写了个Servlet。 <br>public void handleRequest(HttpServletRequest request, <br>HttpServletResponse response) throws IOException, ServletException { <br>String name = request.getParameter("name"); <br>String type = request.getParameter("type"); <br>String dir = request.getParameter("dir"); <br>if (name == null || name.length() &lt; 2 || dir == null || dir.length() &lt; 1 || type == null || type.length() &lt; 1) { <br>throw new ServletException("Sorry,error occured"); <br>} <br>char ch = dir.charAt(dir.length() - 1); <br>if (ch != '/' || ch != '\') <br>dir = dir + "/"; <br>ServletOutputStream os = null; <br>BufferedInputStream bis = null; <br>try { <br>File file = new File(dir + name); <br>if (!file.exists() || file.length() &gt;= Integer.MAX_VALUE) { <br>logger.error("Invalid file or file to large,file: " + name); <br>throw new ServletException( <br>"Invalid file or file to large,file: " + name); <br>} <br>response.setContentType("application/" + type); <br>response.addHeader("Content-Disposition", "attachment; filename="+ name); <br>response.setContentLength((int) file.length()); <br>os = response.getOutputStream(); <br>bis = new BufferedInputStream(new FileInputStream(file)); <br>int size = -1; <br>while ((size = bis.read()) != -1) <br>os.write(size); <br>} catch (IOException ioe) { <br>throw new ServletException(ioe.getMessage()); <br>} finally { <br>if (os != null) <br>os.close(); <br>if (bis != null) <br>bis.close(); <br>} <br>} <br>以上只是个示例程序，灵活与方便的做法应该是在Servlet初始化参数（&lt;init-param&gt;）设置下载文件所在目录，当然也可以在页面中设置参数。甚至可以做成一个下载标签，方便使用。</div>
<img src ="http://www.blogjava.net/hilor/aggbug/137031.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/hilor/" target="_blank">hilor</a> 2007-08-15 20:34 <a href="http://www.blogjava.net/hilor/articles/137031.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>JSP页面跳转问题</title><link>http://www.blogjava.net/hilor/articles/136975.html</link><dc:creator>hilor</dc:creator><author>hilor</author><pubDate>Wed, 15 Aug 2007 09:00:00 GMT</pubDate><guid>http://www.blogjava.net/hilor/articles/136975.html</guid><wfw:comment>http://www.blogjava.net/hilor/comments/136975.html</wfw:comment><comments>http://www.blogjava.net/hilor/articles/136975.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/hilor/comments/commentRss/136975.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/hilor/services/trackbacks/136975.html</trackback:ping><description><![CDATA[<div align="justify">页面调转有如下几种方式</div>
<div>1&nbsp;&nbsp; RequestDispatcher.forward()</div>
<div>2&nbsp; response.sendRedirect()<br />
3 &nbsp;&lt;jsp:forward page="" /&gt; </div>
<div>4&nbsp; 修改HTTP header的Location属性来重定向</div>
<div>5&nbsp; pageContext.forward()</div>
<div>&nbsp;</div>
<div>我把检验用户是否登录的代码写在一个JSP文件中</div>
<div>代<font color="#ff0000">码如下</font></div>
<div><font color="#ff0000">logincheck.jsp</font></div>
<div><font color="#000000">&lt;%</font></div>
<div><font color="#000000">&nbsp;&nbsp; if (session.getAttribute("flag") == null&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;|| !"ok".equals(session.getAttribute("flag"))) {</font></div>
<div><font color="#000000">&nbsp;&nbsp;&nbsp; </font></div>
<div><font color="#000000">&nbsp;&nbsp; <font color="#ff0000">//1 跳转方式1<br />
&nbsp;&nbsp;&nbsp;&nbsp;response.sendRedirect("login.jsp");<br />
&nbsp;&nbsp;&nbsp;&nbsp;return;</font></font></div>
<div><font color="#ff0000"></font>&nbsp;</div>
<div><font color="#000000"><font color="#0000ff">&nbsp;&nbsp;&nbsp; //2跳转方式2&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;//pageContext.forward("login.jsp");</font><font color="#0000ff">&nbsp; &nbsp;&nbsp;</font><br />
&nbsp;&nbsp;&nbsp;}</font></div>
<div><font color="#000000">%&gt;</font></div>
<p><font color="#ff0000"></font>&nbsp;</p>
<p><font color="#ff0000">//success.jsp</font></p>
<p>&lt;%@ page contentType="text/html;charset=Shift_JIS" session="true"<br />
&nbsp;isErrorPage="false" errorPage="err.jsp" %&gt;</p>
<p><font color="#0000ff">//a&nbsp; 包含方法a</font><br />
<font color="#0000ff">&lt;!-- jsp:include page="logincheck.jsp" flush="true"/----&gt;&nbsp;</font></p>
<p><font color="#ff0000">//b 包含方法b<br />
</font><font color="#ff0000">&lt;%@ include file="logincheck.jsp"%&gt;</font><br />
&lt;html&gt;<br />
&nbsp; &lt;head&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;title&gt;Success.jsp&lt;/title&gt;<br />
&nbsp; &lt;/head&gt;<br />
&nbsp; &lt;body&gt;<br />
&nbsp;&nbsp;&nbsp; This is my JSP page. Success! &lt;br&gt;<br />
&nbsp;&nbsp;&nbsp; Welcome&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp; &lt;%<br />
&nbsp;&nbsp;&nbsp; out.print("SCHOOL : "+request.getAttribute("school")+"&lt;br&gt;");<br />
&nbsp;&nbsp;&nbsp; out.print("AGE : "+session.getAttribute("age")+"&lt;br&gt;");<br />
&nbsp;&nbsp;&nbsp; out.print("CITY : "+application.getAttribute("city")+"&lt;br&gt;");<br />
&nbsp;&nbsp;&nbsp; %&gt;<br />
&nbsp; &lt;/body&gt;<br />
&nbsp;&nbsp; &nbsp;&lt;A&nbsp; href="logout.jsp"&gt;ログ アウト&lt;/A&gt;<br />
&lt;/html&gt;<br />
</p>
<p><font color="#ff0000"></font>&nbsp;我将文件的包含方式和文件的调转方式作了组合测试。</p>
<p>结果如下</p>
<p>--------------------------------------------------</p>
<p>包含方法&nbsp; |&nbsp;&nbsp; 跳转方法&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |&nbsp;&nbsp; 结果</p>
<p>-------------------------------------------------</p>
<p>&nbsp;&nbsp;&nbsp; a&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <font color="#ff0000">注1</font></p>
<p>------------------------------------------------ </p>
<div>&nbsp;&nbsp;&nbsp; b&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ok </div>
<p>------------------------------------------------ </p>
<p>&nbsp; &nbsp;a&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;2&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <font color="#ff0000">注2</font></p>
<p>------------------------------------------------ </p>
<div>&nbsp;&nbsp; b&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ok</div>
<p>------------------------------------------------ </p>
<p><font color="#ff0000">注1</font></p>
<p>不做任何调转</p>
<p><font color="#ff0000">注2 </font></p>
<p><font color="#0000ff">只有将</font></p>
<p><font color="#0000ff">&lt;jsp:include page="logincheck.jsp" flush="true"/&gt;&nbsp;</font></p>
<p><font color="#0000ff">放在代码的第一行才可以。</font></p>
<p><font color="#0000ff">否则</font></p>
<p>java.lang.IllegalStateException: Cannot forward after response has been committed at org.apache.catalina.core.ApplicationDispatcher.doForward</p>
<p>&nbsp;</p>
<p>日文环境</p>
<p>java.lang.IllegalStateException: レスポンスをコミットした后でフォワードできません at org.apache.catalina.core.ApplicationDispatcher.doForward(ApplicationDispatcher.java:324) at </p>
<p><font color="#ff0000">这个错误往往是在forward执行之前，response已经返回了！</font></p>
<p><font color="#ff0000">不明的原因！有空上网上再找找！<br />
<br />
4: 修改HTTP header的Location属性来重定向<br />
　　通过设置直接修改地址栏来实现页面的重定向。<br />
　　jsp文件代码如下：<br />
　　＜%<br />
　　response.setStatus(HttpServletResponse.SC_MOVED_PERMANENTLY);<br />
　　String newLocn = "/newpath/jsa.jsp";<br />
　　response.setHeader("Location",newLocn);<br />
　　%＞ <br />
　　5.JSP中实现在某页面停留若干秒后,自动重定向到另一页面<br />
　　在html文件中，下面的代码：<br />
　　&lt;meta http-equiv="refresh" content="300; url=target.jsp"&gt; <br />
　　它的含义：在5分钟之后正在浏览的页面将会自动变为target.html这一页。代码中300为刷新的延迟时间，以秒为单位。targer.html为你想转向的目标页,若为本页则为自动刷新本页。<br />
　　由上可知，可以通过setHeader来实现某页面停留若干秒后,自动重定向到另一页面。<br />
　　关键代码：<br />
　　String content=stayTime+";URL="+URL;<br />
　　response.setHeader("REFRESH",content); <br />
　　如果总结得不够全面，请各位发表自己的意见或经验。</font></p><img src ="http://www.blogjava.net/hilor/aggbug/136975.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/hilor/" target="_blank">hilor</a> 2007-08-15 17:00 <a href="http://www.blogjava.net/hilor/articles/136975.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>jsp中把特殊字符转换成html特定符号的函数</title><link>http://www.blogjava.net/hilor/articles/136839.html</link><dc:creator>hilor</dc:creator><author>hilor</author><pubDate>Wed, 15 Aug 2007 02:38:00 GMT</pubDate><guid>http://www.blogjava.net/hilor/articles/136839.html</guid><wfw:comment>http://www.blogjava.net/hilor/comments/136839.html</wfw:comment><comments>http://www.blogjava.net/hilor/articles/136839.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/hilor/comments/commentRss/136839.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/hilor/services/trackbacks/136839.html</trackback:ping><description><![CDATA[import &nbsp; <nobr oncontextmenu="return false;" onmousemove=kwM(3); id=key3 onmouseover="kwE(event,3, this);" style="COLOR: #6600ff; BORDER-BOTTOM: 0px dotted; BACKGROUND-COLOR: transparent; TEXT-DECORATION: underline" onclick="return kwC();" onmouseout="kwL(event, this);" target="_blank">java</nobr>.io.*; &nbsp; <br>&nbsp; public &nbsp; class &nbsp; Test{ &nbsp; <br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; public &nbsp; static &nbsp; String &nbsp; changeToHtml(String &nbsp; input) &nbsp; <br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; { &nbsp; <br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if(input &nbsp; == &nbsp; null &nbsp; || &nbsp; input.length() &nbsp; == &nbsp; 0) &nbsp; <br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; return &nbsp; ""; &nbsp; <br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; char &nbsp; c &nbsp; = &nbsp; ' &nbsp; '; &nbsp; <br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; StringBuffer &nbsp; sb &nbsp; = &nbsp; new &nbsp; StringBuffer(input.length()); &nbsp; <br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; for(int &nbsp; i &nbsp; = &nbsp; 0; &nbsp; i &nbsp; &lt; &nbsp; input.length(); &nbsp; i++) &nbsp; <br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; { &nbsp; <br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; c &nbsp; = &nbsp; input.charAt(i); &nbsp; <br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if(c &nbsp; == &nbsp; ' &nbsp; ') &nbsp; <br>&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; sb.append("&amp;nbsp;"); &nbsp; <br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; continue; &nbsp; <br>&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; if(c &nbsp; == &nbsp; '&lt;') &nbsp; <br>&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; sb.append("&amp;lt;"); &nbsp; <br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; continue; &nbsp; <br>&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; if(c &nbsp; == &nbsp; '&gt;') &nbsp; <br>&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; sb.append("&amp;gt;"); &nbsp; <br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; continue; &nbsp; <br>&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; if(c &nbsp; == &nbsp; '\n'){ &nbsp; <br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; sb.append("&lt;br&gt; &nbsp; "); &nbsp; <br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; continue; &nbsp; <br>&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; if(c &nbsp; == &nbsp; '&amp;' &nbsp; ){ &nbsp; <br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; sb.append("&amp;amp;"); &nbsp; <br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; continue; &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; <br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; else &nbsp; <br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; sb.append(c); &nbsp; <br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; } &nbsp; <br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; return &nbsp; sb.toString(); &nbsp; <br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; } &nbsp; <br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; public &nbsp; static &nbsp; String &nbsp; transform(String &nbsp; content) &nbsp; <br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; { &nbsp; <br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; content=content.replaceAll("&amp;","&amp;amp;"); &nbsp; <br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; content=content.replaceAll("&lt;","&amp;lt;"); &nbsp; <br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; content=content.replaceAll(" &nbsp; ","&amp;nbsp;"); &nbsp; <br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; content=content.replaceAll("&gt;","&amp;gt;"); &nbsp; <br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; content=content.replaceAll("\n","&lt;br&gt;"); &nbsp; <br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; return &nbsp; content; &nbsp; <br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; } &nbsp; <br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; public &nbsp; static &nbsp; void &nbsp; main(String &nbsp; []args){ &nbsp; <br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; BufferedReader &nbsp; bw; &nbsp; <br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; StringBuffer &nbsp; sb=new &nbsp; StringBuffer(""); &nbsp; <br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; String &nbsp; ss=""; &nbsp; <br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; long &nbsp; l=0; &nbsp; <br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; try{ &nbsp; <br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; File &nbsp; file=new &nbsp; File("G:\\novel\\凡尔纳\\海底两万里\\001.HTM");//随意选的文件 &nbsp; <br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; System.out.println(file.getPath().toString()); &nbsp; <br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; bw=new &nbsp; BufferedReader(new &nbsp; FileReader(file)); &nbsp; <br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; while((ss=bw.readLine())!=null){ &nbsp; <br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; System.out.println(ss); &nbsp; <br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; sb.append(ss); &nbsp; <br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; } &nbsp; <br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; bw.close(); &nbsp; <br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; for(int &nbsp; i=0;i&lt;10;i++) &nbsp; sb.append(sb);//作一个大字串 &nbsp; <br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }catch(IOException &nbsp; e){} &nbsp; <br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; long &nbsp; a=0; &nbsp; <br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; long &nbsp; b=0; &nbsp; <br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; /*输出使用changeToHtml()所用<nobr oncontextmenu="return false;" onmousemove=kwM(0); id=key0 onmouseover="kwE(event,0, this);" style="COLOR: #6600ff; BORDER-BOTTOM: #6600ff 1px dotted; BACKGROUND-COLOR: transparent; TEXT-DECORATION: underline" onclick="return kwC();" onmouseout="kwL(event, this);" target="_blank">时间</nobr> &nbsp; <br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; *a=System.currentTimeMillis(); &nbsp; <br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; *changeToHtml(sb.toString()); &nbsp; <br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; *b=System.currentTimeMillis(); &nbsp; <br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; *System.out.println(b-a); &nbsp; <br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; *此处正常显示时间 &nbsp; <br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; */ &nbsp; <br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; /*输出<nobr oncontextmenu="return false;" onmousemove=kwM(1); id=key1 onmouseover="kwE(event,1, this);" style="COLOR: #6600ff; BORDER-BOTTOM: #6600ff 1px dotted; BACKGROUND-COLOR: transparent; TEXT-DECORATION: underline" onclick="return kwC();" onmouseout="kwL(event, this);" target="_blank">使用</nobr>transform()所用时间 &nbsp; <br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; *a=System.currentTimeMillis(); &nbsp; <br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; *transform(sb.toString()); &nbsp; <br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; *b=System.currentTimeMillis(); &nbsp; <br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; *System.out.println(b-a); &nbsp; <br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; *发生<nobr oncontextmenu="return false;" onmousemove=kwM(8); id=key6 onmouseover="kwE(event,8, this);" style="COLOR: #6600ff; BORDER-BOTTOM: #6600ff 1px dotted; BACKGROUND-COLOR: transparent; TEXT-DECORATION: underline" onclick="return kwC();" onmouseout="kwL(event, this);" target="_blank">内存</nobr>溢出错误 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; */ &nbsp; <br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; } &nbsp; <br>&nbsp; }<br><br>如果字串稍小一点，不发生错误，那么即可看出chageToHtml()所用时间比transform()要少得多。
<img src ="http://www.blogjava.net/hilor/aggbug/136839.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/hilor/" target="_blank">hilor</a> 2007-08-15 10:38 <a href="http://www.blogjava.net/hilor/articles/136839.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>JAVA中的数据类型转换</title><link>http://www.blogjava.net/hilor/articles/135759.html</link><dc:creator>hilor</dc:creator><author>hilor</author><pubDate>Fri, 10 Aug 2007 03:48:00 GMT</pubDate><guid>http://www.blogjava.net/hilor/articles/135759.html</guid><wfw:comment>http://www.blogjava.net/hilor/comments/135759.html</wfw:comment><comments>http://www.blogjava.net/hilor/articles/135759.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/hilor/comments/commentRss/135759.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/hilor/services/trackbacks/135759.html</trackback:ping><description><![CDATA[<div>1如何将字串 String 转换成整数 int? </div>
<div>&nbsp;</div>
<div>A. 有两个方法:</div>
<div>&nbsp;</div>
<div>1). int i = Integer.parseInt([String]); 或 <br>i = Integer.parseInt([String],[int radix]);</div>
<div>&nbsp;</div>
<div>2). int i = Integer.valueOf(my_str).intValue(); </div>
<div>&nbsp;</div>
<div>注: 字串转成 Double, Float, Long 的方法大同小异. </div>
<div>&nbsp;</div>
<div><br>2 如何将整数 int 转换成字串 String ? </div>
<div>&nbsp;</div>
<div><br>A. 有叁种方法:</div>
<div>&nbsp;</div>
<div>1.) String s = String.valueOf(i);</div>
<div>&nbsp;</div>
<div>2.) String s = Integer.toString(i); </div>
<div>&nbsp;</div>
<div>3.) String s = "" + i; </div>
<div>&nbsp;</div>
<div>注: Double, Float, Long 转成字串的方法大同小异. </div>
<div>&nbsp;</div>
<div>&nbsp;</div>
<div>&nbsp;</div>
<div>JAVA数据类型转换&nbsp;&nbsp;&nbsp;&nbsp; ynniebo [收藏]&nbsp; <br>关键字&nbsp;&nbsp; 类型转换 <br>出处&nbsp;&nbsp;&nbsp; <br>&nbsp;<br>&nbsp;这是一个例子,说的是JAVA中数据数型的转换.供大家学习引</div>
<div>&nbsp;</div>
<div>package cn.com.lwkj.erts.register;<br>import java.sql.Date;<br>public class TypeChange {<br>&nbsp; public TypeChange() {<br>&nbsp; }<br>&nbsp; //change the string type to the int type<br>&nbsp; public static&nbsp; int stringToInt(String intstr)<br>&nbsp; {<br>&nbsp;&nbsp;&nbsp; Integer integer;<br>&nbsp;&nbsp;&nbsp; integer = Integer.valueOf(intstr);<br>&nbsp;&nbsp;&nbsp; return integer.intValue();<br>&nbsp; }<br>&nbsp; //change int type to the string type<br>&nbsp; public static String intToString(int value)<br>&nbsp; {<br>&nbsp;&nbsp;&nbsp; Integer integer = new Integer(value);<br>&nbsp;&nbsp;&nbsp; return integer.toString();<br>&nbsp; }<br>&nbsp; //change the string type to the float type<br>&nbsp; public static&nbsp; float stringToFloat(String floatstr)<br>&nbsp; {<br>&nbsp;&nbsp;&nbsp; Float floatee;<br>&nbsp;&nbsp;&nbsp; floatee = Float.valueOf(floatstr);<br>&nbsp;&nbsp;&nbsp; return floatee.floatValue();<br>&nbsp; }<br>&nbsp; //change the float type to the string type<br>&nbsp; public static String floatToString(float value)<br>&nbsp; {<br>&nbsp;&nbsp;&nbsp; Float floatee = new Float(value);<br>&nbsp;&nbsp;&nbsp; return floatee.toString();<br>&nbsp; }<br>&nbsp; //change the string type to the sqlDate type<br>&nbsp; public static java.sql.Date stringToDate(String dateStr)<br>&nbsp; {<br>&nbsp;&nbsp;&nbsp; return&nbsp; java.sql.Date.valueOf(dateStr);<br>&nbsp; }<br>&nbsp; //change the sqlDate type to the string type<br>&nbsp; public static String dateToString(java.sql.Date datee)<br>&nbsp; {<br>&nbsp;&nbsp;&nbsp; return datee.toString();<br>&nbsp; }</div>
<div>&nbsp;</div>
<div>&nbsp; public static void main(String[] args)<br>&nbsp; {<br>&nbsp;&nbsp;&nbsp; java.sql.Date day ;<br>&nbsp;&nbsp;&nbsp; day = TypeChange.stringToDate("2003-11-3");<br>&nbsp;&nbsp;&nbsp; String strday = TypeChange.dateToString(day);<br>&nbsp;&nbsp;&nbsp; System.out.println(strday);<br>&nbsp; }</div>
<div>&nbsp;</div>
<div><br>}</div>
<div>&nbsp;</div>
<div><br>JAVA中常用数据类型转换函数 <br>虽然都能在JAVA API中找到，整理一下做个备份。</div>
<div>&nbsp;</div>
<div>string-&gt;byte<br>Byte static byte parseByte(String s)&nbsp; </div>
<div>&nbsp;</div>
<div>byte-&gt;string <br>Byte static String toString(byte b) </div>
<div>&nbsp;</div>
<div>char-&gt;string <br>Character static String to String (char c) </div>
<div>&nbsp;</div>
<div>string-&gt;Short <br>Short static Short parseShort(String s) </div>
<div>&nbsp;</div>
<div>Short-&gt;String <br>Short static String toString(Short s) </div>
<div>&nbsp;</div>
<div>String-&gt;Integer <br>Integer static int parseInt(String s)</div>
<div>&nbsp;</div>
<div>Integer-&gt;String <br>Integer static String tostring(int i) </div>
<div>&nbsp;</div>
<div>String-&gt;Long <br>Long static long parseLong(String s) </div>
<div>&nbsp;</div>
<div>Long-&gt;String <br>Long static String toString(Long i) </div>
<div>&nbsp;</div>
<div>String-&gt;Float <br>Float static float parseFloat(String s) </div>
<div>&nbsp;</div>
<div>Float-&gt;String <br>Float static String toString(float f) </div>
<div>&nbsp;</div>
<div>String-&gt;Double <br>Double static double parseDouble(String s)</div>
<div>&nbsp;</div>
<div>Double-&gt;String<br>Double static String toString(Double)<br><br>-------------------------------------华丽的分割线-----------------------------------<br>
<div id="Content">
<div class="serendipity_entry_body">
<p><strong><font size="3">数据类型</font></strong></p>
<p>基本类型有以下四种：<br>int长度数据类型有：byte(8bits)、short(16bits)、int(32bits)、long(64bits)、<br>float长度数据类型有：单精度（32bits float）、双精度（64bits double）<br>boolean类型变量的取值有：ture、false<br>char数据类型有：unicode字符,16位<br>对应的类类型：Integer、Float、Boolean、Character、Double、Short、Byte、Long</p>
</div>
<div class="serendipity_entry_extended"><a id="extended"></a>
<p><strong><font size="3">转换原则</font></strong></p>
<p>从低精度向高精度转换<br>byte 、short、int、long、float、double、char<br>注：两个char型运算时，自动转换为int型；当char与别的类型运算时，也会先自动转换为int型的，再做其它类型的自动转换</p>
<p>基本类型向类类型转换</p>
<p>正向转换：通过类包装器来new出一个新的类类型的变量<br>Integer a= new Integer(2);<br>反向转换：通过类包装器来转换<br>int b=a.intValue();</p>
<p>类类型向字符串转换</p>
<p>正向转换：因为每个类都是object类的子类，而所有的object类都有一个toString()函数，所以通过toString()函数来转换即可<br>反向转换：通过类包装器new出一个新的类类型的变量<br>eg1: int i=Integer.valueOf(&#8220;123&#8221;).intValue()<br>说明：上例是将一个字符串转化成一个Integer对象，然后再调用这个对象的intValue()方法返回其对应的int数值。<br>eg2: float f=Float.valueOf(&#8220;123&#8221;).floatValue()<br>说明：上例是将一个字符串转化成一个Float对象，然后再调用这个对象的floatValue()方法返回其对应的float数值。<br>eg3: boolean b=Boolean.valueOf(&#8220;123&#8221;).booleanValue()<br>说明：上例是将一个字符串转化成一个Boolean对象，然后再调用这个对象的booleanValue()方法返回其对应的boolean数值。<br>eg4:double d=Double.valueOf(&#8220;123&#8221;).doubleValue()<br>说明：上例是将一个字符串转化成一个Double对象，然后再调用这个对象的doubleValue()方法返回其对应的double数值。<br>eg5: long l=Long.valueOf(&#8220;123&#8221;).longValue()<br>说明：上例是将一个字符串转化成一个Long对象，然后再调用这个对象的longValue()方法返回其对应的long数值。<br>eg6: char=Character.valueOf(&#8220;123&#8221;).charValue()<br>说明：上例是将一个字符串转化成一个Character对象，然后再调用这个对象的charValue()方法返回其对应的char数值。</p>
<p>基本类型向字符串的转换<br>正向转换：<br>如：int a=12;<br>String b;b=a+&#8221;&#8221;;</p>
<p>反向转换：<br>通过类包装器<br>eg1:int i=Integer.parseInt(&#8220;123&#8221;)<br>说明：此方法只能适用于字符串转化成整型变量<br>eg2: float f=Float.valueOf(&#8220;123&#8221;).floatValue()<br>说明：上例是将一个字符串转化成一个Float对象，然后再调用这个对象的floatValue()方法返回其对应的float数值。<br>eg3: boolean b=Boolean.valueOf(&#8220;123&#8221;).booleanValue()<br>说明：上例是将一个字符串转化成一个Boolean对象，然后再调用这个对象的booleanValue()方法返回其对应的boolean数值。<br>eg4:double d=Double.valueOf(&#8220;123&#8221;).doubleValue()<br>说明：上例是将一个字符串转化成一个Double对象，然后再调用这个对象的doubleValue()方法返回其对应的double数值。<br>eg5: long l=Long.valueOf(&#8220;123&#8221;).longValue()<br>说明：上例是将一个字符串转化成一个Long对象，然后再调用这个对象的longValue()方法返回其对应的long数值。<br>eg6: char=Character.valueOf(&#8220;123&#8221;).charValue()<br>说明：上例是将一个字符串转化成一个Character对象，然后再调用这个对象的charValue()方法返回其对应的char数值。</p>
</div>
</div>
</div><img src ="http://www.blogjava.net/hilor/aggbug/135759.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/hilor/" target="_blank">hilor</a> 2007-08-10 11:48 <a href="http://www.blogjava.net/hilor/articles/135759.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>SQL中的日期和时间函数</title><link>http://www.blogjava.net/hilor/articles/135521.html</link><dc:creator>hilor</dc:creator><author>hilor</author><pubDate>Thu, 09 Aug 2007 07:48:00 GMT</pubDate><guid>http://www.blogjava.net/hilor/articles/135521.html</guid><wfw:comment>http://www.blogjava.net/hilor/comments/135521.html</wfw:comment><comments>http://www.blogjava.net/hilor/articles/135521.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/hilor/comments/commentRss/135521.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/hilor/services/trackbacks/135521.html</trackback:ping><description><![CDATA[<table class=contentTable cellSpacing=0 cellPadding=0 width="92%" align=center border=0>
    <tbody>
        <tr>
            <td>
            <div class=articleText>1.一个月第一天的<br>Select DATEADD(mm, DATEDIFF(mm,0,getdate()), 0)<br><br>2.本周的星期一<br>Select DATEADD(wk, DATEDIFF(wk,0,getdate()), 0)<br><br>3.一年的第一天<br>Select DATEADD(yy, DATEDIFF(yy,0,getdate()), 0)<br><br>4.季度的第一天<br>Select DATEADD(qq, DATEDIFF(qq,0,getdate()), 0)<br><br>5.当天的半夜<br>Select DATEADD(dd, DATEDIFF(dd,0,getdate()), 0)<br><br>6.上个月的最后一天<br>Select dateadd(ms,-3,DATEADD(mm, DATEDIFF(mm,0,getdate()), 0))<br><br>7.去年的最后一天<br>Select dateadd(ms,-3,DATEADD(yy, DATEDIFF(yy,0,getdate()), 0))<br><br>8.本月的最后一天<br>Select dateadd(ms,-3,DATEADD(mm, DATEDIFF(m,0,getdate())+1, 0))<br><br>9.本年的最后一天<br>Select dateadd(ms,-3,DATEADD(yy, DATEDIFF(yy,0,getdate())+1, 0))<br><br>10.本月的第一个星期一<br>select DATEADD(wk, DATEDIFF(wk,0,dateadd(dd,6-datepart(day,getdate()),getdate())), 0) <br><br>返回当前<strong style="COLOR: black; BACKGROUND-COLOR: #a0ffff">日期</strong>和时间<br>通过函数GETDATE（），你可以获得当前的<strong style="COLOR: black; BACKGROUND-COLOR: #a0ffff">日期</strong>和时间。函数GETDATE（）可以用来作为DATEDIME型字段的缺省值。这对插入记录时保存当时的时间是有用的。要建立一个表，其中的记录包含有当前的<strong style="COLOR: black; BACKGROUND-COLOR: #a0ffff">日期</strong>和时间，可以添加一个DATETIME型字段，指定其缺省值为函数GETDATE（）的返回值，就象这样：<br><br>Create TABLE site_log (<br>username VARCHAR(40)，<br>useractivity VARCHAR(100)，<br>entrydate DATETIME DEFAULT GETDATE())<br><br>转换<strong style="COLOR: black; BACKGROUND-COLOR: #a0ffff">日期</strong>和时间<br>函数GETDATE（）的返回值在显示时只显示到秒。实际上，<strong style="COLOR: black; BACKGROUND-COLOR: #ffff66">SQL</strong> Sever内部时间可以精确到毫秒级（确切地说，可以精确到3.33毫秒）。<br>要得到不同格式的<strong style="COLOR: black; BACKGROUND-COLOR: #a0ffff">日期</strong>和时间，你需要使用函数CONVERT（）。例如，当下面的这个语句执行时，显示的时间将包括毫秒：<br><br>Select CONVERT(VARCHAR(30)，GETDATE()，9)<br><br>注意例子中数字9的使用。这个数字指明了在显示<strong style="COLOR: black; BACKGROUND-COLOR: #a0ffff">日期</strong>和时间时使用哪种<strong style="COLOR: black; BACKGROUND-COLOR: #a0ffff">日期</strong>和时间格式。当这个语句执行时，将显示如下的<strong style="COLOR: black; BACKGROUND-COLOR: #a0ffff">日期</strong>和时间：<br>Nov 30 1997 3:29:55:170AM<br>(1 row(s) affected)<br><br>在函数CONVERT（）中你可以使用许多种不同风格的<strong style="COLOR: black; BACKGROUND-COLOR: #a0ffff">日期</strong>和时间格式。下表显示了所有的格式。<br><br><strong style="COLOR: black; BACKGROUND-COLOR: #a0ffff">日期</strong>和时间的类型：<br>类型值 标准 输出<br>0 Default mon dd yyyy hh:miAM<br>1 USA mm/dd/yy<br>2 ANSI yy.mm.dd<br>3 British/French dd/mm/yy<br>4 German dd.mm.yy<br>5 Italian dd-mm-yy<br>6 - dd mon yy<br>7 - mon dd，yy<br>8 - hh:mi:ss<br>9 Default + milliseconds--mon dd yyyy<br>hh:mi:ss:mmmAM(or )<br>10 USA mm-dd-yy<br>11 JAPAN yy/mm/dd<br>12 ISO yymmdd<br>13 Europe Default + milliseconds--dd mon yyyy<br>hh:mi:ss:mmm(24h)<br>14 - hh:mi:ss:mmm(24h)<br><br>类型0，9，和13总是返回四位的年。对其它类型，要显示世纪，把style值加上100。类型13和14返回24小时时钟的时间。类型0，7，和13返回的月份用三位字符表示（用Nov代表November）.<br><br>对表中所列的每一种格式，你可以把类型值加上100来显示有世纪的年（例如，00年将显示为2000年）。例如，要按日本标准显示<strong style="COLOR: black; BACKGROUND-COLOR: #a0ffff">日期</strong>，包括世纪，你应使用如下的语句：<br><br>Select CONVERT（VARCHAR（30），GETDATE（），111）<br><br>在这个例子中，函数CONVERT（）把<strong style="COLOR: black; BACKGROUND-COLOR: #a0ffff">日期</strong>格式进行转换，显示为1997/11/30<br><br>抽取<strong style="COLOR: black; BACKGROUND-COLOR: #a0ffff">日期</strong>和时间<br>在许多情况下，你也许只想得到<strong style="COLOR: black; BACKGROUND-COLOR: #a0ffff">日期</strong>和时间的一部分，而不是完整的<strong style="COLOR: black; BACKGROUND-COLOR: #a0ffff">日期</strong>和时间。为了抽取<strong style="COLOR: black; BACKGROUND-COLOR: #a0ffff">日期</strong>的特定部分，你可以使用函数DATEPART（），象这样：<br><br>Select site_name &#8216;Site Name&#8217;，<br>DATEPART(mm，site_entrydate) &#8216;Month Posted&#8217; FROM site_directory<br><br>函数DATEPART（）的参数是两个变量。第一个变量指定要抽取<strong style="COLOR: black; BACKGROUND-COLOR: #a0ffff">日期</strong>的哪一部分；第二个变量是实际的数据。在这个例子中，函数DATEPART（）抽取月份，因为mm代表月份。下面是这个Select 语句的输出结果：<br><br>Site Name Month Posted<br>&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;<br>Yahoo 2<br>Microsoft 5<br>Magicw3 5<br>(3 row(s) affected)<br><br>Month Posted列显示了每个站点被查询的月份。函数DATEPART（）的返回值是一个整数。你可以用这个函数抽取<strong style="COLOR: black; BACKGROUND-COLOR: #a0ffff">日期</strong>的各个不同部分，如下表所示。<br><br><strong style="COLOR: black; BACKGROUND-COLOR: #a0ffff">日期</strong>的各部分及其简写<br><strong style="COLOR: black; BACKGROUND-COLOR: #a0ffff">日期</strong>部分 简写 值<br>year yy 1753--9999<br>quarter qq 1--4<br>month mm 1--12<br>day of year dy 1--366<br>day dd 1--31<br>week wk 1--53<br>weekday dw 1--7(Sunday--Saturday)<br>hour hh 0--23<br>minute mi 0--59<br>second ss 0--59<br>milisecond ms 0--999<br><br>当你需要进行<strong style="COLOR: black; BACKGROUND-COLOR: #a0ffff">日期</strong>和时间的比较时，使用函数DATEPART（）返回整数是有用的。但是，上例中的查询结果（2，5）不是十分易读。要以更易读的格式得到部分的<strong style="COLOR: black; BACKGROUND-COLOR: #a0ffff">日期</strong>和时间，你可以使用函数DATENAME（），如下例所示：<br><br>Select site_name &#8216;Site Name&#8217;<br>DATENAME(mm，site_entrydate) &#8216;Month Posted&#8217;<br>FROM site_directory<br><br>函数DATENAME（）和函数DATEPART（）接收同样的参数。但是，它的返回值是一个字符串，而不是一个整数。下面是上例该用DATENAME（）得到的结果：<br><br>Site Name Month Postec<br>&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;.<br>Yahoo February<br>Microsoft June<br>Magicw3 June<br>(3 row(s) affected)<br><br>你也可以用函数DATENAE（）来抽取一个星期中的某一天。下面的这个例子同时抽取一周中的某一天和<strong style="COLOR: black; BACKGROUND-COLOR: #a0ffff">日期</strong>中的月份：<br><br>Select site_name &#8216;Site Name&#8217;，<br>DATENAME(dw，site_entrydate)+ &#8216;-&#8217; + DATENAME（mm，site_entrydate）<br>&#8216;Day and Month Posted&#8217; FORM site_directory<br><br>这个例子执行时，将返回如下的结果：<br><br>Site Name Day and Month Posted<br>&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;<br>Yahoo Friday - February<br>Microsoft Tuesday - June<br>Magicw3 Monday - June<br>(3 row(s) affected)<br><br>返回<strong style="COLOR: black; BACKGROUND-COLOR: #a0ffff">日期</strong>和时间范围<br>当你分析表中的数据时，你也许希望取出某个特定时间的数据。你也许对特定的某一天中――比如说2000年12月25日――访问者在你站点上的活动感兴趣。要取出这种类型的数据，你也许会试图使用这样的Select语句：<br><br>Select * FROM weblog Where entrydate="12/25/20000"<br><br>不要这样做。这个Select语句不会返回正确的记录――它将只返回<strong style="COLOR: black; BACKGROUND-COLOR: #a0ffff">日期</strong>和时间是12/25/2000 12:00:00:000AM的记录。换句话说，只有刚好在午夜零点输入的记录才被返回。<br><br>问题是<strong style="COLOR: black; BACKGROUND-COLOR: #ffff66">SQL</strong> Sever将用完整的<strong style="COLOR: black; BACKGROUND-COLOR: #a0ffff">日期</strong>和时间代替部分<strong style="COLOR: black; BACKGROUND-COLOR: #a0ffff">日期</strong>和时间。例如，当你输入一个<strong style="COLOR: black; BACKGROUND-COLOR: #a0ffff">日期</strong>，但不输入时间时，<strong style="COLOR: black; BACKGROUND-COLOR: #ffff66">SQL</strong> Sever将加上缺省的时间&#8220;12：00：00：000AM&#8221;。当你输入一个时间，但不输入<strong style="COLOR: black; BACKGROUND-COLOR: #a0ffff">日期</strong>时，<strong style="COLOR: black; BACKGROUND-COLOR: #ffff66">SQL</strong> Sever将加上缺省的<strong style="COLOR: black; BACKGROUND-COLOR: #a0ffff">日期</strong>&#8220;Jan 1 1900&#8221;。<br>要返回正确的记录，你需要适用<strong style="COLOR: black; BACKGROUND-COLOR: #a0ffff">日期</strong>和时间范围。有不止一种途径可以做到这一点。例如，下面的这个Select 语句将能返回正确的记录：<br><br>Select * FROM weblog <br>Where entrydate&gt;=&#8221;12/25/2000&#8221; AND entrydate&lt;&#8221;12/26/2000&#8221;<br><br>这个语句可以完成任务，因为它选取的是表中的<strong style="COLOR: black; BACKGROUND-COLOR: #a0ffff">日期</strong>和时间大于等于12/25/2000 12:00:00:000AM并小于12/26/2000 12:00:00:000AM的记录。换句话说，它将正确地返回2000年圣诞节这一天输入的每一条记录。<br>另一种方法是，你可以使用LIKE来返回正确的记录。通过在<strong style="COLOR: black; BACKGROUND-COLOR: #a0ffff">日期</strong>表达式中包含通配符&#8220;％&#8221;，你可以匹配一个特定<strong style="COLOR: black; BACKGROUND-COLOR: #a0ffff">日期</strong>的所有时间。这里有一个例子：<br><br>Select * FROM weblog Where entrydate LIKE &#8216;Dec 25 2000%&#8217;<br><br>这个语句可以匹配正确的记录。因为通配符&#8220;％&#8221;代表了任何时间。<br>使用这两种匹配<strong style="COLOR: black; BACKGROUND-COLOR: #a0ffff">日期</strong>和时间范围的函数，你可以选择某个月，某一天，某一年，某个小时，某一分钟，某一秒，甚至某一毫秒内输入的记录。但是，如果你使用LIKE 来匹配秒或毫秒，你首先需要使用函数CONVERT（）把<strong style="COLOR: black; BACKGROUND-COLOR: #a0ffff">日期</strong>和时间转换为更精确的格式（参见前面&#8220;转换<strong style="COLOR: black; BACKGROUND-COLOR: #a0ffff">日期</strong>和时间&#8221;一节）。<br><br>比较<strong style="COLOR: black; BACKGROUND-COLOR: #a0ffff">日期</strong>和时间<br>最后，还有两个<strong style="COLOR: black; BACKGROUND-COLOR: #a0ffff">日期</strong>和时间函数对根据<strong style="COLOR: black; BACKGROUND-COLOR: #a0ffff">日期</strong>和时间取出记录是有用的。使用函数DATEADD（）和DATEDIFF（），你可以比较<strong style="COLOR: black; BACKGROUND-COLOR: #a0ffff">日期</strong>的早晚。例如，下面的Select语句将显示表中的每一条记录已经输入了多少个小时：<br><br>Select entrydate &#8216;Time Entered&#8217;<br>DATEDIFF(hh，entrydate，GETDATE()) &#8216;Hours Ago&#8217; FROM weblog<br><br>如果当前时间是2000年11月30号下午6点15分，则会返回如下的结果：<br><br>Time Entered Hours Ago<br>&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;..<br>Dec 30 2000 4:09PM 2<br>Dec 30 2000 4:13PM 2<br>Dec 1 2000 4:09PM 698<br>(3 row(s) affected)<br><br>函数DADEDIFF（）的参数是三个变量。第个变量指定<strong style="COLOR: black; BACKGROUND-COLOR: #a0ffff">日期</strong>的某一部分。在这个例子中，是按小时对<strong style="COLOR: black; BACKGROUND-COLOR: #a0ffff">日期</strong>进行比较，（要了解<strong style="COLOR: black; BACKGROUND-COLOR: #a0ffff">日期</strong>各部分的详细内容，请参考表11.2）在<strong style="COLOR: black; BACKGROUND-COLOR: #a0ffff">日期</strong>2000年11月1日和2000年11月30日的指定时间之间有689个小时。另外两个参数是要进行比较的时间。为了返回一个正数，较早的时间应该先给。<br>函数DATEADD（）把两个<strong style="COLOR: black; BACKGROUND-COLOR: #a0ffff">日期</strong>相加。当你需要计算截止<strong style="COLOR: black; BACKGROUND-COLOR: #a0ffff">日期</strong>这一类的数据时，这个函数是有用处的。假如你要查询一个月前注册用户的记录，你可以使用如下的Select语句：<br><br>Select username &#8216;User Name&#8217;，<br>DATEADD(mm，1，firstvisit_date) &#8216;Registration Expires&#8217;<br>FROM registration_table<br><br>函数DATEADD（）的参数有三个变量。第一个变量代表<strong style="COLOR: black; BACKGROUND-COLOR: #a0ffff">日期</strong>的某一部分，这个例子用到了代表月份的mm。第二个变量指定了时间的间隔――在本例中是一个月。最后一个变量是一个<strong style="COLOR: black; BACKGROUND-COLOR: #a0ffff">日期</strong>，在这个例子中，<strong style="COLOR: black; BACKGROUND-COLOR: #a0ffff">日期</strong>是取自DATETIME型字段firstvisit_date.假设当前<strong style="COLOR: black; BACKGROUND-COLOR: #a0ffff">日期</strong>是June 30，2000，这个语句将返回如下的内容：<br><br>User Name Registration Expires<br>&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;<br>Bill Gates Jul 30 2000 4:09PM<br>President Clinton Jul 30 2000 4:13PM<br>William Shakespeare Jul 1 2000 4:09PM<br>(3 row(s) affected)<br><br>注意：<br>使用函数DATEADD（）把一个<strong style="COLOR: black; BACKGROUND-COLOR: #a0ffff">日期</strong>加上一个月，它并不加上30天。这个函数只简单地把月份值加1。&nbsp; </div>
            <div class=articleText>
            <p>1.&nbsp;当前系统日期、时间&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; select getdate()&nbsp;</p>
            <p>2. dateadd&nbsp; 在向指定日期加上一段时间的基础上，返回新的 datetime 值<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 例如：向日期加上2天<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; select dateadd(day,2,'2004-10-15')&nbsp;--返回：2004-10-17 00:00:00.000</p>
            <p>3. datediff 返回跨两个指定日期的日期和时间边界数。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; select datediff(day,'2004-09-01','2004-09-18')&nbsp;&nbsp; --返回：17</p>
            <p>4. datepart 返回代表指定日期的指定日期部分的整数。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;select datepart(month, '2004-10-15')&nbsp; --返回 10</p>
            <p>5. datename 返回代表指定日期的指定日期部分的字符串<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;select datename(weekday, '2004-10-15')&nbsp; --返回：星期五</p>
            <p>6. day(), month(),year() --可以与datepart对照一下</p>
            <p>&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;select 当前日期=convert(varchar(10),getdate(),120),</p>
            <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 当前时间=convert(varchar(8),getdate(),114)</p>
            <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; select datename(dw,'2004-10-15')</p>
            <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; select 本年第多少周=datename(week,'2004-10-15'),</p>
            <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;今天是周几=datename(weekday,'2004-10-15')<br></p>
            </div>
            <div class=articleText>
            <table id=Table1 height=197 cellSpacing=1 cellPadding=3 width=376 bgColor=#666666 border=0>
                <tbody>
                    <tr>
                        <td bgColor=#cccccc height=30><strong>函数</strong></td>
                        <td bgColor=#cccccc height=30><strong>参数/功能</strong></td>
                    </tr>
                    <tr>
                        <td bgColor=#ffffff>GetDate( ) </td>
                        <td bgColor=#ffffff>返回系统目前的<strong style="COLOR: black; BACKGROUND-COLOR: #a0ffff">日期</strong>与时间</td>
                    </tr>
                    <tr>
                        <td bgColor=#ffffff>DateDiff (interval,date1,date2)</td>
                        <td bgColor=#ffffff>以interval 指定的方式，返回date2 与date1两个<strong style="COLOR: black; BACKGROUND-COLOR: #a0ffff">日期</strong>之间的差值 date2-date1</td>
                    </tr>
                    <tr>
                        <td bgColor=#ffffff>DateAdd (interval,number,date)</td>
                        <td bgColor=#ffffff>以interval指定的方式，加上number之后的<strong style="COLOR: black; BACKGROUND-COLOR: #a0ffff">日期</strong></td>
                    </tr>
                    <tr>
                        <td bgColor=#ffffff>DatePart (interval,date)</td>
                        <td bgColor=#ffffff>返回<strong style="COLOR: black; BACKGROUND-COLOR: #a0ffff">日期</strong>date中，interval指定部分所对应的整数值</td>
                    </tr>
                    <tr>
                        <td bgColor=#ffffff>DateName (interval,date)</td>
                        <td bgColor=#ffffff>返回<strong style="COLOR: black; BACKGROUND-COLOR: #a0ffff">日期</strong>date中，interval指定部分所对应的字符串名称</td>
                    </tr>
                </tbody>
            </table>
            </div>
            <div class=articleText><br>参数 interval的设定值如下： <br></div>
            <div class=articleText>
            <table id=Table2 cellSpacing=1 cellPadding=3 width=492 bgColor=#999999 border=0>
                <tbody>
                    <tr>
                        <td width=77 bgColor=#cccccc height=30><strong>值</strong></td>
                        <td width=144 bgColor=#cccccc height=30><strong>缩 写（<strong style="COLOR: black; BACKGROUND-COLOR: #ffff66">Sql</strong> Server）</strong></td>
                        <td width=118 bgColor=#cccccc height=30><strong>Access 和 ASP</strong></td>
                        <td width=124 bgColor=#cccccc height=30><strong>说明</strong></td>
                    </tr>
                    <tr>
                        <td bgColor=#ffffff>Year</td>
                        <td bgColor=#ffffff>Yy</td>
                        <td bgColor=#ffffff>yyyy</td>
                        <td bgColor=#ffffff>年 1753 ~ 9999</td>
                    </tr>
                    <tr>
                        <td bgColor=#ffffff>Quarter</td>
                        <td bgColor=#ffffff>Qq</td>
                        <td bgColor=#ffffff>q&nbsp; </td>
                        <td bgColor=#ffffff>季 1 ~ 4</td>
                    </tr>
                    <tr>
                        <td bgColor=#ffffff>Month</td>
                        <td bgColor=#ffffff>Mm</td>
                        <td bgColor=#ffffff>m&nbsp; </td>
                        <td bgColor=#ffffff>月1 ~ 12</td>
                    </tr>
                    <tr>
                        <td bgColor=#ffffff>Day of year</td>
                        <td bgColor=#ffffff>Dy</td>
                        <td bgColor=#ffffff>y </td>
                        <td bgColor=#ffffff>一年的日数,一年中的第几日 1-366</td>
                    </tr>
                    <tr>
                        <td bgColor=#ffffff>Day</td>
                        <td bgColor=#ffffff>Dd</td>
                        <td bgColor=#ffffff>d&nbsp; </td>
                        <td bgColor=#ffffff>日，1-31</td>
                    </tr>
                    <tr>
                        <td bgColor=#ffffff>Weekday</td>
                        <td bgColor=#ffffff>Dw</td>
                        <td bgColor=#ffffff>w</td>
                        <td bgColor=#ffffff>一周的日数，一周中的第几日 1-7</td>
                    </tr>
                    <tr>
                        <td bgColor=#ffffff>Week</td>
                        <td bgColor=#ffffff>Wk</td>
                        <td bgColor=#ffffff>ww </td>
                        <td bgColor=#ffffff>周，一年中的第几周 0 ~ 51</td>
                    </tr>
                    <tr>
                        <td bgColor=#ffffff>Hour</td>
                        <td bgColor=#ffffff>Hh</td>
                        <td bgColor=#ffffff>h&nbsp; </td>
                        <td bgColor=#ffffff>时0 ~ 23</td>
                    </tr>
                    <tr>
                        <td bgColor=#ffffff>Minute</td>
                        <td bgColor=#ffffff>Mi</td>
                        <td bgColor=#ffffff>n&nbsp;</td>
                        <td bgColor=#ffffff>分钟0 ~ 59</td>
                    </tr>
                    <tr>
                        <td bgColor=#ffffff>Second</td>
                        <td bgColor=#ffffff>Ss</td>
                        <td bgColor=#ffffff>s</td>
                        <td bgColor=#ffffff>秒 0 ~ 59</td>
                    </tr>
                    <tr>
                        <td bgColor=#ffffff>Millisecond</td>
                        <td bgColor=#ffffff>Ms</td>
                        <td bgColor=#ffffff>-</td>
                        <td bgColor=#ffffff>毫秒 0 ~ 999</td>
                    </tr>
                </tbody>
            </table>
            </div>
            <div class=articleText><br></div>
            </td>
        </tr>
        <tr>
            <td>
            <div id=extInfor></div>
            </td>
        </tr>
    </tbody>
</table>
<img src ="http://www.blogjava.net/hilor/aggbug/135521.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/hilor/" target="_blank">hilor</a> 2007-08-09 15:48 <a href="http://www.blogjava.net/hilor/articles/135521.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>JSP中年、日、月，周访问量统计方法</title><link>http://www.blogjava.net/hilor/articles/135486.html</link><dc:creator>hilor</dc:creator><author>hilor</author><pubDate>Thu, 09 Aug 2007 06:11:00 GMT</pubDate><guid>http://www.blogjava.net/hilor/articles/135486.html</guid><wfw:comment>http://www.blogjava.net/hilor/comments/135486.html</wfw:comment><comments>http://www.blogjava.net/hilor/articles/135486.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.blogjava.net/hilor/comments/commentRss/135486.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/hilor/services/trackbacks/135486.html</trackback:ping><description><![CDATA[&nbsp;<font color=#333333>&nbsp;</font> <font color=#333333>学习笔记：年、日、月，周访问量统计 <br>&nbsp;&nbsp;&nbsp;&nbsp;看了champion的文章《灵活的计数器的设计与实现》与源码，（这篇文章在 <a href="http://champion.ewuxi.com/old/opensource/my/count.htm">http://champion.ewuxi.com/old/opensource/my/count.htm</a>），就做了这个练习。用session来计数，它是将访问量保存在一个xml文件中，读写xml文件用的是Castor。<br><br></font><font color=#333333>一、这是jsp调用页testcount.jsp <br><br>&lt;%@&nbsp;page&nbsp;import="java.util.Date"&nbsp;%&gt; <br>&lt;%@&nbsp;page&nbsp;import="count.CountXml"&nbsp;%&gt; <br><br>计算器测试&lt;br&gt; <br>&lt;% <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CountXml&nbsp;xmlcount=CountXml.getInstance(); <br>&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(session.isNew()){<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;xmlcount.addcount(new&nbsp;Date());//增加访问量 <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;int&nbsp;n&nbsp;=xmlcount.getTotalCount();//取总访问量&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;count=Integer.toString(n); <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;session.putValue("count",count);&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;<br></font><font color=#333333><br>%&gt; <br>您是第&lt;font&nbsp;color="red"&gt;&lt;%=session.getValue("count")%&gt;&lt;/font&gt;位访问者&nbsp;&lt;br&gt;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp; <br>总访问量：&nbsp;&nbsp;&lt;%=xmlcount.getTotalCount()&nbsp;%&gt;&lt;br&gt; <br>本年访问量：&lt;%=xmlcount.getYearCount()&nbsp;%&gt;&lt;br&gt; <br>本月访问量：&lt;%=xmlcount.getMonthCount()&nbsp;%&gt;&lt;br&gt; <br>本周访问量：&lt;%=xmlcount.getWeekCount()&nbsp;%&gt;&lt;br&gt; <br>本日访问量：&lt;%=xmlcount.getDayCount()&nbsp;%&gt;&lt;br&gt; <br><br>二、用到的两个类 <br>1、CountXml.java <br><br>package&nbsp;count; <br><br>import&nbsp;java.io.File; <br>import&nbsp;java.io.FileReader; <br>import&nbsp;java.io.FileWriter; <br>import&nbsp;java.io.InputStream; <br>import&nbsp;java.util.Properties; <br>import&nbsp;java.util.Date; <br>import&nbsp;java.text.SimpleDateFormat; <br>import&nbsp;java.util.Calendar; <br><br><br>import&nbsp;org.exolab.castor.xml.Marshaller; <br>import&nbsp;org.exolab.castor.xml.Unmarshaller; <br><br>public&nbsp;class&nbsp;CountXml{ <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;private&nbsp;String&nbsp;fileName&nbsp;=&nbsp;"h:\\Tomcat&nbsp;5.0\\webapps\\zz3zcwbwebhome\\WEB-INF\\xmlcount.xml"; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; private&nbsp;static&nbsp;CountObjectInf&nbsp;obj=null; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;private&nbsp;static&nbsp;CountXml&nbsp;instance=null; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;static&nbsp;CountXml&nbsp;getInstance(){ <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(instance==null){ <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;instance=new&nbsp;CountXml(); <br>&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;return&nbsp;instance; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} <br><br>private&nbsp;CountXml()&nbsp;{ <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;try{ <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;obj=read(fileName); <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}catch(Exception&nbsp;e){ <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(e); <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br><br>} <br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;int&nbsp;getTotalCount(){ <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;obj.getTotalCount(); <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} <br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;int&nbsp;getDayCount()&nbsp;{ <br>return&nbsp;obj.getDayCount(); <br>} <br><br><br>public&nbsp;int&nbsp;getMonthCount()&nbsp;{ <br>return&nbsp;obj.getMonthCount(); <br>} <br><br><br>public&nbsp;int&nbsp;getWeekCount()&nbsp;{ <br>return&nbsp;obj.getWeekCount(); <br>} <br><br><br>public&nbsp;int&nbsp;getYearCount()&nbsp;{ <br>return&nbsp;obj.getYearCount(); <br>} <br><br>public&nbsp;synchronized&nbsp;void&nbsp;addcount(Date&nbsp;da){//比较日期增加计数 <br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(new&nbsp;SimpleDateFormat("yyyy-MM-dd").format(this.obj.date) <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;.equals(new&nbsp;SimpleDateFormat("yyyy-MM-dd").format(da))) <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;this.obj.setDayCount(this.obj.getDayCount()&nbsp;+&nbsp;1); <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;this.obj.setDayCount(1); <br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(new&nbsp;SimpleDateFormat("yyyy-MM").format(this.obj.date) <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;.equals(new&nbsp;SimpleDateFormat("yyyy-MM").format(da))) <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;this.obj.setMonthCount(this.obj.getMonthCount()&nbsp;+&nbsp;1); <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;obj.setMonthCount(1); <br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Calendar&nbsp;ca&nbsp;=&nbsp;Calendar.getInstance(); <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ca.setTime(da); <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ca.setFirstDayOfWeek(Calendar.MONDAY); <br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(ca.get(Calendar.DAY_OF_WEEK)&nbsp;==&nbsp;Calendar.MONDAY&nbsp;&amp;&amp;&nbsp;!new&nbsp;SimpleDateFormat("yyyy-MM-dd").format(this.obj.date).equals(new&nbsp;SimpleDateFormat("yyyy-MM-dd").format(da))) <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;obj.setWeekCount(1); <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;obj.setWeekCount(obj.getWeekCount()&nbsp;+&nbsp;1); <br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(new&nbsp;SimpleDateFormat("yyyy").format(this.obj.date) <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;.equals(new&nbsp;SimpleDateFormat("yyyy").format(da))) <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;this.obj.setYearCount(this.obj.getYearCount()&nbsp;+&nbsp;1); <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;obj.setYearCount(1); <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;obj.setDate(da); <br><br>&nbsp;&nbsp;&nbsp;obj.setTotalCount(obj.getTotalCount()+1);&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;obj.setTempCount(obj.getTempCount()+1); <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(obj.getTempCount()&gt;=20){//只有当临时访问量大于等于20时才保存一次 <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;obj.setTempCount(0);//临时计数器置0 <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;write(fileName); <br>&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;} <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} <br><br>private&nbsp;void&nbsp;write(String&nbsp;fileName)&nbsp;{ <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;try&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;FileWriter&nbsp;writer&nbsp;=&nbsp;new&nbsp;FileWriter(fileName); <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;Marshaller.marshal(obj,&nbsp;writer); <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;writer.close(); <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;catch&nbsp;(Exception&nbsp;e)&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;System.out.println(e); <br><br>&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;} <br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;private&nbsp;CountObjectInf&nbsp;read(String&nbsp;fileName)&nbsp;throws&nbsp;Exception&nbsp;{ <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;FileReader&nbsp;reader&nbsp;=&nbsp;new&nbsp;FileReader(fileName); <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CountObjectInf&nbsp;result&nbsp;=&nbsp;(CountObjectInf)&nbsp; <br><br>Unmarshaller.unmarshal(CountObjectInf.class,&nbsp;reader); <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;reader.close(); <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;result; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} <br>} <br><br>2、 <br><br>package&nbsp;count; <br><br>import&nbsp;java.util.Date; <br>public&nbsp;class&nbsp;CountObjectInf&nbsp;{ <br>// 总访问量合计 <br>protected&nbsp;int&nbsp;totalCount&nbsp;=&nbsp;0; <br>//日访问量 <br>protected&nbsp;int&nbsp;dayCount&nbsp;=&nbsp;0; <br>//周访问量 <br>protected&nbsp;int&nbsp;weekCount&nbsp;=&nbsp;0; <br>// 月访问量 <br>protected&nbsp;int&nbsp;monthCount&nbsp;=&nbsp;0; <br>//年访问量 <br>protected&nbsp;int&nbsp;yearCount&nbsp;=&nbsp;0; <br><br>//临时访问量 <br>protected&nbsp;int&nbsp;tempCount=0; <br><br>protected&nbsp;Date&nbsp;date&nbsp;=new&nbsp;Date(); <br><br>/** <br>&nbsp;*&nbsp;@return <br>&nbsp;*/ <br>public&nbsp;int&nbsp;getDayCount()&nbsp;{ <br>return&nbsp;dayCount; <br>} <br><br>/** <br>&nbsp;*&nbsp;@return <br>&nbsp;*/ <br>public&nbsp;int&nbsp;getMonthCount()&nbsp;{ <br>return&nbsp;monthCount; <br>} <br><br>/** <br>&nbsp;*&nbsp;@return <br>&nbsp;*/ <br>public&nbsp;int&nbsp;getTotalCount()&nbsp;{ <br>return&nbsp;totalCount; <br>} <br><br>/** <br>&nbsp;*&nbsp;@return <br>&nbsp;*/ <br>public&nbsp;int&nbsp;getWeekCount()&nbsp;{ <br>return&nbsp;weekCount; <br>} <br><br>/** <br>&nbsp;*&nbsp;@return <br>&nbsp;*/ <br>public&nbsp;int&nbsp;getYearCount()&nbsp;{ <br>return&nbsp;yearCount; <br>} <br><br>/** <br>&nbsp;*&nbsp;@param&nbsp;i <br>&nbsp;*/ <br>public&nbsp;void&nbsp;setDayCount(int&nbsp;i)&nbsp;{ <br>dayCount&nbsp;=&nbsp;i; <br>} <br><br>/** <br>&nbsp;*&nbsp;@param&nbsp;i <br>&nbsp;*/ <br>public&nbsp;void&nbsp;setMonthCount(int&nbsp;i)&nbsp;{ <br>monthCount&nbsp;=&nbsp;i; <br>} <br><br>/** <br>&nbsp;*&nbsp;@param&nbsp;i <br>&nbsp;*/ <br>public&nbsp;void&nbsp;setTotalCount(int&nbsp;i)&nbsp;{ <br>totalCount&nbsp;=&nbsp;i; <br>} <br><br>/** <br>&nbsp;*&nbsp;@param&nbsp;i <br>&nbsp;*/ <br>public&nbsp;void&nbsp;setWeekCount(int&nbsp;i)&nbsp;{ <br>&nbsp;&nbsp;weekCount&nbsp;=&nbsp;i; <br>} <br><br>/** <br>&nbsp;*&nbsp;@param&nbsp;i <br>&nbsp;*/ <br>public&nbsp;void&nbsp;setYearCount(int&nbsp;i)&nbsp;{ <br>&nbsp;&nbsp;yearCount&nbsp;=&nbsp;i; <br>} <br><br><br><br>/** <br>&nbsp;*&nbsp;@return <br>&nbsp;*/ <br>public&nbsp;Date&nbsp;getDate()&nbsp;{ <br>&nbsp;&nbsp;return&nbsp;date; <br>} <br><br>/** <br>&nbsp;*&nbsp;@param&nbsp;date <br>&nbsp;*/ <br>public&nbsp;void&nbsp;setDate(Date&nbsp;date)&nbsp;{ <br>&nbsp;&nbsp;this.date&nbsp;=&nbsp;date; <br>} <br><br>/** <br>&nbsp;*&nbsp;@return <br>&nbsp;*/ <br>public&nbsp;int&nbsp;getTempCount()&nbsp;{ <br>&nbsp;&nbsp;&nbsp;return&nbsp;tempCount; <br>} <br><br>/** <br>&nbsp;*&nbsp;@param&nbsp;i <br>&nbsp;*/ <br>public&nbsp;void&nbsp;setTempCount(int&nbsp;i)&nbsp;{ <br>&nbsp;&nbsp;tempCount&nbsp;=&nbsp;i; <br>} <br><br>} <br></font>
<img src ="http://www.blogjava.net/hilor/aggbug/135486.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/hilor/" target="_blank">hilor</a> 2007-08-09 14:11 <a href="http://www.blogjava.net/hilor/articles/135486.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>List list = new ArrayList()与ArrayList list = new ArrayList();的区别</title><link>http://www.blogjava.net/hilor/articles/135217.html</link><dc:creator>hilor</dc:creator><author>hilor</author><pubDate>Wed, 08 Aug 2007 05:00:00 GMT</pubDate><guid>http://www.blogjava.net/hilor/articles/135217.html</guid><wfw:comment>http://www.blogjava.net/hilor/comments/135217.html</wfw:comment><comments>http://www.blogjava.net/hilor/articles/135217.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/hilor/comments/commentRss/135217.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/hilor/services/trackbacks/135217.html</trackback:ping><description><![CDATA[说完泛型参数之后,顺便再说一下List list = new ArrayList()与ArrayList list = new ArrayList();的区别.<br>List是一个接口，而ListArray是一个类。 ListArray继承并实现了List。<br>List&nbsp;list&nbsp;=&nbsp;new&nbsp;ArrayList();这句创建了一个ArrayList的对象后把上溯到了List。此时它是一个List对象了，有些ArrayList有但是List没有的属性和方法，它就不能再用了。而ArrayList&nbsp;list=new&nbsp;ArrayList();创建一对象则保留了ArrayList的所有属性。<br>为什么一般都使用&nbsp;List&nbsp;list&nbsp;=&nbsp;new&nbsp;ArrayList()&nbsp;,而不用&nbsp;ArrayList&nbsp;alist&nbsp;=&nbsp;new&nbsp;ArrayList()呢？ <br>问题就在于List有多个实现类，现在你用的是ArrayList，也许哪一天你需要换成其它的实现类，如&nbsp;LinkedList或者Vector等等，这时你只要改变这一行就行了：List&nbsp;list&nbsp;=&nbsp;new&nbsp;LinkedList();&nbsp;其它使用了list地方的代码根本不需要改动。假设你开始用&nbsp;ArrayList&nbsp;alist&nbsp;=&nbsp;new&nbsp;ArrayList(),&nbsp;这下你有的改了，特别是如果你使用了&nbsp;ArrayList特有的方法和属性。&nbsp; 所以建议大家,如果没有特别需求的话,最好使用List&nbsp;list&nbsp;=&nbsp;new&nbsp;LinkedList();&nbsp;,便于程序代码的重构.<img src ="http://www.blogjava.net/hilor/aggbug/135217.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/hilor/" target="_blank">hilor</a> 2007-08-08 13:00 <a href="http://www.blogjava.net/hilor/articles/135217.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>ArrayList&lt;&gt; list=new ArrayList&lt;&gt;()中&lt;&gt;的作用</title><link>http://www.blogjava.net/hilor/articles/135214.html</link><dc:creator>hilor</dc:creator><author>hilor</author><pubDate>Wed, 08 Aug 2007 04:44:00 GMT</pubDate><guid>http://www.blogjava.net/hilor/articles/135214.html</guid><wfw:comment>http://www.blogjava.net/hilor/comments/135214.html</wfw:comment><comments>http://www.blogjava.net/hilor/articles/135214.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/hilor/comments/commentRss/135214.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/hilor/services/trackbacks/135214.html</trackback:ping><description><![CDATA[&lt;Employee&gt;是从JDK&nbsp;1.5开始才有的泛型(generic)参数，泛型参数是放在&#8220;&lt;&gt;&#8221;中的，从1.5开始所有的Collection类都增加了泛型参数。旨在强调类型安全，在使用中，list中只能添加Employee的对象，而不添加其他类型的对象，这样取出时就不必再用强制类型转换了。泛型参数只能是类的类型，而不能是基本类型。<br><br>说的通俗一点,&lt;&gt;中的参数是用来指定ArrayList里的元素的类型,可以是任意类. <br>例:&nbsp; 自定义一个VO类 Person.java<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;现在要把多个Person实例储存到List中,如果按照List person = new ArraryList();的写法,在Eclipse中就会发出警告:<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;类型安全：方法 add（Object）属于原始类型 List。应该将对通用类型 <br>&nbsp;List&lt;E&gt; 的引用参数化.&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;改成List&lt;Person&gt; person = new ArraryList&lt;Person&gt;();就OK了. 
<img src ="http://www.blogjava.net/hilor/aggbug/135214.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/hilor/" target="_blank">hilor</a> 2007-08-08 12:44 <a href="http://www.blogjava.net/hilor/articles/135214.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>文件上传组件的应用与编写</title><link>http://www.blogjava.net/hilor/articles/135020.html</link><dc:creator>hilor</dc:creator><author>hilor</author><pubDate>Tue, 07 Aug 2007 09:41:00 GMT</pubDate><guid>http://www.blogjava.net/hilor/articles/135020.html</guid><wfw:comment>http://www.blogjava.net/hilor/comments/135020.html</wfw:comment><comments>http://www.blogjava.net/hilor/articles/135020.html#Feedback</comments><slash:comments>4</slash:comments><wfw:commentRss>http://www.blogjava.net/hilor/comments/commentRss/135020.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/hilor/services/trackbacks/135020.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 第1章文件上传组件的应用与编写在许多Web站点应用中都需要为用户提供通过浏览器上传文档资料的功能，例如，上传邮件附件、个人相片、共享资料等。对文件上传功能，在浏览器端提供了较好的支持，只要将FORM表单的enctype属性设置为&#8220;multipart/form-data&#8221;即可；但在Web服务器端如何获取浏览器上传的文件，需要进行复杂的编程处理。为了简化和帮助Web开发人员...&nbsp;&nbsp;<a href='http://www.blogjava.net/hilor/articles/135020.html'>阅读全文</a><img src ="http://www.blogjava.net/hilor/aggbug/135020.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/hilor/" target="_blank">hilor</a> 2007-08-07 17:41 <a href="http://www.blogjava.net/hilor/articles/135020.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>JSP实现文件下载</title><link>http://www.blogjava.net/hilor/articles/134983.html</link><dc:creator>hilor</dc:creator><author>hilor</author><pubDate>Tue, 07 Aug 2007 07:42:00 GMT</pubDate><guid>http://www.blogjava.net/hilor/articles/134983.html</guid><wfw:comment>http://www.blogjava.net/hilor/comments/134983.html</wfw:comment><comments>http://www.blogjava.net/hilor/articles/134983.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/hilor/comments/commentRss/134983.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/hilor/services/trackbacks/134983.html</trackback:ping><description><![CDATA[jsp中实现文件下载的最简单的方式是在网页上做超级链接，如：&lt;a href="music/abc.mp3"&gt;点击下载&lt;/a&gt;。但是这样服务器上的目录资源会直接暴露给最终用户，会给网站带来一些不安全的因素。因此可以采用其它方式实现下载，可以采用：1、RequestDispatcher的方式进行；2、采用文件流输出的方式下载。
<p>1、采用RequestDispatcher的方式进行</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; jsp页面中添加如下代码：<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;%<br>&nbsp;&nbsp;&nbsp;&nbsp; response.setContentType("application/x-download");//设置为下载application/x-download<br>&nbsp;&nbsp;&nbsp;&nbsp; String filedownload = "/要下载的文件名";//即将下载的文件的相对路径<br>&nbsp;&nbsp;&nbsp;&nbsp; String filedisplay = "最终要显示给用户的保存文件名";//下载文件时显示的文件保存名称<br>&nbsp;&nbsp;&nbsp;&nbsp; filenamedisplay = URLEncoder.encode(filedisplay,"UTF-8");<br>&nbsp;&nbsp;&nbsp;&nbsp; response.addHeader("Content-Disposition","attachment;filename=" + filedisplay);<br>&nbsp;&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp; try<br>&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; RequestDispatcher dis = application.getRequestDispatcher(filedownload);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(dis!= null)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; dis.forward(request,response);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; response.flushBuffer();<br>&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp; catch(Exception e)<br>&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; e.printStackTrace();<br>&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp; finally<br>&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp; }<br>%&gt;</p>
<p>2、采用文件流输出的方式下载</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;%@page language="java" contentType="application/x-msdownload"&nbsp;&nbsp; pageEncoding="gb2312"%&gt;&lt;%<br>&nbsp;&nbsp;&nbsp;&nbsp; //关于文件下载时采用文件流输出的方式处理：<br>&nbsp;&nbsp;&nbsp;&nbsp; //加上response.reset()，并且<strong><em>所有的％&gt;后面不要换行，包括最后一个</em></strong>；<br><br>&nbsp;&nbsp;&nbsp;&nbsp; response.reset();//可以加也可以不加<br>&nbsp;&nbsp;&nbsp;&nbsp; response.setContentType("application/x-download");<br>&nbsp;&nbsp;&nbsp;&nbsp; String filedownload = "想办法找到要提供下载的文件的物理路径＋文件名";<br>&nbsp;&nbsp;&nbsp;&nbsp; String filedisplay = "给用户提供的下载文件名";<br>&nbsp;&nbsp;&nbsp;&nbsp; filedisplay = URLEncoder.encode(filedisplay,"UTF-8");<br>&nbsp;&nbsp;&nbsp;&nbsp; response.addHeader("Content-Disposition","attachment;filename=" + filedisplay);<br><br>&nbsp;&nbsp;&nbsp;&nbsp; OutputStream outp = null;<br>&nbsp;&nbsp;&nbsp;&nbsp; FileInputStream in = null;<br>&nbsp;&nbsp;&nbsp;&nbsp; try<br>&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; outp = response.getOutputStream();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; in = new FileInputStream(filenamedownload);<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; byte[] b = new byte[1024];<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int i = 0;<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; while((i = in.read(b)) &gt; 0)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; outp.write(b, 0, i);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; outp.flush();<br>&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp; catch(Exception e)<br>&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println("Error!");<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; e.printStackTrace();<br>&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp; finally<br>&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(in != null)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; in.close();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; in = null;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(outp != null)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; outp.close();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; outp = null;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp; }<br>%&gt;</p>
<div>&nbsp;</div>
<div>另外</div>
<div>&nbsp;</div>
<div>
<p>要作一个jsp文件上传和下载的东东，上传使用的是jspsmartupload,采用的方法是将文件上传至一个目录下(c:\tomcat\webapps\root\upload),然后将文件名存入到数据库中，页面显示时从数据库中读出文件名，其下载链接直接指向upload目录，但是如果文件名是中文时，下载会出现乱码，在网上找了好多资料，终于找到了解决的办法</p>
<p>下载页面 test.jsp</p>
<p>&#160;</p>
<p><a href="http://publishblog.bokee.com/control/blog/testdown.jsp?filename=%3C%=name%"><u><font color=#800080>下载</font></u></a></p>
<p>操作页面testdown.jsp</p>
<p>&lt;%<br>&nbsp; java.io.BufferedInputStream bis=null;<br>&nbsp; java.io.BufferedOutputStream&nbsp; bos=null;<br>&nbsp;try<br>&nbsp;{<br>&nbsp;&nbsp;&nbsp;String filename=request.getParameter("filename");<br>&nbsp;&nbsp;&nbsp; filename=new String(filename.getBytes("iso8859-1"),"gb2312");<br>&nbsp;&nbsp;&nbsp;response.setContentType("application/x-msdownload");<br>&nbsp;&nbsp;&nbsp;response.setHeader("Content-disposition","attachment; "+<br>&nbsp;&nbsp;&nbsp;&nbsp;"filename="+new String(filename.getBytes("gb2312"),"iso8859-1"));<br>&nbsp;&nbsp;String filepath = "C:\\Tomcat\\webapps\\lynews\\upload\\";<br>&nbsp;&nbsp;&nbsp;bis =new java.io.BufferedInputStream(new java.io.FileInputStream("+<br>&nbsp;&nbsp;&nbsp;&nbsp;"config.getServletContext().getRealPath("files/" +filepath+ filename)));<br>&nbsp;&nbsp;&nbsp;bos=new java.io.BufferedOutputStream(response.getOutputStream());<br>&nbsp;&nbsp;&nbsp;byte[] buff = new byte[2048];<br>&nbsp;&nbsp;&nbsp;int bytesRead;<br>&nbsp;&nbsp;&nbsp;while(-1 != (bytesRead = bis.read(buff, 0, buff.length)))<br>&nbsp;&nbsp;&nbsp;{<br>&nbsp; &nbsp;&nbsp;bos.write(buff,0,bytesRead);<br>&nbsp;&nbsp;&nbsp;}<br>&nbsp;}<br>&nbsp;catch(Exception e)<br>&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;e.printStackTrace();<br>&nbsp;}<br>&nbsp;finally<br>&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;if(bis != null)bis.close();<br>&nbsp;&nbsp;&nbsp;&nbsp;if(bos != null)bos.close();<br>&nbsp;}<br>%&gt;</p>
</div>
<img src ="http://www.blogjava.net/hilor/aggbug/134983.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/hilor/" target="_blank">hilor</a> 2007-08-07 15:42 <a href="http://www.blogjava.net/hilor/articles/134983.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>利用apache-commons-fileupload写jsp上传文件</title><link>http://www.blogjava.net/hilor/articles/134962.html</link><dc:creator>hilor</dc:creator><author>hilor</author><pubDate>Tue, 07 Aug 2007 06:33:00 GMT</pubDate><guid>http://www.blogjava.net/hilor/articles/134962.html</guid><wfw:comment>http://www.blogjava.net/hilor/comments/134962.html</wfw:comment><comments>http://www.blogjava.net/hilor/articles/134962.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/hilor/comments/commentRss/134962.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/hilor/services/trackbacks/134962.html</trackback:ping><description><![CDATA[需要下载fileupload和beanutils两个包，<br>下载地址: http://commons.apache.org/downloads/download_fileupload.cgi<br>代码如下。
<div class=code>&lt;%@&nbsp;page&nbsp;language="java"&nbsp;contentType="text/html;charset=gb2312"%&gt;
<p>&lt;%@&nbsp;page&nbsp;import="java.util.*"%&gt;</p>
<p>&lt;%@&nbsp;page&nbsp;import="java.io.*"%&gt;</p>
<p>&lt;%@&nbsp;page&nbsp;import="org.apache.commons.fileupload.*"%&gt;</p>
<p>&lt;%!<br>String&nbsp;Mkdir(String&nbsp;path)&nbsp;{</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;msg=null;<br>&nbsp;&nbsp;&nbsp;&nbsp;java.io.File&nbsp;dir;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;新建文件对象<br>&nbsp;&nbsp;&nbsp;&nbsp;dir&nbsp;=new&nbsp;java.io.File(path);<br>&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(dir&nbsp;==&nbsp;null)&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;msg&nbsp;=&nbsp;"错误原因:&lt;BR&gt;对不起，不能创建空目录！";<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;msg;<br>&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(dir.isFile())&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;msg&nbsp;=&nbsp;"错误原因:&lt;BR&gt;已有同名文件&lt;B&gt;"&nbsp;+&nbsp;dir.getAbsolutePath()&nbsp;+&nbsp;"&lt;/B&gt;存在。";<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;msg;<br>&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(!dir.exists())&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;boolean&nbsp;result&nbsp;=&nbsp;dir.mkdirs();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(result&nbsp;==&nbsp;false)&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;msg&nbsp;=&nbsp;"错误原因:&lt;BR&gt;目录&lt;b&gt;"&nbsp;+&nbsp;dir.getAbsolutePath()&nbsp;+&nbsp;"&lt;/B&gt;创建失败，原因不明！";<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;msg;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;如果成功创建目录，则无输出。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;msg&nbsp;="成功创建目录:&nbsp;&lt;B&gt;"&nbsp;+&nbsp;dir.getAbsolutePath()&nbsp;+&nbsp;"&lt;/B&gt;";<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;msg;<br>&nbsp;&nbsp;&nbsp;&nbsp;}else&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;&nbsp;&nbsp;&nbsp;msg&nbsp;=&nbsp;"错误原因:&lt;BR&gt;目录&lt;b&gt;"&nbsp;+&nbsp;dir.getAbsolutePath()&nbsp;+&nbsp;"&lt;/b&gt;已存在。";<br>&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;msg;<br>}<br>String&nbsp;getCurDate(){<br>&nbsp;&nbsp;&nbsp;&nbsp;GregorianCalendar&nbsp;gcDate&nbsp;=&nbsp;new&nbsp;GregorianCalendar();&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;int&nbsp;year&nbsp;&nbsp;=&nbsp;gcDate.get(GregorianCalendar.YEAR);<br>&nbsp;&nbsp;&nbsp;&nbsp;int&nbsp;month&nbsp;=&nbsp;gcDate.get(GregorianCalendar.MONTH);<br>&nbsp;&nbsp;&nbsp;&nbsp;int&nbsp;day&nbsp;&nbsp;&nbsp;=&nbsp;gcDate.get(GregorianCalendar.DAY_OF_MONTH);<br>&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;""+year+month+day;<br>}<br>%&gt;&nbsp;<br>&lt;%<br>&nbsp;String&nbsp;msg&nbsp;="";<br>&nbsp;String&nbsp;img=null;</p>
<p>&nbsp;DiskFileUpload&nbsp;fu&nbsp;=&nbsp;new&nbsp;DiskFileUpload();<br>&nbsp;//&nbsp;设置允许用户上传文件大小,单位:字节<br>&nbsp;fu.setSizeMax(10000000);<br>&nbsp;//&nbsp;maximum&nbsp;size&nbsp;that&nbsp;will&nbsp;be&nbsp;stored&nbsp;in&nbsp;memory?<br>&nbsp;//&nbsp;设置最多只允许在内存中存储的数据,单位:字节<br>&nbsp;fu.setSizeThreshold(4096);<br>&nbsp;//&nbsp;设置一旦文件大小超过getSizeThreshold()的值时数据存放在硬盘的目录<br>&nbsp;fu.setRepositoryPath("/tmp");<br>&nbsp;//开始读取上传信息</p>
<p>&nbsp;List&nbsp;fileItems&nbsp;=&nbsp;fu.parseRequest(request);</p>
<p>&nbsp;//&nbsp;依次处理每个上传的文件<br>&nbsp;Iterator&nbsp;iter&nbsp;=&nbsp;fileItems.iterator();<br>&nbsp;String&nbsp;updir="/dbweb/upics/";<br>&nbsp;String&nbsp;updir2="/upics/";<br>&nbsp;String&nbsp;curdate=getCurDate();<br>&nbsp;String&nbsp;filepath&nbsp;=&nbsp;getServletContext().getRealPath(updir2)+"/"+curdate;//<ins>&lt;---好象在tomcat下getrealpath有点问题</ins><br>&nbsp;String&nbsp;opmsg&nbsp;=&nbsp;Mkdir(filepath);<br>&nbsp;if(&nbsp;opmsg&nbsp;==&nbsp;null)&nbsp;{</p>
<p>&nbsp;while&nbsp;(iter.hasNext())&nbsp;{<br>&nbsp;&nbsp;FileItem&nbsp;item&nbsp;=&nbsp;(FileItem)&nbsp;iter.next();<br>&nbsp;&nbsp;//忽略其他不是文件域的所有表单信息<br>&nbsp;&nbsp;if&nbsp;(!item.isFormField())&nbsp;{<br>&nbsp;&nbsp;&nbsp;String&nbsp;name&nbsp;=&nbsp;item.getName();<br>&nbsp;&nbsp;&nbsp;long&nbsp;size&nbsp;=&nbsp;item.getSize();<br>&nbsp;&nbsp;&nbsp;if((name==null||name.equals(""))&nbsp;&amp;&amp;&nbsp;size==0)<br>&nbsp;&nbsp;&nbsp;continue;<br>&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;注意item.getName()<br>&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;会返回上载文件在客户端的完整路径名称，这似乎是一个BUG。<br>&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;为解决这个问题，这里使用了fullFile.getName()。<br>&nbsp;&nbsp;&nbsp;&nbsp;name=name.replace('\\','/');<br>&nbsp;&nbsp;&nbsp;&nbsp;File&nbsp;fullFile&nbsp;=&nbsp;new&nbsp;File(name);&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;File&nbsp;savedFile&nbsp;=&nbsp;new&nbsp;File(filepath,fullFile.getName());<br>&nbsp;&nbsp;&nbsp;&nbsp;item.write(savedFile);<br>&nbsp;&nbsp;&nbsp;&nbsp;msg="&lt;img&nbsp;alt='"+fullFile.getName()+"'&nbsp;src='"+updir+curdate+"/"+fullFile.getName()+"'&nbsp;/&gt;";<br>&nbsp;&nbsp;&nbsp;&nbsp;img="&lt;img&nbsp;alt='"+fullFile.getName()+"'&nbsp;src='"+updir+curdate+"/"+fullFile.getName()+"'&nbsp;/&gt;";<br>&nbsp;&nbsp;}<br>&nbsp;}<br>}//opmsg=null<br>%&gt;<br></p>
</div>
<img src ="http://www.blogjava.net/hilor/aggbug/134962.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/hilor/" target="_blank">hilor</a> 2007-08-07 14:33 <a href="http://www.blogjava.net/hilor/articles/134962.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>JSP中发送邮件(简化JavaMail)</title><link>http://www.blogjava.net/hilor/articles/134961.html</link><dc:creator>hilor</dc:creator><author>hilor</author><pubDate>Tue, 07 Aug 2007 06:31:00 GMT</pubDate><guid>http://www.blogjava.net/hilor/articles/134961.html</guid><wfw:comment>http://www.blogjava.net/hilor/comments/134961.html</wfw:comment><comments>http://www.blogjava.net/hilor/articles/134961.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/hilor/comments/commentRss/134961.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/hilor/services/trackbacks/134961.html</trackback:ping><description><![CDATA[Jakarta发布了Commons Emails 1.0 released 版本，目的是为了简化JavaMail。<br><br>知道有它几个class吗？你一定想不到，只有8个！<br><br>好了，开始我们的jakarta commons emails 之旅：）<br><br>一：Quick Start<br>通过SimpleEmail发送邮件<br>
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><span style="COLOR: #008080">1</span><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top><span style="COLOR: #000000">java.lang.Object<br></span><span style="COLOR: #008080">2</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;org.apache.commons.mail.Email<br></span><span style="COLOR: #008080">3</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;org.apache.commons.mail.SimpleEmail</span></div>
<br>
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><span style="COLOR: #008080">1</span><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top><span style="COLOR: #000000">SimpleEmail&nbsp;email&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000">&nbsp;SimpleEmail();<br></span><span style="COLOR: #008080">2</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>email.setHostName(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">mail.4ya.cn</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">);<br></span><span style="COLOR: #008080">3</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>email.setAuthentication(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">&lt;username&gt;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">,</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">&lt;password&gt;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">)<br></span><span style="COLOR: #008080">4</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>email.addTo(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">martin.xus@gmail.com</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">,&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">martin</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">);<br></span><span style="COLOR: #008080">5</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>email.setFrom(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">martin@4ya.cn</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">,&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">martin</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">);<br></span><span style="COLOR: #008080">6</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>email.setSubject(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">测试主题</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">);<br></span><span style="COLOR: #008080">7</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>email.setMsg(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">这里是邮件内容</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">);<br></span><span style="COLOR: #008080">8</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>email.send();</span></div>
<br>就如代码里字面上的意思一样简单:<br>1：创建以SimpleEmail对象<br>2：设定发送信件的smtp服务器，如果没有设定，会寻找系统变量中mail.host值。<br>3：设定smtp的用户和密码<br>4：收件人<br>5：发件人<br>6：主题<br>7：内容<br>8：发送<br><br>二：发送带附件的邮件<br>我们可以发送本机的附件，当然我们也可以发送非本机的附件，如果发送的是一个存在网络上的附件的url,则邮件发送的时候会自动下载，添加到附件中。<br><br>&nbsp;&nbsp; 1：）发送本地附件：<br>
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><span style="COLOR: #008080">1</span><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top><span style="COLOR: #000000">EmailAttachment&nbsp;attachment&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000">&nbsp;EmailAttachment();<br></span><span style="COLOR: #008080">2</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>attachment.setPath(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">test/test.rar</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">);<br></span><span style="COLOR: #008080">3</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>attachment.setDisposition(EmailAttachment.ATTACHMENT);<br></span><span style="COLOR: #008080">4</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>attachment.setDescription(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">python&nbsp;resource</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">);<br></span><span style="COLOR: #008080">5</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>attachment.setName(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">resource</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">);</span></div>
<br>&nbsp;&nbsp; 2：）发送不存在本地的附件<br>
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><span style="COLOR: #008080">1</span><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top><span style="COLOR: #000000">EmailAttachment&nbsp;attachment&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000">&nbsp;EmailAttachment();<br></span><span style="COLOR: #008080">2</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>attachment.setURL(</span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000">&nbsp;URL(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">http://www.smilinglibrary.org/sldoc/pics/index03.jpg</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">));<br></span><span style="COLOR: #008080">3</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>attachment.setDisposition(EmailAttachment.ATTACHMENT);<br></span><span style="COLOR: #008080">4</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>attachment.setDescription(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">微笑图书馆</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">);<br></span><span style="COLOR: #008080">5</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>attachment.setName(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">微笑图书馆</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">);</span></div>
<br><br>next,添加附件到我们的邮件中<br>
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><span style="COLOR: #008080">&nbsp;1</span><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top><span style="COLOR: #000000">MultiPartEmail&nbsp;email&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000">&nbsp;MultiPartEmail();<br></span><span style="COLOR: #008080">&nbsp;2</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>email.setHostName(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">mail.4ya.cn</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">);<br>&nbsp;3&nbsp;&nbsp;&nbsp; email.setAuthentication(<span style="COLOR: #000000">"</span><span style="COLOR: #000000">&lt;username&gt;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">,</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">&lt;password&gt;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">)</span><br></span><span style="COLOR: #008080">&nbsp;4</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>email.addTo(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">martin.xus@gmail.com</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">,&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">martin</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">);<br></span><span style="COLOR: #008080">&nbsp;5</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>email.setFrom(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">martin@4ya.cn</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">,&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">martin</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">);<br></span><span style="COLOR: #008080">&nbsp;6</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>email.setSubject(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">邮件主题</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">);<br></span><span style="COLOR: #008080">&nbsp;7</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>email.setMsg(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">邮件内容</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">);<br></span><span style="COLOR: #000000"><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top><br></span><span style="COLOR: #008080">&nbsp;8</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">添加附件</span><span style="COLOR: #008000"><br></span><span style="COLOR: #008080">&nbsp;9</span><span style="COLOR: #008000"><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #000000">email.attach(attachment);<br></span><span style="COLOR: #008080">10</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top><br></span><span style="COLOR: #008080">11</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">发送邮件</span><span style="COLOR: #008000"><br></span><span style="COLOR: #008080">12</span><span style="COLOR: #008000"><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #000000">email.send();</span></div>
<br>如果需要发送多个附件，只需创建多个EmailAttachement,即可<br>
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><span style="COLOR: #008080">1</span><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top><span style="COLOR: #000000">email.attach(attachment1)<br></span><span style="COLOR: #008080">2</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>email.attach(attachment2)</span></div>
<br>三：发送html格式的邮件<br>通过HtmlEmail我们可以发送Html格式的邮件：<br><br>
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><span style="COLOR: #008080">1</span><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top><span style="COLOR: #000000">java.lang.Object<br></span><span style="COLOR: #008080">2</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;org.apache.commons.mail.Email<br></span><span style="COLOR: #008080">3</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;org.apache.commons.mail.MultiPartEmail<br></span><span style="COLOR: #008080">4</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;org.apache.commons.mail.HtmlEmail<br></span><span style="COLOR: #008080">5</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top></span></div>
<br>如下：<br>
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><span style="COLOR: #008080">&nbsp;1</span><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top><span style="COLOR: #008000">//</span><span style="COLOR: #008000">HtmlEmail!</span><span style="COLOR: #008000"><br></span><span style="COLOR: #008080">&nbsp;2</span><span style="COLOR: #008000"><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #000000">HtmlEmail&nbsp;email&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000">&nbsp;HtmlEmail();<br></span><span style="COLOR: #008080">&nbsp;3</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>email.setHostName(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">mail.4ya.cn</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">);<br>&nbsp;3&nbsp;&nbsp;&nbsp;email.setAuthentication(<span style="COLOR: #000000">"</span><span style="COLOR: #000000">&lt;username&gt;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">,</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">&lt;password&gt;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">)</span><br></span><span style="COLOR: #008080">&nbsp;5</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>email.addTo("martin@4ya.cn</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">martin</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">);<br></span><span style="COLOR: #008080">&nbsp;6</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>email.setFrom("martin.xus@gmail.com</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">martin</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">);<br></span><span style="COLOR: #008080">&nbsp;7</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>email.setSubject(</span><span style="COLOR: #000000">"主题：该邮件包括html格式内容</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">);<br></span><span style="COLOR: #008080">&nbsp;</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top><br></span><span style="COLOR: #008080">&nbsp;8</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">&nbsp;embed&nbsp;the&nbsp;image&nbsp;and&nbsp;get&nbsp;the&nbsp;content&nbsp;id<br></span><span style="COLOR: #008080">&nbsp;9</span><span style="COLOR: #008000"><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">&nbsp;注意这里：embed&nbsp;将帮助我们创建标签如：cid:xxx&nbsp;url</span><span style="COLOR: #008000"><br></span><span style="COLOR: #008080">10</span><span style="COLOR: #008000"><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #000000">URL&nbsp;url&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000">&nbsp;URL(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">http://www.apache.org/images/asf_logo_wide.gif</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">);<br></span><span style="COLOR: #008080">11</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>String&nbsp;cid&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;email.embed(url,&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">Apache&nbsp;logo</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">);<br></span><span style="COLOR: #008080">12</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top><br></span><span style="COLOR: #008080">13</span><span style="COLOR: #000000"><img id=Codehighlighter1_419_557_Open_Image onclick="this.style.display='none'; Codehighlighter1_419_557_Open_Text.style.display='none'; Codehighlighter1_419_557_Closed_Image.style.display='inline'; Codehighlighter1_419_557_Closed_Text.style.display='inline';" src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedBlockStart.gif" align=top><img id=Codehighlighter1_419_557_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_419_557_Closed_Text.style.display='none'; Codehighlighter1_419_557_Open_Image.style.display='inline'; Codehighlighter1_419_557_Open_Text.style.display='inline';" src="http://www.blogjava.net/Images/OutliningIndicators/ContractedBlock.gif" align=top></span><span id=Codehighlighter1_419_557_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff">/**&nbsp;*/</span><span id=Codehighlighter1_419_557_Open_Text><span style="COLOR: #008000">/**</span><span style="COLOR: #008000"><br></span><span style="COLOR: #008080">14</span><span style="COLOR: #008000"><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top>set&nbsp;the&nbsp;html&nbsp;message<br></span><span style="COLOR: #008080">15</span><span style="COLOR: #008000"><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top>我们看到HtmlEmail&nbsp;extends&nbsp;Email的，它依然有setMsg()，但是这里发送的邮件包括了插入在邮件内容中的图片，所以不能在使用了setMsg(),而要以setHtmlMsg&nbsp;或setTextMsg代码<br></span><span style="COLOR: #008080">16</span><span style="COLOR: #008000"><img src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedBlockEnd.gif" align=top>*</span><span style="COLOR: #008000">*/</span></span><span style="COLOR: #000000"><br></span><span style="COLOR: #008080">17</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>email.setHtmlMsg(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">&lt;html&gt;The&nbsp;apache&nbsp;logo&nbsp;-&nbsp;&lt;img&nbsp;src=\</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">cid:</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">+cid+</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">\</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">&gt;&lt;/html&gt;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">);<br></span><span style="COLOR: #008080">18</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top><br></span><span style="COLOR: #008080">19</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">&nbsp;set&nbsp;the&nbsp;alternative&nbsp;message</span><span style="COLOR: #008000"><br></span><span style="COLOR: #008080">20</span><span style="COLOR: #008000"><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #000000">email.setTextMsg(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">Your&nbsp;email&nbsp;client&nbsp;does&nbsp;not&nbsp;support&nbsp;HTML&nbsp;messages</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">);<br></span><span style="COLOR: #008080">21</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top><br></span><span style="COLOR: #008080">22</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">set&nbsp;mail</span><span style="COLOR: #008000"><br></span><span style="COLOR: #008080">23</span><span style="COLOR: #008000"><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #000000">email.send();<br></span><span style="COLOR: #008080">24</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top></span></div>
<br>四：最后一步 <br><font face="Courier New">如果需要实现更复杂authenticator 你可以extends javax.mail.Authenticator</font> ,实现你自己的东西，然后调用<font face=Courier>Email.setAuthenticator(javax.mail.Authenticator&nbsp;newAuthenticator)即可<br><br>这一点jakarta也做了，给我们提供了一个defaultAuthenticator<br>
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><span style="COLOR: #008080">1</span><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top><span style="COLOR: #000000">java.lang.Object<br></span><span style="COLOR: #008080">2</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;javax.mail.Authenticator<br></span><span style="COLOR: #008080">3</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;org.apache.commons.mail.DefaultAuthenticator</span></div>
<br>覆盖掉该方法，实现你自己的东东 o_o<br>
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><span style="COLOR: #008080">1</span><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top><span style="COLOR: #0000ff">protected</span><span style="COLOR: #000000">&nbsp;javax.mail.PasswordAuthentication&nbsp;getPasswordAuthentication()</span></div>
<br></font>
<img src ="http://www.blogjava.net/hilor/aggbug/134961.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/hilor/" target="_blank">hilor</a> 2007-08-07 14:31 <a href="http://www.blogjava.net/hilor/articles/134961.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>