﻿<?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-morcble的blog-文章分类-Java</title><link>http://www.blogjava.net/fengliangjun/category/1649.html</link><description /><language>zh-cn</language><lastBuildDate>Fri, 15 Jan 2016 06:07:08 GMT</lastBuildDate><pubDate>Fri, 15 Jan 2016 06:07:08 GMT</pubDate><ttl>60</ttl><item><title>M-SYS 文档驱动软件设计方法</title><link>http://www.blogjava.net/fengliangjun/articles/429009.html</link><dc:creator>morcble的blog</dc:creator><author>morcble的blog</author><pubDate>Tue, 12 Jan 2016 07:26:00 GMT</pubDate><guid>http://www.blogjava.net/fengliangjun/articles/429009.html</guid><wfw:comment>http://www.blogjava.net/fengliangjun/comments/429009.html</wfw:comment><comments>http://www.blogjava.net/fengliangjun/articles/429009.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/fengliangjun/comments/commentRss/429009.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/fengliangjun/services/trackbacks/429009.html</trackback:ping><description><![CDATA[<div><strong style="color: red;">问题：</strong></div><div>在我们的软件立项阶段，我们通常会预估软件开发周期，成本预算，人员配置，版本迭代时间节点.</div><div>但是大量的软件研发在实际的操作上都不可能按我们计划顺利实施。</div><div>因为有很多综合的因素是人为不可控的，</div><div>1,不断变更的需求</div><div>最有可能导致软件研发失败的因素。客户本身不一定是软件专业人士，大多是用一堆可能互不相干的松散的功能点来讲诉他们所设想的软件。他们</div><div>需要什么样的软件和他们所能描述的可能差距很大。在研发的过程中，甚至交付阶段，客户也会不断的提出新需求和变更需求。</div><div>2,业务模型设计有误</div><div>需求调研不明确或者涉及到需求大的变更都会影响业务模型，直接导致数据库大幅度增删数据表及字段</div><div>3,系统编程结构繁琐</div><div>多模块及分布式远程调用系统与研发环境紧耦合。在研发中需要调用多个远程服务(不包括第三方系统)，测试一个子功能设计到库打包到maven库再远程包含，极大增加了编程测试的步骤与难度。</div><div>4,前端和后端研发的时间差</div><div>后端研发比前端慢，前端需要的模拟数据需要等待后端的服务，或者前端根据业务写模拟数据</div><div>5,研发人员差异</div><div>人员的素质参差不齐，编程风格不统一，逻辑思维不够严密常常引发很多BUG。</div><div></div><div><span style="color: red;">改变：</span></div><div>文档驱动的模板系统设计</div><div>顾名思义，以需求文档为驱动，模板为材料，以架构为核心，通过模式映射软件组装我们的软件系统，M-SYS。</div><div>M-SYS的必须包含的模块：</div><div>&nbsp; &nbsp; 前端页面，前端JS框架，后端服务模块，后端数据库操作模块，缓存模块，日志模块，权限系统，Session子系统。</div><div>&nbsp; &nbsp; 针对移动服务，需要增加后端数据加密系统，后端服务系统。</div><div>&nbsp; &nbsp; 针对分布式系统，需要增加分布式远程调用模块,服务发现子系统，分布式消息子系统，分布式缓存系统。</div><div></div><div>M-SYS的几个必要特征：</div><div>&nbsp; &nbsp; 1，简单逻辑的代码自动化：根据文档生成增删查改看的前端和后端代码。当需求导致文档变更时，也可简单的重新生成代码。</div><div>&nbsp; &nbsp; 2，功能模块插件模式：根据需求自由搭配不同需求文档组装成新的系统。</div><div>&nbsp; &nbsp; 3，简化研发和测试：把系统设计，细节，容易犯错的地方与研发人员高度隔离，软件开发人员仅仅专注于业务逻辑的实现，便捷的测试环境和步骤。</div><div></div><div>模板，模块，特征及子系统的设计此篇文章不做详述。以下以简单的实现做为说明，<br /><br />需求文档以Excel为载体<br /><br /><img src="http://www.blogjava.net/images/blogjava_net/fengliangjun/驱动文档.png" width="576" height="450" alt="" /><br /><br />利用模式映射软件在几十毫秒生成以下所有的模块<br /><img src="http://www.blogjava.net/images/blogjava_net/fengliangjun/LIST.png" width="1896" height="575" alt="" /><br /><br /><img src="http://www.blogjava.net/images/blogjava_net/fengliangjun/Search.png" width="1907" height="676" alt="" /><br /><br /><br /><br /><br /><img src="http://www.blogjava.net/images/blogjava_net/fengliangjun/Edit.png" width="1839" height="773" alt="" /><br /><br /><br />在M-SYSTEM体系下，一个不会编程的人都能非常方便的编写出一个庞大的软件及分布式系统。M-SYSTEM强调每个独立的轻服务模块，在名空间管理下，利用已有的各种服务可以像搭积木一样组成一个复杂的界面，</div><img src ="http://www.blogjava.net/fengliangjun/aggbug/429009.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/fengliangjun/" target="_blank">morcble的blog</a> 2016-01-12 15:26 <a href="http://www.blogjava.net/fengliangjun/articles/429009.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>JAVA 转码</title><link>http://www.blogjava.net/fengliangjun/articles/285064.html</link><dc:creator>morcble的blog</dc:creator><author>morcble的blog</author><pubDate>Thu, 02 Jul 2009 01:24:00 GMT</pubDate><guid>http://www.blogjava.net/fengliangjun/articles/285064.html</guid><wfw:comment>http://www.blogjava.net/fengliangjun/comments/285064.html</wfw:comment><comments>http://www.blogjava.net/fengliangjun/articles/285064.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/fengliangjun/comments/commentRss/285064.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/fengliangjun/services/trackbacks/285064.html</trackback:ping><description><![CDATA[public static synchronized void paseCode(Object obj,String fromEncode,String toEncode){<br />
&nbsp;&nbsp;HashMap&lt;String,Method&gt; setMethodMap = new HashMap&lt;String,Method&gt;();<br />
&nbsp;&nbsp;HashMap&lt;String,Method&gt; getMethodMap = new HashMap&lt;String,Method&gt;();<br />
&nbsp;&nbsp;List&lt;String&gt; propertyList= new ArrayList&lt;String&gt;();<br />
&nbsp;&nbsp;Method[] methods = obj.getClass().getDeclaredMethods();<br />
&nbsp;&nbsp;for(Method method:methods){<br />
&nbsp;&nbsp;&nbsp;String methodName = method.getName();<br />
&nbsp;&nbsp;&nbsp;if( methodName.indexOf("get")!=-1){<br />
&nbsp;&nbsp;&nbsp;&nbsp;if(method.getReturnType().equals(String.class)){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;getMethodMap.put(methodName.substring(3),method);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;propertyList.add(methodName.substring(3));<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;else if( methodName.indexOf("set")!=-1){<br />
&nbsp;&nbsp;&nbsp;&nbsp;if(method.getParameterTypes()[0].equals(String.class)){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;setMethodMap.put(methodName.substring(3),method);<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;}<br />
&nbsp;&nbsp;String tempvalue = null;<br />
&nbsp;&nbsp;String propertyName = null;<br />
&nbsp;&nbsp;for(int i = 0;i &lt;propertyList.size();i++){<br />
&nbsp;&nbsp;&nbsp;try {<br />
&nbsp;&nbsp;&nbsp;&nbsp;propertyName = propertyList.get(i);&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;tempvalue = (String) getMethodMap.get(propertyName).invoke(obj, new Object[0]);<br />
&nbsp;&nbsp;&nbsp;&nbsp;if(tempvalue!=null&amp;&amp;!tempvalue.equals(""))<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tempvalue = new String(tempvalue.getBytes(fromEncode),toEncode);<br />
&nbsp;&nbsp;&nbsp;&nbsp;setMethodMap.get(propertyName).invoke(obj, tempvalue);<br />
&nbsp;&nbsp;&nbsp;} catch (IllegalArgumentException e) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;e.printStackTrace();<br />
&nbsp;&nbsp;&nbsp;} catch (IllegalAccessException e) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;e.printStackTrace();<br />
&nbsp;&nbsp;&nbsp;} catch (InvocationTargetException e) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;e.printStackTrace();<br />
&nbsp;&nbsp;&nbsp;} catch (UnsupportedEncodingException e) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;e.printStackTrace();<br />
&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;}<br />
&nbsp;&nbsp;<br />
&nbsp;} <br />
<br />
<br />
<br />
test eg&nbsp; paseCode(new Object(),"GB2312","latin1") 
<img src ="http://www.blogjava.net/fengliangjun/aggbug/285064.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/fengliangjun/" target="_blank">morcble的blog</a> 2009-07-02 09:24 <a href="http://www.blogjava.net/fengliangjun/articles/285064.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>java 分割合并文件</title><link>http://www.blogjava.net/fengliangjun/articles/259038.html</link><dc:creator>morcble的blog</dc:creator><author>morcble的blog</author><pubDate>Wed, 11 Mar 2009 03:04:00 GMT</pubDate><guid>http://www.blogjava.net/fengliangjun/articles/259038.html</guid><wfw:comment>http://www.blogjava.net/fengliangjun/comments/259038.html</wfw:comment><comments>http://www.blogjava.net/fengliangjun/articles/259038.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/fengliangjun/comments/commentRss/259038.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/fengliangjun/services/trackbacks/259038.html</trackback:ping><description><![CDATA[import java.io.FileInputStream;<br />
import java.io.FileNotFoundException;<br />
import java.io.FileOutputStream;<br />
import java.io.IOException;<br />
public class FileReadAndWrite{<br />
&nbsp;public static void main(String[] args) {<br />
&nbsp;&nbsp;FileReadAndWrite fileReadAndWrite = new FileReadAndWrite();<br />
&nbsp;&nbsp;//fileReadAndWrite.splitFile("c:/1.doc");<br />
&nbsp;&nbsp;fileReadAndWrite.mergeFile("c:/1.doc1","c:/1.doc2");<br />
&nbsp;}<br />
&nbsp;<br />
&nbsp;public void splitFile(String filePath){<br />
&nbsp;&nbsp;try {<br />
&nbsp;&nbsp;&nbsp;FileInputStream is = new FileInputStream(filePath);<br />
&nbsp;&nbsp;&nbsp;int file1Size = is.available()/2;<br />
&nbsp;&nbsp;&nbsp;int buffersize = 512;<br />
&nbsp;&nbsp;&nbsp;file1Size = (file1Size/buffersize)*buffersize;<br />
&nbsp;&nbsp;&nbsp;//int file2Size = is.available() - file1Size;<br />
&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;byte buffer[] = new byte[buffersize];<br />
&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;int i = 0;<br />
&nbsp;&nbsp;&nbsp;FileOutputStream os1 = new FileOutputStream(filePath+"1");//file 1<br />
&nbsp;&nbsp;&nbsp;FileOutputStream os2 = new FileOutputStream(filePath+"2");//file 2<br />
&nbsp;&nbsp;&nbsp;while ((is.read(buffer, 0, buffersize) != -1) &amp;&amp; (buffersize &gt; 0)) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if((i&lt;file1Size/buffersize)){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;os1.write(buffer);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; else{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;os2.write(buffer);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; i++;<br />
&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;os1.close();<br />
&nbsp;&nbsp;&nbsp;os2.close();<br />
&nbsp;&nbsp;&nbsp;is.close();<br />
&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;} catch (FileNotFoundException e) {<br />
&nbsp;&nbsp;&nbsp;e.printStackTrace();<br />
&nbsp;&nbsp;} catch (IOException e) {<br />
&nbsp;&nbsp;&nbsp;// TODO Auto-generated catch block<br />
&nbsp;&nbsp;&nbsp;e.printStackTrace();<br />
&nbsp;&nbsp;}<br />
&nbsp;}<br />
&nbsp;<br />
&nbsp;public void mergeFile(String filePath1,String filePath2){<br />
&nbsp;&nbsp;try {<br />
&nbsp;&nbsp;&nbsp;FileInputStream is1 = new FileInputStream(filePath1);<br />
&nbsp;&nbsp;&nbsp;FileInputStream is2 = new FileInputStream(filePath2);<br />
&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;FileOutputStream os1 = new FileOutputStream(filePath1.substring(0,filePath1.length()-1));<br />
&nbsp;&nbsp;&nbsp;int buffersize = 512;<br />
&nbsp;&nbsp;&nbsp;byte buffer[] = new byte[buffersize];<br />
&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;while ((is1.read(buffer, 0, buffersize) != -1) &amp;&amp; (buffersize &gt; 0)) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;os1.write(buffer);&nbsp; &nbsp;<br />
&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;while ((is2.read(buffer, 0, buffersize) != -1) &amp;&amp; (buffersize &gt; 0)) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;os1.write(buffer);&nbsp; &nbsp;<br />
&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;is1.close();<br />
&nbsp;&nbsp;&nbsp;is2.close();<br />
&nbsp;&nbsp;&nbsp;os1.close();<br />
&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;} catch (FileNotFoundException e) {<br />
&nbsp;&nbsp;&nbsp;e.printStackTrace();<br />
&nbsp;&nbsp;} catch (IOException e) {<br />
&nbsp;&nbsp;&nbsp;// TODO Auto-generated catch block<br />
&nbsp;&nbsp;&nbsp;e.printStackTrace();<br />
&nbsp;&nbsp;}<br />
&nbsp;}<br />
}
<img src ="http://www.blogjava.net/fengliangjun/aggbug/259038.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/fengliangjun/" target="_blank">morcble的blog</a> 2009-03-11 11:04 <a href="http://www.blogjava.net/fengliangjun/articles/259038.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>关于JAVA的泛类型简介</title><link>http://www.blogjava.net/fengliangjun/articles/26542.html</link><dc:creator>morcble的blog</dc:creator><author>morcble的blog</author><pubDate>Wed, 04 Jan 2006 05:40:00 GMT</pubDate><guid>http://www.blogjava.net/fengliangjun/articles/26542.html</guid><wfw:comment>http://www.blogjava.net/fengliangjun/comments/26542.html</wfw:comment><comments>http://www.blogjava.net/fengliangjun/articles/26542.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/fengliangjun/comments/commentRss/26542.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/fengliangjun/services/trackbacks/26542.html</trackback:ping><description><![CDATA[<P><FONT size=2>JAVA的泛类型,类似c++中的模板template,从JDK1.5开始支持编写泛类型了。<BR>列如：<BR>①jdk1.5以前的代码<BR>import java.util.Hashtable;<BR>class Test {<BR>&nbsp; public static void main(String[] args) {<BR>&nbsp;&nbsp;&nbsp; Hashtable h = new Hashtable();<BR>&nbsp;&nbsp;&nbsp; h.put(new Integer(0), "value");<BR>&nbsp;&nbsp;&nbsp; String s = (String)h.get(new Integer(0));<BR>&nbsp;&nbsp;&nbsp; System.out.println(s);<BR>&nbsp; }<BR>}<BR>里面有强制的数据类型转化。</FONT></P>
<P><BR><FONT size=2>而在java（jdk1.5）的源代码中则没有了数据的强制转化</FONT></P>
<P><FONT size=2>class Hashtable&lt;Key, Value&gt; {<BR>&nbsp; ...<BR>&nbsp; Value put(Key k, Value v) {...}<BR>&nbsp; Value get(Key k) {...}<BR>}<BR>import java.util.Hashtable;<BR>class Test {<BR>&nbsp; public static void main(String[] args) {<BR>&nbsp;&nbsp;&nbsp; Hashtable&lt;Integer, String&gt; h = new Hashtable&lt;Integer, String&gt;();<BR>&nbsp;&nbsp;&nbsp; h.put(new Integer(0), "value");<BR>&nbsp;&nbsp;&nbsp; String s = h.get(new Integer(0));&nbsp;&nbsp;&nbsp; System.out.println(s);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<BR>} </FONT></P>
<P><BR><FONT size=2>②泛型的多态</FONT></P>
<P><FONT size=2>class Utilities {<BR>&nbsp;&nbsp; &lt;T extends Object&gt; public static List&lt;T&gt; make(T first) {<BR>&nbsp;&nbsp;&nbsp;&nbsp; return new List&lt;T&gt;(first);<BR>&nbsp;&nbsp; }<BR>}</FONT></P>
<P><FONT size=2>强制 make 构造新实例<BR>Utilities.make(Integer(0))<BR>&nbsp;</FONT></P>
<P><FONT size=2>③ 受限泛型</FONT></P>
<P><FONT size=2>有时我们想限制可能出现的泛型类的类型实例化。在上面这个示例中，类 Hashtable 的类型参数可以用我们想用的任何类型参数进行实例化，但是对于其它某些类，我们或许想将可能的类型参数集限定为给定类型 范围内的子类型。 </FONT></P>
<P><FONT size=2>例如，我们可能想定义泛型 ScrollPane 类，它引用普通的带有滚动条功能的 Pane 。被包含的 Pane 的运行时类型通常会是类 Pane 的子类型，但是静态类型就只是 Pane 。 </FONT></P>
<P><FONT size=2>有时我们想用 getter 检索被包含的 Pane ，但是希望 getter 的返回类型尽可能具体些。我们可能想将类型参数 MyPane 添加到 ScrollPane 中，该类型参数可以用 Pane 的任何子类进行实例化。然后可以用这种形式的子句： extends Bound 来说明 MyPane 的声明，从而来设定 MyPane 的范围： </FONT></P>
<P><BR><FONT size=2>清单 7. 用 extends 子句来说明 MyPane 声明<BR>class ScrollPane&lt;MyPane extends Pane&gt; { ... }<BR>&nbsp;</FONT></P>
<P><FONT size=2>④<BR>其它泛型的例子<BR>class C&lt;T&gt; {<BR>&nbsp; static T member;</FONT></P>
<P><FONT size=2>&nbsp; C(T t) { member = t; }</FONT></P>
<P><FONT size=2>&nbsp; T getMember() { return member; }</FONT></P>
<P><FONT size=2>&nbsp; public static void main(String[] args) {<BR>&nbsp;&nbsp;&nbsp; C&lt;String&gt; c = new C&lt;String&gt;("test");<BR>&nbsp;&nbsp;&nbsp; System.out.println(c.getMember().toString());<BR>&nbsp;&nbsp;&nbsp; new C&lt;Integer&gt;(new Integer(1));<BR>&nbsp;&nbsp;&nbsp; System.out.println(c.getMember().toString());<BR>&nbsp; }<BR>}</FONT></P>
<P><FONT size=2></FONT>&nbsp;</P>
<P><FONT size=2>import java.util.Hashtable;<BR>interface Registry {<BR>&nbsp; public void register(Object o);<BR>}<BR>class C&lt;T&gt; implements Registry {<BR>&nbsp; int counter = 0;<BR>&nbsp; Hashtable&lt;Integer, T&gt; values;</FONT></P>
<P><FONT size=2>&nbsp; public C() {<BR>&nbsp;&nbsp;&nbsp; values = new Hashtable&lt;Integer, T&gt;();<BR>&nbsp; }</FONT></P>
<P><FONT size=2>&nbsp; public void register(Object o) {<BR>&nbsp;&nbsp;&nbsp; values.put(new Integer(counter), (T)o);<BR>&nbsp;&nbsp;&nbsp; counter++;<BR>&nbsp; }<BR>}</FONT></P>
<P><FONT size=2>⑤</FONT></P>
<P><FONT size=2>轻松掌握 Java 泛型，第 3 部分<BR>克服 JSR-14 原型编译器中泛型的限制<BR>&nbsp; </FONT></P>
<P><FONT size=2>级别: 初级</FONT></P>
<P><FONT size=2>Eric E. Allen, 博士研究生, Java 编程语言团队，Rice 大学</FONT></P>
<P><BR><FONT size=2>2003 年 6 月 09 日</FONT></P>
<P><FONT size=2>Java 开发人员和研究员 Eric Allen 继续讨论 JSR-14 和 Tiger 中的泛型类型，并着眼于在泛型类型中添加 naked 类型参数的 new 操作支持这一分支。<BR>这一系列主要讨论在 Java 编程中添加泛型类型，本文是其中的一篇，将研究还未讨论过的有关使用泛型的两个限制之一，即添加对裸类型参数的 new 操作的支持（如类 C&lt;T&gt; 中的 new T() ）。 </FONT></P>
<P><FONT size=2>正如我 上个月所提到的那样，Tiger 和 JSR-14 通过使用“类型消除（type erasure）”对 Java 语言实现泛型类型。使用类型消除（type erasure），泛型类型仅用于类型检查；然后，用它们的上界替换它们。由此定义可知：消除将与如 new T() 之类的表达式冲突。 </FONT></P>
<P><FONT size=2>如果假定 T 的界限是 Object ，那么这一表达式将被消除为 new Object() ，并且不管对 T 如何实例化（ String 、 List 、 URLClassLoader 等等）， new 操作将产生一个新的 Object 实例。显然，这不是我们想要的。 </FONT></P>
<P><FONT size=2>要添加对表达式（如 new T() ）的支持，以及添加对我们上次讨论过的其它与类型相关的操作（如数据类型转换和 instanceof 表达式）的支持，我们必须采用某种实现策略而不是类型消除（如对于每个泛型实例化，使用独立的类）。但对于 new 操作，需要处理其它问题。 </FONT></P>
<P><FONT size=2>尤其是，为了实现对 Java 语言添加这种支持，必须对许多基本的语言设计问题作出决定。 </FONT></P>
<P><FONT size=2>有效的构造函数调用</FONT></P>
<P><FONT size=2>首先，为了对类型参数构造合法的 new 表达式（如 new T() ），必须确保我们调用的构造函数对于 T 的每个实例化都有效。但由于我们只知道 T 是其已声明界限的子类型，所以我们不知道 T 的某一实例化将有什么构造函数。要解决这一问题，可以用下述三种方法之一： </FONT></P>
<P><FONT size=2>要求类型参数的所有实例化都包括不带参数的（zeroary）构造函数。 <BR>只要泛型类的运行时实例化没有包括所需的构造函数，就抛出异常。 <BR>修改语言的语法以包括更详尽的类型参数界限。 <BR>第 1 种方法：需要不带参数的构造函数</FONT></P>
<P><FONT size=2>只要求类型参数的所有实例化都包括不带参数的构造函数。该解决方案的优点是非常简单。使用这种方法也有先例。</FONT></P>
<P><FONT size=2>处理类似问题的现有 Java 技术（象 JavaBean 技术）就是通过要求一个不带参数的构造函数来解决问题的。然而，该方法的一个主要缺点是：对于许多类，没有合理的不带参数的构造函数。</FONT></P>
<P><FONT size=2>例如，表示非空容器的任何类在构造函数中必然使用表示其元素的参数。包括不带参数的构造函数将迫使我们先创建实例，然后再进行本来可以在构造函数调用中完成的初始化。但该实践会导致问题的产生（您可能想要阅读 2002 年 4 月发表的本专栏文章“The Run-on Initializer bug pattern”，以获取详细信息；请参阅 参考资料。） </FONT></P>
<P><FONT size=2>第 2 种方法：当缺少所需构造函数时，抛出异常</FONT></P>
<P><FONT size=2>处理该问题的另一种方法是：只要泛型类的运行时实例化没有包括所需构造函数，就抛出异常。请注意：必须在运行时抛出异常。因为 Java 语言的递增式编译模型，所以我们无法静态地确定所有将在运行时发生的泛型类的实例化。例如，假设我们有如下一组泛型类：</FONT></P>
<P><BR><FONT size=2>清单 1.“裸”类型参数的 New 操作</FONT></P>
<P><FONT size=2>class C&lt;T&gt; {<BR>&nbsp; T makeT() {<BR>&nbsp;&nbsp;&nbsp; return new T();<BR>&nbsp; }<BR>}</FONT></P>
<P><FONT size=2>class D&lt;S&gt; {<BR>&nbsp; C&lt;S&gt; makeC() {<BR>&nbsp;&nbsp;&nbsp; return new C&lt;S&gt;();<BR>&nbsp; }<BR>}<BR>&nbsp;</FONT></P>
<P><BR><FONT size=2>现在，在类 D&lt;S&gt; 中，构造了类 C&lt;S&gt; 的实例。然后，在类 C 的主体中，将调用 S 的不带参数的构造函数。这种不带参数的构造函数存在吗？答案当然取决于 S 的实例化！ </FONT></P>
<P><FONT size=2>比方说，如果 S 被实例化为 String ，那么答案是“存在”。如果它被实例化为 Integer ，那么答案是“不存在”。但是，当编译类 D 和 C 时，我们不知道其它类会构造什么样的 D&lt;S&gt; 实例化。即使我们有可用于分析的整个程序（我们几乎从来没有这样的 Java 程序），我们还是必须进行代价相当高的流分析来确定潜在的构造函数问题可能会出现在哪里。 </FONT></P>
<P><FONT size=2>此外，这一技术所产生的错误种类对于程序员来说很难诊断和修复。例如，假设程序员只熟悉类 D 的头。他知道 D 的类型参数的界限是缺省界限（ Object ）。如果得到那样的信息，他没有理由相信满足声明类型界限（如 D&lt;Integer&gt; ）的 D 的实例化将会导致错误。事实上，它在相当长的时间里都不会引起错误，直到最后有人调用方法 makeC 以及（最终）对 C 的实例化调用方法 makeT 。然后，我们将得到一个报告的错误，但这将在实际问题发生很久以后 ― 类 D 的糟糕实例化。 </FONT></P>
<P><FONT size=2>还有，对所报告错误的堆栈跟踪甚至可能不包括任何对这个糟糕的 D 实例的方法调用！现在，让我们假设程序员无权访问类 C 的源代码。他对问题是什么或如何修正代码将毫无头绪，除非他设法联系类 C 的维护者并获得线索。 </FONT></P>
<P><FONT size=2>第 3 种方法：修改语法以获得更详尽的界限</FONT></P>
<P><FONT size=2>另一种可能性是修改语言语法以包括更详尽的类型参数界限。这些界限可以指定一组可用的构造函数，它们必须出现在参数的每一个实例化中。因而，在泛型类定义内部，唯一可调用的构造函数是那些在界限中声明的构造函数。 </FONT></P>
<P><FONT size=2>同样，实例化泛型类的客户机类必须使用满足对构造函数存在所声明的约束的类来这样做。参数声明将充当类与其客户机之间的契约，这样我们可以静态地检查这两者是否遵守契约。 </FONT></P>
<P><FONT size=2>与另外两种方法相比，该方法有许多优点，它允许我们保持第二种方法的可表达性以及与第一种方法中相同的静态检查程度。但它也有需要克服的问题。</FONT></P>
<P><FONT size=2>首先，类型参数声明很容易变得冗长。我们或许需要某种形式的语法上的甜头，使这些扩充的参数声明还过得去。另外，如果在 Tiger 以后的版本中添加扩充的参数声明，那么我们必须确保这些扩充的声明将与现有的已编译泛型类兼容。 </FONT></P>
<P><FONT size=2>如果将对泛型类型的与类型相关的操作的支持添加到 Java 编程中，那么它采用何种形式还不清楚。但是，从哪种方法将使 Java 代码尽可能地保持健壮（以及使在它遭到破坏时尽可能容易地修正）的观点看，第三个选项无疑是最适合的。 </FONT></P>
<P><FONT size=2>然而， new 表达式有另一个更严重的问题。 </FONT></P>
<P><BR><FONT size=2>&nbsp;</FONT></P>
<P><FONT size=2>&nbsp;回页首 <BR>&nbsp;</FONT></P>
<P><FONT size=2></FONT>&nbsp;</P>
<P><FONT size=2>多态递归</FONT></P>
<P><FONT size=2>更严重的问题是类定义中可能存在 多态递归。当泛型类在其自己的主体中实例化其本身时，发生多态递归。例如，考虑下面的错误示例： </FONT></P>
<P><BR><FONT size=2>清单 2. 自引用的泛型类</FONT></P>
<P><FONT size=2>class C&lt;T&gt; {<BR>&nbsp; public Object nest(int n) {<BR>&nbsp;&nbsp;&nbsp; if (n == 0) return this;<BR>&nbsp;&nbsp;&nbsp; else return new C&lt;C&lt;T&gt;&gt;().nest(n - 1);<BR>&nbsp; }<BR>}<BR>&nbsp;</FONT></P>
<P><BR><FONT size=2>假设客户机类创建新的 C&lt;Object&gt; 实例，并调用（比方说） nest(1000) 。然后，在执行方法 nest() 的过程中，将构造新的实例化 C&lt;C&lt;Object&gt;&gt; ，并且对它调用 nest(999) 。然后，将构造实例化 C&lt;C&lt;C&lt;Object&gt;&gt;&gt; ，以此类推，直到构造 1000 个独立的类 C 的实例化。当然，我随便选择数字 1000；通常，我们无法知道在运行时哪些整数将被传递到方法 nest 。事实上，可以将它们作为用户输入传入。 </FONT></P>
<P><FONT size=2>为什么这成为问题呢？因为如果我们通过为每个实例化构造独立类来支持泛型类型的与类型相关的操作，那么，在程序运行以前，我们无法知道我们需要构造哪些类。但是，如果类装入器为它所装入的每个类查找现有类文件，那么它会如何工作呢？</FONT></P>
<P><FONT size=2>同样，这里有几种可能的解决办法： </FONT></P>
<P><FONT size=2>对程序可以产生的泛型类的实例化数目设置上限。 <BR>静态禁止多态递归。 <BR>在程序运行时随需构造新的实例化类。 <BR>第 1 种：对实例化数设置上限</FONT></P>
<P><FONT size=2>我们对程序可以产生的泛型类的实例化数目设置上限。然后，在编译期间，我们可以对一组合法的实例化确定有限界限，并且仅为该界限中的所有实例化生成类文件。 </FONT></P>
<P><FONT size=2>该方法类似于在 C++ 标准模板库中完成的事情（这使我们有理由担心它不是一个好方法）。该方法的问题是，和为错误的构造函数调用报告错误一样，程序员将无法预知其程序的某一次运行将崩溃。例如，假设实例化数的界限为 42，并且使用用户提供的参数调用先前提到的 nest() 方法。那么，只要用户输入小于 42 的数，一切都正常。当用户输入 43 时，这一计划不周的设计就会失败。现在，设想一下可怜的代码维护者，他所面对的任务是重新组合代码并试图弄清楚幻数 42 有什么特殊之处。 </FONT></P>
<P><FONT size=2>第 2 种：静态禁止多态递归</FONT></P>
<P><FONT size=2>为什么我们不向编译器发出类似“静态禁止多态递归”这样的命令呢？（唉！要是那么简单就好了。）当然，包括我在内的许多程序员都会反对这种策略，它抑制了许多重要设计模式的使用。 </FONT></P>
<P><FONT size=2>例如，在泛型类 List&lt;T&gt; 中，您真的想要防止 List&lt;List&lt;T&gt;&gt; 的构造吗？从方法返回这种列表对于构建许多很常用的数据结构很有用。事实证明我们无法防止多态递归，即使我们想要那样，也是如此。就象静态检测糟糕的泛型构造函数调用一样，禁止多态递归会与递增式类编译发生冲突。我们先前的简单示例（其中，多态递归作为一个简单直接的自引用发生）会使这一事实变得模糊。但是，自引用对于在不同时间编译的大多数类常常采用任意的间接级别。再提一次，那是因为一个泛型类可以用其自己的类型参数来实例化另一个泛型类。 </FONT></P>
<P><FONT size=2>下面的示例涉及两个类之间的多态递归：</FONT></P>
<P><BR><FONT size=2>清单 3. 相互递归的多态递归</FONT></P>
<P><FONT size=2>class C&lt;T&gt; {<BR>&nbsp; public Object potentialNest(int n) {<BR>&nbsp;&nbsp;&nbsp; if (n == 0) return this;<BR>&nbsp;&nbsp;&nbsp; else return new D&lt;T&gt;().nest(n - 1);<BR>&nbsp; }<BR>}</FONT></P>
<P><FONT size=2>class D&lt;S&gt; {<BR>&nbsp; public Object nest(int n) {<BR>&nbsp;&nbsp;&nbsp; return new C&lt;C&lt;S&gt;&gt;().nest(n);<BR>&nbsp; }<BR>}<BR>&nbsp;</FONT></P>
<P><BR><FONT size=2>在类 C 或 D 中显然没有多态递归，但象 new D&lt;C&lt;Object&gt;&gt;().nest(1000) 之类的表达式将引起类 C 的 1000 次实例化。 </FONT></P>
<P><FONT size=2>或许，我们可以将新属性添加到类文件中，以表明类中所有不同泛型类型实例化，然后在编译其它类时分析这些实例化，以进行递归。但是，我们还是必须向程序员提供奇怪的和不直观的错误消息。</FONT></P>
<P><FONT size=2>在上面的代码中，我们在哪里报告错误呢？在类 D 的编译过程中还是在包含不相干表达式 new D&lt;C&lt;Object&gt;&gt;().nest(1000) 的客户机类的编译过程中呢？无论是哪一种，除非程序员有权访问类 C 的源代码，否则他无法预知何时会发生编译错误。 </FONT></P>
<P><FONT size=2>第 3 种：实时构造新的实例化类</FONT></P>
<P><FONT size=2>另一种方法是在程序运行时按需构造新的实例化类。起先，这种方法似乎与 Java 运行时完全不兼容。但实际上，实现该策略所需的全部就是使用一个修改的类装入器，它根据“模板（template）”类文件构造新的实例化类。 </FONT></P>
<P><FONT size=2>JVM 规范已经允许程序员使用修改的类装入器；事实上，许多流行的 Java 应用程序（如 Ant、JUnit 和 DrJava）都使用它们。该方法的缺点是：修改的类装入器必须与其应用程序一起分布，以在较旧的 JVM 上运行。因为类装入器往往比较小，所以这个开销不会大。<BR>&nbsp;<BR></FONT></P><img src ="http://www.blogjava.net/fengliangjun/aggbug/26542.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/fengliangjun/" target="_blank">morcble的blog</a> 2006-01-04 13:40 <a href="http://www.blogjava.net/fengliangjun/articles/26542.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>向客户端写入二进制流文件</title><link>http://www.blogjava.net/fengliangjun/articles/6882.html</link><dc:creator>morcble的blog</dc:creator><author>morcble的blog</author><pubDate>Wed, 29 Jun 2005 07:46:00 GMT</pubDate><guid>http://www.blogjava.net/fengliangjun/articles/6882.html</guid><wfw:comment>http://www.blogjava.net/fengliangjun/comments/6882.html</wfw:comment><comments>http://www.blogjava.net/fengliangjun/articles/6882.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/fengliangjun/comments/commentRss/6882.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/fengliangjun/services/trackbacks/6882.html</trackback:ping><description><![CDATA[<P>&lt;%@ page contentType="text/html; charset=gb2312"%&gt;<BR>&lt;%@ include file="/WEB-INF/jsp/includes.jsp" %&gt;<BR>&lt;%@ include file="/WEB-INF/jsp/header1.jsp" %&gt;<BR>&lt;%@ page import="java.sql.Blob,java.io.*,org.spring.lh.xiaolv.util.*,org.spring.lh.xiaolv.*,org.spring.lh.*,org.spring.lh.hibernate.*"%&gt;<BR>&lt;%!<BR>public static String getStr(String str){ <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; try {String temp_p=str; <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; byte[] temp_t=temp_p.getBytes("ISO8859-1"); <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String temp=new String(temp_t); <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return temp; <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; catch(Exception e){ } <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return "";<BR>&nbsp;&nbsp;&nbsp; }<BR>%&gt;<BR>&lt;%<BR>Lhspring lhSpring=(Lhspring)request.getSession().getAttribute("lhspring");<BR>System.out.println(lhSpring.getfindc_info("ddd").toString());<BR>calendar a = lhSpring.loadcalendar(request.getParameter("uuid"));<BR>System.out.println(a);<BR>Blob blob = a.getAccessories();&nbsp;&nbsp; </P>
<P>String filename = a.getAccessories_name();<BR>String filename1=getStr(filename);<BR>String strFileExt = filename.substring(filename.lastIndexOf(".") + 1);<BR>String mine=request.getSession().getServletContext().getMimeType(filename);<BR>if(mine==null)<BR>mine="application/octet-stream";<BR>response.setContentType(mine);</P>
<P>response.setHeader(<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "Content-disposition",<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "attachment;filename=\""+filename+"\"");<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <BR>InputStream is= null;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <BR>OutputStream os= null;<BR>&nbsp;&nbsp;try {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; is = blob.getBinaryStream();<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ByteArrayOutputStream baos = new ByteArrayOutputStream();<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; os = new BufferedOutputStream(response.getOutputStream());<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; byte[] buffer = new byte[4*1024];<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int read = 0;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; while((read = is.read(buffer))!=-1){<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;baos.write(buffer,0,read);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; os.write(baos.toByteArray());<BR>&nbsp;&nbsp;}<BR>&nbsp;&nbsp;catch(Exception e){<BR>&nbsp;&nbsp;&nbsp;System.out.println("读取附件出错");<BR>&nbsp;&nbsp;}<BR>&nbsp;&nbsp;finally{<BR>&nbsp;&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;os.close();<BR>&nbsp;&nbsp;&nbsp;&nbsp;is.close();&nbsp;&nbsp;<BR>&nbsp;&nbsp;}<BR>&nbsp;&nbsp;</P>
<P>%&gt;<BR></P><img src ="http://www.blogjava.net/fengliangjun/aggbug/6882.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/fengliangjun/" target="_blank">morcble的blog</a> 2005-06-29 15:46 <a href="http://www.blogjava.net/fengliangjun/articles/6882.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>实现Serializable 接口的对象可以进行二进制传输</title><link>http://www.blogjava.net/fengliangjun/articles/6881.html</link><dc:creator>morcble的blog</dc:creator><author>morcble的blog</author><pubDate>Wed, 29 Jun 2005 07:43:00 GMT</pubDate><guid>http://www.blogjava.net/fengliangjun/articles/6881.html</guid><wfw:comment>http://www.blogjava.net/fengliangjun/comments/6881.html</wfw:comment><comments>http://www.blogjava.net/fengliangjun/articles/6881.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/fengliangjun/comments/commentRss/6881.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/fengliangjun/services/trackbacks/6881.html</trackback:ping><description><![CDATA[<P><BR>import java.io.*;</P>
<P>public class SerializationDemo {<BR>&nbsp;public static void main(String args[]) {</P>
<P>&nbsp;&nbsp;//Object serialization<BR>&nbsp;&nbsp;try {<BR>&nbsp;&nbsp;&nbsp;MyClass object1 = new MyClass("Hello", -7, 2.7e10);<BR>&nbsp;&nbsp;&nbsp;System.out.println("object1:" + object1);<BR>&nbsp;&nbsp;&nbsp;FileOutputStream fos = new FileOutputStream("serial");<BR>&nbsp;&nbsp;&nbsp;ObjectOutputStream oos = new ObjectOutputStream(fos);<BR>&nbsp;&nbsp;&nbsp;oos.writeObject(object1);<BR>&nbsp;&nbsp;&nbsp;oos.flush();<BR>&nbsp;&nbsp;&nbsp;oos.close();<BR>&nbsp;&nbsp;} catch (Exception e) {<BR>&nbsp;&nbsp;&nbsp;System.out.println("Exception during serialization:" + e);<BR>&nbsp;&nbsp;&nbsp;System.exit(0);<BR>&nbsp;&nbsp;}</P>
<P>&nbsp;&nbsp;//Object deserialization<BR>&nbsp;&nbsp;try {<BR>&nbsp;&nbsp;&nbsp;MyClass object2;<BR>&nbsp;&nbsp;&nbsp;FileInputStream fis = new FileInputStream("serial");<BR>&nbsp;&nbsp;&nbsp;ObjectInputStream ois = new ObjectInputStream(fis);<BR>&nbsp;&nbsp;&nbsp;object2 = (MyClass) ois.readObject();<BR>&nbsp;&nbsp;&nbsp;ois.close();<BR>&nbsp;&nbsp;&nbsp;System.out.println("object2:" + object2);<BR>&nbsp;&nbsp;} catch (Exception e) {<BR>&nbsp;&nbsp;&nbsp;System.out.println("Exception during deserialization:" + e);<BR>&nbsp;&nbsp;&nbsp;System.exit(0);<BR>&nbsp;&nbsp;}<BR>&nbsp;}<BR>}</P>
<P>class MyClass implements Serializable {<BR>&nbsp;String s;</P>
<P>&nbsp;int i;</P>
<P>&nbsp;double d;</P>
<P>&nbsp;public MyClass(String s, int i, double d) {<BR>&nbsp;&nbsp;this.s = s;<BR>&nbsp;&nbsp;this.i = i;<BR>&nbsp;&nbsp;this.d = d;<BR>&nbsp;}</P>
<P>&nbsp;public String toString() {<BR>&nbsp;&nbsp;return "s=" + s + ";i=" + i + ";d=" + d;<BR>&nbsp;}<BR>}</P><img src ="http://www.blogjava.net/fengliangjun/aggbug/6881.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/fengliangjun/" target="_blank">morcble的blog</a> 2005-06-29 15:43 <a href="http://www.blogjava.net/fengliangjun/articles/6881.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>deleteDirectoryorFile    Getpath.path()      TestCmd()</title><link>http://www.blogjava.net/fengliangjun/articles/6684.html</link><dc:creator>morcble的blog</dc:creator><author>morcble的blog</author><pubDate>Fri, 24 Jun 2005 07:59:00 GMT</pubDate><guid>http://www.blogjava.net/fengliangjun/articles/6684.html</guid><wfw:comment>http://www.blogjava.net/fengliangjun/comments/6684.html</wfw:comment><comments>http://www.blogjava.net/fengliangjun/articles/6684.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/fengliangjun/comments/commentRss/6684.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/fengliangjun/services/trackbacks/6684.html</trackback:ping><description><![CDATA[<P>//删除文件&nbsp; 无论a是文件还是文件夹<BR>public class file {<BR>&nbsp;public static void deleteDirectoryorFile(java.io.File a){//全路径<BR>&nbsp;&nbsp;if (a.isFile()){<BR>&nbsp;&nbsp;&nbsp;a.delete();<BR>&nbsp;&nbsp;}<BR>&nbsp;&nbsp;else{<BR>&nbsp;&nbsp;&nbsp;java.io.File[] files = a.listFiles();<BR>&nbsp;&nbsp;&nbsp;for(int i= 0 ;i&lt;files.length;i++){<BR>&nbsp;&nbsp;&nbsp;&nbsp;deleteDirectoryorFile(files[i]);<BR>&nbsp;&nbsp;&nbsp;}<BR>&nbsp;&nbsp;&nbsp;a.delete();<BR>&nbsp;&nbsp;}<BR>&nbsp;}<BR>}</P>
<P>&nbsp;</P>
<P>&nbsp;</P>
<P>&nbsp;</P>
<P>&nbsp;</P>
<P><BR>**<BR>&nbsp;* <BR>&nbsp;* web-inf的相对路径 调用方法 Getpath.path();<BR>&nbsp;*/<BR>public class Getpath {<BR>&nbsp;private String path;</P>
<P>&nbsp;private static Getpath s;//静态单例模式</P>
<P>&nbsp;public Getpath() {<BR>&nbsp;&nbsp;path = this.getClass().getResource("Getpath.class").getPath();<BR>&nbsp;&nbsp;path = path.substring(0, path.indexOf("WEB-INF"));<BR>&nbsp;&nbsp;path = path + "WEB-INF/";<BR>&nbsp;}</P>
<P>&nbsp;public void setpath(String path) {<BR>&nbsp;&nbsp;this.path = path;<BR>&nbsp;}</P>
<P>&nbsp;public String getpath() {<BR>&nbsp;&nbsp;return this.path;<BR>&nbsp;}</P>
<P>&nbsp;public static String path() {<BR>&nbsp;&nbsp;if (s == null)<BR>&nbsp;&nbsp;&nbsp;s = new Getpath();<BR>&nbsp;&nbsp;return (s.getpath());<BR>&nbsp;}</P>
<P>&nbsp;public static void main(String[] args) {</P>
<P>&nbsp;&nbsp;System.out.println(Getpath.path());<BR>&nbsp;}<BR>}</P>
<P>&nbsp;</P>
<P>&nbsp;</P>
<P>/**<BR>*<BR>* @author&nbsp; Administrator<BR>*/<BR>public class TestCmd {<BR>&nbsp;&nbsp;&nbsp; public TestCmd(){}<BR>&nbsp;&nbsp;&nbsp; public static void main(String args[]){<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; try {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Process process = Runtime.getRuntime().exec("cmd.exe&nbsp; /c&nbsp; start&nbsp; <A href="http://www.hao123.net/">http://www.hao123.net/</A>");&nbsp; //登录网站<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // Process process = Runtime.getRuntime().exec("cmd.exe&nbsp; /c&nbsp; start&nbsp; ping 10.5.2.19");&nbsp; //调用Ping命令<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }catch (Exception&nbsp; e)<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; e.printStackTrace();<BR>&nbsp;&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; }<BR>&nbsp;&nbsp;&nbsp; } <BR></P><img src ="http://www.blogjava.net/fengliangjun/aggbug/6684.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/fengliangjun/" target="_blank">morcble的blog</a> 2005-06-24 15:59 <a href="http://www.blogjava.net/fengliangjun/articles/6684.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>String.split(String a)的错误 == 正则表达式问题</title><link>http://www.blogjava.net/fengliangjun/articles/6267.html</link><dc:creator>morcble的blog</dc:creator><author>morcble的blog</author><pubDate>Fri, 17 Jun 2005 03:15:00 GMT</pubDate><guid>http://www.blogjava.net/fengliangjun/articles/6267.html</guid><wfw:comment>http://www.blogjava.net/fengliangjun/comments/6267.html</wfw:comment><comments>http://www.blogjava.net/fengliangjun/articles/6267.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/fengliangjun/comments/commentRss/6267.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/fengliangjun/services/trackbacks/6267.html</trackback:ping><description><![CDATA[<P>String的静态方法split(String a)有点问题，列如<BR>String a0 = "|we|r|";<BR>String[] b0 = a0.split("|");<BR>b0不会得到预期的数组，而是{"|","w","e","r","|"}.<BR><BR>于是写了一个类代替这个方法<BR>如下<BR>public class Strings {<BR>&nbsp;public static&nbsp; Collection seperateBy(String target,String seperate) {<BR>&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;if (target==null||seperate==null||target.equals("")){<BR>&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;return new ArrayList();<BR>&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;}<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Collection collection = new ArrayList();<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;int num = target.indexOf(seperate);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if (num!=-1){<BR>&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;if(num==0){<BR>&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;target = target.substring(1,target.length());<BR>&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Collection here = seperateBy(target,seperate);<BR>&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for(Iterator iterator1 = here.iterator();iterator1.hasNext();){<BR>&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;collection.add(iterator1.next());<BR>&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<BR>&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return collection;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else if(num == target.length()-1){ <BR>&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;collection.add(target.substring(0,target.length()-1));<BR>&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;return collection;<BR>&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;}<BR>&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;else<BR>&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;{<BR>&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;collection.add(target.substring(0,num));<BR>&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;target = target.substring(num+1,target.length());<BR>&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;Collection here = seperateBy(target,seperate);<BR>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for(Iterator iterator1 = here.iterator();iterator1.hasNext();){<BR>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;collection.add(iterator1.next());<BR>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<BR>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return collection;<BR>&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;}<BR>&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;}<BR>&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;else collection.add(target);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp; collection;<BR>&nbsp;&nbsp;&nbsp;&nbsp; }<BR>/*测试<BR>&nbsp;public static&nbsp; void main(String[] args) {<BR>&nbsp;&nbsp;Collection a1 = Strings.seperateBy("|aaa|aa","|");<BR>&nbsp;&nbsp;Collection a2 =Strings.seperateBy("|aaa|aa|","|");<BR>&nbsp;&nbsp;Collection a3 =Strings.seperateBy("aaa|aa","|");<BR>&nbsp;&nbsp;Collection a4 =Strings.seperateBy("aaaaa","|");<BR>&nbsp;&nbsp;Collection a5 =Strings.seperateBy("|aaa|aa","|");<BR>&nbsp;&nbsp;Collection a6 =Strings.seperateBy("||||","|");<BR>&nbsp;&nbsp;Collection a7 =Strings.seperateBy("","|");<BR>&nbsp;}*/<BR>}<BR><BR><BR><BR>正则表达式问题<BR><BR>正确写法String a0 = "|we|r|";<BR>String[] b0 = a0.split("\\|");<BR></P><img src ="http://www.blogjava.net/fengliangjun/aggbug/6267.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/fengliangjun/" target="_blank">morcble的blog</a> 2005-06-17 11:15 <a href="http://www.blogjava.net/fengliangjun/articles/6267.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>数据库存取文件</title><link>http://www.blogjava.net/fengliangjun/articles/5897.html</link><dc:creator>morcble的blog</dc:creator><author>morcble的blog</author><pubDate>Fri, 10 Jun 2005 14:20:00 GMT</pubDate><guid>http://www.blogjava.net/fengliangjun/articles/5897.html</guid><wfw:comment>http://www.blogjava.net/fengliangjun/comments/5897.html</wfw:comment><comments>http://www.blogjava.net/fengliangjun/articles/5897.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/fengliangjun/comments/commentRss/5897.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/fengliangjun/services/trackbacks/5897.html</trackback:ping><description><![CDATA[数据库存文件<BR>&nbsp;File file = new File("c:\\2.jpg"); <BR>&nbsp;&nbsp;int fileLength =(int) file.length(); <BR>&nbsp;&nbsp;InputStream fin = new FileInputStream(file); <BR>&nbsp;&nbsp;PreparedStatement pstmt = con.prepareStatement("insert into file values('2.jpg',?)"); <BR>&nbsp;&nbsp;pstmt.setBinaryStream (1, fin, fileLength); <BR>&nbsp;&nbsp;pstmt.executeUpdate();&nbsp;&nbsp;&nbsp;<BR><BR><BR>数据库取文件<BR>&nbsp;&nbsp;//"select * from file"<BR>&nbsp;&nbsp;Statement pstmt = con.createStatement(); <BR>&nbsp;&nbsp;ResultSet rs = pstmt.executeQuery("select * from file");<BR>&nbsp;&nbsp;<BR>&nbsp;&nbsp;while(rs.next()){<BR>&nbsp;&nbsp;&nbsp;Blob blob = rs.getBlob("aaa");//aaa为blob列 存储二进制文件<BR>&nbsp;&nbsp;&nbsp;String name = rs.getString("v");//v为文件名<BR>&nbsp;&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;int bloblength =(int) blob.length();<BR>&nbsp;&nbsp;&nbsp;byte[] bytes = blob.getBytes(1,bloblength);<BR>&nbsp;&nbsp;&nbsp;OutputStream f0 = new FileOutputStream("c:\\1\\"+name);<BR>&nbsp;&nbsp;&nbsp;for (int i =0;i&lt;bytes.length;i+=1){<BR>&nbsp;&nbsp;&nbsp;&nbsp;f0.write(bytes[i]);<BR>&nbsp;&nbsp;&nbsp;}<BR>&nbsp;&nbsp;&nbsp;f0.close();<BR>&nbsp;&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;<img src ="http://www.blogjava.net/fengliangjun/aggbug/5897.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/fengliangjun/" target="_blank">morcble的blog</a> 2005-06-10 22:20 <a href="http://www.blogjava.net/fengliangjun/articles/5897.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>javamail接收邮件</title><link>http://www.blogjava.net/fengliangjun/articles/5740.html</link><dc:creator>morcble的blog</dc:creator><author>morcble的blog</author><pubDate>Wed, 08 Jun 2005 08:32:00 GMT</pubDate><guid>http://www.blogjava.net/fengliangjun/articles/5740.html</guid><wfw:comment>http://www.blogjava.net/fengliangjun/comments/5740.html</wfw:comment><comments>http://www.blogjava.net/fengliangjun/articles/5740.html#Feedback</comments><slash:comments>7</slash:comments><wfw:commentRss>http://www.blogjava.net/fengliangjun/comments/commentRss/5740.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/fengliangjun/services/trackbacks/5740.html</trackback:ping><description><![CDATA[<P>import java.util.Properties;</P>
<P>import javax.mail.*;<BR>import javax.mail.internet.*;<BR><BR>public class receivemail {<BR>&nbsp;public static void main(String[] args) throws Exception {</P>
<P>&nbsp;&nbsp;Properties props = new Properties();<BR>&nbsp;&nbsp;Session recesession = Session.getDefaultInstance(props, null);<BR>&nbsp;&nbsp;recesession.setDebug(true);</P>
<P>&nbsp;&nbsp;Store store = recesession.getStore("pop3");<BR>&nbsp;&nbsp;String user = "****";//帐户<BR>&nbsp;&nbsp;String password = "*****";//密码<BR>&nbsp;&nbsp;store.connect("pop.163.com", user, password);</P>
<P>&nbsp;&nbsp;Folder folder = store.getFolder("INBOX");<BR>&nbsp;&nbsp;<BR>&nbsp;&nbsp;folder.open(Folder.READ_ONLY);<BR>&nbsp;&nbsp;<BR>&nbsp;&nbsp;Message[] msgs = folder.getMessages();<BR>&nbsp;&nbsp;for (int msgNum = 0; msgNum &lt; msgs.length; msgNum++) {<BR>&nbsp;&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;System.out.println(msgs[msgNum].getSentDate());<BR>&nbsp;&nbsp;&nbsp;System.out.println(msgs[msgNum].getSubject());<BR>&nbsp;&nbsp;&nbsp;System.out.println(msgs[msgNum].getContent());<BR>&nbsp;&nbsp;}<BR>&nbsp;&nbsp;folder.close(false);<BR>&nbsp;&nbsp;store.close();</P>
<P>&nbsp;}</P>
<P>}</P><img src ="http://www.blogjava.net/fengliangjun/aggbug/5740.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/fengliangjun/" target="_blank">morcble的blog</a> 2005-06-08 16:32 <a href="http://www.blogjava.net/fengliangjun/articles/5740.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>javamail发送邮件</title><link>http://www.blogjava.net/fengliangjun/articles/5652.html</link><dc:creator>morcble的blog</dc:creator><author>morcble的blog</author><pubDate>Tue, 07 Jun 2005 03:16:00 GMT</pubDate><guid>http://www.blogjava.net/fengliangjun/articles/5652.html</guid><wfw:comment>http://www.blogjava.net/fengliangjun/comments/5652.html</wfw:comment><comments>http://www.blogjava.net/fengliangjun/articles/5652.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/fengliangjun/comments/commentRss/5652.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/fengliangjun/services/trackbacks/5652.html</trackback:ping><description><![CDATA[<P>import java.util.Properties;</P>
<P>import javax.mail.*;<BR>import javax.mail.internet.*;</P>
<P>/**<BR>&nbsp;* @author Administrator<BR>&nbsp;*<BR>&nbsp;* TODO 要更改此生成的类型注释的模板，请转至<BR>&nbsp;* 窗口 － 首选项 － Java － 代码样式 － 代码模板<BR>&nbsp;*/<BR>public class mymail {<BR>&nbsp;public static String username = "***";//用户名</P>
<P>&nbsp;public static String password = "***";//用户密码</P>
<P>&nbsp;public static String smtpaddress = "smtp.163.com";//邮件服务起地址<BR>&nbsp;<BR>&nbsp;public static String from = "<A href='mailto:fengliangjun727@163.com";//'>***@163.com";//</A>发邮件的邮箱<BR>&nbsp;<BR>&nbsp;public static String to = "<A href='mailto:fengliangjun727@***";//'>****@***";//</A>收邮件的邮箱<BR>&nbsp;<BR>&nbsp;public static String title = "标题";//文件标题<BR>&nbsp;<BR>&nbsp;public static String content = "neirong";//文件neirong<BR>&nbsp;<BR>&nbsp;public static void main(String[] args) throws Exception {<BR>&nbsp;&nbsp;String[] b = { mymail.to, mymail.title, mymail.content };</P>
<P>&nbsp;&nbsp;Properties props = new Properties();<BR>&nbsp;&nbsp;props.put("mail.smtp.host", mymail.smtpaddress); //设置smtp主机</P>
<P>&nbsp;&nbsp;props.put("mail.smtp.auth", "true");//使用smtp身份验证</P>
<P>&nbsp;&nbsp;Session session = Session.getDefaultInstance(props,<BR>&nbsp;&nbsp;&nbsp;&nbsp;new Authenticator() {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;public PasswordAuthentication getPasswordAuthentication() {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return new PasswordAuthentication(mymail.username,<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mymail.password);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<BR>&nbsp;&nbsp;&nbsp;&nbsp;});</P>
<P>&nbsp;&nbsp;session.setDebug(true);</P>
<P>&nbsp;&nbsp;Message msg = new MimeMessage(session);</P>
<P>&nbsp;&nbsp;InternetAddress addressFrom = new InternetAddress(<BR>&nbsp;&nbsp;&nbsp;&nbsp;mymail.from);<BR>&nbsp;&nbsp;msg.setFrom(addressFrom);<BR>&nbsp;&nbsp;Address addressTo = new InternetAddress(b[0]);<BR>&nbsp;&nbsp;msg.setRecipient(Message.RecipientType.TO, addressTo);</P>
<P>&nbsp;&nbsp;msg.setSubject(b[1]);//标题<BR>&nbsp;&nbsp;msg.setContent(b[2], "text/plain");//内容</P>
<P>①&nbsp;&nbsp;<BR>Transport transport = session.getTransport("smtp");<BR>&nbsp;&nbsp;System.out.println("连接邮件服务器成功");<BR>&nbsp;&nbsp;transport.send(msg);</P>
<P>&nbsp;}<BR>}<BR><BR><BR><BR>***************************8<BR>第二种写法<BR>/*<BR>&nbsp;* 创建日期 2005-6-8<BR>&nbsp;*<BR>&nbsp;* TODO 要更改此生成的文件的模板，请转至<BR>&nbsp;* 窗口 － 首选项 － Java － 代码样式 － 代码模板<BR>&nbsp;*/</P>
<P>import java.util.Properties;</P>
<P>import javax.mail.*;<BR>import javax.mail.internet.*;<BR><BR>public class sendmail {<BR>&nbsp;public&nbsp; static String username = "***";//用户名</P>
<P>&nbsp;public static String password = "***";//用户密码</P>
<P>&nbsp;public static String smtpaddress = "smtp.163.com";//邮件服务器<BR>&nbsp;<BR>&nbsp;public static String from = "<A href='mailto:fengliangjun727@163.com";//'>***";//</A>发邮件的邮箱<BR>&nbsp;<BR>&nbsp;public static String to = "<A href='mailto:fengliangjun727@163.com";//'>***";//</A>收邮件的邮箱<BR>&nbsp;<BR>&nbsp;public static String title = "标题";//文件标题<BR>&nbsp;<BR>&nbsp;public static String content = "neirong";//文件neirong<BR>&nbsp;<BR>&nbsp;public static void main(String[] args) throws Exception {<BR>&nbsp;&nbsp;String[] b = { sendmail.to, sendmail.title, sendmail.content };</P>
<P>&nbsp;&nbsp;Properties props = new Properties();<BR>&nbsp;&nbsp;props.put("mail.smtp.host", sendmail.smtpaddress); //设置smtp主机</P>
<P>&nbsp;&nbsp;props.put("mail.smtp.auth", "true");//使用smtp身份验证</P>
<P>&nbsp;&nbsp;Session session = Session.getDefaultInstance(props,<BR>&nbsp;&nbsp;&nbsp;&nbsp;null);</P>
<P>&nbsp;&nbsp;session.setDebug(true);</P>
<P>&nbsp;&nbsp;Message msg = new MimeMessage(session);</P>
<P>&nbsp;&nbsp;InternetAddress addressFrom = new InternetAddress(<BR>&nbsp;&nbsp;&nbsp;&nbsp;sendmail.from);<BR>&nbsp;&nbsp;msg.setFrom(addressFrom);<BR>&nbsp;&nbsp;Address addressTo = new InternetAddress(b[0]);<BR>&nbsp;&nbsp;msg.setRecipient(Message.RecipientType.TO, addressTo);</P>
<P>&nbsp;&nbsp;msg.setSubject(b[1]);//标题<BR>&nbsp;&nbsp;msg.setContent(b[2], "text/plain");//内容</P>
<P>&nbsp;&nbsp;①<BR>Transport transport = session.getTransport("smtp");<BR>&nbsp;&nbsp;transport.connect(smtpaddress,username,password);<BR>&nbsp;&nbsp;System.out.println("连接邮件服务器成功");<BR>&nbsp;&nbsp;//transport.send(msg);<BR>&nbsp;&nbsp;transport.sendMessage(msg,msg.getAllRecipients());</P>
<P>&nbsp;}<BR>}</P>
<P>*****************************<BR>如果要添加附件 参考下面程序片段&nbsp;&nbsp;把下面的程序片段添加到①<BR>&nbsp;&nbsp;&nbsp;String attachment = "c:\1.txt";//附件</P>
<P>&nbsp;&nbsp;if (!attachment.equals("")) {</P>
<P>&nbsp;&nbsp;&nbsp;BodyPart messageBodyPart = new MimeBodyPart();<BR>&nbsp;&nbsp;&nbsp;messageBodyPart.setText(new String(content.getBytes("ISO8859_1"),<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"GBK")); //</P>
<P>&nbsp;&nbsp;&nbsp;Multipart multipart = new MimeMultipart();<BR>&nbsp;&nbsp;&nbsp;multipart.addBodyPart(messageBodyPart); //</P>
<P>&nbsp;&nbsp;&nbsp;messageBodyPart = new MimeBodyPart();//</P>
<P>&nbsp;&nbsp;&nbsp;DataSource source = new FileDataSource(attachment);</P>
<P>&nbsp;&nbsp;&nbsp;messageBodyPart.setDataHandler(new DataHandler(source));</P>
<P>&nbsp;&nbsp;&nbsp;messageBodyPart.setFileName(attachment);</P>
<P>&nbsp;&nbsp;&nbsp;multipart.addBodyPart(messageBodyPart);</P>
<P>&nbsp;&nbsp;&nbsp;message.setContent(multipart);<BR>&nbsp;&nbsp;} <BR><BR>最后要记得在tomcat的lib目录下添加mail.jar,j2ee.jar,activation.jar。</P><img src ="http://www.blogjava.net/fengliangjun/aggbug/5652.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/fengliangjun/" target="_blank">morcble的blog</a> 2005-06-07 11:16 <a href="http://www.blogjava.net/fengliangjun/articles/5652.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>