﻿<?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-壹咪阳光-随笔分类-java</title><link>http://www.blogjava.net/ywj-316/category/42589.html</link><description /><language>zh-cn</language><lastBuildDate>Fri, 18 Mar 2011 08:57:18 GMT</lastBuildDate><pubDate>Fri, 18 Mar 2011 08:57:18 GMT</pubDate><ttl>60</ttl><item><title>Java 7七大新功能预览</title><link>http://www.blogjava.net/ywj-316/archive/2011/03/18/346539.html</link><dc:creator>junly</dc:creator><author>junly</author><pubDate>Fri, 18 Mar 2011 07:21:00 GMT</pubDate><guid>http://www.blogjava.net/ywj-316/archive/2011/03/18/346539.html</guid><wfw:comment>http://www.blogjava.net/ywj-316/comments/346539.html</wfw:comment><comments>http://www.blogjava.net/ywj-316/archive/2011/03/18/346539.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/ywj-316/comments/commentRss/346539.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/ywj-316/services/trackbacks/346539.html</trackback:ping><description><![CDATA[<p>Java 7已经完成的7大新功能：<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1 对集合类的语言支持；<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2 自动资源管理；<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 3 改进的通用实例创建类型推断；<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 4 数字字面量下划线支持；<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 5 switch中使用string；<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 6 二进制字面量；<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 7 简化可变参数方法调用。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 下面我们来仔细看一下这7大新功能：<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1 对集合类的语言支持<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Java将包含对创建集合类的第一类语言支持。这意味着集合类的创建可以像Ruby和Perl那样了。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 原本需要这样：<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; List&lt;String&gt; list = new ArrayList&lt;String&gt;();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; list.add("item");<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String item = list.get(0);<br />
&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Set&lt;String&gt; set = new HashSet&lt;String&gt;();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; set.add("item");<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Map&lt;String, Integer&gt; map = new HashMap&lt;String, Integer&gt;();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; map.put("key", 1);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;int value = map.get("key"); </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 现在你可以这样：<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; List&lt;String&gt; list = ["item"];<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String item = list[0];<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Set&lt;String&gt; set = {"item"};<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Map&lt;String, Integer&gt; map = {"key" : 1};<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int value = map["key"]; </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 这些集合是不可变的。</p>
<p>&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2 自动资源管理<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Java中某些资源是需要手动关闭的，如InputStream，Writes，Sockets，Sql classes等。这个新的语言特性允许try语句本身申请更多的资源，<br />
&nbsp;&nbsp; 这些资源作用于try代码块，并自动关闭。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 这个：<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; BufferedReader br = new BufferedReader(new FileReader(path));<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; try {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return br.readLine();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;} finally {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; br.close();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 变成了这个：<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; try (BufferedReader br = new BufferedReader(new FileReader(path)) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return br.readLine();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } <br />
&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 你可以定义关闭多个资源：<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; try (<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;InputStream in = new FileInputStream(src);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; OutputStream out = new FileOutputStream(dest))<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // code<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 为了支持这个行为，所有可关闭的类将被修改为可以实现一个Closable（可关闭的）接口。<br />
&nbsp;&nbsp; </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 3 增强的对通用实例创建（diamond）的类型推断<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 类型推断是一个特殊的烦恼，下面的代码：<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Map&lt;String, List&lt;String&gt;&gt; anagrams = new HashMap&lt;String, List&lt;String&gt;&gt;(); </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 通过类型推断后变成：<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Map&lt;String, List&lt;String&gt;&gt; anagrams = new HashMap&lt;&gt;(); <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 这个&lt;&gt;被叫做diamond（钻石）运算符，这个运算符从引用的声明中推断类型。</p>
<p>&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 4 数字字面量下划线支持<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 很长的数字可读性不好，在Java 7中可以使用下划线分隔长int以及long了，如：<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int one_million = 1_000_000; <br />
&nbsp;&nbsp; 运算时先去除下划线，如：1_1 * 10 = 110，120 &#8211; 1_0 = 110<br />
&nbsp;&nbsp; </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 5 switch中使用string<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 以前你在switch中只能使用number或enum。现在你可以使用string了：<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String s = ...<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; switch(s) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; case "quux":<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; processQuux(s);<br />
&nbsp;&nbsp;&nbsp;&nbsp; // fall-through<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; case "foo":<br />
&nbsp;&nbsp; case "bar":<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; processFooOrBar(s);<br />
&nbsp;&nbsp;&nbsp;&nbsp; break;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; case "baz":<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; processBaz(s);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // fall-through<br />
&nbsp;&nbsp; default:<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; processDefault(s);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; break;<br />
&nbsp;&nbsp;} </p>
<p>&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 6 二进制字面量<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 由于继承C语言，Java代码在传统上迫使程序员只能使用十进制，八进制或十六进制来表示数(numbers)。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 由于很少的域是以bit导向的，这种限制可能导致错误。你现在可以使用0b前缀创建二进制字面量：<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int binary = 0b1001_1001; <br />
&nbsp;&nbsp; 现在，你可以使用二进制字面量这种表示方式，并且使用非常简短的代码，可将二进制字符转换为数据类型，如在byte或short。<br />
&nbsp;&nbsp; byte aByte = (byte)0b001;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp; short aShort = (short)0b010;&nbsp;&nbsp;&nbsp; </p>
<p>&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 7 简化的可变参数调用<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 当程序员试图使用一个不可具体化的可变参数并调用一个*varargs* （可变）方法时，编辑器会生成一个&#8220;非安全操作&#8221;的警告。<br />
&nbsp;&nbsp; JDK 7将警告从call转移到了方法声明(methord declaration)的过程中。这样API设计者就可以使用vararg，因为警告的数量大大减少了。</p>
<img src ="http://www.blogjava.net/ywj-316/aggbug/346539.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/ywj-316/" target="_blank">junly</a> 2011-03-18 15:21 <a href="http://www.blogjava.net/ywj-316/archive/2011/03/18/346539.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>开发高并发web应用的注意事项</title><link>http://www.blogjava.net/ywj-316/archive/2010/08/09/328323.html</link><dc:creator>junly</dc:creator><author>junly</author><pubDate>Mon, 09 Aug 2010 09:16:00 GMT</pubDate><guid>http://www.blogjava.net/ywj-316/archive/2010/08/09/328323.html</guid><wfw:comment>http://www.blogjava.net/ywj-316/comments/328323.html</wfw:comment><comments>http://www.blogjava.net/ywj-316/archive/2010/08/09/328323.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/ywj-316/comments/commentRss/328323.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/ywj-316/services/trackbacks/328323.html</trackback:ping><description><![CDATA[&nbsp;
<p>1 <span style="font-family: 宋体">对</span>Collection<span style="font-family: 宋体">、</span>Map<span style="font-family: 宋体">接口的类对象初始化时要先分配合理的空间大小，同时还要按照自已的实际需求选择合适的对象。</span></p>
<p><span style="font-family: 宋体">例如：声明</span>Vector vect<span style="font-family: 宋体">＝</span>new Vector()<span style="font-family: 宋体">时，系统调用：</span></p>
<p>public Vector() {</p>
<p>// <span style="font-family: 宋体">缺省构造函数</span></p>
<p>this(10);</p>
<p>// <span style="font-family: 宋体">容量是</span></p>
<p>10;}<span style="font-family: 宋体">　</span></p>
<p><span style="font-family: 宋体">缺省分配</span>10<span style="font-family: 宋体">个对象大小容量。<br />
<br />
</span></p>
<p>2 <span style="font-family: 宋体">优化循环体</span></p>
<p><span style="font-family: 宋体">循环是比较重复运行的地方，如果循环次数很大，循环体内不好的代码对效率的影响就会被放大而变的突出。<br />
<br />
</span></p>
<p>3 <span style="font-family: 宋体">少用</span>new<span style="font-family: 宋体">初始化一个实例</span></p>
<p><span style="font-family: 宋体">尽量少用</span>new<span style="font-family: 宋体">来初始化一个类的实例，当一个对象是用</span>new<span style="font-family: 宋体">进行初始化时，其构造函数链的所有构造函数都被调用到，所以</span>new<span style="font-family: 宋体">操作符是很消耗系统资源的，</span>new<span style="font-family: 宋体">一个对象耗时往往是局部变量赋值耗时的上千倍。同时，当生成对象后，系统还要花时间进行垃圾回收和处理。当</span>new<span style="font-family: 宋体">创建对象不可避免时，注意避免多次的使用</span>new<span style="font-family: 宋体">初始化一个对象。尽量在使用时再创建该对象，另外，应该尽量重复使用一个对象，而不是声明新的同类对象。一个重用对象的方法是改变对象的值，如可以通过</span>setValue<span style="font-family: 宋体">之类的方法改变对象的变量达到重用的目的。<br />
</span></p>
<p><br />
4 <span style="font-family: 宋体">选择合适的方法调用：</span></p>
<p><span style="font-family: 宋体">在</span>Java<span style="font-family: 宋体">中，一切都是对象，如果有方法（</span>Method<span style="font-family: 宋体">）调用，处理器先要检查该方法是属于哪个对象，该对象是否有效，对象属于什么类型，然后选择合适的方法并调用。可以减少方法的调用，不影响可读性等情况下，可以把几个小的方法合成一个大的方法。另外，在方法前加上</span>final<span style="font-family: 宋体">，</span>private<span style="font-family: 宋体">关键字有利于编译器的优化。</span></p>
<p><br />
5<span style="font-family: 宋体">异常处理技巧</span></p>
<p><span style="font-family: 宋体">异常是</span>Java<span style="font-family: 宋体">的一种错误处理机制，对程序来说是非常有用的，但是异常对性能不利。抛出异常首先要创建一个新的对象，并进行相关的处理，造成系统的开销，所以异常应该用在错误处理的情况，不应该用来控制程序流程，流程尽量用</span>while<span style="font-family: 宋体">，</span>if<span style="font-family: 宋体">等处理。在不是很影响代码健壮性的前提下，可以把几个</span>try/catch<span style="font-family: 宋体">块合成一个。</span><br />
<br />
</p>
<p>6 <span style="font-family: 宋体">尽量使用局部变量</span></p>
<p><span style="font-family: 宋体">尽量使用局部变量，调用方法时传递的参数以及在调用中创建的临时变量都保存在栈（</span>Stack<span style="font-family: 宋体">）</span> <span style="font-family: 宋体">中，速度较快。其他变量，如静态变量、实例变量等，都在堆（</span>Heap<span style="font-family: 宋体">）中创建，速度较慢。</span><span style="font-family: 宋体">　　</span></p>
<p><br />
7<span style="font-family: 宋体">同步处理技巧</span></p>
<p><span style="font-family: 宋体">同步主要出现在多线程的情况，为多线程同时运行时提供对象数据安全的机制，多线程是比较复杂话题，应用多线程也是为了获得性能的提升，应该尽可能减少同步。</span></p>
<p><span style="font-family: 宋体">另外，如果需要同步的地方，可以减少同步的代码段，如只同步某个方法或函数，而不是整个代码。</span><br />
<br />
</p>
<p>8 <span style="font-family: 宋体">尽可能的使用</span>Java<span style="font-family: 宋体">自身提供的</span>API</p>
<p>Java<span style="font-family: 宋体">的</span>API<span style="font-family: 宋体">一般都做了性能的考虑，如果完成相同的功能，优先使用</span>API<span style="font-family: 宋体">而不是自己写的代码，如数组复制。</span></p>
<p><br />
9 <span style="font-family: 宋体">尽量减少</span>I/O<span style="font-family: 宋体">操作</span></p>
<p><span style="font-family: 宋体">输入</span>/<span style="font-family: 宋体">输出（</span>I/O<span style="font-family: 宋体">）包括很多方面，我们知道，进行</span>I/O<span style="font-family: 宋体">操作是很消耗系统资源的。程序中应该尽量少用</span>I/O<span style="font-family: 宋体">操作。使用时可以注意：</span> . <span style="font-family: 宋体">合理控制输出函数</span>System.out.println()<span style="font-family: 宋体">对于大多时候是有用的，特别是系统调试的时候，但也会产生大量的信息出现在控制台和日志上，同时输出时，有序列化和同步的过程，造成了开销。</span></p>
<p><span style="font-family: 宋体">特别是在发行版中，要合理的控制输出，可以在项目开发时，设计好一个</span>Debug<span style="font-family: 宋体">的工具类，在该类中可以实现输出开关，输出的级别，根据不同的情况进行不同的输出的控制。</span><br />
<br />
</p>
<p>10 <span style="font-family: 宋体">尽量使用缓存</span></p>
<p><span style="font-family: 宋体">读写内存要比读写硬盘上的文件要快很多，应尽可能使用缓冲，以便直接从内存中读取数据。尽可能使用带有</span>Buffer<span style="font-family: 宋体">的类代替没有</span>Buffer<span style="font-family: 宋体">的类，如可以用</span>BufferedReader <span style="font-family: 宋体">代替</span>Reader<span style="font-family: 宋体">，用</span>BufferedWriter<span style="font-family: 宋体">代替</span>Writer<span style="font-family: 宋体">来进行处理</span>I/O<span style="font-family: 宋体">操作。</span></p>
<p><span style="font-family: 宋体">同样可以用</span>BufferedInputStream<span style="font-family: 宋体">代替</span>InputStream<span style="font-family: 宋体">都可以获得性能的提高</span></p>
<p><br />
11 <span style="font-family: 宋体">尽量不使用同步：</span></p>
<p>Servlet<span style="font-family: 宋体">是多线程的，以处理不同的请求，基于前面同步的分析，如果有太多的同步就失去了多线程的优势了。</span></p>
<p><br />
12 <span style="font-family: 宋体">不用保存太多的信息在</span>HttpSession<span style="font-family: 宋体">中</span></p>
<p><span style="font-family: 宋体">很多时候，存储一些对象在</span>HttpSession<span style="font-family: 宋体">中是有必要的，可以加快系统的开发，如网上商店系统会把购物车信息保存在该用户的</span>Session<span style="font-family: 宋体">中，但当存储大量的信息或是大的对象在会话中时，是有害的，特别是当系统中用户的访问量很大，对内存的需求就会很高。具体开发时，在这两者之间应作好权衡。</span><br />
<br />
</p>
<p>13<span style="font-family: 宋体">清除</span>SESSION<span style="font-family: 宋体">：</span></p>
<p><span style="font-family: 宋体">通常情况，当达到设定的超时时间时，同时有些</span>Session<span style="font-family: 宋体">没有了活动，服务器会释放这些没有活动的</span>Session<span style="font-family: 宋体">，</span>.. <span style="font-family: 宋体">不过这种情况下，特别是多用户并访时，系统内存要维护多个的无效</span>Session<span style="font-family: 宋体">。当用户退出时，应该手动释放，回收资源，实现如下：</span>..<br />
HttpSession theSession = request.getSession();<br />
// <span style="font-family: 宋体">获取当前</span>Session<br />
if(theSession != null){<br />
<span style="font-family: 宋体">　</span>theSession.invalidate(); // <span style="font-family: 宋体">使该</span>Session<span style="font-family: 宋体">失效</span><br />
}</p>
<p><br />
14 <span style="font-family: 宋体">缓存</span>Home<span style="font-family: 宋体">接口</span></p>
<p>EJB<span style="font-family: 宋体">库使用</span>Enterprise Bean <span style="font-family: 宋体">的客户端通过它的</span>Home<span style="font-family: 宋体">接口创建它的实例。客户端能通过</span>JNDI<span style="font-family: 宋体">访问它。服务器通过</span>Lookup<span style="font-family: 宋体">方法来获取。</span><br />
JNDI<span style="font-family: 宋体">是个远程对象，通过</span>RMI<span style="font-family: 宋体">方式调用，对它的访问往往是比较费时的。所以，在设计时可以设计一个类专门用来缓存</span>Home<span style="font-family: 宋体">接口，在系统初始化时就获得需要的</span>Home<span style="font-family: 宋体">接口并缓存，以后的引用只要引用缓存即可。</span><br />
<br />
</p>
<p>15 <span style="font-family: 宋体">使用快速度的</span>Jdbc<span style="font-family: 宋体">驱动</span></p>
<p>JDBC API<span style="font-family: 宋体">包括两种实现接口形式，一种是纯</span>Java<span style="font-family: 宋体">实现的驱动，一种利用</span>ODBC<span style="font-family: 宋体">驱动和数据库客户端实现，具体有四种驱动模式：</span></p>
<p><span style="font-family: 宋体">第一类：</span>JDBC-ODBC<span style="font-family: 宋体">桥，再加上</span>ODBC<span style="font-family: 宋体">驱动程序。</span><br />
JDBC<span style="font-family: 宋体">驱动程序是</span>JDBC-ODBC<span style="font-family: 宋体">桥再加上一个</span>ODBC<span style="font-family: 宋体">驱动程序。建议第一类驱动程序只用于原型开发，而不要用于正式的运行环境。桥接驱动程序由</span>Sun<span style="font-family: 宋体">提供，它的目标是支持传统的数据库系统。</span>Sun<span style="font-family: 宋体">为该软件提供关键问题的补丁，但不为该软件的最终用户提供支持。一般地，桥接驱动程序用于已经在</span>ODBC<span style="font-family: 宋体">技术上投资的情形，例如已经投资了</span>Windows<span style="font-family: 宋体">应用服务器。</span><br />
<span style="font-family: 宋体">尽管</span>Sun<span style="font-family: 宋体">提供了</span>JDBC-ODBC<span style="font-family: 宋体">桥接驱动程序，但由于</span>ODBC<span style="font-family: 宋体">会在客户端装载二进制代码和数据库客户端代码，这种技术不适用于高事务性的环境。另外，第一类</span>JDBC<span style="font-family: 宋体">驱动程序不支持完整的</span>Java<span style="font-family: 宋体">命令集，而是局限于</span>ODBC<span style="font-family: 宋体">驱动程序的功能，这种驱动方式也叫胖客户，主要用于低并发请求，大数据量传输的应用。</span></p>
<p><span style="font-family: 宋体">第二类：本机</span>API<span style="font-family: 宋体">，部分是</span>Java<span style="font-family: 宋体">的驱动程序。</span><br />
JDBC<span style="font-family: 宋体">驱动程序是本机</span>API<span style="font-family: 宋体">的部分</span>Java<span style="font-family: 宋体">代码的驱动程序，用于把</span>JDBC<span style="font-family: 宋体">调用转换成主流数据库</span>API<span style="font-family: 宋体">的本机调用。这类驱动程序也存在与第一类驱动程序一样的性能问题，即客户端载入二进制代码的问题，而且它们被绑定了特定的平台。</span><br />
<span style="font-family: 宋体">第二类驱动程序要求编写面向特定平台的代码，主流的数据库厂商，例如</span>Oracle<span style="font-family: 宋体">和</span>IBM<span style="font-family: 宋体">，都为它们的企业数据库平台提供了第二类驱动程序，使用这些驱动程序的开发者必须及时跟进不同数据库厂商针对不同操作系统发行的各个驱动程序版本。</span><br />
<span style="font-family: 宋体">另外，由于第二类驱动程序没有使用纯</span>Java<span style="font-family: 宋体">的</span>API<span style="font-family: 宋体">，把</span>Java<span style="font-family: 宋体">应用连接到数据源时，往往必须执行一些额外的配置工作。很多时候，第二类驱动程序不能在体系结构上与大型主机的数据源兼容；即使做到了兼容，效果也是比较差。</span></p>
<p><span style="font-family: 宋体">第三类：面向数据库中间件的纯</span>Java<span style="font-family: 宋体">驱动程序。</span><br />
JDBC<span style="font-family: 宋体">驱动程序是面向数据库中间件的纯</span>Java<span style="font-family: 宋体">驱动程序，</span>JDBC<span style="font-family: 宋体">调用被转换成一种中间件厂商的协议，中间件再把这些调用转换到数据库</span>API<span style="font-family: 宋体">。第三类</span>JDBC<span style="font-family: 宋体">驱动程序的优点是它以服务器为基础，也就是不再需要客户端的本机代码，这使第三类驱动程序要比第一、二两类快。另外，开发者还可以利用单一的驱动程序连接到多种数据库。</span></p>
<p><span style="font-family: 宋体">第四类：直接面向数据库的纯</span>Java<span style="font-family: 宋体">驱动程序。</span> <br />
JDBC<span style="font-family: 宋体">驱动程序是直接面向数据库的纯</span>Java<span style="font-family: 宋体">驱动程序，即所谓的&#8220;瘦&#8221;（</span>thin<span style="font-family: 宋体">）驱动程序，它把</span>JDBC<span style="font-family: 宋体">调用转换成某种直接可被</span>DBMS<span style="font-family: 宋体">使用的网络协议，这样，客户机和应用服务器可以直接调用</span>DBMS<span style="font-family: 宋体">服务器。对于第四类驱动程序，不同</span>DBMS<span style="font-family: 宋体">的驱动程序不同。因此，在一个异构计算环境中，驱动程序的数量可能会比较多。但是，由于第四类驱动程序具有较高的性能，能够直接访问</span>DBMS<span style="font-family: 宋体">，所以这一问题就不那么突出了，</span> <span style="font-family: 宋体">这种驱动方式，主要用于高并发，低数据量请求的应用中。</span><br />
<br />
</p>
<p>16 <span style="font-family: 宋体">使用</span>Jdbc<span style="font-family: 宋体">链接池</span></p>
<p><span style="font-family: 宋体">为了提高访问数据库的性能，我们还可以使用</span>JDBC 2.0<span style="font-family: 宋体">的一些规范和特性，</span>JDBC<span style="font-family: 宋体">是占用资源的，在使用数据库连接时可以使用连接池</span>Connection Pooling<span style="font-family: 宋体">，避免频繁打开、关闭</span>Connection<span style="font-family: 宋体">。而我们知道，获取</span>Connection<span style="font-family: 宋体">是比较消耗系统资源的。</span><br />
Connection<span style="font-family: 宋体">缓冲池：当一个应用程序关闭一个数据库连接时，这个连接并不真正释放而是被循环利用，建立连接是消耗较大的操作，循环利用连接可以显著的提高性能，因为可以减少新连接的建立。</span></p>
<p><span style="font-family: 宋体">一个通过</span>DataSource<span style="font-family: 宋体">获取缓冲池获得连接，并连接到一个</span>CustomerDB<span style="font-family: 宋体">数据源的代码演示如下：</span><br />
Context ctx = new InitialContext();<br />
DataSource dataSource = (DataSource) ctx.lookup("jdbc/CustomerDB");<br />
Connection conn = dataSource.getConnection("password","username");</p>
<p><br />
17 <span style="font-family: 宋体">缓存</span>DataSorce</p>
<p><span style="font-family: 宋体">一个</span>DataSource<span style="font-family: 宋体">对象代表一个实际的数据源。这个数据源可以是从关系数据库到表格形式的文件，完全依赖于它是怎样实现的，一个数据源对象注册到</span>JNDI<span style="font-family: 宋体">名字服务后，应用程序就可以从</span>JNDI<span style="font-family: 宋体">服务器上取得该对象，并使用之和数据源建立连接。</span><br />
<span style="font-family: 宋体">　　通过上面的例子，我们知道</span>DataSource<span style="font-family: 宋体">是从连接池获得连接的一种方式，通过</span>JNDI<span style="font-family: 宋体">方式获得，是占用资源的。</span><br />
<span style="font-family: 宋体">　　为了避免再次的</span>JNDI<span style="font-family: 宋体">调用，可以系统中缓存要使用的</span>DataSource<span style="font-family: 宋体">。</span></p>
<p><br />
18 <span style="font-family: 宋体">即时关闭使用过的资源</span></p>
<p><span style="font-family: 宋体">互联网应用系统一般是并发的系统，在每次申请和使用完资源后，应该释放供别人使用，使用完成后应该保证彻底的释放。</span></p>
<p><br />
19 <span style="font-family: 宋体">架构选型</span></p>
<p>CoreMediaCMS<span style="font-family: 宋体">将整个应用分成四成架构，每一层都可以独立于其他层而正常运行，每一层都可以分布式布署，极大的提高了应用系统的稳定性、可扩展性、支持高并发的要求，每一次之前通过中间件</span>Corba<span style="font-family: 宋体">进行稳定的传输数据。</span></p>
<p><br />
20 <span style="font-family: 宋体">开发框架的选型</span></p>
<p><span style="font-family: 宋体">充分利用开源框架，可以大大提高开发效率。很多初级开发者，都采用</span>DB+JavaBean+JSP<span style="font-family: 宋体">这种初级的开发模式，而现在主要使用</span>Struts<span style="font-family: 宋体">、</span>Spring<span style="font-family: 宋体">等</span>MVC<span style="font-family: 宋体">开发框架。</span></p>
<p><span style="font-family: 宋体">常用开发框架构选型有：</span></p>
<p>Struts<span style="font-family: 宋体">、</span>Spring<span style="font-family: 宋体">、</span>Webwork<span style="font-family: 宋体">等。</span></p>
<p><span style="font-family: 宋体">天极传媒选择的开发框架是：</span>Struts+Spring+iBatis<span style="font-family: 宋体">，在这个开发框架里，充分利用了</span>Struts<span style="font-family: 宋体">、</span>Spring<span style="font-family: 宋体">各自己的优点，可以选择</span>Stuts<span style="font-family: 宋体">　</span>MVC<span style="font-family: 宋体">，也可以选择</span>Spring MVC<span style="font-family: 宋体">。</span></p>
<p><br />
21 <span style="font-family: 宋体">分级存储</span></p>
<p><span style="font-family: 宋体">１）数据库数据分级存储：</span></p>
<p><span style="font-family: 宋体">将经常访问的数据和访问频度低的数据，分别存放到不同的分区，甚至存放到不同的数据库服务器，以便合进分配硬盘</span>I/O<span style="font-family: 宋体">及系统</span>I/O<span style="font-family: 宋体">。</span></p>
<p><span style="font-family: 宋体">２）网站内容发布之后，分级存储：</span></p>
<p><span style="font-family: 宋体">任何一个大型的网站，一般都有海量的内容，为了提高访问效率，应搭建分级存储体系，根据应用的重要性和访问并发要求，将这些内容分级存储，同时将静态内容中的静态页面文件、图片文件、下载文件分不同的</span>Web<span style="font-family: 宋体">服务器访问，降低</span>I/O<span style="font-family: 宋体">争用，提高访问效率，同时让数据存储、管理、备份更加清晰。</span></p>
<p><br />
22 <span style="font-family: 宋体">页面静态化</span></p>
<p><span style="font-family: 宋体">一个大型网站，既有静态内容，也有动态内容。静态内容，直接通过</span>Apache<span style="font-family: 宋体">或者</span>Squid<span style="font-family: 宋体">访问，效率高，稳定可靠，更多的是受服务器等硬件设备的</span>I/O<span style="font-family: 宋体">吞吐量、网络环境及页面代码本身质量限制，不受应用系统及数据库性能限制，这些内容往往访问速度和效率不会有较大的问题。</span></p>
<p><span style="font-family: 宋体">而动态内容，除了受硬件设备</span>I/O<span style="font-family: 宋体">、操作系统</span>I/O<span style="font-family: 宋体">及内容、网络环境及页面代码的影响，还要受应用服务器和数据库性能影响，因此，这部份内容，要尽可能作静态化或者伪静态，并采用缓存技术，将其缓存，以减少对应用服务器和数据库服务器的操作次数，提高用户访问效率和稳定性。</span></p>
<p><br />
23 <span style="font-family: 宋体">缓存策略</span></p>
<p><span style="font-family: 宋体">对于构建的业务系统，如果有些数据要经常要从数据库中读取，同时，这些数据又不经常变化，这些数据就可以在系统中缓存起来，使用时直接读取缓存，而不用频繁的访问数据库读取数据。</span><br />
<span style="font-family: 宋体">缓存工作可以在系统初始化时一次性读取数据，特别是一些只读的数据，当数据更新时更新数据库内容，同时更新缓存的数据值。</span></p>
<p><span style="font-family: 宋体">例如：在</span>CMS2005<span style="font-family: 宋体">系统中，我们将很少发生变化的网站节点树数据，缓存在客户端，当用户登录时，一次性读入到客户端缓存起来，以后编辑在使用时，不用再从数据库中读取，大大提高了应用系统的访问速度。</span></p>
<p><span style="font-family: 宋体">当然，也可以将数据库中重复访问的数据缓存在应用服务器内存中，减少对数据库的访问次数，</span>Java<span style="font-family: 宋体">常用的缓存技术产品有：</span>MemoryCache<span style="font-family: 宋体">、</span>OSCache<span style="font-family: 宋体">等。</span></p>
<img src ="http://www.blogjava.net/ywj-316/aggbug/328323.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/ywj-316/" target="_blank">junly</a> 2010-08-09 17:16 <a href="http://www.blogjava.net/ywj-316/archive/2010/08/09/328323.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>内存溢出跟踪笔录</title><link>http://www.blogjava.net/ywj-316/archive/2010/07/22/326814.html</link><dc:creator>junly</dc:creator><author>junly</author><pubDate>Thu, 22 Jul 2010 03:11:00 GMT</pubDate><guid>http://www.blogjava.net/ywj-316/archive/2010/07/22/326814.html</guid><wfw:comment>http://www.blogjava.net/ywj-316/comments/326814.html</wfw:comment><comments>http://www.blogjava.net/ywj-316/archive/2010/07/22/326814.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/ywj-316/comments/commentRss/326814.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/ywj-316/services/trackbacks/326814.html</trackback:ping><description><![CDATA[最近一直被内存溢出捆扰，现在对这几天的工作做个小小的总结！另外给首次与到此类问题的小鸟们作个提示，希望大家早日变成老鸟！<br />
<br />
1 首先确认是不是内存溢出，如果直接报OutOfMemoryException，那肯定是内存溢出，有时可能没有发现这个错误，但WEB服务到最后还是挂了，也有可能是由Memory Out，如何确认，最好的办法就是查看gc日志。<br />
<br />
2 如果确认是内存溢出，不要急着跟踪，因为要找到确切位置还是有一定困难的，个人建议对最近修改的代码作一次全面检查，对于有可能出现内存溢出的地方作些修改。<br />
可能出现的原因：<br />
（1） 递归、循环，这里要注意隐性的地笔，如拦载器，我自已遇到一次拦载器的死循环<br />
（2） static 的对象，查看static里面是不是有大量的对象塞进去<br />
（3）Set/List/Map对象，查看Set/List/Map里面是不是有对象用完了没有释放<br />
（4）session/application，查看session里的对象、过期时间等，看是不是无法即时释放<br />
（5）ClassLoader，Java ClassLoader结构的使用为内存泄漏提供了许多可乘之机。这个我不知道深层原因，有知道的可以告诉我，将不胜感谢！<br />
（6）String,字符串累加也容易出现溢出。一般顺序StringBuilder,StringBuffer,String。<br />
（7）全局变量，尽量不使用，使用了即时释放<br />
修改后再查看日志，也许问题已经解决了。<br />
<br />
3 如果还是有溢出就只能上工具了，我使用的是JProfiler，功能很强大，首先我在window上远程监控linux，结果失败，原因是因为JProfiler本身就有很大的消耗，而且在测试中还要不断gc，影响生产，所以选用在测试环境中配合jmeter测试。<br />
<br />
4 测试方法：循环测试，查看gc后是否有对象数量不断增加，即有对象未释放。<br />
<br />
5 其此是要了解java内存分配原理和gc的工作原理，这样才可以定位到问题的具体位置。<br />
<br />
6 对jvm进行优化。<br />
<br />
<br />
<br />
<br />
具体操作未详细说明，可以参考相关资料<br />
<br />
java内存泄漏原因 <a title="http://www.ibm.com/developerworks/cn/java/l-JavaMemoryLeak/" href="http://www.ibm.com/developerworks/cn/java/l-JavaMemoryLeak/">http://www.ibm.com/developerworks/cn/java/l-JavaMemoryLeak/</a><br />
<br />
gc原理<a title="http://chenchendefeng.javaeye.com/blog/455883" href="http://chenchendefeng.javaeye.com/blog/455883">http://chenchendefeng.javaeye.com/blog/455883</a><br />
<br />
jvm优化<a title="http://www.cjsdn.net/post/view?bid=1&amp;id=197954" href="http://www.cjsdn.net/post/view?bid=1&amp;id=197954">http://www.cjsdn.net/post/view?bid=1&amp;id=197954</a><br />
<br />
<a href="http://sw1982.javaeye.com/blog/724626">JVM调优-解决native heap持续增长</a>&nbsp;<a title="http://sw1982.javaeye.com/blog/724626" href="http://sw1982.javaeye.com/blog/724626">http://sw1982.javaeye.com/blog/724626</a>&nbsp;荐<br />
<br />
<br />
<br />
<img src ="http://www.blogjava.net/ywj-316/aggbug/326814.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/ywj-316/" target="_blank">junly</a> 2010-07-22 11:11 <a href="http://www.blogjava.net/ywj-316/archive/2010/07/22/326814.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>守护线程、非守护线程（用户线程）(转)</title><link>http://www.blogjava.net/ywj-316/archive/2010/04/25/319298.html</link><dc:creator>junly</dc:creator><author>junly</author><pubDate>Sat, 24 Apr 2010 16:06:00 GMT</pubDate><guid>http://www.blogjava.net/ywj-316/archive/2010/04/25/319298.html</guid><wfw:comment>http://www.blogjava.net/ywj-316/comments/319298.html</wfw:comment><comments>http://www.blogjava.net/ywj-316/archive/2010/04/25/319298.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/ywj-316/comments/commentRss/319298.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/ywj-316/services/trackbacks/319298.html</trackback:ping><description><![CDATA[<h3><a href="http://speed847.javaeye.com/blog/379907"></a>&nbsp;</h3>
<div>
<p><span style="font-size: small"><span style="font-family: Times New Roman">1、&nbsp;java</span>命令和<span style="font-family: Times New Roman"> javaw</span>命令是怎么回事？</span></p>
<p style="margin: 0cm 0cm 0pt"><span style="font-size: small">我现在的理解：</span></p>
<p style="margin: 0cm 0cm 0pt"><span style="font-size: small"><span style="font-family: Times New Roman">java</span>命令在执行一个<span style="font-family: Times New Roman">class</span>文件的时候，</span></p>
<p style="margin: 0cm 0cm 0pt"><span style="font-size: small">（<span style="font-family: Times New Roman">1</span>）首先要创建一个虚拟机实例</span></p>
<p style="margin: 0cm 0cm 0pt"><span style="font-size: small">（<span style="font-family: Times New Roman">2</span>）虚拟机启动用户主线程<span style="font-family: Times New Roman"> main</span>（）方法，这是非守护线程</span></p>
<p style="margin: 0cm 0cm 0pt"><span style="font-size: small">（<span style="font-family: Times New Roman">3</span>）虚拟机（也可能是主线程）启动守护线程。比如垃圾收集线程。</span></p>
<p style="margin: 0cm 0cm 0pt"><span style="font-size: small">（<span style="font-family: Times New Roman">4</span>）<span style="font-family: Times New Roman">main</span>（）方法结束，并且由<span style="font-family: Times New Roman">main</span>（）方法创建的用户线程也结束。也就是说系统中没有用户线程存在了，则守护线程也结束，最后虚拟机实例自动销毁。</span></p>
<p style="margin: 0cm 0cm 0pt"><span style="font-size: small"><span style="font-family: Times New Roman">javaw</span>命令在<span style="font-family: Times New Roman">eclipse</span>启动后，也是代表了一个虚拟机实例。它一直存在应该是因为系统中有用户线程一直在后台运行。</span></p>
<p style="margin: 0cm 0cm 0pt"><span style="font-size: small">当<span style="font-family: Times New Roman">eclipse</span>被关闭是，应该是调用了<span style="font-family: Times New Roman">system</span>的<span style="font-family: Times New Roman">exist</span>（）方法，即虚拟机实例强行销毁。</span></p>
<p style="margin: 0cm 0cm 0pt"><span style="font-size: small">当用户自己编写的<span style="font-family: Times New Roman">class</span>文件在<span style="font-family: Times New Roman">eclipse</span>中执行时，由<span style="font-family: Times New Roman">javaw</span>这个虚拟机实例解释执行。</span></p>
<p><span style="font-size: small"><span style="font-family: Times New Roman">2、&nbsp;</span>下面是网上资料总结如下：</span></p>
<p style="margin: 0cm 0cm 0pt; text-indent: 21pt; line-height: 150%; text-align: left" align="left"><span style="font-size: small">Java有两种Thread：&#8220;守护线程Daemon&#8221;与&#8220;用户线程User&#8221;。</span></p>
<p style="margin: 0cm 0cm 0pt; text-indent: 21pt; line-height: 150%; text-align: left" align="left"><span style="font-size: small">从字面上我们很容易将守护线程理解成是由虚拟机（virtual machine）在内部创建的，而用户线程则是自己所创建的。事实并不是这样，任何线程都可以是&#8220;守护线程Daemon&#8221;或&#8220;用户线程User&#8221;。他们在几乎每个方面都是相同的，唯一的区别是判断虚拟机何时离开：</span></p>
<p style="margin: 0cm 0cm 0pt; text-indent: 21pt; line-height: 150%; text-align: left" align="left"><span style="font-size: small">用户线程：Java虚拟机在它所有非守护线程已经离开后自动离开。</span></p>
<p style="margin: 0cm 0cm 0pt; text-indent: 21pt; line-height: 150%; text-align: left" align="left"><span style="font-size: small">守护线程：守护线程则是用来服务用户线程的，如果没有其他用户线程在运行，那么就没有可服务对象，也就没有理由继续下去。</span></p>
<p style="margin: 0cm 0cm 0pt; text-indent: 21pt; line-height: 150%; text-align: left" align="left"><span style="font-size: small">setDaemon(boolean on)方法可以方便的设置线程的Daemon模式，true为Daemon模式，false为User模式。setDaemon(boolean on)方法必须在线程启动之前调用，当线程正在运行时调用会产生异常。isDaemon方法将测试该线程是否为守护线程。值得一提的是，当你在一个守护线程中产生了其他线程，那么这些新产生的线程不用设置Daemon属性，都将是守护线程，用户线程同样。</span></p>
<p style="margin: 0cm 0cm 0pt; line-height: 150%; text-align: left" align="left"><span style="font-size: small">下面是演示程序：</span></p>
<p style="margin: 0cm 0cm 0pt; line-height: 150%; text-align: left" align="left"><span style="font-size: small">----------------------------------------------------------------</span></p>
<p style="margin: 0cm 0cm 0pt"><span style="font-size: small; font-family: Times New Roman">import java.io.IOException;</span></p>
<p style="margin: 0cm 0cm 0pt"><span style="font-size: small; font-family: Times New Roman">/**</span></p>
<p style="margin: 0cm 0cm 0pt"><span style="font-size: small"><span style="font-family: Times New Roman">&nbsp;* </span>守护线程在没有用户线程可服务时自动离开</span></p>
<p style="margin: 0cm 0cm 0pt"><span style="font-family: Times New Roman"><span style="font-size: small">&nbsp;*/</span></span></p>
<p style="margin: 0cm 0cm 0pt"><span style="font-size: small; font-family: Times New Roman">public class TestMain4 extends Thread {</span></p>
<p style="margin: 0cm 0cm 0pt"><span style="font-size: small; font-family: Times New Roman">&nbsp;&nbsp;&nbsp; </span></p>
<p style="margin: 0cm 0cm 0pt"><span style="font-family: Times New Roman"><span style="font-size: small">&nbsp;&nbsp;&nbsp; public TestMain4() {</span></span></p>
<p style="margin: 0cm 0cm 0pt"><span style="font-family: Times New Roman"><span style="font-size: small">&nbsp;&nbsp;&nbsp; }</span></span></p>
<p style="margin: 0cm 0cm 0pt"><span style="font-family: Times New Roman"><span style="font-size: small">&nbsp;&nbsp;&nbsp; public void run() {</span></span></p>
<p style="margin: 0cm 0cm 0pt"><span style="font-family: Times New Roman"><span style="font-size: small">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for(int i = 1; i &lt;= 50; i++){</span></span></p>
<p style="margin: 0cm 0cm 0pt"><span style="font-family: Times New Roman"><span style="font-size: small">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; try {</span></span></p>
<p style="margin: 0cm 0cm 0pt"><span style="font-family: Times New Roman"><span style="font-size: small">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Thread.sleep(100);</span></span></p>
<p style="margin: 0cm 0cm 0pt"><span style="font-family: Times New Roman"><span style="font-size: small">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } catch (InterruptedException ex) {</span></span></p>
<p style="margin: 0cm 0cm 0pt"><span style="font-family: Times New Roman"><span style="font-size: small">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ex.printStackTrace();</span></span></p>
<p style="margin: 0cm 0cm 0pt"><span style="font-family: Times New Roman"><span style="font-size: small">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</span></span></p>
<p style="margin: 0cm 0cm 0pt"><span style="font-family: Times New Roman"><span style="font-size: small">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println(i);</span></span></p>
<p style="margin: 0cm 0cm 0pt"><span style="font-family: Times New Roman"><span style="font-size: small">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</span></span></p>
<p style="margin: 0cm 0cm 0pt"><span style="font-family: Times New Roman"><span style="font-size: small">&nbsp;&nbsp;&nbsp; }</span></span></p>
<p style="margin: 0cm 0cm 0pt"><span style="font-size: small; font-family: Times New Roman">&nbsp;&nbsp;&nbsp; </span></p>
<p style="margin: 0cm 0cm 0pt"><span style="font-family: Times New Roman"><span style="font-size: small">&nbsp;&nbsp;&nbsp; public static void main(String [] args){</span></span></p>
<p style="margin: 0cm 0cm 0pt"><span style="font-family: Times New Roman"><span style="font-size: small">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; TestMain4 test = new TestMain4();</span></span></p>
<p style="margin: 0cm 0cm 0pt"><span style="font-family: Times New Roman"><span style="font-size: small">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; test.setDaemon(false);</span></span></p>
<p style="margin: 0cm 0cm 0pt"><span style="font-family: Times New Roman"><span style="font-size: small">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; test.start();</span></span></p>
<p style="margin: 0cm 0cm 0pt"><span style="font-family: Times New Roman"><span style="font-size: small">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println("isDaemon = " + test.isDaemon());</span></span></p>
<p style="margin: 0cm 0cm 0pt"><span style="font-family: Times New Roman"><span style="font-size: small">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; try {</span></span></p>
<p style="margin: 0cm 0cm 0pt"><span style="font-size: small"><span style="font-family: Times New Roman">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.in.read(); // </span>接受输入，使程序在此停顿，一旦接收到用户输入，<span style="font-family: Times New Roman">main</span>线程结束，守护线程自动结束<span style="font-family: Times New Roman">,</span>如果<span style="font-family: Times New Roman">test</span>不是守护进程必须等到<span style="font-family: Times New Roman">test</span>运行完了以后才退出</span></p>
<p style="margin: 0cm 0cm 0pt"><span style="font-family: Times New Roman"><span style="font-size: small">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } catch (Exception ex) {</span></span></p>
<p style="margin: 0cm 0cm 0pt"><span style="font-family: Times New Roman"><span style="font-size: small">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ex.printStackTrace();</span></span></p>
<p style="margin: 0cm 0cm 0pt"><span style="font-family: Times New Roman"><span style="font-size: small">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</span></span></p>
<p style="margin: 0cm 0cm 0pt"><span style="font-family: Times New Roman"><span style="font-size: small">&nbsp;&nbsp;&nbsp; } </span></span></p>
<p style="margin: 0cm 0cm 0pt"><span style="font-size: small; font-family: Times New Roman">}</span></p>
<p style="margin: 0cm 0cm 0pt"><span style="font-size: small; font-family: Times New Roman">----------------------------------------------------------------------------------</span></p>
<p style="margin: 0cm 0cm 0pt"><span style="font-size: small">例：我们所熟悉的<span style="color: black; font-family: Verdana">Java</span>垃圾回收线程就是一个典型的守护线程，当我们的程序中不再有任何运行中的<span style="color: black; font-family: Verdana">Thread</span>，程序就不会再产生垃圾，垃圾回收器也就无事可做，所以当垃圾回收线程是<span style="color: black; font-family: Verdana">Java</span>虚拟机上仅剩的线程时，<span style="color: black; font-family: Verdana">Java</span>虚拟机会自动离开。</span></p>
<p style="margin: 0cm 0cm 0pt"><span style="color: black; font-family: Verdana">&nbsp;</span></p>
<p><span style="font-size: small"><span style="color: black; font-family: Verdana">3、</span>下面是一个论坛的帖子</span></p>
<p style="margin: 0cm 0cm 0pt"><span style="color: black; font-family: Verdana">&nbsp;</span></p>
<p style="margin: 0cm 0cm 0pt"><span style="color: black; font-family: Verdana"><a href="http://topic.csdn.net/t/20060115/00/4517316.html"><span style="font-size: small">http://topic.csdn.net/t/20060115/00/4517316.html</span></a></span></p>
<p style="margin: 0cm 0cm 0pt"><span style="color: black; font-family: Verdana">&nbsp;</span></p>
<p style="margin: 0cm 0cm 0pt; text-indent: 18pt"><span style="font-size: small">守护线程与普通线程的唯一区别是：当<span style="font-size: 9pt; font-family: Tahoma">JVM</span>中所有的线程都是守护线程的时候，<span style="font-size: 9pt; font-family: Tahoma">JVM</span>就可以退出了；如果还有一个或以上的非守护线程则不会退出。（以上是针对正常退出，调用<span style="font-size: 9pt; font-family: Tahoma">System.exit</span>则必定会退出）</span><span style="font-size: small"><span style="font-size: 9pt; font-family: Tahoma"> &nbsp; <br />
&nbsp; &nbsp;&nbsp;</span>所以<span style="font-size: 9pt; font-family: Tahoma">setDeamon(true)</span>的唯一意义就是告诉<span style="font-size: 9pt; font-family: Tahoma">JVM</span>不需要等待它退出，让<span style="font-size: 9pt; font-family: Tahoma">JVM</span>喜欢什么退出就退出吧，不用管它。</span></p>
</div>
<img src ="http://www.blogjava.net/ywj-316/aggbug/319298.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/ywj-316/" target="_blank">junly</a> 2010-04-25 00:06 <a href="http://www.blogjava.net/ywj-316/archive/2010/04/25/319298.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>jvm类加载器</title><link>http://www.blogjava.net/ywj-316/archive/2010/04/24/319291.html</link><dc:creator>junly</dc:creator><author>junly</author><pubDate>Sat, 24 Apr 2010 14:26:00 GMT</pubDate><guid>http://www.blogjava.net/ywj-316/archive/2010/04/24/319291.html</guid><wfw:comment>http://www.blogjava.net/ywj-316/comments/319291.html</wfw:comment><comments>http://www.blogjava.net/ywj-316/archive/2010/04/24/319291.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/ywj-316/comments/commentRss/319291.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/ywj-316/services/trackbacks/319291.html</trackback:ping><description><![CDATA[<a title="http://gzcj.javaeye.com/blog/394648" href="http://gzcj.javaeye.com/blog/394648" name="major1"><span class="atitle"><br />
其他参考:<br />
1 http://gzcj.javaeye.com/blog/394648<br />
2 http://blog.sina.com.cn/s/blog_5f1fe33f0100d9ak.html<br />
<br />
<br />
类加载器</span></a>是 Java 语言流行的重要原因之一。它使得 Java 类可以被动态加载到 Java 虚拟机中并执行。类加载器从 JDK 1.0 就出现了，最初是为了满足 Java Applet 的需要而开发出来的。Java Applet 需要从远程下载 Java 类文件到浏览器中并执行。现在类加载器在 Web 容器和 OSGi 中得到了广泛的使用。一般来说，Java 应用的开发人员不需要直接同类加载器进行交互。Java 虚拟机默认的行为就已经足够满足大多数情况的需求了。不过如果遇到了需要与类加载器进行交互的情况，而对类加载器的机制又不是很了解的话，就很容易花大量的时间去调试 <code>ClassNotFoundException</code> 和 <code>NoClassDefFoundError</code> 等异常。本文将详细介绍 Java 的类加载器，帮助读者深刻理解 Java 语言中的这个重要概念。下面首先介绍一些相关的基本概念。
<p>&nbsp;</p>
<p><a name="major1"><span class="atitle">类加载器基本概念</span></a></p>
<p>顾名思义，类加载器（class loader）用来加载 Java 类到 Java 虚拟机中。一般来说，Java 虚拟机使用 Java 类的方式如下：Java 源程序（.java 文件）在经过 Java 编译器编译之后就被转换成 Java 字节代码（.class 文件）。类加载器负责读取 Java 字节代码，并转换成 <code>java.lang.Class</code> 类的一个实例。每个这样的实例用来表示一个 Java 类。通过此实例的 <code>newInstance()</code>方法就可以创建出该类的一个对象。实际的情况可能更加复杂，比如 Java 字节代码可能是通过工具动态生成的，也可能是通过网络下载的。</p>
<p>基本上所有的类加载器都是 <code>java.lang.ClassLoader</code> 类的一个实例。下面详细介绍这个 Java 类。</p>
<p><a name="minor1.1"><span class="smalltitle"><code>java.lang.ClassLoader</code> 类介绍</span></a></p>
<p><code>java.lang.ClassLoader</code> 类的基本职责就是根据一个指定的类的名称，找到或者生成其对应的字节代码，然后从这些字节代码中定义出一个 Java 类，即 <code>java.lang.Class</code> 类的一个实例。除此之外，<code>ClassLoader</code> 还负责加载 Java 应用所需的资源，如图像文件和配置文件等。不过本文只讨论其加载类的功能。为了完成加载类的这个职责，<code>ClassLoader</code> 提供了一系列的方法，比较重要的方法如 <a href="http://www.ibm.com/developerworks/cn/java/j-lo-classloader/#table1">表 1</a> 所示。关于这些方法的细节会在下面进行介绍。</p>
<br />
<a name="minor1.1"><strong>表 1. ClassLoader 中与加载类相关的方法</strong></a><br />
<table class="data-table-1" cellspacing="0" cellpadding="0" width="100%" summary="ClassLoader 中与加载类相关的方法" border="0">
    <tbody>
        <tr>
            <th scope="col">方法</th>
            <th scope="col">说明</th>
        </tr>
        <tr>
            <td><code>getParent()</code> </td>
            <td>返回该类加载器的父类加载器。</td>
        </tr>
        <tr>
            <td><code>loadClass(String name)</code> </td>
            <td>加载名称为 <code>name</code> 的类，返回的结果是 <code>java.lang.Class</code> 类的实例。</td>
        </tr>
        <tr>
            <td><code>findClass(String name)</code> </td>
            <td>查找名称为 <code>name</code> 的类，返回的结果是 <code>java.lang.Class</code> 类的实例。</td>
        </tr>
        <tr>
            <td><code>findLoadedClass(String name)</code> </td>
            <td>查找名称为 <code>name</code> 的已经被加载过的类，返回的结果是 <code>java.lang.Class</code> 类的实例。</td>
        </tr>
        <tr>
            <td><code>defineClass(String name, byte[] b, int off, int len)</code> </td>
            <td>把字节数组 <code>b</code> 中的内容转换成 Java 类，返回的结果是 <code>java.lang.Class</code> 类的实例。这个方法被声明为 <code>final</code> 的。</td>
        </tr>
        <tr>
            <td><code>resolveClass(Class&lt;?&gt; c)</code> </td>
            <td>链接指定的 Java 类。</td>
        </tr>
    </tbody>
</table>
<p>对于 <a href="http://www.ibm.com/developerworks/cn/java/j-lo-classloader/#table1">表 1</a> 中给出的方法，表示类名称的 <code>name</code> 参数的值是类的二进制名称。需要注意的是内部类的表示，如 <code>com.example.Sample$1</code> 和 <code>com.example.Sample$Inner</code> 等表示方式。这些方法会在下面介绍类加载器的工作机制时，做进一步的说明。下面介绍类加载器的树状组织结构。</p>
<p><a name="minor1.2"><span class="smalltitle">类加载器的树状组织结构</span></a></p>
<p>Java 中的类加载器大致可以分成两类，一类是系统提供的，另外一类则是由 Java 应用开发人员编写的。系统提供的类加载器主要有下面三个：</p>
<ul>
    <li>引导类加载器（bootstrap class loader）：它用来加载 Java 的核心库，是用原生代码来实现的，并不继承自 <code>java.lang.ClassLoader</code>。
    <li>扩展类加载器（extensions class loader）：它用来加载 Java 的扩展库。Java 虚拟机的实现会提供一个扩展库目录。该类加载器在此目录里面查找并加载 Java 类。
    <li>系统类加载器（system class loader）：它根据 Java 应用的类路径（CLASSPATH）来加载 Java 类。一般来说，Java 应用的类都是由它来完成加载的。可以通过 <code>ClassLoader.getSystemClassLoader()</code> 来获取它。 </li>
</ul>
<p>除了系统提供的类加载器以外，开发人员可以通过继承 <code>java.lang.ClassLoader</code> 类的方式实现自己的类加载器，以满足一些特殊的需求。</p>
<p>除了引导类加载器之外，所有的类加载器都有一个父类加载器。通过 <a href="http://www.ibm.com/developerworks/cn/java/j-lo-classloader/#table1">表 1</a> 中给出的 <code>getParent()</code> 方法可以得到。对于系统提供的类加载器来说，系统类加载器的父类加载器是扩展类加载器，而扩展类加载器的父类加载器是引导类加载器；对于开发人员编写的类加载器来说，其父类加载器是加载此类加载器 Java 类的类加载器。因为类加载器 Java 类如同其它的 Java 类一样，也是要由类加载器来加载的。一般来说，开发人员编写的类加载器的父类加载器是系统类加载器。类加载器通过这种方式组织起来，形成树状结构。树的根节点就是引导类加载器。<a href="http://www.ibm.com/developerworks/cn/java/j-lo-classloader/#fig-classloader-structure">图 1</a> 中给出了一个典型的类加载器树状组织结构示意图，其中的箭头指向的是父类加载器。</p>
<br />
<a name="fig1"><strong>图 1. 类加载器树状组织结构示意图</strong></a><br />
<img height="446" alt="类加载器树状组织结构示意图" src="http://image7.360doc.com/DownloadImg/2010/03/0215/2442419_1.jpg" width="564" /> <br />
<p><a href="http://www.ibm.com/developerworks/cn/java/j-lo-classloader/#code1">代码清单 1</a> 演示了类加载器的树状组织结构。</p>
<br />
<a name="listing1"><strong>清单 1. 演示类加载器的树状组织结构</strong></a><br />
<table cellspacing="0" cellpadding="0" width="100%" border="0">
    <tbody>
        <tr>
            <td class="code-outline">
            <pre class="displaycode">public class ClassLoaderTree { <br />
            <br />
            public static void main(String[] args) { <br />
            ClassLoader loader = ClassLoaderTree.class.getClassLoader(); <br />
            while (loader != null) { <br />
            System.out.println(loader.toString()); <br />
            loader = loader.getParent(); <br />
            } <br />
            } <br />
            }</pre>
            </td>
        </tr>
    </tbody>
</table>
<br />
<p><span style="background-color: yellow">每个 Java 类都维护着一个指向定义它的类加载器的引用，通过 <code>getClassLoader()</code> 方法就可以获取到此引用。</span><a href="http://www.ibm.com/developerworks/cn/java/j-lo-classloader/#code1">代码清单 1</a> 中通过递归调用 <code>getParent()</code> 方法来输出全部的父类加载器。<a href="http://www.ibm.com/developerworks/cn/java/j-lo-classloader/#code1">代码清单 1</a> 的运行结果如 <a href="http://www.ibm.com/developerworks/cn/java/j-lo-classloader/#code2">代码清单 2</a> 所示。</p>
<br />
<a name="listing2"><strong>清单 2. 演示类加载器的树状组织结构的运行结果</strong></a><br />
<table cellspacing="0" cellpadding="0" width="100%" border="0">
    <tbody>
        <tr>
            <td class="code-outline">
            <pre class="displaycode">sun.misc.Launcher$AppClassLoader@9304b1 <br />
            sun.misc.Launcher$ExtClassLoader@190d11</pre>
            </td>
        </tr>
    </tbody>
</table>
<br />
<p>如 <a href="http://www.ibm.com/developerworks/cn/java/j-lo-classloader/#code2">代码清单 2</a> 所示，第一个输出的是 <code>ClassLoaderTree</code> 类的类加载器，即系统类加载器。它是 <code>sun.misc.Launcher$AppClassLoader</code> 类的实例；第二个输出的是扩展类加载器，是 <code>sun.misc.Launcher$ExtClassLoader</code> 类的实例。需要注意的是这里并没有输出引导类加载器，这是由于有些 JDK 的实现对于父类加载器是引导类加载器的情况，<code>getParent()</code> 方法返回 <code>null</code>。</p>
<p>在了解了类加载器的树状组织结构之后，下面介绍类加载器的代理模式。</p>
<p><a name="minor1.3"><span class="smalltitle">类加载器的代理模式</span></a></p>
<p>类加载器在尝试自己去查找某个类的字节代码并定义它时，会先代理给其父类加载器，由父类加载器先去尝试加载这个类，依次类推。在介绍代理模式背后的动机之前，首先需要说明一下 Java 虚拟机是如何判定两个 Java 类是相同的。Java 虚拟机不仅要看类的全名是否相同，还要看加载此类的类加载器是否一样。只有两者都相同的情况，才认为两个类是相同的。即便是同样的字节代码，被不同的类加载器加载之后所得到的类，也是不同的。比如一个 Java 类 <code>com.example.Sample</code>，编译之后生成了字节代码文件 <code>Sample.class</code>。两个不同的类加载器 <code>ClassLoaderA</code> 和 <code>ClassLoaderB</code> 分别读取了这个 <code>Sample.class</code> 文件，并定义出两个 <code>java.lang.Class</code> 类的实例来表示这个类。这两个实例是不相同的。对于 Java 虚拟机来说，它们是不同的类。试图对这两个类的对象进行相互赋值，会抛出运行时异常 <code>ClassCastException</code>。下面通过示例来具体说明。<a href="http://www.ibm.com/developerworks/cn/java/j-lo-classloader/#code3">代码清单 3</a> 中给出了 Java 类 <code>com.example.Sample</code>。</p>
<br />
<a name="listing3"><strong>清单 3. com.example.Sample 类</strong></a><br />
<table cellspacing="0" cellpadding="0" width="100%" border="0">
    <tbody>
        <tr>
            <td class="code-outline">
            <pre class="displaycode">package com.example; <br />
            <br />
            public class Sample { <br />
            private Sample instance; <br />
            <br />
            public void setSample(Object instance) { <br />
            this.instance = (Sample) instance; <br />
            } <br />
            }</pre>
            </td>
        </tr>
    </tbody>
</table>
<br />
<p>如 <a href="http://www.ibm.com/developerworks/cn/java/j-lo-classloader/#code3">代码清单 3</a> 所示，<code>com.example.Sample</code> 类的方法 <code>setSample</code> 接受一个 <code>java.lang.Object</code> 类型的参数，并且会把该参数强制转换成 <code>com.example.Sample</code> 类型。测试 Java 类是否相同的代码如 <a href="http://www.ibm.com/developerworks/cn/java/j-lo-classloader/#code4">代码清单 4</a> 所示。</p>
<br />
<a name="listing4"><strong>清单 4. 测试 Java 类是否相同</strong></a><br />
<table cellspacing="0" cellpadding="0" width="100%" border="0">
    <tbody>
        <tr>
            <td class="code-outline">
            <pre class="displaycode">public void testClassIdentity() { <br />
            String classDataRootPath = "C:\\workspace\\Classloader\\classData"; <br />
            FileSystemClassLoader fscl1 = new FileSystemClassLoader(classDataRootPath); <br />
            FileSystemClassLoader fscl2 = new FileSystemClassLoader(classDataRootPath); <br />
            String className = "com.example.Sample";  <br />
            try { <br />
            Class&lt;?&gt; class1 = fscl1.loadClass(className); <br />
            Object obj1 = class1.newInstance(); <br />
            Class&lt;?&gt; class2 = fscl2.loadClass(className); <br />
            Object obj2 = class2.newInstance(); <br />
            Method setSampleMethod = class1.getMethod("setSample", java.lang.Object.class); <br />
            setSampleMethod.invoke(obj1, obj2); <br />
            } catch (Exception e) { <br />
            e.printStackTrace(); <br />
            } <br />
            }</pre>
            </td>
        </tr>
    </tbody>
</table>
<br />
<p><a href="http://www.ibm.com/developerworks/cn/java/j-lo-classloader/#code4">代码清单 4</a> 中使用了类 <code>FileSystemClassLoader</code> 的两个不同实例来分别加载类 <code>com.example.Sample</code>，得到了两个不同的 <code>java.lang.Class</code> 的实例，接着通过 <code>newInstance()</code> 方法分别生成了两个类的对象 <code>obj1</code> 和 <code>obj2</code>，最后通过 Java 的反射 API 在对象 <code>obj1</code> 上调用方法 <code>setSample</code>，试图把对象 <code>obj2</code> 赋值给 <code>obj1</code> 内部的 <code>instance</code> 对象。<a href="http://www.ibm.com/developerworks/cn/java/j-lo-classloader/#code4">代码清单 4</a> 的运行结果如 <a href="http://www.ibm.com/developerworks/cn/java/j-lo-classloader/#code5">代码清单 5</a> 所示。</p>
<br />
<a name="listing5"><strong>清单 5. 测试 Java 类是否相同的运行结果</strong></a><br />
<table cellspacing="0" cellpadding="0" width="100%" border="0">
    <tbody>
        <tr>
            <td class="code-outline">
            <pre class="displaycode">java.lang.reflect.InvocationTargetException <br />
            at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) <br />
            at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) <br />
            at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) <br />
            at java.lang.reflect.Method.invoke(Method.java:597) <br />
            at classloader.ClassIdentity.testClassIdentity(ClassIdentity.java:26) <br />
            at classloader.ClassIdentity.main(ClassIdentity.java:9) <br />
            Caused by: java.lang.ClassCastException: com.example.Sample <br />
            cannot be cast to com.example.Sample <br />
            at com.example.Sample.setSample(Sample.java:7) <br />
            ... 6 more <br />
            </pre>
            </td>
        </tr>
    </tbody>
</table>
<br />
<p>从 <a href="http://www.ibm.com/developerworks/cn/java/j-lo-classloader/#code5">代码清单 5</a> 给出的运行结果可以看到，运行时抛出了 <code>java.lang.ClassCastException</code> 异常。虽然两个对象 <code>obj1</code> 和 <code>obj2</code> 的类的名字相同，但是这两个类是由不同的类加载器实例来加载的，因此不被 Java 虚拟机认为是相同的。</p>
<p>了解了这一点之后，就可以理解代理模式的设计动机了。代理模式是为了保证 Java 核心库的类型安全。所有 Java 应用都至少需要引用 <code>java.lang.Object</code> 类，也就是说在运行的时候，<code>java.lang.Object</code> 这个类需要被加载到 Java 虚拟机中。如果这个加载过程由 Java 应用自己的类加载器来完成的话，很可能就存在多个版本的 <code>java.lang.Object</code> 类，而且这些类之间是不兼容的。通过代理模式，对于 Java 核心库的类的加载工作由引导类加载器来统一完成，保证了 Java 应用所使用的都是同一个版本的 Java 核心库的类，是互相兼容的。</p>
<p>不同的类加载器为相同名称的类创建了额外的名称空间。相同名称的类可以并存在 Java 虚拟机中，只需要用不同的类加载器来加载它们即可。不同类加载器加载的类之间是不兼容的，这就相当于在 Java 虚拟机内部创建了一个个相互隔离的 Java 类空间。这种技术在许多框架中都被用到，后面会详细介绍。</p>
<p>下面具体介绍类加载器加载类的详细过程。</p>
<p><a name="minor1.4"><span class="smalltitle">加载类的过程</span></a></p>
<p>在前面介绍类加载器的代理模式的时候，提到过类加载器会首先代理给其它类加载器来尝试加载某个类。这就意味着真正完成类的加载工作的类加载器和启动这个加载过程的类加载器，有可能不是同一个。真正完成类的加载工作是通过调用 <code>defineClass</code> 来实现的；而启动类的加载过程是通过调用 <code>loadClass</code> 来实现的。前者称为一个类的定义加载器（defining loader），后者称为初始加载器（initiating loader）。在 Java 虚拟机判断两个类是否相同的时候，使用的是类的定义加载器。也就是说，哪个类加载器启动类的加载过程并不重要，重要的是最终定义这个类的加载器。两种类加载器的关联之处在于：一个类的定义加载器是它引用的其它类的初始加载器。如类 <code>com.example.Outer</code> 引用了类 <code>com.example.Inner</code>，则由类 <code>com.example.Outer</code> 的定义加载器负责启动类 <code>com.example.Inner</code> 的加载过程。</p>
<p>方法 <code>loadClass()</code> 抛出的是 <code>java.lang.ClassNotFoundException</code> 异常；方法 <code>defineClass()</code> 抛出的是 <code>java.lang.NoClassDefFoundError</code> 异常。</p>
<p>类加载器在成功加载某个类之后，会把得到的 <code>java.lang.Class</code> 类的实例缓存起来。下次再请求加载该类的时候，类加载器会直接使用缓存的类的实例，而不会尝试再次加载。也就是说，对于一个类加载器实例来说，相同全名的类只加载一次，即 <code>loadClass</code> 方法不会被重复调用。</p>
<p>下面讨论另外一种类加载器：线程上下文类加载器。</p>
<p><a name="minor1.5"><span class="smalltitle">线程上下文类加载器</span></a></p>
<p>线程上下文类加载器（context class loader）是从 JDK 1.2 开始引入的。类 <code>java.lang.Thread</code> 中的方法 <code>getContextClassLoader()</code> 和 <code>setContextClassLoader(ClassLoader cl)</code> 用来获取和设置线程的上下文类加载器。如果没有通过 <code>setContextClassLoader(ClassLoader cl)</code> 方法进行设置的话，线程将继承其父线程的上下文类加载器。Java 应用运行的初始线程的上下文类加载器是系统类加载器。在线程中运行的代码可以通过此类加载器来加载类和资源。</p>
<p>前面提到的类加载器的代理模式并不能解决 Java 应用开发中会遇到的类加载器的全部问题。Java 提供了很多服务提供者接口（Service Provider Interface，SPI），允许第三方为这些接口提供实现。常见的 SPI 有 JDBC、JCE、JNDI、JAXP 和 JBI 等。这些 SPI 的接口由 Java 核心库来提供，如 JAXP 的 SPI 接口定义包含在 <code>javax.xml.parsers</code> 包中。这些 SPI 的实现代码很可能是作为 Java 应用所依赖的 jar 包被包含进来，可以通过类路径（CLASSPATH）来找到，如实现了 JAXP SPI 的 <a href="http://xerces.apache.org/">Apache Xerces</a> 所包含的 jar 包。SPI 接口中的代码经常需要加载具体的实现类。如 JAXP 中的 <code>javax.xml.parsers.DocumentBuilderFactory</code> 类中的 <code>newInstance()</code> 方法用来生成一个新的 <code>DocumentBuilderFactory</code> 的实例。这里的实例的真正的类是继承自 <code>javax.xml.parsers.DocumentBuilderFactory</code>，由 SPI 的实现所提供的。如在 Apache Xerces 中，实现的类是 <code>org.apache.xerces.jaxp.DocumentBuilderFactoryImpl</code>。而问题在于，SPI 的接口是 Java 核心库的一部分，是由引导类加载器来加载的；SPI 实现的 Java 类一般是由系统类加载器来加载的。引导类加载器是无法找到 SPI 的实现类的，因为它只加载 Java 的核心库。它也不能代理给系统类加载器，因为它是系统类加载器的祖先类加载器。也就是说，类加载器的代理模式无法解决这个问题。</p>
<p>线程上下文类加载器正好解决了这个问题。如果不做任何的设置，Java 应用的线程的上下文类加载器默认就是系统上下文类加载器。在 SPI 接口的代码中使用线程上下文类加载器，就可以成功的加载到 SPI 实现的类。线程上下文类加载器在很多 SPI 的实现中都会用到。</p>
<p>下面介绍另外一种加载类的方法：<code>Class.forName</code>。</p>
<p><a name="minor1.6"><span class="smalltitle">Class.forName</span></a></p>
<p><code>Class.forName</code> 是一个静态方法，同样可以用来加载类。该方法有两种形式：<code>Class.forName(String name, boolean initialize, ClassLoader loader)</code> 和 <code>Class.forName(String className)</code>。第一种形式的参数 <code>name</code> 表示的是类的全名；<code>initialize</code> 表示是否初始化类；<code>loader</code> 表示加载时使用的类加载器。第二种形式则相当于设置了参数 <code>initialize</code> 的值为 <code>true</code>，<code>loader</code> 的值为当前类的类加载器。<code>Class.forName</code> 的一个很常见的用法是在加载数据库驱动的时候。如 <code>Class.forName("org.apache.derby.jdbc.EmbeddedDriver").newInstance()</code> 用来加载 Apache Derby 数据库的驱动。</p>
<p>在介绍完类加载器相关的基本概念之后，下面介绍如何开发自己的类加载器。</p>
<div class="ibm-alternate-rule">
<hr />
</div>
<p class="ibm-ind-link&#13;&#10;ibm-back-to-top"><a class="ibm-anchor-up-link" href="http://www.ibm.com/developerworks/cn/java/j-lo-classloader/#ibm-pcon">回页首</a></p>
<p><a name="major2"><span class="atitle">开发自己的类加载器</span></a></p>
<p>虽然在绝大多数情况下，系统默认提供的类加载器实现已经可以满足需求。但是在某些情况下，您还是需要为应用开发出自己的类加载器。比如您的应用通过网络来传输 Java 类的字节代码，为了保证安全性，这些字节代码经过了加密处理。这个时候您就需要自己的类加载器来从某个网络地址上读取加密后的字节代码，接着进行解密和验证，最后定义出要在 Java 虚拟机中运行的类来。下面将通过两个具体的实例来说明类加载器的开发。</p>
<p><a name="minor2.1"><span class="smalltitle">文件系统类加载器</span></a></p>
<p>第一个类加载器用来加载存储在文件系统上的 Java 字节代码。完整的实现如 <a href="http://www.ibm.com/developerworks/cn/java/j-lo-classloader/#code6">代码清单 6</a> 所示。</p>
<br />
<a name="listing6"><strong>清单 6. 文件系统类加载器</strong></a><br />
<table cellspacing="0" cellpadding="0" width="100%" border="0">
    <tbody>
        <tr>
            <td class="code-outline">
            <pre class="displaycode">public class FileSystemClassLoader extends ClassLoader { <br />
            <br />
            private String rootDir; <br />
            <br />
            public FileSystemClassLoader(String rootDir) { <br />
            this.rootDir = rootDir; <br />
            } <br />
            <br />
            protected Class&lt;?&gt; findClass(String name) throws ClassNotFoundException { <br />
            byte[] classData = getClassData(name); <br />
            if (classData == null) { <br />
            throw new ClassNotFoundException(); <br />
            } <br />
            else { <br />
            return defineClass(name, classData, 0, classData.length); <br />
            } <br />
            } <br />
            <br />
            private byte[] getClassData(String className) { <br />
            String path = classNameToPath(className); <br />
            try { <br />
            InputStream ins = new FileInputStream(path); <br />
            ByteArrayOutputStream baos = new ByteArrayOutputStream(); <br />
            int bufferSize = 4096; <br />
            byte[] buffer = new byte[bufferSize]; <br />
            int bytesNumRead = 0; <br />
            while ((bytesNumRead = ins.read(buffer)) != -1) { <br />
            baos.write(buffer, 0, bytesNumRead); <br />
            } <br />
            return baos.toByteArray(); <br />
            } catch (IOException e) { <br />
            e.printStackTrace(); <br />
            } <br />
            return null; <br />
            } <br />
            <br />
            private String classNameToPath(String className) { <br />
            return rootDir + File.separatorChar <br />
            + className.replace('.', File.separatorChar) + ".class"; <br />
            } <br />
            }</pre>
            </td>
        </tr>
    </tbody>
</table>
<br />
<p>如 <a href="http://www.ibm.com/developerworks/cn/java/j-lo-classloader/#code6">代码清单 6</a> 所示，类 <code>FileSystemClassLoader</code> 继承自类 <code>java.lang.ClassLoader</code>。在 <a href="http://www.ibm.com/developerworks/cn/java/j-lo-classloader/#table1">表 1</a> 中列出的 <code>java.lang.ClassLoader</code> 类的常用方法中，一般来说，自己开发的类加载器只需要覆写 <code>findClass(String name)</code> 方法即可。<code>java.lang.ClassLoader</code> 类的方法 <code>loadClass()</code> 封装了前面提到的代理模式的实现。该方法会首先调用 <code>findLoadedClass()</code> 方法来检查该类是否已经被加载过；如果没有加载过的话，会调用父类加载器的 <code>loadClass()</code> 方法来尝试加载该类；如果父类加载器无法加载该类的话，就调用 <code>findClass()</code> 方法来查找该类。因此，为了保证类加载器都正确实现代理模式，在开发自己的类加载器时，最好不要覆写 <code>loadClass()</code> 方法，而是覆写 <code>findClass()</code> 方法。</p>
<p>类 <code>FileSystemClassLoader</code> 的 <code>findClass()</code> 方法首先根据类的全名在硬盘上查找类的字节代码文件（.class 文件），然后读取该文件内容，最后通过 <code>defineClass()</code> 方法来把这些字节代码转换成 <code>java.lang.Class</code> 类的实例。</p>
<p><a name="minor2.2"><span class="smalltitle">网络类加载器</span></a></p>
<p>下面将通过一个网络类加载器来说明如何通过类加载器来实现组件的动态更新。即基本的场景是：Java 字节代码（.class）文件存放在服务器上，客户端通过网络的方式获取字节代码并执行。当有版本更新的时候，只需要替换掉服务器上保存的文件即可。通过类加载器可以比较简单的实现这种需求。</p>
<p>类 <code>NetworkClassLoader</code> 负责通过网络下载 Java 类字节代码并定义出 Java 类。它的实现与 <code>FileSystemClassLoader</code> 类似。在通过 <code>NetworkClassLoader</code> 加载了某个版本的类之后，一般有两种做法来使用它。第一种做法是使用 Java 反射 API。另外一种做法是使用接口。需要注意的是，并不能直接在客户端代码中引用从服务器上下载的类，因为客户端代码的类加载器找不到这些类。使用 Java 反射 API 可以直接调用 Java 类的方法。而使用接口的做法则是把接口的类放在客户端中，从服务器上加载实现此接口的不同版本的类。在客户端通过相同的接口来使用这些实现类。网络类加载器的具体代码见 <a href="http://www.ibm.com/developerworks/cn/java/j-lo-classloader/#download">下载</a>。</p>
<p>在介绍完如何开发自己的类加载器之后，下面说明类加载器和 Web 容器的关系。<br />
<br />
<br />
<a name="major3"><span class="atitle">类加载器与 Web 容器</span></a></p>
<p>对于运行在 Java EE&#8482; 容器中的 Web 应用来说，类加载器的实现方式与一般的 Java 应用有所不同。不同的 Web 容器的实现方式也会有所不同。以 Apache Tomcat 来说，每个 Web 应用都有一个对应的类加载器实例。该类加载器也使用代理模式，所不同的是它是首先尝试去加载某个类，如果找不到再代理给父类加载器。这与一般类加载器的顺序是相反的。这是 Java Servlet 规范中的推荐做法，其目的是使得 Web 应用自己的类的优先级高于 Web 容器提供的类。这种代理模式的一个例外是：Java 核心库的类是不在查找范围之内的。这也是为了保证 Java 核心库的类型安全。</p>
<p>绝大多数情况下，Web 应用的开发人员不需要考虑与类加载器相关的细节。下面给出几条简单的原则： </p>
<ul>
    <li>每个 Web 应用自己的 Java 类文件和使用的库的 jar 包，分别放在 <code>WEB-INF/classes</code> 和 <code>WEB-INF/lib</code> 目录下面。
    <li>多个应用共享的 Java 类文件和 jar 包，分别放在 Web 容器指定的由所有 Web 应用共享的目录下面。
    <li>当出现找不到类的错误时，检查当前类的类加载器和当前线程的上下文类加载器是否正确。 </li>
</ul>
<p>在介绍完类加载器与 Web 容器的关系之后，下面介绍它与 OSGi 的关系。</p>
<p class="ibm-ind-link&#13;&#10;ibm-back-to-top"><a class="ibm-anchor-up-link" href="http://www.ibm.com/developerworks/cn/java/j-lo-classloader/#ibm-pcon"></a>&nbsp;</p>
<p><a name="major4"><span class="atitle">类加载器与 OSGi</span></a></p>
<p>OSGi&#8482; 是 Java 上的动态模块系统。它为开发人员提供了面向服务和基于组件的运行环境，并提供标准的方式用来管理软件的生命周期。OSGi 已经被实现和部署在很多产品上，在开源社区也得到了广泛的支持。Eclipse 就是基于 OSGi 技术来构建的。</p>
<p>OSGi 中的每个模块（bundle）都包含 Java 包和类。模块可以声明它所依赖的需要导入（import）的其它模块的 Java 包和类（通过 <code>Import-Package</code>），也可以声明导出（export）自己的包和类，供其它模块使用（通过 <code>Export-Package</code>）。也就是说需要能够隐藏和共享一个模块中的某些 Java 包和类。这是通过 OSGi 特有的类加载器机制来实现的。OSGi 中的每个模块都有对应的一个类加载器。它负责加载模块自己包含的 Java 包和类。当它需要加载 Java 核心库的类时（以 <code>java</code> 开头的包和类），它会代理给父类加载器（通常是启动类加载器）来完成。当它需要加载所导入的 Java 类时，它会代理给导出此 Java 类的模块来完成加载。模块也可以显式的声明某些 Java 包和类，必须由父类加载器来加载。只需要设置系统属性 <code>org.osgi.framework.bootdelegation</code> 的值即可。</p>
<p>假设有两个模块 bundleA 和 bundleB，它们都有自己对应的类加载器 classLoaderA 和 classLoaderB。在 bundleA 中包含类 <code>com.bundleA.Sample</code>，并且该类被声明为导出的，也就是说可以被其它模块所使用的。bundleB 声明了导入 bundleA 提供的类 <code>com.bundleA.Sample</code>，并包含一个类 <code>com.bundleB.NewSample</code> 继承自 <code>com.bundleA.Sample</code>。在 bundleB 启动的时候，其类加载器 classLoaderB 需要加载类 <code>com.bundleB.NewSample</code>，进而需要加载类 <code>com.bundleA.Sample</code>。由于 bundleB 声明了类 <code>com.bundleA.Sample</code> 是导入的，classLoaderB 把加载类 <code>com.bundleA.Sample</code> 的工作代理给导出该类的 bundleA 的类加载器 classLoaderA。classLoaderA 在其模块内部查找类 <code>com.bundleA.Sample</code> 并定义它，所得到的类 <code>com.bundleA.Sample</code> 实例就可以被所有声明导入了此类的模块使用。对于以 <code>java</code> 开头的类，都是由父类加载器来加载的。如果声明了系统属性 <code>org.osgi.framework.bootdelegation=com.example.core.*</code>，那么对于包 <code>com.example.core</code> 中的类，都是由父类加载器来完成的。</p>
<p>OSGi 模块的这种类加载器结构，使得一个类的不同版本可以共存在 Java 虚拟机中，带来了很大的灵活性。不过它的这种不同，也会给开发人员带来一些麻烦，尤其当模块需要使用第三方提供的库的时候。下面提供几条比较好的建议： </p>
<ul>
    <li>如果一个类库只有一个模块使用，把该类库的 jar 包放在模块中，在 <code>Bundle-ClassPath</code> 中指明即可。
    <li>如果一个类库被多个模块共用，可以为这个类库单独的创建一个模块，把其它模块需要用到的 Java 包声明为导出的。其它模块声明导入这些类。
    <li>如果类库提供了 SPI 接口，并且利用线程上下文类加载器来加载 SPI 实现的 Java 类，有可能会找不到 Java 类。如果出现了 <code>NoClassDefFoundError</code> 异常，首先检查当前线程的上下文类加载器是否正确。通过 <code>Thread.currentThread().getContextClassLoader()</code> 就可以得到该类加载器。该类加载器应该是该模块对应的类加载器。如果不是的话，可以首先通过 <code>class.getClassLoader()</code> 来得到模块对应的类加载器，再通过 <code>Thread.currentThread().setContextClassLoader()</code> 来设置当前线程的上下文类加载器。 </li>
</ul>
<p><a name="major5"><span class="atitle">总结</span></a></p>
<p>类加载器是 Java 语言的一个创新。它使得动态安装和更新软件组件成为可能。本文详细介绍了类加载器的相关话题，包括基本概念、代理模式、线程上下文类加载器、与 Web 容器和 OSGi 的关系等。开发人员在遇到 <code>ClassNotFoundException</code> 和 <code>NoClassDefFoundError</code> 等异常的时候，应该检查抛出异常的类的类加载器和当前线程的上下文类加载器，从中可以发现问题的所在。在开发自己的类加载器的时候，需要注意与已有的类加载器组织结构的协调。</span> </p>
<img src ="http://www.blogjava.net/ywj-316/aggbug/319291.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/ywj-316/" target="_blank">junly</a> 2010-04-24 22:26 <a href="http://www.blogjava.net/ywj-316/archive/2010/04/24/319291.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>J2EE的13种核心技术简介(转)</title><link>http://www.blogjava.net/ywj-316/archive/2010/02/21/313545.html</link><dc:creator>junly</dc:creator><author>junly</author><pubDate>Sun, 21 Feb 2010 08:28:00 GMT</pubDate><guid>http://www.blogjava.net/ywj-316/archive/2010/02/21/313545.html</guid><wfw:comment>http://www.blogjava.net/ywj-316/comments/313545.html</wfw:comment><comments>http://www.blogjava.net/ywj-316/archive/2010/02/21/313545.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/ywj-316/comments/commentRss/313545.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/ywj-316/services/trackbacks/313545.html</trackback:ping><description><![CDATA[<p>J2EE平台由一整套服务（Services）、应用程序接口（APIs）和协议构成，它对开发基于Web的多层应用提供了功能支持。在本文中将解释支撑J2EE的13种核心技术：</p>
<p>JDBC,JNDI,EJBs,RMI,JSP,Javaservlets,XML,JMS,JavaIDL,JTS, JTA,JavaMail和JAF，同时还将描述在何时、何处需要使用这些技术。当然，我还要介绍这些不同的技术之间是如何交互的。此外，为了让您更好地 感受J2EE的真实应用，将在WebLogic应用服务器,来自BEA Systems公司的一种广为应用的产品环境下来介绍这些技术。不论对于Web Logic应用服务器和J2EE的新手，还是那些想了解J2EE能带来什么好处的项目管理者和系统分析员，相信本文一定很有参考价值。 </p>
<p>一、宏观印象:分布式结构和J2EE </p>
<p>过去，二层化应用--通常被称为client/server应用--是大家谈论的最多的。在很多情况下，服务器提供的惟一服务就是数据库服务。在这 种解决方案中，客户端程序负责数据访问、实现业务逻辑、用合适的样式显示结果、弹出预设的用户界面、接受用户输入等。client/server结构通常 在第一次部署的时候比较容易，但难于升级或改进，而且经常基于某种专有的协议，通常是某种数据库协议。它使得重用业务逻辑和界面逻辑非常困难。更重要的 是，在Web时代，二层化应用通常不能体现出很好的伸缩性，因而很难适应Internet的要求。 </p>
<p>Sun设计J2EE的部分起因就是想解决二层化结构的缺陷。于是，J2EE定义了一套标准来简化N层企业级应用的开发。它定义了一套标准化的组件，并为这些组件提供了完整的服务。J2EE还自动为应用程序处理了很多实现细节，如安全、多线程等。 </p>
<p>用J2EE开发N层应用包括将二层化结构中的不同层面切分成许多层。一个N层化应用A能够为以下的每种服务提供一个分开的层： </p>
<p>显示：在一个典型的Web应用中，客户端机器上运行的浏览器负责实现用户界面。 字串1 </p>
<p>动态生成显示:尽管浏览器可以完成某些动态内容显示，但为了兼容不同的浏览器，这些动态生成工作应该放在Web服务器端进行，使用JSP、Servlets，或者XML（可扩展标记语言）和（可扩展样式表语言）。 字串6 </p>
<p>业务逻辑：业务逻辑适合用SessionEJBs（后面将介绍）来实现。 </p>
<p>数据访问：数据访问适合用EntityEJBs（后面将介绍）和JDBC来实现。 </p>
<p>后台系统集成:同后台系统的集成可能需要用到许多不同的技术，至于何种最佳需要根据后台系统的特征而定。 </p>
<p>您可能开始诧异：为什么有这么多的层？事实上，多层方式可以使企业级应用具有很强的伸缩性，它允许每层专注于特定的角色。例如，让Web服务器负责提供页面，应用服务器处理应用逻辑，而数据库服务器提供数据库服务。 </p>
<p>由于J2EE建立在Java2平台标准版（J2SE）的基础上，所以具备了J2SE的所有优点和功能。包括&#8220;编写一次，到处可用&#8221;的可移植性、通过 JDBC访问数据库、同原有企业资源进行交互的CORBA技术，以及一个经过验证的安全模型。在这些基础上，J2EE又增加了对EJB（企业级Java组 件）、Javaservlets、Java服务器页面（JSPs）和XML技术的支持。 </p>
<p>二、分布式结构与WebLogic应用服务器 </p>
<p>J2EE提供了一个框架--一套标准API--用于开发分布式结构的应用，这个框架的实际实现留给了第三方厂商。部分厂商只是专注于整个J2EE架 构中的的特定组件，例如Apache的Tomcat提供了对JSP和servlets的支持，BEA系统公司则通过其WebLogic应用服务器产品为整 个J2EE规范提供了一个较为完整的实现。 </p>
<p>WebLogic服务器已使建立和部署伸缩性较好的分布式应用的过程大为简化。WebLogic和J2EE代你处理了大量常规的编程任务，包括提供事务服务、安全领域、可靠的消息、名字和目录服务、数据库访问和连接池、线程池、负载平衡和容错处理等。 </p>
<p>通过以一种标准、易用的方式提供这些公共服务，象WebLogic服务器这样的产品造就了具有更好伸缩性和可维护性的应用系统，使其为大量的用户提供了增长的可用性。 </p>
<p>J2EE技术 </p>
<p>在接下来的部分里，我们将描述构成J2EE的各种技术，并且了解WebLogic服务器是如何在一个分布式应用中对它们进行支持的。最常用的J2EE技术应该是JDBC、JNDI、EJB、JSP和servlets，对这些我们将作更仔细的考察。 </p>
<p>三、Java Database Connectivity(JDBC) </p>
<p>JDBCAPI以一种统一的方式来对各种各样的数据库进行存取。和ODBC一样，JDBC为开发人员隐藏了不同数据库的不同特性。另外，由于JDBC建立在Java的基础上,因此还提供了数据库存取的平台独立性。 字串5 </p>
<p>JDBC定义了4种不同的驱动程序，现分述如下： </p>
<p>类型1:JDBC-ODBCBridge </p>
<p>在JDBC出现的初期，JDBC-ODBC桥显然是非常有实用意义的，通过JDBC-ODBC桥，开发人员可以使用JDBC来存取ODBC数据源。 不足的是，他需要在客户端安装ODBC驱动程序，换句话说，必须安装MicrosoftWindows的某个版本。使用这一类型你需要牺牲JDBC的平台 独立性。另外，ODBC驱动程序还需要具有客户端的控制权限。 </p>
<p>类型2:JDBC-nativedriverbridge </p>
<p>JDBC本地驱动程序桥提供了一种JDBC接口，它建立在本地数据库驱动程序的顶层，而不需要使用ODBC。JDBC驱动程序将对数据库的API从标准的JDBC调用转换为本地调用。使用此类型需要牺牲JDBC的平台独立性，还要求在客户端安装一些本地代码。 字串3 </p>
<p>类型3:JDBC-networkbridge </p>
<p>JDBC网络桥驱动程序不再需要客户端数据库驱动程序。它使用网络上的中间服务器来存取数据库。这种应用使得以下技术的实现有了可能，这些技术包括 负载均衡、连接缓冲池和数据缓存等。由于第3种类型往往只需要相对更少的下载时间，具有平台独立性，而且不需要在客户端安装并取得控制权，所以很适合于 Internet上的应用。 </p>
<p>类型4:PureJavadriver </p>
<p>第4种类型通过使用一个纯Java数据库驱动程序来执行数据库的直接访问。此类型实际上在客户端实现了2层结构。要在N-层结构中应用，一个更好的做法是编写一个EJB，让它包含存取代码并提供一个对客户端具有数据库独立性的服务。 </p>
<p>WebLogic服务器为一些通常的数据库提供了JDBC驱动程序，包括Oracle,Sybase,MicrosoftSQLServer以及 Informix。它也带有一种JDBC驱动程序用于Cloudscape，这是一种纯Java的DBMS，WebLogic服务器中带有该数据库的评估 版本。 </p>
<p>以下让我们看一个JDBC实例：在这个例子中我们假定你已经在Cloudscape中建立了一个PhoneBook数据库，并且包含一个表，名为 CONTACT_TABLE，它带有2个字段：NAME和PHONE。开始的时候先装载CloudscapeJDBCdriver，并请求 drivermanager得到一个对PhoneBookCloudscape数据库的连接。通过这一连接，我们可以构造一个Statement对象并用 它来执行一个简单的SQL查询。最后，用循环来遍历结果集的所有数据，并用标准输出将NAME和PHONE字段的内容进行输出。 </p>
<p>import java.sql.*; 字串5 public class JDBCExample{public static void main( String args[] ){try{Class.forName("COM.cloudscape.core.JDBCDriver");Connection conn = DriverManager.getConnection("jdbc:cloudscape:PhoneBook");Statement stmt = conn.createStatement();String sql = "SELECT name, phone FROM CONTACT_TABLE ORDER BYname";ResultSet resultSet = stmt.executeQuery( sql ); 字串8 String name;String phone;while ( resultSet.next() ){name = resultSet.getString(1).trim();phone = resultSet.getString(2).trim();System.out.println( name + ", " + phone ); }catch ( Exception e ){// Handle exception heree.printStackTrace();}}} </p>
<p>OK。接着来看一看JDBC是如何在企业应用中的进行使用。 </p>
<p>JDBC在企业级应用中的应用。以上实例其实是很基本的，可能有些微不足道。它假定了一个2层结构。在一个多层的企业级应用中，更大的可能是在客户 端和一个EJB进行通信，该EJB将建立数据库连接。为了实现和改进可伸缩性和系统性能， WebLogic服务器提供了对连接缓冲池connection pool的支持。 </p>
<p>Connection pool减少了建立和释放数据库连接的消耗。在系统启动以后即可建立这样的缓冲池，此后如故再有对数据库的请求，WebLogic服务器可以很简单地从缓 冲池中取出数据。数据缓冲池可以在WebLogic服务器的 weblogic.properties 文件中进行定义。 </p>
<p>在企业级应用的另一个常见的数据库特性是事务处理。事务是一组申明statement，它们必须做为同一个statement来处理以保证数据完整 性。缺省情况下JDBC使用 auto-commit 事务模式。这可以通过使用Connection类的setAutoCommit() 方法来实现。现在已经对JDBC有了一些认识，下面该转向JNDI了。 </p>
<p>四、Java Naming and Directory Interface (JNDI) 字串3 </p>
<p>JNDI API被用于执行名字和目录服务。它提供了一致的模型来存取和操作企业级的资源如DNS和LDAP，本地文件系统，后者在应用服务器中的对象。在JNDI 中，在目录结构中的每一个结点称为context。每一个JNDI名字都是相对于context的。这里没有绝对名字的概念存在。对一个应用来说，它可以 通过使用 InitialContext 类来得到其第一个context: 字串6 </p>
<p>Context ctx = new InitialContext();</p>
<p>应用可以通过这个初始化的context经有这个目录树 来定位它所需要的资源或对象。例如，假设你在Weblogic服务器中展开了一个EJB并将home接口绑定到名字 myApp.myEJB ，那么该EJB的某个客户在取得一个初始化context以后，可以通过以下语句定位home接口： </p>
<p>MyEJBHome home = ctx.lookup( "myApp.myEJB" );</p>
<p>在这个例子中，一旦你有了对被请求对象的参考，EJB的home接口就可以在它上面调用方法。我们将在下面的"Enterprise Java Beans"章节中做更多的介绍。 </p>
<p>以上关于JNDI的讨论只是冰山之一角而已。如果要更进一步地在context中查找对象，JNDI也提供了一些方法来进行以下操作：将一个对象插 入或绑定到context。这在你展开一个EJB的时候是很有效的。从context中移去对象。列出context中的所有对象。创建或删除子一级的 context。接下来，要开始关注EJB了。<br />
五、Enterprise Java Beans (EJB) </p>
<p>J2EE技术之所以赢得某体广泛重视的原因之一就是EJB。它们提供了一个框架来开发和实施分布式商务逻辑，由此很显著地简化了具有可伸缩性和高度 复杂的企业级应用的开发。EJB规范定义了EJB组件在何时如何与它们的容器进行交互作用。容器负责提供公用的服务，例如目录服务、事务管理、安全性、资 源缓冲池以及容错性。 字串8 </p>
<p>EJB规范定义了三种基本的bean类型:</p>
<p>Stateless session beans: 提供某种单一的服务，不维持任何状态，在服务器故障发生时无法继续存在，生命期相对较短。例如，一个stateless sessionbean可能被用于执行温度转换计算。</p>
<p>Stateful session bean: T提供了与客户端的会话交互，可以存储状态从而代表一个客户。典型例子是购物车。Stateful session bean在服务器故障时无法继续生存，生命气相对较短。每一个实例只用于一个单个的线程。</p>
<p>Entity beans: 提供了一致性数据的表示-- 通常存放在数据库中 -- 在服务器故障发生后能继续存在。多用户情况下可以使用EJB来表示相同的数据。entity EJB的一个典型例子是客户的帐号信息。 字串2 </p>
<p>尽管有以上的区别，所有的EJB还是有许多的共同之处。它们都处理homeinterface。它定义了一个客户端是如何创建与消亡EJB的。可以 在bean中对定义了客户端方法的远程接口进行调用；bean类则执行了主要的商务逻辑。描述EJB的开发已经超出了本文的范围。但是，如果一个EJB已 经被开发了或者从第三方进行了购买，它就必须在应用服务器中进行发布。WebLogic Server 5.1带有一个EJB Deployer Tool来协助处理EJB的发布。当你使用EJB Deployer Tool的时候，你要定义客户端所用的JNDI名字来定位EJB。Deployer Tool将生成wrapper类来处理和容器的通信以及在一个jar文件中把被请求的Java类绑定在一起。 </p>
<p>一旦EJB被发布，客户端就可以使用它的JNDI名字来定位EJB。首先，它必须得到一个到home接口的reference。然后，客户端可以使 用该接口，调用一个create() 方法来得到服务器上运行的某个bean实例的句柄；最后，客户端可以使用该句柄在bean中调用方法。了解 EJB后，让我们再来看JSP。 字串4 </p>
<p>六、JavaServer Pages (JSPs) 字串4 </p>
<p>可能已经有许多人已经熟悉Microsoft的Active Server Pages(ASP)技术了。JSP和ASP相对应的，但更具有平台对立性。他们被设计用以帮助Web内容开发人员创建动态网页，并且只需要相对较少的代 码。 即使Web设计师不懂得如何编程也可以使用JSP，因为JSP应用是很方便的。 JSP页面由HTML代码和嵌入其中的Java代码所组成。服务器在页面被客户端所请求以后对这些Java代码进行处理，然后将生成的HTML页面返回给 客户端的浏览器。 字串5 </p>
<p>下面来看一个JSP的简单实例。它只显示了服务器的当前日期和时间。虽然，对语法的具体解释已经超出了本文的范围，但我们还是可以很直观地看到，Java代码被放在 符号的中间，而Java的表达式则放在符号之间。 </p>
<p>＜H1＞Date JSP sample＜/H1＞＜H2＞＜% response.setHeader("Refresh", 5); %＞The current date is ＜%= new Date() %＞.＜/H2＞ 字串1 </p>
<p>下面是: Java servlets</p>
<p>七、Java Servlets</p>
<p>Servlet 提供的功能大多与JSP类似，不过实现的方式不同。JSP通常是大多数HTML代码中嵌入少量的Java代码，而servlets全部由Java写成并且 生成HTML。Servlet是一种小型的Java程序，它扩展了Web服务器的功能。作为一种服务器端的应用，当被请求时开始执行，这和CGI Perl脚本很相似。Servlets和CGI脚本的一个很大的区别是：每一个CGI在开始的时候都要求开始一个新的进程 -- 而servlets是在servlet引擎中以分离的线程来运行的。因此servlets在可伸缩性上提供了很好的改进。</p>
<p>在开发servlets的时候，您常常需要扩展javax.servlet.http.HttpServlet类，并且override一些它的方法，其中包括：</p>
<p>service(): 作为dispatcher来实现命令-定义方法</p>
<p>doGet(): 处理客户端的HTTP GET请求。</p>
<p>doPost(): 进行HTTP POST操作 字串7 </p>
<p>其它的方法还包括处理不同类型的HTTP请求 -- 可以参考HttpServlet API文档。以上描述的是标准J2EE Servlet API的各种方法。WebLogic服务器提供了一个该API完整的实现途径。一旦你开发了一个servlet，你就可以在 weblogic.properties 中加以注册并由此可以在WebLogic服务器中对它进行配置。 字串8 </p>
<p>通过Java servlets,我们已经到达了J2EE主要技术的末尾了。但J2EE所提供的并不止于这些。下面的段落中我们将简要地看一下现存的一些技术，包括RMI,Java IDL和CORBA, JTA, 以及XML，等等。 字串1 </p>
<p>八、Remote Method Invocation (RMI) </p>
<p>正如其名字所表示的那样，RMI协议是在远程对象上调用一些方法。它使用了连续序列方式在客户端和服务器端传递数据。RMI是一种被EJB使用的更下层的协议。 字串5 </p>
<p>九、Java IDL/CORBA 字串5 </p>
<p>在Java IDL的支持下，开发人员可以将Java和CORBA集成在一起。 他们可以创建Java对象并使之可在CORBA ORB中展开, 或者他们还可以创建Java类并作为和其它ORB一起展开的CORBA对象的客户。后一种方法提供了另外一种途径，通过它Java可以被用于将你的新的应 用和legacy系统相集成。 字串4 </p>
<p>十、Java Transaction Architecture (JTA)/Java Transaction Service (JTS) </p>
<p>JTA定义了一种标准的API，应用系统由此可以存取各种事务监控。JTS是CORBA OTS事务监控的基本的实现。JTS规定了事务管理器的实现方式。该事务管理器是在高层支持Java Transaction API (JTA)规范，并且在较底层实现OMG OTS specification的Java映像。JTS事务管理器为应用服务器、资源管理器、独立的应用以及通信资源管理器提供了事务服务。 </p>
<p>十一、JavaMail and JavaBeans Activation Framework </p>
<p>JavaMail是用于存取邮件服务器的API，它提供了一套邮件服务器的抽象类。仅支持SMTP服务器，也支持IMAP服务器。JavaMail 利用JavaBeans Activation Framework (JAF)来处理MIME-编码的邮件附件。MIME的字节流可以被转换成Java对象，或者转换自Java对象。由此大多数应用都可以不需要直接使用 JAF。 </p>
<p>十二、Java Messaging Service (JMS) </p>
<p>JMS是用于和面向消息的中间件相互通信的应用程序接口(API)。它既支持点对点的域，有支持发布/订阅(publish/subscribe) 类型的域，并且提供对下列类型的支持：经认可的消息传递,事务型消息的传递，一致性消息和具有持久性的订阅者支持。JMS还提供了另一种方式来对您的应用 与legacy backend系统相集成。 </p>
<p>十三、Extensible Markup Language (XML) 字串7 </p>
<p>XML是一种可以用来定义其它标记语言的语言。它被用来在不同的商务过程中共享数据。XML的发展和Java是相互独立的，但是，它和Java具有 的相同目标正是平台独立性。通过将Java和XML的组合，您可以得到一个完美的具有平台独立性的解决方案。目前正有许多不同的公司在为Java和XML 的组合而努力。如果要了解更多的这方面的信息，可以访问Sun的Java-XML页面，或者IBM developerWorks的XML Zone。</p>
<p>&nbsp;</p>
<img src ="http://www.blogjava.net/ywj-316/aggbug/313545.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/ywj-316/" target="_blank">junly</a> 2010-02-21 16:28 <a href="http://www.blogjava.net/ywj-316/archive/2010/02/21/313545.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Java正则表达式的解释说明 </title><link>http://www.blogjava.net/ywj-316/archive/2010/02/09/312388.html</link><dc:creator>junly</dc:creator><author>junly</author><pubDate>Tue, 09 Feb 2010 01:47:00 GMT</pubDate><guid>http://www.blogjava.net/ywj-316/archive/2010/02/09/312388.html</guid><wfw:comment>http://www.blogjava.net/ywj-316/comments/312388.html</wfw:comment><comments>http://www.blogjava.net/ywj-316/archive/2010/02/09/312388.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/ywj-316/comments/commentRss/312388.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/ywj-316/services/trackbacks/312388.html</trackback:ping><description><![CDATA[<p>表达式意义：<br />
<p><strong>1.字符<br />
</strong><br />
x&nbsp;&nbsp;&nbsp; 字符 x。例如a表示字符a<br />
\\&nbsp;&nbsp;&nbsp; 反斜线字符。在书写时要写为<a>\\\\</a>。（注意：因为java在第一次解析时,把<a>\\\\</a>解析成正则表达式\\，在第二次解析时再解析为\，所以凡是不是1.1列举到的转义字符，包括1.1的\\,而又带有\的都要写两次）<br />
\0n&nbsp;&nbsp;&nbsp; 带有八进制值 0的字符 n (0 &lt;= n &lt;= 7)<br />
\0nn&nbsp;&nbsp;&nbsp; 带有八进制值 0的字符 nn (0 &lt;= n &lt;= 7)<br />
\0mnn&nbsp;&nbsp;&nbsp; 带有八进制值 0的字符 mnn（0 &lt;= m &lt;= 3、0 &lt;= n &lt;= 7）<br />
\xhh&nbsp;&nbsp;&nbsp; 带有十六进制值 0x的字符 hh<br />
\uhhhh&nbsp;&nbsp;&nbsp; 带有十六进制值 0x的字符 hhhh<br />
\t&nbsp;&nbsp;&nbsp; 制表符 ('\u0009')<br />
\n&nbsp;&nbsp;&nbsp; 新行（换行）符 ('\u000A')<br />
\r&nbsp;&nbsp;&nbsp; 回车符 ('\u000D')<br />
\f&nbsp;&nbsp;&nbsp; 换页符 ('\u000C')<br />
\a&nbsp;&nbsp;&nbsp; 报警 (bell) 符 ('\u0007')<br />
\e&nbsp;&nbsp;&nbsp; 转义符 ('\u001B')<br />
\cx&nbsp;&nbsp;&nbsp; 对应于 x 的控制符<br />
<strong>2.字符类<br />
</strong>[abc]&nbsp;&nbsp;&nbsp; a、b或 c（简单类）。例如[egd]表示包含有字符e、g或d。<br />
[^abc]&nbsp;&nbsp;&nbsp; 任何字符，除了 a、b或 c（否定）。例如[^egd]表示不包含字符e、g或d。<br />
[a-zA-Z]&nbsp;&nbsp;&nbsp; a到 z或 A到 Z，两头的字母包括在内（范围）<br />
[a-d[m-p]]&nbsp;&nbsp;&nbsp; a到 d或 m到 p：[a-dm-p]（并集）<br />
[a-z&amp;&amp;[def]]&nbsp;&nbsp;&nbsp; d、e或 f（交集）<br />
[a-z&amp;&amp;[^bc]]&nbsp;&nbsp;&nbsp; a到 z，除了 b和 c：[ad-z]（减去）<br />
[a-z&amp;&amp;[^m-p]]&nbsp;&nbsp;&nbsp; a到 z，而非 m到 p：[a-lq-z]（减去）<br />
<strong>3.预定义字符类</strong>(注意反斜杠要写两次，例如\d<span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin" twffan="done"><span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin" twffan="done">写为</span><span lang="EN-US" twffan="done"><a href="file://d/"><span style="color: windowtext" twffan="done"><font face="Calibri"><u>\\d</u></font></span></a><font face="Calibri">)</font></span><span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin" twffan="done">任何字符</span></p>
</span>
<p>（与行结束符可能匹配也可能不匹配）<br />
\d&nbsp;&nbsp;&nbsp; 数字：[0-9]<br />
\D&nbsp;&nbsp;&nbsp; 非数字： [^0-9]<br />
\s&nbsp;&nbsp;&nbsp; 空白字符：[ \t\n\x0B\f\r]<br />
\S&nbsp;&nbsp;&nbsp; 非空白字符：[^\s]<br />
\w&nbsp;&nbsp;&nbsp; 单词字符：[a-zA-Z_0-9]<br />
\W&nbsp;&nbsp;&nbsp; 非单词字符：[^\w]<br />
<strong>4.POSIX 字符类</strong>（仅 US-ASCII)(注意反斜杠要写两次，例如\p{Lower}写为\\p{Lower})<br />
\p{Lower}&nbsp;&nbsp;&nbsp; 小写字母字符：[a-z]。<br />
\p{Upper}&nbsp;&nbsp;&nbsp; 大写字母字符：[A-Z]<br />
\p{ASCII}&nbsp;&nbsp;&nbsp; 所有 ASCII：[\x00-\x7F]<br />
\p{Alpha}&nbsp;&nbsp;&nbsp; 字母字符：[\p{Lower}\p{Upper}]<br />
\p{Digit}&nbsp;&nbsp;&nbsp; 十进制数字：[0-9]<br />
\p{Alnum}&nbsp;&nbsp;&nbsp; 字母数字字符：[\p{Alpha}\p{Digit}]<br />
\p{Punct}&nbsp;&nbsp;&nbsp; 标点符号：!"#$%&amp;'()*+,-./:;&lt;=&gt;?@[\]^_`{|}~<br />
\p{Graph}&nbsp;&nbsp;&nbsp; 可见字符：[\p{Alnum}\p{Punct}]<br />
\p{Print}&nbsp;&nbsp;&nbsp; 可打印字符：[\p{Graph}\x20]<br />
\p{Blank}&nbsp;&nbsp;&nbsp; 空格或制表符：[ \t]<br />
\p{Cntrl}&nbsp;&nbsp;&nbsp; 控制字符：[\x00-\x1F\x7F]<br />
\p{XDigit}&nbsp;&nbsp;&nbsp; 十六进制数字：[0-9a-fA-F]<br />
\p{Space}&nbsp;&nbsp;&nbsp; 空白字符：[ \t\n\x0B\f\r]<br />
<strong>5.java.lang.Character 类</strong>（简单的 java 字符类型）<br />
\p{javaLowerCase}&nbsp;&nbsp;&nbsp; 等效于 java.lang.Character.isLowerCase()<br />
\p{javaUpperCase}&nbsp;&nbsp;&nbsp; 等效于 java.lang.Character.isUpperCase()<br />
\p{javaWhitespace}&nbsp;&nbsp;&nbsp; 等效于 java.lang.Character.isWhitespace()<br />
\p{javaMirrored}&nbsp;&nbsp;&nbsp; 等效于 java.lang.Character.isMirrored()<br />
<strong>6.Unicode 块和类别的类</strong><br />
\p{InGreek}&nbsp;&nbsp;&nbsp; Greek 块（简单块）中的字符<br />
\p{Lu}&nbsp;&nbsp;&nbsp; 大写字母（简单类别）<br />
\p{Sc}&nbsp;&nbsp;&nbsp; 货币符号<br />
\P{InGreek}&nbsp;&nbsp;&nbsp; 所有字符，Greek 块中的除外（否定）<br />
[\p{L}&amp;&amp;[^\p{Lu}]] &nbsp;&nbsp;&nbsp; 所有字母，大写字母除外（减去）<br />
<strong>7.边界匹配器</strong><br />
^&nbsp;&nbsp;&nbsp; 行的开头，请在正则表达式的开始处使用^。例如：^(abc)表示以abc开头的字符串。注意编译的时候要设置参数MULTILINE，如 Pattern p = Pattern.compile(regex,Pattern.MULTILINE);<br />
$&nbsp;&nbsp;&nbsp; 行的结尾，请在正则表达式的结束处使用。例如：(^bca).*(abc$)表示以bca开头以abc结尾的行。<br />
\b&nbsp;&nbsp;&nbsp; 单词边界。例如\b(abc)表示单词的开始或结束包含有abc,（abcjj、jjabc 都可以匹配）<br />
\B&nbsp;&nbsp;&nbsp; 非单词边界。例如\B(abc)表示单词的中间包含有abc,(jjabcjj匹配而jjabc、abcjj不匹配)<br />
\A&nbsp;&nbsp;&nbsp; 输入的开头<br />
\G&nbsp;&nbsp;&nbsp; 上一个匹配的结尾(个人感觉这个参数没什么用)。例如\\Gdog表示在上一个匹配结尾处查找dog如果没有的话则从开头查找,注意如果开头不是dog则不能匹配。<br />
\Z&nbsp;&nbsp;&nbsp; 输入的结尾，仅用于最后的结束符（如果有的话）<br />
行结束符 是一个或两个字符的序列，标记输入字符序列的行结尾。<br />
以下代码被识别为行结束符： <br />
‐新行（换行）符 ('\n')、 <br />
‐后面紧跟新行符的回车符 ("\r\n")、 <br />
‐单独的回车符 ('\r')、 <br />
‐下一行字符 ('\u0085')、 <br />
‐行分隔符 ('\u2028') 或 <br />
‐段落分隔符 ('\u2029)。<br />
\z&nbsp;&nbsp;&nbsp; 输入的结尾<br />
当编译模式时，可以设置一个或多个标志，例如<br />
Pattern pattern = Pattern.compile(patternString,Pattern.CASE_INSENSITIVE + Pattern.UNICODE_CASE);<br />
下面六个标志都是支持的：<br />
‐CASE_INSENSITIVE：匹配字符时与大小写无关，该标志默认只考虑US ASCII字符。<br />
‐UNICODE_CASE：当与CASE_INSENSITIVE结合时，使用Unicode字母匹配<br />
‐MULTILINE：^和$匹配一行的开始和结尾，而不是整个输入<br />
‐UNIX_LINES： 当在多行模式下匹配^和$时，只将'\n'看作行终止符<br />
‐DOTALL: 当使用此标志时，.符号匹配包括行终止符在内的所有字符<br />
‐CANON_EQ: 考虑Unicode字符的规范等价<br />
<strong>8.Greedy 数量词<br />
</strong>X?&nbsp;&nbsp;&nbsp; X，一次或一次也没有<br />
X*&nbsp;&nbsp;&nbsp; X，零次或多次<br />
X+&nbsp;&nbsp;&nbsp; X，一次或多次<br />
X{n}&nbsp;&nbsp;&nbsp; X，恰好 n 次<br />
X{n,}&nbsp;&nbsp;&nbsp; X，至少 n 次<br />
X{n,m}&nbsp;&nbsp;&nbsp; X，至少 n 次，但是不超过 m 次<br />
<strong>9.Reluctant 数量词<br />
</strong>X??&nbsp;&nbsp;&nbsp; X，一次或一次也没有<br />
X*?&nbsp;&nbsp;&nbsp; X，零次或多次<br />
X+?&nbsp;&nbsp;&nbsp; X，一次或多次<br />
X{n}?&nbsp;&nbsp;&nbsp; X，恰好 n 次<br />
X{n,}?&nbsp;&nbsp;&nbsp; X，至少 n 次<br />
X{n,m}?&nbsp;&nbsp;&nbsp; X，至少 n 次，但是不超过 m 次<br />
<strong>10.Possessive 数量词</strong><br />
X?+&nbsp;&nbsp;&nbsp; X，一次或一次也没有<br />
X*+&nbsp;&nbsp;&nbsp; X，零次或多次<br />
X++&nbsp;&nbsp;&nbsp; X，一次或多次<br />
X{n}+&nbsp;&nbsp;&nbsp; X，恰好 n 次<br />
X{n,}+&nbsp;&nbsp;&nbsp; X，至少 n 次<br />
X{n,m}+&nbsp;&nbsp;&nbsp; X，至少 n 次，但是不超过 m 次<br />
Greedy，Reluctant，Possessive的区别在于:(注意仅限于进行.等模糊处理时)<br />
greedy量 词被看作&#8220;贪婪的&#8221;，因为它第一次就读入整个被模糊匹配的字符串。如果第一个匹配尝试（整个输入字符串）失败，匹配器就会在被匹配字符串中的最后一位后退一个字符并且再次尝试，重复这个过程，直到找到匹配或者没有更多剩下的字符可以后退为止。根据表达式中使用的量词，它最后试图匹配的内容是1 个或者0个字符。<br />
但是，reluctant量词采取相反的方式：它们从被匹配字符串的开头开始，然后逐步地一次读取一个字符搜索匹配。它们最后试图匹配的内容是整个输入字符串。<br />
最后，possessive量词总是读完整个输入字符串，尝试一次（而且只有一次）匹配。和greedy量词不同，possessive从不后退。<br />
<strong>11.Logical 运算符<br />
</strong>XY&nbsp;&nbsp;&nbsp; X 后跟 Y<br />
X|Y&nbsp;&nbsp;&nbsp; X 或 Y<br />
(X)&nbsp;&nbsp;&nbsp; X，作为捕获组。例如(abc)表示把abc作为一个整体进行捕获<br />
<strong>12.Back 引用</strong><br />
\n&nbsp;&nbsp;&nbsp; 任何匹配的 nth捕获组<br />
捕获组可以通过从左到右计算其开括号来编号。例如，在表达式 ((A)(B(C)))中，存在四个这样的组： <br />
1&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; ((A)(B(C)))<br />
2&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; \A<br />
3&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; (B(C))<br />
4&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; (C)<br />
在表达式中可以通过\n来对相应的组进行引用，例如(ab)34\1就表示ab34ab，(ab)34(cd)\1\2就表示ab34cdabcd。<br />
<strong>13.引用<br />
</strong>\&nbsp;&nbsp;&nbsp; Nothing，但是引用以下字符<br />
\Q&nbsp;&nbsp;&nbsp; Nothing，但是引用所有字符，直到 \E。QE之间的字符串会原封不动的使用(1.1中转义字符的除外)。例如, ab\\Q{|}\\\\E<br />
可以匹配ab{|}\\<br />
\E&nbsp;&nbsp;&nbsp; Nothing，但是结束从 \Q开始的引用<br />
<strong>14.特殊构造（非捕获）</strong><br />
(?:X)&nbsp;&nbsp;&nbsp; X，作为非捕获组<br />
(?idmsux-idmsux) &nbsp;&nbsp;&nbsp; Nothing，但是将匹配标志由 on 转为 off。比如：表达式 (?i)abc(?-i)def 这时，(?i) 打开不区分大小写开关，abc 匹配<br />
idmsux说明如下：<br />
‐i CASE_INSENSITIVE :US-ASCII 字符集不区分大小写。(?i)<br />
‐d UNIX_LINES : 打开UNIX换行符<br />
‐m MULTILINE :多行模式(?m)<br />
UNIX下换行为\n<br />
WINDOWS下换行为\r\n(?s)<br />
‐u UNICODE_CASE : Unicode 不区分大小写。(?u)<br />
‐x COMMENTS :可以在pattern里面使用注解，忽略pattern里面的whitespace，以及"#"一直到结尾（#后面为注解）。(?x)例如(?x)abc#asfsdadsa可以匹配字符串abc<br />
(?idmsux-idmsux:X) &nbsp;&nbsp;&nbsp; X，作为带有给定标志 on - off 的非捕获组。与上面的类似，上面的表达式，可以改写成为：(?i:abc)def，或者 (?i)abc(?-i:def)<br />
(?=X)&nbsp;&nbsp;&nbsp; X，通过零宽度的正 lookahead。零宽度正先行断言，仅当子表达式 X 在 此位置的右侧匹配时才继续匹配。例如，\w+(?=\d) 表示字母后面跟数字，但不捕获数字（不回溯）<br />
(?!X)&nbsp;&nbsp;&nbsp; X，通过零宽度的负 lookahead。零宽度负先行断言。仅当子表达式 X 不在 此位置的右侧匹配时才继续匹配。例如，\w+(?!\d) 表示字母后面不跟数字，且不捕获数字。<br />
(?&lt;=X)&nbsp;&nbsp;&nbsp; X，通过零宽度的正 lookbehind。零宽度正后发断言。仅当子表达式 X 在 此位置的左侧匹配时才继续匹配。例如，(?&lt;=19)99 表示99前面是数字19，但不捕获前面的19。（不回溯）<br />
(?<!x)&nbsp;&nbsp;&nbsp; X，通过零宽度的负 lookbehind。零宽度负后发断言。仅当子表达式 X 不在此位置的左侧匹配时才继续匹配。例如，(?<!19)99 表示99前面不能是19，且不捕获前面的东东。<br />
(?&gt;X)&nbsp;&nbsp;&nbsp; X，作为独立的非捕获组（不回溯）<br />
(?=X)与(?&gt;X)的区别在于(?&gt;X)是不回溯的。例如被匹配的字符串为abcm<br />
当表达式为a(?:b|bc)m是可以匹配的，而当表达式是a(?&gt;b|bc)时是不能匹配的，因为当后者匹配到b时，由于已经匹配，就跳出了非捕获组，而不再次对组内的字符进行匹配。可以加快速度。</p>
<a href="http://www.blogjava.net/Werther/archive/2009/06/10/281198.html">来自：http://www.blogjava.net/Werther/archive/2009/06/10/281198.html</a><br />
<br />
在JAVA中使用正则表达式时，应该import下面两个类<br />
import java.util.regex.Matcher; <br />
import java.util.regex.Pattern; <br />
另外"\"应该被替换成"\\"。<br />
<br />
具体方法是：<br />
String sql="create table test(id varchar(10) not null)"<br />
String reg="create\\s+table\\s+.+";<br />
Pattern p = Pattern.compile(reg); <br />
Matcher m = p.matcher(sql); <br />
boolean b = m.matches(); <br />
<br />
得到的布尔值表示sql是否匹配正则表达式reg。 
<img src ="http://www.blogjava.net/ywj-316/aggbug/312388.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/ywj-316/" target="_blank">junly</a> 2010-02-09 09:47 <a href="http://www.blogjava.net/ywj-316/archive/2010/02/09/312388.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>java优化编程-核心类</title><link>http://www.blogjava.net/ywj-316/archive/2010/01/21/310425.html</link><dc:creator>junly</dc:creator><author>junly</author><pubDate>Thu, 21 Jan 2010 10:35:00 GMT</pubDate><guid>http://www.blogjava.net/ywj-316/archive/2010/01/21/310425.html</guid><wfw:comment>http://www.blogjava.net/ywj-316/comments/310425.html</wfw:comment><comments>http://www.blogjava.net/ywj-316/archive/2010/01/21/310425.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/ywj-316/comments/commentRss/310425.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/ywj-316/services/trackbacks/310425.html</trackback:ping><description><![CDATA[1 Vector与ArrayList（HashTable/HashMap）<br />
Vector防止多线程运行，是线程安全的，效率低，安全性高。<br />
ArrayList在多线程环境下运行，是非线程安全的，效率高，安全性低。<br />
以下方法可以将ArrayList类标识为线程安全的对象：<br />
List list=Collections.synchronizedList(new ArrayList());<br />
2 ArrayList<br />
&nbsp; 对于很大的数组，并且你预料到这个数组将会变得异常庞大，这里给出一个方法优化性能：<br />
<div style="border-bottom: #cccccc 1px solid; border-left: #cccccc 1px solid; padding-bottom: 4px; background-color: #eeeeee; padding-left: 4px; width: 98%; padding-right: 5px; font-size: 13px; word-break: break-all; border-top: #cccccc 1px solid; border-right: #cccccc 1px solid; padding-top: 4px"><img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" /><span style="color: #000000">&nbsp;&nbsp;</span><span style="color: #0000ff">final</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;N</span><span style="color: #000000">=</span><span style="color: #000000">1000000</span><span style="color: #000000">;<br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" />&nbsp;&nbsp;ArrayList&nbsp;list</span><span style="color: #000000">=</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;ArrayList();<br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" />&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">调用ensureCapacity()方法初始化大小</span><span style="color: #008000"><br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" /></span><span style="color: #000000">&nbsp;&nbsp;list.ensureCapacity(N);<br />
<img id="Codehighlighter1_135_158_Open_Image" onclick="this.style.display='none'; Codehighlighter1_135_158_Open_Text.style.display='none'; Codehighlighter1_135_158_Closed_Image.style.display='inline'; Codehighlighter1_135_158_Closed_Text.style.display='inline';" align="top" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif"  alt="" /><img style="display: none" id="Codehighlighter1_135_158_Closed_Image" onclick="this.style.display='none'; Codehighlighter1_135_158_Closed_Text.style.display='none'; Codehighlighter1_135_158_Open_Image.style.display='inline'; Codehighlighter1_135_158_Open_Text.style.display='inline';" align="top" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif"  alt="" />&nbsp;&nbsp;</span><span style="color: #0000ff">for</span><span style="color: #000000">(</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;i</span><span style="color: #000000">=</span><span style="color: #000000">0</span><span style="color: #000000">;i</span><span style="color: #000000">&lt;</span><span style="color: #000000">N;i</span><span style="color: #000000">++</span><span style="color: #000000">)</span><span style="border-bottom: #808080 1px solid; border-left: #808080 1px solid; background-color: #ffffff; display: none; border-top: #808080 1px solid; border-right: #808080 1px solid" id="Codehighlighter1_135_158_Closed_Text"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_135_158_Open_Text"><span style="color: #000000">{<br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;list.add(obj);<br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif"  alt="" />&nbsp;&nbsp;}</span></span><span style="color: #000000"><br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" /></span></div>
3 ArrayList与LinkedList（同属List接口）<br />
&nbsp;&nbsp;底层实现方法不同：ArrayList通过内部数组结构Object[]实现。<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; LinkedList类似数据结构中的链表对象，通过一系列的内部记录连接在一起来实现的。<br />
<span style="color: #0000ff">将一个元素插入到集合中的某个位置时</span>，使用LinkedList比ArrayList快很多，原因是ArrayList插入后其后面所有元素后移一位，而LinkedList只需要添加一个指向头部的引用即可。<br />
<span style="color: #0000ff">在集合中按下标查找元素时</span>，使用ArrayList比LinkedList快很多。<br />
4 String与StringBuffer<br />
使用append()方法代替"+"运算<br />
5 字符串的length()方法<br />
6 charAt()与toCharArray()<br />
通过charAt()定位字符串时每次都要引起新的检索过程，更好的办法是转化为字符数给，通过数组索引定位。<br />
7 简单字符串格式化时，"+"运算<span style="color: #0000ff">优于</span>String.formart()很多。
<img src ="http://www.blogjava.net/ywj-316/aggbug/310425.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/ywj-316/" target="_blank">junly</a> 2010-01-21 18:35 <a href="http://www.blogjava.net/ywj-316/archive/2010/01/21/310425.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>java优化编程-语句</title><link>http://www.blogjava.net/ywj-316/archive/2010/01/20/310246.html</link><dc:creator>junly</dc:creator><author>junly</author><pubDate>Wed, 20 Jan 2010 07:50:00 GMT</pubDate><guid>http://www.blogjava.net/ywj-316/archive/2010/01/20/310246.html</guid><wfw:comment>http://www.blogjava.net/ywj-316/comments/310246.html</wfw:comment><comments>http://www.blogjava.net/ywj-316/archive/2010/01/20/310246.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/ywj-316/comments/commentRss/310246.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/ywj-316/services/trackbacks/310246.html</trackback:ping><description><![CDATA[1 少量的内联代码 比&nbsp; 方法调用运行速度快4倍。但对于大量的、重复度高的代码还是建议使用方法。<br />
2 final方法编译器会将该方法的代码展开插入到调用代码处，因此运行速度快，提高了效率。同样final类也可以提高效率。<br />
3 使用循环语句的几个建议：<br />
1）当作数组拷贝操作时，采用System.arraycopy()方法完成拷贝操作。<br />
2）尽量避免在循环体中调用方法，因为方法调用是比较昂贵的。<br />
3）最好避免在循环体中存取数组元素，比较好的办法是在循环体内采用临时变量，在循环体外更改数组的值。<br />
4）采用0值作为终结条件。<br />
5）避免作终结条件比较时采用方法返回值的方式进行判断，这样将降低系统性能。<br />
6）避免在循环体中使用try-catch，最好在在循环体外使用try-catch以提高性能。<br />
7）在多重循环中，如果有可能，尽量将最长的循环放在最内层，最短的循环放在最外层，以减少循环层间的切换次数。<br />
8）如果循环体内有if-else类逻辑判断，并且循环次数很大，最好将if-else类逻辑判断移到循环体之外，以提高应用性能。<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<img src ="http://www.blogjava.net/ywj-316/aggbug/310246.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/ywj-316/" target="_blank">junly</a> 2010-01-20 15:50 <a href="http://www.blogjava.net/ywj-316/archive/2010/01/20/310246.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>java优化编程-字符串驻留</title><link>http://www.blogjava.net/ywj-316/archive/2010/01/20/310241.html</link><dc:creator>junly</dc:creator><author>junly</author><pubDate>Wed, 20 Jan 2010 07:26:00 GMT</pubDate><guid>http://www.blogjava.net/ywj-316/archive/2010/01/20/310241.html</guid><wfw:comment>http://www.blogjava.net/ywj-316/comments/310241.html</wfw:comment><comments>http://www.blogjava.net/ywj-316/archive/2010/01/20/310241.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/ywj-316/comments/commentRss/310241.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/ywj-316/services/trackbacks/310241.html</trackback:ping><description><![CDATA[字符串比较时，采用.intern()方法将字符串添加到驻留池中，再进行比较，运行速度比equals()方法更快<br />
<div style="border-bottom: #cccccc 1px solid; border-left: #cccccc 1px solid; padding-bottom: 4px; background-color: #eeeeee; padding-left: 4px; width: 98%; padding-right: 5px; font-size: 13px; word-break: break-all; border-top: #cccccc 1px solid; border-right: #cccccc 1px solid; padding-top: 4px"><img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" /><span style="color: #000000">String&nbsp;str</span><span style="color: #000000">=</span><span style="color: #000000">"</span><span style="color: #000000">张三</span><span style="color: #000000">"</span><span style="color: #000000">;<br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" />str</span><span style="color: #000000">=</span><span style="color: #000000">str.intern();<br />
<img id="Codehighlighter1_48_76_Open_Image" onclick="this.style.display='none'; Codehighlighter1_48_76_Open_Text.style.display='none'; Codehighlighter1_48_76_Closed_Image.style.display='inline'; Codehighlighter1_48_76_Closed_Text.style.display='inline';" align="top" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif"  alt="" /><img style="display: none" id="Codehighlighter1_48_76_Closed_Image" onclick="this.style.display='none'; Codehighlighter1_48_76_Closed_Text.style.display='none'; Codehighlighter1_48_76_Open_Image.style.display='inline'; Codehighlighter1_48_76_Open_Text.style.display='inline';" align="top" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif"  alt="" /></span><span style="color: #0000ff">if</span><span style="color: #000000">(str</span><span style="color: #000000">==</span><span style="color: #000000">"</span><span style="color: #000000">张三</span><span style="color: #000000">"</span><span style="color: #000000">)</span><span style="border-bottom: #808080 1px solid; border-left: #808080 1px solid; background-color: #ffffff; display: none; border-top: #808080 1px solid; border-right: #808080 1px solid" id="Codehighlighter1_48_76_Closed_Text"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_48_76_Open_Text"><span style="color: #000000">{<br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif"  alt="" />System.out.println(</span><span style="color: #000000">"</span><span style="color: #000000">相同</span><span style="color: #000000">"</span><span style="color: #000000">);<br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif"  alt="" />}</span></span></div>
<img src ="http://www.blogjava.net/ywj-316/aggbug/310241.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/ywj-316/" target="_blank">junly</a> 2010-01-20 15:26 <a href="http://www.blogjava.net/ywj-316/archive/2010/01/20/310241.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>java反编译工具jad</title><link>http://www.blogjava.net/ywj-316/archive/2009/12/13/305818.html</link><dc:creator>junly</dc:creator><author>junly</author><pubDate>Sun, 13 Dec 2009 14:40:00 GMT</pubDate><guid>http://www.blogjava.net/ywj-316/archive/2009/12/13/305818.html</guid><wfw:comment>http://www.blogjava.net/ywj-316/comments/305818.html</wfw:comment><comments>http://www.blogjava.net/ywj-316/archive/2009/12/13/305818.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/ywj-316/comments/commentRss/305818.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/ywj-316/services/trackbacks/305818.html</trackback:ping><description><![CDATA[<p><a href="http://www.kpdus.com/jad.html">http://www.kpdus.com/jad.html</a>&nbsp;&nbsp; 官方最新版本，支持jdk1.6&nbsp; </p>
<p>Java下的一个简单易用的反编译工具jad, 可以很方便的将.class反编译为.Java. 点击下载&nbsp;&nbsp;</p>
<p>一、基本用法 <br />
Usage:jad [option(s)] <br />
直接输入类文件名，且支持通配符，如下所示。 <br />
c:\Java\&gt;jad example1.class <br />
c:\Java\&gt;jad *.class <br />
结果是将example1.class反编译为example1.jad。将example1.jad改为example1.Java即得源文件。</p>
<p>二、Option -o <br />
不提示，覆盖源文件</p>
<p>三、Option -s <br />
c:\Java\&gt;jad -sJava example1.class <br />
反编译结果以.Java为扩展名。</p>
<p>四、Option -p <br />
将反编译结果输出到屏幕 <br />
c:\Java\&gt;jad -p example1.class <br />
将反编译结果重定向到文件 <br />
c:\Java\&gt;jad -p example1.class&gt;example1.Java</p>
<p>五、Option -d <br />
指定反编译的输出文件目录 <br />
c:\Java\&gt;jad -o -dtest -sJava *.class</p>
<p>该文章转载自网络大本营：<a href="http://www.haoad.net/Info/3883.Html">http://www.haoad.net/Info/3883.Html</a></p>
<p>　　反编译别人的程序是不对的，但是有时候由于某种原因，不得不反编译别人的代码，那就需要一个工具了。小颖JAVA源代码反编译专家V1.4终极版是个很好的工具，但是只能对JDK1.4.2和之前的版本编译的程序反编译，而JDK5.0后的就无能为力了，但是可以下载JAD.EXE来逐个反编译 CLASS文件，不过如果碰到有几十个或几百个文件夹，并且目录很深的时候，就麻烦了，这个给出一个直接使用命令行反编译整个目录的方法：使用jad批量反编译</p>
<p>jad -o -r -sjava -d src bin/**/*.class</p>
<p>src: 是反编後的目錄</p>
<p>bin:指 package 開頭</p>
<p>将bin里面所有的.class反编译到src下面JAD下载： 文件名: jadnt157.ziphttp://download.pchome.net/php/dl.php?sid=9111</p>
<p><br />
jad:反编译工具<br />
可以将class文件反编译成java文件<br />
假设将jad.exe安装在f:\java\jad目录下<br />
把要反编译的文件*.class复制到此目录下，接着接以下步骤，<br />
在命令行窗口环境中进入jad目录，<br />
然后运行：jad -s java *.class&nbsp;&nbsp; (附，*.class指要反编译的文件名)<br />
如果*.class文件和jad程序不在同一个目录，就要用到path环境变量，<br />
将jad 所在目录加到path路径中即可：set path=%path%;f:\java\jad<br />
若要了解jad更为详细的使用帮助信息，直接运行jad.exe查看</p>
<p>以下假设jad.exe在c:\java目录下</p>
<p>一、基本用法 <br />
Usage:jad [option(s)] <br />
直接输入类文件名，且支持通配符，如下所示。 <br />
c:\java\&gt;jad example1.class <br />
c:\java\&gt;jad *.class <br />
结果是将example1.class反编译为example1.jad。将example1.jad改为example1.java即得源文件。</p>
<p>二、Option -o <br />
不提示，覆盖源文件</p>
<p>三、Option -s <br />
c:\java\&gt;jad -sjava example1.class <br />
反编译结果以.java为扩展名。</p>
<p>四、Option -p <br />
将反编译结果输出到屏幕 <br />
c:\java\&gt;jad -p example1.class <br />
将反编译结果重定向到文件 <br />
c:\java\&gt;jad -p example1.class&gt;example1.java</p>
<p>五、Option -d <br />
指定反编译的输出文件目录 <br />
c:\java\&gt;jad -o -dtest -sjava *.class</p>
<p>六、Option -r <br />
按*.class的包结构输出文件目录<br />
c:\java\&gt;jad -o -r -dtest -sjava d:/1/**/*.class<br />
将d:\1\文件夹下的.class文件按照原程序的包结构反编译到test目录下。</p>
<p><strong>命令行选择的列表<br />
<br />
</strong>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; -a&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; - 用JVM字节格式来注解输出<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; -af&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; - 同 -a,但是注解的时候用全名称<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; -clear&nbsp;&nbsp;&nbsp; - 清除所有的前缀<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; -b&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; - 输出多于的括号 (e.g., if(a) { b(); }, default: no)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; -d</p>
<dir>- 指定输出文件的文件目录<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; -dead&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; -试图反编译代码的dead 部分(default: no)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; -disass&nbsp;&nbsp; - 不用用字节码的方式反编译 (no JAVA source generated)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; -f&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; - 输出整个的名字,无论是类还是方法<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; -ff&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; -输出类的成员在方法之前 (default: after methods)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; -i&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; - 输出所有的变量的缺省的最初值<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; -l<num></num>&nbsp;&nbsp;&nbsp; - 将strings分割成指定数目的块的字符 (default: no)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; -lnc&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; - 将输出文件用行号来注解 (default: no)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; -nl&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; - 分割strings用新行字符 newline character (default: no)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; -nodos&nbsp;&nbsp;&nbsp; -不要去检查class文件是否以dos方式写 (CR before NL, default: check)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; -nocast&nbsp;&nbsp; - 不要生成辅助文件<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; -nocode&nbsp;&nbsp;&nbsp; -不要生成方法的源代码 <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; -noconv&nbsp;&nbsp;&nbsp; - 不要转换java的定义符 (default: do)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; -noctor&nbsp;&nbsp; - 不允许空的构造器存在<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; -noinner&nbsp;&nbsp; -关掉对内部类的支持 (default: turn on)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; -nolvt&nbsp;&nbsp;&nbsp; - 忽略局部变量的表信息<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; -nonlb&nbsp;&nbsp;&nbsp;&nbsp; - 不要输出一个新行在打开一个括号之前 (default: do)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; -o&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; - 无需确认直接覆盖输出 (default: no)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; -p&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; - 发送反编译代码到标准输出 STDOUT (e.g., for piping)
<p align="center"></p>
<p>&nbsp;</p>
<span>
<p align="center"></p>
</span></dir>
<img src ="http://www.blogjava.net/ywj-316/aggbug/305818.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/ywj-316/" target="_blank">junly</a> 2009-12-13 22:40 <a href="http://www.blogjava.net/ywj-316/archive/2009/12/13/305818.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>字符串日期转换</title><link>http://www.blogjava.net/ywj-316/archive/2009/12/03/304667.html</link><dc:creator>junly</dc:creator><author>junly</author><pubDate>Thu, 03 Dec 2009 09:09:00 GMT</pubDate><guid>http://www.blogjava.net/ywj-316/archive/2009/12/03/304667.html</guid><wfw:comment>http://www.blogjava.net/ywj-316/comments/304667.html</wfw:comment><comments>http://www.blogjava.net/ywj-316/archive/2009/12/03/304667.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/ywj-316/comments/commentRss/304667.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/ywj-316/services/trackbacks/304667.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: java开发时往往需要做字符串和日期的转换主要用到：java.text.SimpleDateFormatSimpleDateFormat&nbsp;sdf&nbsp;=&nbsp;&nbsp;&nbsp;new&nbsp;SimpleDateFormat(&nbsp;"&nbsp;yyyy-MM-dd&nbsp;HH:mm:ss&nbsp;"&nbsp;);&nbsp;&nbsp;...&nbsp;&nbsp;<a href='http://www.blogjava.net/ywj-316/archive/2009/12/03/304667.html'>阅读全文</a><img src ="http://www.blogjava.net/ywj-316/aggbug/304667.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/ywj-316/" target="_blank">junly</a> 2009-12-03 17:09 <a href="http://www.blogjava.net/ywj-316/archive/2009/12/03/304667.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>文件下载</title><link>http://www.blogjava.net/ywj-316/archive/2009/11/29/304147.html</link><dc:creator>junly</dc:creator><author>junly</author><pubDate>Sun, 29 Nov 2009 13:35:00 GMT</pubDate><guid>http://www.blogjava.net/ywj-316/archive/2009/11/29/304147.html</guid><wfw:comment>http://www.blogjava.net/ywj-316/comments/304147.html</wfw:comment><comments>http://www.blogjava.net/ywj-316/archive/2009/11/29/304147.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/ywj-316/comments/commentRss/304147.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/ywj-316/services/trackbacks/304147.html</trackback:ping><description><![CDATA[<p>文件下载代码(2008-02-26 21:33:36)标签：情感&nbsp;&nbsp;&nbsp; <br />
&nbsp; <br />
&nbsp;String fileName = request.getParameter("fileName");<br />
&nbsp; fileName = fileName.substring(fileName.indexOf("=")+1);<br />
&nbsp; <br />
&nbsp; String filePath = servlet.getServletContext().getRealPath("")<br />
&nbsp; + "\\upload\\" ;<br />
&nbsp; String file = filePath + fileName;<br />
&nbsp; System.out.println(file);<br />
&nbsp; FileInputStream fis = null;<br />
&nbsp; OutputStream os = null;&nbsp; </p>
<p><br />
&nbsp; byte[] bos = new byte[1024];<br />
&nbsp; int length = 0;<br />
&nbsp; try {</p>
<p>&nbsp;&nbsp; response.setContentType("application/x-msdownload");<br />
&nbsp;&nbsp; response.setHeader("Content-disposition", "attachment;filename="<br />
&nbsp;&nbsp;&nbsp;&nbsp; + new String(fileName.getBytes("gb2312"),"iso8859-1"));<br />
&nbsp;&nbsp; <br />
&nbsp;&nbsp; fis = new FileInputStream(file);<br />
&nbsp;&nbsp; os = response.getOutputStream();<br />
&nbsp;&nbsp; while((length=fis.read(bos))!=-1){<br />
&nbsp;&nbsp;&nbsp; os.write(bos, 0, length);<br />
//&nbsp;&nbsp;&nbsp; os.flush();<br />
&nbsp;&nbsp; }<br />
&nbsp; } catch (Exception e) {<br />
&nbsp;&nbsp; e.printStackTrace();<br />
&nbsp; }finally{<br />
&nbsp;&nbsp; try {<br />
&nbsp;&nbsp;&nbsp; if(os!=null)<br />
&nbsp;&nbsp;&nbsp;&nbsp; os.close();<br />
&nbsp;&nbsp;&nbsp; if(fis!=null)<br />
&nbsp;&nbsp;&nbsp;&nbsp; fis.close();<br />
&nbsp;&nbsp; } catch (Exception e) {<br />
&nbsp;&nbsp;&nbsp; e.printStackTrace();<br />
&nbsp;&nbsp; }<br />
&nbsp; }</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>注意:</p>
<p>1.response.setContentType("application/x-msdownload");</p>
<p>2.response.setHeader("Content-disposition", "attachment;filename="<br />
&nbsp;&nbsp;&nbsp;&nbsp; + new String(fileName.getBytes("gb2312"),"iso8859-1"));</p>
<p>&nbsp;PS:解决下载中文乱码 fileName.getBytes("gb2312"),"iso8859-1")</p>
<p>3.待解决问题：选择图片下载时候点取消抛异常</p>
<p>&nbsp;</p>
<p>----------------------------------------------------------------------------------------------<br />
用commons.fileupload实现文件的上传和下载2008年04月11日 星期五 15:27commons.fileupload实现文件的上传，需要用到的组件如下：</p>
<p>1）Commons-fileupload-1.1.zip,下载地址为http://archive.apache.org/dist/jakarta/commons/fileupload/</p>
<p>2)commons-io-1.1.zip,下载地址为:http://archive.apache.org/dist/jakarta/commons/io/</p>
<p>代码如下：<br />
&lt;%! <br />
//服务器端保存上传文件的路径 <br />
&nbsp;&nbsp;&nbsp; String saveDirectory = "g:\\upload\\";<br />
&nbsp;&nbsp;&nbsp; // 临时路径 一旦文件大小超过getSizeThreshold()的值时数据存放在硬盘的目录<br />
&nbsp;&nbsp;&nbsp; String tmpDirectory = "g:\\upload\\tmp\\";<br />
&nbsp;&nbsp;&nbsp; // 最多只允许在内存中存储的数据大小,单位:字节 <br />
&nbsp;&nbsp;&nbsp; int maxPostSize = 1024 * 1024; <br />
%&gt;<br />
&lt;%<br />
&nbsp;&nbsp;&nbsp; // 文件内容 <br />
&nbsp;&nbsp;&nbsp; String FileDescription = null; <br />
&nbsp;&nbsp;&nbsp; // 文件名（包括路径）<br />
&nbsp;&nbsp;&nbsp; String FileName = null;<br />
&nbsp;&nbsp;&nbsp; // 文件大小 <br />
&nbsp;&nbsp;&nbsp; long FileSize = 0;<br />
&nbsp;&nbsp;&nbsp; // 文件类型<br />
&nbsp;&nbsp;&nbsp; String ContentType = null;</p>
<p>%&gt;</p>
<p>&lt;%<br />
&nbsp;&nbsp; DiskFileUpload fu = new DiskFileUpload();//创建一个新的文件上传句柄<br />
&nbsp;&nbsp;&nbsp; // 设置允许用户上传文件大小,单位:字节<br />
&nbsp;&nbsp; fu.setSizeMax(200*1024*1024);<br />
&nbsp;&nbsp;&nbsp; // 设置最多只允许在内存中存储的数据,单位:字节<br />
&nbsp;&nbsp; fu.setSizeThreshold(maxPostSize);<br />
&nbsp;&nbsp;&nbsp; // 设置一旦文件大小超过getSizeThreshold()的值时数据存放在硬盘的目录<br />
&nbsp;&nbsp; fu.setRepositoryPath("g:\\upload\\tmp\\");<br />
&nbsp;&nbsp;&nbsp; //开始读取上传信息 得到所有文件<br />
&nbsp;&nbsp; try{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; List fileItems = fu.parseRequest(request);//解析上传的请求<br />
&nbsp;&nbsp;&nbsp;&nbsp; }catch(FileUploadException e){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //这里异常产生的原因可能是用户上传文件超过限制、不明类型的文件等<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //自己处理的代码<br />
&nbsp;&nbsp;&nbsp;&nbsp; }<br />
%&gt;<br />
&lt;%<br />
// 依次处理每个上传的文件<br />
&nbsp;&nbsp; Iterator iter = fileItems.iterator();<br />
&nbsp;&nbsp; while (iter.hasNext()) {<br />
&nbsp;&nbsp;&nbsp;&nbsp; FileItem item = (FileItem) iter.next();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //忽略其他不是文件域的所有表单信息<br />
&nbsp;&nbsp;&nbsp;&nbsp; if (!item.isFormField()) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String name = item.getName();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; long size = item.getSize();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String contentType = item.getContentType();<br />
&nbsp;&nbsp;&nbsp;&nbsp; if((name==null||name.equals("")) &amp;&amp; size==0)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; continue;<br />
%&gt;<br />
&lt;%<br />
&nbsp;&nbsp; //保存上传的文件到指定的目录<br />
String[] names=StringUtils.split(name,"\\"); //对原来带路径的文件名进行分割<br />
&nbsp;&nbsp; name = names[names.length-1];<br />
&nbsp;&nbsp; item.write(new File(saveDirectory+ name));<br />
}<br />
}<br />
%&gt;<br />
下面是其简单的使用场景：<br />
A、上传项目只要足够小，就应该保留在内存里。<br />
B、较大的项目应该被写在硬盘的临时文件上。<br />
C、非常大的上传请求应该避免。<br />
D、限制项目在内存中所占的空间，限制最大的上传请求，并且设定临时文件的位置。</p>
<p>可以根据具体使用用servlet来重写，具体参数配置可以统一放置到一配置文件</p>
<p><br />
--------------------------------------------------------------------------------</p>
<p>文件的下载用servlet实现<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public void doGet(HttpServletRequest request,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; HttpServletResponse response)<br />
&nbsp;&nbsp;&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String aFilePath = null;&nbsp;&nbsp;&nbsp; //要下载的文件路径<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String aFileName = null;&nbsp;&nbsp;&nbsp; //要下载的文件名<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; FileInputStream in = null; //输入流<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ServletOutputStream out = null; //输出流 </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; try<br />
&nbsp;&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; aFilePath = getFilePath(request); <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; aFileName = getFileName(request);</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; response.setContentType(getContentType(aFileName) + "; charset=UTF-8");<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; response.setHeader("Content-disposition", "attachment; filename=" + aFileName);</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; in = new FileInputStream(aFilePath + aFileName); //读入文件<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; out = response.getOutputStream();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; out.flush();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int aRead = 0;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; while((aRead = in.read()) != -1 &amp; in != null)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; out.write(aRead);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; out.flush();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; catch(Throwable e)<br />
&nbsp;&nbsp;&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp;&nbsp; log.error("FileDownload doGet() IO error!",e);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; finally<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br />
&nbsp;&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; {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&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;&nbsp;&nbsp;&nbsp;&nbsp; out.close();<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;&nbsp; catch(Throwable e)<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;&nbsp; log.error("FileDownload doGet() IO close error!",e);<br />
&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; }</p>
<img src ="http://www.blogjava.net/ywj-316/aggbug/304147.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/ywj-316/" target="_blank">junly</a> 2009-11-29 21:35 <a href="http://www.blogjava.net/ywj-316/archive/2009/11/29/304147.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>pager-taglib的安装和使用</title><link>http://www.blogjava.net/ywj-316/archive/2009/11/29/304145.html</link><dc:creator>junly</dc:creator><author>junly</author><pubDate>Sun, 29 Nov 2009 13:34:00 GMT</pubDate><guid>http://www.blogjava.net/ywj-316/archive/2009/11/29/304145.html</guid><wfw:comment>http://www.blogjava.net/ywj-316/comments/304145.html</wfw:comment><comments>http://www.blogjava.net/ywj-316/archive/2009/11/29/304145.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/ywj-316/comments/commentRss/304145.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/ywj-316/services/trackbacks/304145.html</trackback:ping><description><![CDATA[<p>1、拷贝pager-taglib.jar包<br />
2、在JSP页面中使用taglib指令引入pager-taglib标签库<br />
3、使用pager-taglib标签库进行分页处理</p>
<p>pg:pager【这个标签用来设置分页的总体参数】重要参数说明：<br />
&nbsp;url:分页的链接根地址，pager标签会在这个链接的基础上附加分页参数<br />
&nbsp;items:总记录数，pager标签正是根据这个值来计算分页参数的<br />
&nbsp;maxPageItems:每页显示的行数，默认为10<br />
&nbsp;maxIndexPages:在循环输出页码的时候，最大输出多少个页码，默认是10<br />
&nbsp;<br />
pg:first【第一页的标签】重要参数说明：<br />
&nbsp;export变量的意义：<br />
&nbsp;pageUrl - 分页链接URL地址（最重要的export参数）<br />
&nbsp;pageNumber - 页码<br />
&nbsp;firstItem - 首页第一行的索引值<br />
&nbsp;lastItem - 首页最后一行的索引值<br />
&nbsp;<br />
pg:pre【上一页标签】重要参数说明：<br />
&nbsp;export变量的意义：<br />
&nbsp;pageUrl - 分页链接URL地址（最重要的export参数）<br />
&nbsp;pageNumber - 页码<br />
&nbsp;firstItem - 前页第一行的索引值<br />
&nbsp;lastItem - 前页最后一行的索引值</p>
<p>pg:next【下一页标签】重要参数说明：<br />
&nbsp;export变量的意义：<br />
&nbsp;pageUrl - 分页链接URL地址（最重要的export参数）<br />
&nbsp;pageNumber - 页码<br />
&nbsp;firstItem - 下页第一行的索引值<br />
&nbsp;lastItem - 下页最后一行的索引值<br />
&nbsp;<br />
pg:last重要参数说明：<br />
&nbsp;export变量的意义：<br />
&nbsp;pageUrl - 分页链接URL地址（最重要的export参数）<br />
&nbsp;pageNumber - 页码<br />
&nbsp;firstItem - 尾页第一行的索引值<br />
&nbsp;lastItem - 尾页最后一行的索引值<br />
&nbsp;<br />
pg:pages【这个标签用来循环输出页码信息】重要参数说明：<br />
&nbsp;export变量的意义：<br />
&nbsp;pageUrl - 分页链接URL地址（最重要的export参数）<br />
&nbsp;pageNumber - 页码<br />
&nbsp;firstItem - pageNumber这个页码指定的那一页的第一行的索引值<br />
&nbsp;lastItem - pageNumber这个页码指定的那一页的最后一行的索引值</p>
<img src ="http://www.blogjava.net/ywj-316/aggbug/304145.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/ywj-316/" target="_blank">junly</a> 2009-11-29 21:34 <a href="http://www.blogjava.net/ywj-316/archive/2009/11/29/304145.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>文件上传组件</title><link>http://www.blogjava.net/ywj-316/archive/2009/11/29/304146.html</link><dc:creator>junly</dc:creator><author>junly</author><pubDate>Sun, 29 Nov 2009 13:34:00 GMT</pubDate><guid>http://www.blogjava.net/ywj-316/archive/2009/11/29/304146.html</guid><wfw:comment>http://www.blogjava.net/ywj-316/comments/304146.html</wfw:comment><comments>http://www.blogjava.net/ywj-316/archive/2009/11/29/304146.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/ywj-316/comments/commentRss/304146.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/ywj-316/services/trackbacks/304146.html</trackback:ping><description><![CDATA[<p>文件上传组件<br />
1 Apache的Commons FileUpload<br />
2 JavaZoom的UploadBean<br />
3 jspSmartUpload<br />
FileUpload下载网址：<br />
http://commons.apache.org/fileupload/<br />
步骤：<br />
1 导入Apache的Commons FileUpload组件的两个jar包<br />
2 建上传页面<br />
&lt;form action="servlet/upload" method="post" enctype="multipart/form-data" name="form1"&gt;<br />
&nbsp; 上传人：&lt;input type="text" name="username"/&gt;&lt;br/&gt;<br />
&nbsp; 上传文件：&lt;input type="file" name="loadname"/&gt;&lt;br/&gt;<br />
&nbsp; &lt;input type="submit"/&gt;<br />
&lt;/form&gt;<br />
注意，form中enctype="multipart/form-data"属性为上传属性，必写<br />
---------------------------------------------------------------------<br />
3 建立servlet处理类<br />
public class UploadServlet extends HttpServlet {<br />
&nbsp;private ServletContext sc;//ServletContext定义了一系列方法用于与相应的servlet容器通信<br />
&nbsp;private String savePath;</p>
<p>&nbsp;public void init(ServletConfig config) throws ServletException {<br />
&nbsp;&nbsp;savePath = config.getInitParameter("savePath");//得到初始化信息<br />
&nbsp;&nbsp;sc = config.getServletContext();//得到ServletContext接口的实例<br />
&nbsp;}</p>
<p>&nbsp;private static final long serialVersionUID = 7093971456528100363L;</p>
<p>&nbsp;public void doGet(HttpServletRequest request, HttpServletResponse response)<br />
&nbsp;&nbsp;&nbsp;throws ServletException, IOException {<br />
&nbsp;&nbsp;doPost(request, response);<br />
&nbsp;}</p>
<p>&nbsp;public void doPost(HttpServletRequest request, HttpServletResponse response)<br />
&nbsp;&nbsp;&nbsp;throws ServletException, IOException {<br />
&nbsp;&nbsp;request.setCharacterEncoding("UTF-8");<br />
&nbsp;&nbsp;DiskFileItemFactory factory = new DiskFileItemFactory();<br />
&nbsp;&nbsp;ServletFileUpload upload = new ServletFileUpload(factory);<br />
&nbsp;&nbsp;try {<br />
&nbsp;&nbsp;&nbsp;List items = upload.parseRequest(request);<br />
&nbsp;&nbsp;&nbsp;for (int i = 0; i &lt; items.size(); i++) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;FileItem item = (FileItem) items.get(i);<br />
&nbsp;&nbsp;&nbsp;&nbsp;if (item.isFormField()) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println("表单的参数名称：" + item.getFieldName()<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;+ ",对应的参数值：" + item.getString("UTF-8"));<br />
&nbsp;&nbsp;&nbsp;&nbsp;} else {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if (item.getName() != null &amp;&amp; !item.getName().equals("")) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println("上传文件的大小:" + item.getSize());<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println("上传文件的类型:" + item.getContentType());<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println("上传文件的名称:" + item.getName());</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;File temFile = new File(item.getName());<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;File file = new File(sc.getRealPath("/") + savePath,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;temFile.getName());<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;item.write(file);</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;request.setAttribute("upload.message", "上传文件成功！");<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} else {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;request.setAttribute("upload.message", "没有上传文件成功！");<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;} catch (Exception e) {<br />
&nbsp;&nbsp;&nbsp;e.printStackTrace();<br />
&nbsp;&nbsp;&nbsp;request.setAttribute("upload.message", "没有上传文件成功！");<br />
&nbsp;&nbsp;}<br />
&nbsp;&nbsp;request.getRequestDispatcher("/uploadresult.jsp").forward(request, response);<br />
&nbsp;}<br />
}<br />
-----------------------------------------------------------------------------------<br />
4 配置web.xml<br />
&lt;servlet&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;servlet-name&gt;UploadServlet&lt;/servlet-name&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;servlet-class&gt;com.webs.UploadServlet&lt;/servlet-class&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;init-param&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;param-name&gt;savePath&lt;/param-name&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;param-value&gt;uploads&lt;/param-value&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;/init-param&gt;<br />
&nbsp; &lt;/servlet&gt;</p>
<p>&nbsp; &lt;servlet-mapping&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;servlet-name&gt;UploadServlet&lt;/servlet-name&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;url-pattern&gt;/servlet/upload&lt;/url-pattern&gt;<br />
&nbsp; &lt;/servlet-mapping&gt;</p>
<p><br />
-----------------------------------------------------------------------------------<br />
-----------------------------------------------------------------------------------<br />
Apache的commons-fileupload.jar可方便的实现文件的上传功能，本文通过实例来介绍如何使用commons-fileupload.jar。 <br />
@author:ZJ 07-2-22 <br />
Blog: http://zhangjunhd.blog.51cto.com/ <br />
&nbsp;&nbsp;&nbsp; 将Apache的commons-fileupload.jar放在应用程序的WEB-INF\lib下，即可使用。下面举例介绍如何使用它的文件上传功能。 <br />
所使用的fileUpload版本为1.2，环境为Eclipse3.3+MyEclipse6.0。FileUpload 是基于 Commons IO的，所以在进入项目前先确定Commons IO的jar包（本文使用commons-io-1.3.2.jar）在WEB-INF\lib下。 <br />
此文作示例工程可在文章最后的附件中下载。 <br />
示例1 <br />
最简单的例子，通过ServletFileUpload静态类来解析Request，工厂类FileItemFactory会对mulipart类的表单中的所有字段进行处理，不只是file字段。getName（）得到文件名，getString（）得到表单数据内容，isFormField（）可判断是否为普通的表单项。 <br />
demo1.html <br />
&lt;html&gt; <br />
&lt;head&gt; <br />
&nbsp;&nbsp;&nbsp; &lt;meta http-equiv="Content-Type" content="text/html; charset=GB18030"&gt; <br />
&nbsp;&nbsp;&nbsp; &lt;title&gt;File upload&lt;/title&gt; <br />
&lt;/head&gt; <br />
&lt;body&gt; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //必须是multipart的表单数据。 <br />
&nbsp;&nbsp;&nbsp; &lt;form name="myform" action="demo1.jsp" method="post" <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; enctype="multipart/form-data"&gt; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Your name: &lt;br&gt; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;input type="text" name="name" size="15"&gt;&lt;br&gt; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; File:&lt;br&gt; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;input type="file" name="myfile"&gt;&lt;br&gt; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;br&gt; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;input type="submit" name="submit" value="Commit"&gt; <br />
&nbsp;&nbsp;&nbsp; &lt;/form&gt; <br />
&lt;/body&gt; <br />
&lt;/html&gt; </p>
<p><br />
demo1.jsp <br />
&lt;%@ page language="java" contentType="text/html; charset=GB18030" <br />
&nbsp;&nbsp;&nbsp; pageEncoding="GB18030"%&gt; <br />
&lt;%@ page import="org.apache.commons.fileupload.*"%&gt; <br />
&lt;%@ page import="org.apache.commons.fileupload.servlet.*"%&gt; <br />
&lt;%@ page import="org.apache.commons.fileupload.disk.*"%&gt; <br />
&lt;%@ page import="java.util.*"%&gt; </p>
<p>&lt;!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"&gt; <br />
&lt;% <br />
&nbsp;&nbsp;&nbsp; boolean isMultipart = ServletFileUpload.isMultipartContent(request);//检查输入请求是否为multipart表单数据。 <br />
&nbsp;&nbsp;&nbsp; if (isMultipart == true) { <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; FileItemFactory factory = new DiskFileItemFactory();//为该请求创建一个DiskFileItemFactory对象，通过它来解析请求。执行解析后，所有的表单项目都保存在一个List中。 <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ServletFileUpload upload = new ServletFileUpload(factory); <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; List&lt;FileItem&gt; items = upload.parseRequest(request); <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Iterator&lt;FileItem&gt; itr = items.iterator(); <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; while (itr.hasNext()) { <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; FileItem item = (FileItem) itr.next(); <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //检查当前项目是普通表单项目还是上传文件。 <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (item.isFormField()) {//如果是普通表单项目，显示表单内容。 <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String fieldName = item.getFieldName(); <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (fieldName.equals("name")) //对应demo1.html中type="text" name="name" <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; out.print("the field name is" + item.getString());//显示表单内容。 <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; out.print("&lt;br&gt;"); <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } else {//如果是上传文件，显示文件名。 <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; out.print("the upload file name is" + item.getName()); <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; out.print("&lt;br&gt;"); <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } <br />
&nbsp;&nbsp;&nbsp; } else { <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; out.print("the enctype must be multipart/form-data"); <br />
&nbsp;&nbsp;&nbsp; } <br />
%&gt; <br />
&lt;html&gt; <br />
&lt;head&gt; <br />
&nbsp;&nbsp;&nbsp; &lt;meta http-equiv="Content-Type" content="text/html; charset=GB18030"&gt; <br />
&nbsp;&nbsp;&nbsp; &lt;title&gt;File upload&lt;/title&gt; <br />
&lt;/head&gt; <br />
&lt;body&gt; <br />
&lt;/body&gt; <br />
&lt;/html&gt; </p>
<p>结果： <br />
the field name isjeff <br />
the upload file name isD:\C语言考试样题\作业题.rar </p>
<p>示例2 <br />
上传两个文件到指定的目录。 <br />
demo2.html <br />
&lt;html&gt; <br />
&lt;head&gt; <br />
&nbsp;&nbsp;&nbsp; &lt;meta http-equiv="Content-Type" content="text/html; charset=GB18030"&gt; <br />
&nbsp;&nbsp;&nbsp; &lt;title&gt;File upload&lt;/title&gt; <br />
&lt;/head&gt; <br />
&lt;body&gt; <br />
&nbsp;&nbsp;&nbsp; &lt;form name="myform" action="demo2.jsp" method="post" <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; enctype="multipart/form-data"&gt; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; File1:&lt;br&gt; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;input type="file" name="myfile"&gt;&lt;br&gt; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; File2:&lt;br&gt; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;input type="file" name="myfile"&gt;&lt;br&gt; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;br&gt; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;input type="submit" name="submit" value="Commit"&gt; <br />
&nbsp;&nbsp;&nbsp; &lt;/form&gt; <br />
&lt;/body&gt; <br />
&lt;/html&gt; </p>
<p><br />
demo2.jsp <br />
&lt;%@ page language="java" contentType="text/html; charset=GB18030" <br />
&nbsp;&nbsp;&nbsp; pageEncoding="GB18030"%&gt; <br />
&lt;%@ page import="org.apache.commons.fileupload.*"%&gt; <br />
&lt;%@ page import="org.apache.commons.fileupload.servlet.*"%&gt; <br />
&lt;%@ page import="org.apache.commons.fileupload.disk.*"%&gt; <br />
&lt;%@ page import="java.util.*"%&gt; <br />
&lt;%@ page import="java.io.*"%&gt; </p>
<p>&lt;!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"&gt; <br />
&lt;%String uploadPath="D:\\temp"; <br />
&nbsp; boolean isMultipart = ServletFileUpload.isMultipartContent(request); <br />
&nbsp; if(isMultipart==true){ <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; try{ <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; FileItemFactory factory = new DiskFileItemFactory(); <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ServletFileUpload upload = new ServletFileUpload(factory); <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; List&lt;FileItem&gt; items = upload.parseRequest(request);//得到所有的文件 <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Iterator&lt;FileItem&gt; itr = items.iterator(); <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; while(itr.hasNext()){//依次处理每个文件 <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; FileItem item=(FileItem)itr.next(); <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String fileName=item.getName();//获得文件名，包括路径 <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(fileName!=null){ <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; File fullFile=new File(item.getName()); <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; File savedFile=new File(uploadPath,fullFile.getName()); <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; item.write(savedFile); <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; out.print("upload succeed"); <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; catch(Exception e){ <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; e.printStackTrace(); <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } <br />
&nbsp; } <br />
&nbsp; else{ <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; out.println("the enctype must be multipart/form-data"); <br />
&nbsp; } <br />
%&gt; <br />
&lt;html&gt; <br />
&lt;head&gt; <br />
&lt;meta http-equiv="Content-Type" content="text/html; charset=GB18030"&gt; <br />
&lt;title&gt;File upload&lt;/title&gt; <br />
&lt;/head&gt; <br />
&lt;body&gt; <br />
&lt;/body&gt; <br />
&lt;/html&gt; </p>
<p>结果： <br />
upload succeed </p>
<p>此时，在"D:\temp"下可以看到你上传的两个文件。 <br />
示例3 <br />
上传一个文件到指定的目录，并限定文件大小。 <br />
demo3.html <br />
&lt;html&gt; <br />
&lt;head&gt; <br />
&nbsp;&nbsp;&nbsp; &lt;meta http-equiv="Content-Type" content="text/html; charset=GB18030"&gt; <br />
&nbsp;&nbsp;&nbsp; &lt;title&gt;File upload&lt;/title&gt; <br />
&lt;/head&gt; <br />
&lt;body&gt; <br />
&nbsp;&nbsp;&nbsp; &lt;form name="myform" action="demo3.jsp" method="post" <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; enctype="multipart/form-data"&gt; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; File:&lt;br&gt; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;input type="file" name="myfile"&gt;&lt;br&gt; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;br&gt; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;input type="submit" name="submit" value="Commit"&gt; <br />
&nbsp;&nbsp;&nbsp; &lt;/form&gt; <br />
&lt;/body&gt; <br />
&lt;/html&gt; </p>
<p><br />
demo3.jsp <br />
&lt;%@ page language="java" contentType="text/html; charset=GB18030" <br />
&nbsp;&nbsp;&nbsp; pageEncoding="GB18030"%&gt; <br />
&lt;%@ page import="org.apache.commons.fileupload.*"%&gt; <br />
&lt;%@ page import="org.apache.commons.fileupload.servlet.*"%&gt; <br />
&lt;%@ page import="org.apache.commons.fileupload.disk.*"%&gt; <br />
&lt;%@ page import="java.util.*"%&gt; <br />
&lt;%@ page import="java.io.*"%&gt; </p>
<p>&lt;!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"&gt; <br />
&lt;% <br />
&nbsp;&nbsp;&nbsp; File uploadPath = new File("D:\\temp");//上传文件目录 <br />
&nbsp;&nbsp;&nbsp; if (!uploadPath.exists()) { <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; uploadPath.mkdirs(); <br />
&nbsp;&nbsp;&nbsp; } <br />
&nbsp;&nbsp;&nbsp; // 临时文件目录 <br />
&nbsp;&nbsp;&nbsp; File tempPathFile = new File("d:\\temp\\buffer\\"); <br />
&nbsp;&nbsp;&nbsp; if (!tempPathFile.exists()) { <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; tempPathFile.mkdirs(); <br />
&nbsp;&nbsp;&nbsp; } <br />
&nbsp;&nbsp;&nbsp; try { <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // Create a factory for disk-based file items <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; DiskFileItemFactory factory = new DiskFileItemFactory(); </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // Set factory constraints <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; factory.setSizeThreshold(4096); // 设置缓冲区大小，这里是4kb <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; factory.setRepository(tempPathFile);//设置缓冲区目录 </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // Create a new file upload handler <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ServletFileUpload upload = new ServletFileUpload(factory); </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // Set overall request size constraint <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; upload.setSizeMax(4194304); // 设置最大文件尺寸，这里是4MB </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; List&lt;FileItem&gt; items = upload.parseRequest(request);//得到所有的文件 <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Iterator&lt;FileItem&gt; i = items.iterator(); <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; while (i.hasNext()) { <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; FileItem fi = (FileItem) i.next(); <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String fileName = fi.getName(); <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (fileName != null) { <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; File fullFile = new File(fi.getName()); <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; File savedFile = new File(uploadPath, fullFile <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; .getName()); <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; fi.write(savedFile); <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; out.print("upload succeed"); <br />
&nbsp;&nbsp;&nbsp; } catch (Exception e) { <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; e.printStackTrace(); <br />
&nbsp;&nbsp;&nbsp; } <br />
%&gt; <br />
&lt;html&gt; <br />
&lt;head&gt; <br />
&lt;meta http-equiv="Content-Type" content="text/html; charset=GB18030"&gt; <br />
&lt;title&gt;File upload&lt;/title&gt; <br />
&lt;/head&gt; <br />
&lt;body&gt; <br />
&lt;/body&gt; <br />
&lt;/html&gt; </p>
<p>示例4 <br />
利用Servlet来实现文件上传。 <br />
Upload.java <br />
package com.zj.sample; </p>
<p>import java.io.File; <br />
import java.io.IOException; <br />
import java.util.Iterator; <br />
import java.util.List; </p>
<p>import javax.servlet.ServletException; <br />
import javax.servlet.http.HttpServlet; <br />
import javax.servlet.http.HttpServletRequest; <br />
import javax.servlet.http.HttpServletResponse; </p>
<p>import org.apache.commons.fileupload.FileItem; <br />
import org.apache.commons.fileupload.disk.DiskFileItemFactory; <br />
import org.apache.commons.fileupload.servlet.ServletFileUpload; </p>
<p>@SuppressWarnings("serial") <br />
public class Upload extends HttpServlet { <br />
&nbsp;&nbsp;&nbsp; private String uploadPath = "D:\\temp"; // 上传文件的目录 <br />
&nbsp;&nbsp;&nbsp; private String tempPath = "d:\\temp\\buffer\\"; // 临时文件目录 <br />
&nbsp;&nbsp;&nbsp; File tempPathFile; </p>
<p>&nbsp;&nbsp;&nbsp; @SuppressWarnings("unchecked") <br />
&nbsp;&nbsp;&nbsp; public void doPost(HttpServletRequest request, HttpServletResponse response) <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; throws IOException, ServletException { <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; try { <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // Create a factory for disk-based file items <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; DiskFileItemFactory factory = new DiskFileItemFactory(); </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // Set factory constraints <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; factory.setSizeThreshold(4096); // 设置缓冲区大小，这里是4kb <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; factory.setRepository(tempPathFile);// 设置缓冲区目录 </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // Create a new file upload handler <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ServletFileUpload upload = new ServletFileUpload(factory); </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // Set overall request size constraint <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; upload.setSizeMax(4194304); // 设置最大文件尺寸，这里是4MB </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; List&lt;FileItem&gt; items = upload.parseRequest(request);// 得到所有的文件 <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Iterator&lt;FileItem&gt; i = items.iterator(); <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; while (i.hasNext()) { <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; FileItem fi = (FileItem) i.next(); <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String fileName = fi.getName(); <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (fileName != null) { <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; File fullFile = new File(fi.getName()); <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; File savedFile = new File(uploadPath, fullFile.getName()); <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; fi.write(savedFile); <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.print("upload succeed"); <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } catch (Exception e) { <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // 可以跳转出错页面 <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; e.printStackTrace(); <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } <br />
&nbsp;&nbsp;&nbsp; } </p>
<p>&nbsp;&nbsp;&nbsp; public void init() throws ServletException { <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; File uploadFile = new File(uploadPath); <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (!uploadFile.exists()) { <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; uploadFile.mkdirs(); <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; File tempPathFile = new File(tempPath); <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (!tempPathFile.exists()) { <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; tempPathFile.mkdirs(); <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } <br />
&nbsp;&nbsp;&nbsp; } <br />
} </p>
<p><br />
demo4.html <br />
&lt;html&gt; <br />
&lt;head&gt; <br />
&nbsp;&nbsp;&nbsp; &lt;meta http-equiv="Content-Type" content="text/html; charset=GB18030"&gt; <br />
&nbsp;&nbsp;&nbsp; &lt;title&gt;File upload&lt;/title&gt; <br />
&lt;/head&gt; <br />
&lt;body&gt; <br />
// action="fileupload"对应web.xml中&lt;servlet-mapping&gt;中&lt;url-pattern&gt;的设置. <br />
&nbsp;&nbsp;&nbsp; &lt;form name="myform" action="fileupload" method="post" <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; enctype="multipart/form-data"&gt; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; File:&lt;br&gt; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;input type="file" name="myfile"&gt;&lt;br&gt; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;br&gt; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;input type="submit" name="submit" value="Commit"&gt; <br />
&nbsp;&nbsp;&nbsp; &lt;/form&gt; <br />
&lt;/body&gt; <br />
&lt;/html&gt; </p>
<p><br />
web.xml <br />
&lt;servlet&gt; <br />
&nbsp;&nbsp;&nbsp; &lt;servlet-name&gt;Upload&lt;/servlet-name&gt; <br />
&nbsp;&nbsp;&nbsp; &lt;servlet-class&gt;com.zj.sample.Upload&lt;/servlet-class&gt; <br />
&lt;/servlet&gt; </p>
<p>&lt;servlet-mapping&gt; <br />
&nbsp;&nbsp;&nbsp; &lt;servlet-name&gt;Upload&lt;/servlet-name&gt; <br />
&nbsp;&nbsp;&nbsp; &lt;url-pattern&gt;/fileupload&lt;/url-pattern&gt; <br />
&lt;/servlet-mapping&gt; </p>
 <img src ="http://www.blogjava.net/ywj-316/aggbug/304146.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/ywj-316/" target="_blank">junly</a> 2009-11-29 21:34 <a href="http://www.blogjava.net/ywj-316/archive/2009/11/29/304146.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>java mail</title><link>http://www.blogjava.net/ywj-316/archive/2009/11/29/304144.html</link><dc:creator>junly</dc:creator><author>junly</author><pubDate>Sun, 29 Nov 2009 13:33:00 GMT</pubDate><guid>http://www.blogjava.net/ywj-316/archive/2009/11/29/304144.html</guid><wfw:comment>http://www.blogjava.net/ywj-316/comments/304144.html</wfw:comment><comments>http://www.blogjava.net/ywj-316/archive/2009/11/29/304144.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/ywj-316/comments/commentRss/304144.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/ywj-316/services/trackbacks/304144.html</trackback:ping><description><![CDATA[<p>JavaMail下载与安装<br />
http://java.sun.com/products/javamail/index.html<br />
核心类与接口<br />
javax.mail.Session<br />
javax.mail.Message<br />
javax.mail.Address<br />
javax.mail.Authenticator<br />
javax.mail.Transport<br />
javax.mail.Store<br />
javax.mail.Folder<br />
-----------------------------------------------------<br />
1 加载javamail的jar包<br />
2 编写处理类<br />
public class SendMail {<br />
&nbsp;public static void mian(String[] args){<br />
&nbsp;&nbsp;Properties props=new Properties();<br />
&nbsp;&nbsp;Session session=Session.getInstance(props,null);<br />
&nbsp;&nbsp;props.put("mail.host", "127.0.0.1");//接收邮件的地址<br />
&nbsp;&nbsp;props.put("mail.transport.protocol", "smtp");//传输邮件的协议<br />
&nbsp;&nbsp;<br />
&nbsp;&nbsp;Message message=new MimeMessage(session);<br />
&nbsp;&nbsp;try {<br />
&nbsp;&nbsp;&nbsp;message.setFrom(new InternetAddress("ywj_sh110@163.com"));//设定发件人<br />
&nbsp;&nbsp;&nbsp;message.setRecipient(Message.RecipientType.TO, new InternetAddress("ywj_316@163.com"));//设定收件人<br />
&nbsp;&nbsp;&nbsp;message.setSubject("你好吗？");//设标题<br />
&nbsp;&nbsp;&nbsp;message.setText("javamail发送邮件测试");//设内容<br />
&nbsp;&nbsp;&nbsp;Transport.send(message);//发送信息<br />
&nbsp;&nbsp;} catch (AddressException e) {<br />
&nbsp;&nbsp;&nbsp;// TODO Auto-generated catch block<br />
&nbsp;&nbsp;&nbsp;e.printStackTrace();<br />
&nbsp;&nbsp;} catch (MessagingException e) {<br />
&nbsp;&nbsp;&nbsp;// TODO Auto-generated catch block<br />
&nbsp;&nbsp;&nbsp;e.printStackTrace();<br />
&nbsp;&nbsp;}<br />
&nbsp;}<br />
}<br />
---------------------------------------------------<br />
Apache Commons Email组件<br />
1 加载javamail的jar包和Apache Commons Email的jar包<br />
2 编写servlet的处理类<br />
public class SendCommMail extends HttpServlet {<br />
&nbsp;public void doGet(HttpServletRequest request, HttpServletResponse response)<br />
&nbsp;&nbsp;&nbsp;throws ServletException, IOException {<br />
&nbsp;&nbsp;doPost(request,response);<br />
&nbsp;}<br />
public void doPost(HttpServletRequest request, HttpServletResponse response)<br />
&nbsp;&nbsp;&nbsp;throws ServletException, IOException {<br />
&nbsp;&nbsp;request.setCharacterEncoding("UTF-8");<br />
&nbsp;&nbsp;SimpleEmail email=new SimpleEmail();//生成SimpleEmail对象<br />
&nbsp;&nbsp;email.setHostName("smtp.sina.com");//生成邮件<br />
&nbsp;&nbsp;email.setAuthentication("web08", "web2008");//建立用户<br />
&nbsp;&nbsp;email.setCharset("UTF-8");//邮件内容编码<br />
&nbsp;&nbsp;try {<br />
&nbsp;&nbsp;&nbsp;email.setFrom(request.getParameter("from"));//发件人<br />
&nbsp;&nbsp;&nbsp;email.addTo(request.getParameter("to"));//收件人<br />
&nbsp;&nbsp;&nbsp;email.setMsg(request.getParameter("context"));//内容<br />
&nbsp;&nbsp;&nbsp;email.send();//发送邮件<br />
&nbsp;&nbsp;&nbsp;request.setAttribute("sendmail.message", "邮件发送成功！");<br />
&nbsp;&nbsp;} catch (Exception e) {<br />
&nbsp;&nbsp;&nbsp;e.printStackTrace();<br />
&nbsp;&nbsp;&nbsp;request.setAttribute("sendmail.message", "邮件发送不成功！");<br />
&nbsp;&nbsp;}<br />
&nbsp;&nbsp;request.getRequestDispatcher("/sendResult.jsp").forward(request, response);<br />
&nbsp;}<br />
}<br />
3 配置web.xml文件<br />
4 页面<br />
----------------------------------------------------------------------<br />
带附件的邮件<br />
1 1 加载javamail的jar包，Apache Commons Email的jar包和fileUpLoad<br />
2 2 编写servlet的处理类<br />
public class SendCommMail extends HttpServlet {<br />
&nbsp;private ServletContext sc;//ServletContext定义了一系列方法用于与相应的servlet容器通信<br />
&nbsp;private String savePath;<br />
&nbsp;File file;<br />
&nbsp;private Map&lt;String,String&gt; parameters=new HashMap&lt;String,String&gt;();//存页面信息</p>
<p>&nbsp;public void doGet(HttpServletRequest request, HttpServletResponse response)<br />
&nbsp;&nbsp;&nbsp;throws ServletException, IOException {<br />
&nbsp;&nbsp;doPost(request,response);<br />
&nbsp;}</p>
<p>&nbsp;public void doPost(HttpServletRequest request, HttpServletResponse response)<br />
&nbsp;&nbsp;&nbsp;throws ServletException, IOException {<br />
&nbsp;&nbsp;request.setCharacterEncoding("UTF-8");<br />
&nbsp;&nbsp;file=this.doAtta(request);<br />
&nbsp;&nbsp;MultiPartEmail email=new MultiPartEmail();//生成SimpleEmail对象<br />
&nbsp;&nbsp;email.setHostName("smtp.163.com");//生成邮件<br />
&nbsp;&nbsp;email.setAuthentication("ywj_316", "1234567890");//建立用户<br />
&nbsp;&nbsp;email.setCharset("UTF-8");//邮件内容编码<br />
&nbsp;&nbsp;try {<br />
&nbsp;&nbsp;&nbsp;email.setFrom(parameters.get("from"));//发件人<br />
&nbsp;&nbsp;&nbsp;email.addTo(parameters.get("to"));//收件人<br />
&nbsp;&nbsp;&nbsp;email.setMsg(parameters.get("context"));//内容&nbsp;<br />
&nbsp;&nbsp;&nbsp;email.setSubject(parameters.get("title"));//主题<br />
&nbsp;&nbsp;&nbsp;if(file!=null){<br />
&nbsp;&nbsp;&nbsp;&nbsp;EmailAttachment attachment=new EmailAttachment();//附什对象<br />
&nbsp;&nbsp;&nbsp;&nbsp;attachment.setPath(file.getParent());//附件路径<br />
&nbsp;&nbsp;&nbsp;&nbsp;attachment.setDescription(EmailAttachment.ATTACHMENT);//附件类型<br />
&nbsp;&nbsp;&nbsp;&nbsp;attachment.setName(file.getName());//附件名称<br />
&nbsp;&nbsp;&nbsp;&nbsp;email.attach(attachment);<br />
&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;System.out.println("ssssssssssssssssssssssssssssssssssss");<br />
&nbsp;&nbsp;&nbsp;email.send();//发送邮件<br />
&nbsp;&nbsp;&nbsp;request.setAttribute("sendmail.message", "邮件发送成功！");<br />
&nbsp;&nbsp;} catch (Exception e) {<br />
&nbsp;&nbsp;&nbsp;e.printStackTrace();<br />
&nbsp;&nbsp;&nbsp;request.setAttribute("sendmail.message", "邮件发送不成功！");<br />
&nbsp;&nbsp;}<br />
&nbsp;&nbsp;request.getRequestDispatcher("/sendResult.jsp").forward(request, response);<br />
&nbsp;}<br />
&nbsp;<br />
&nbsp;public File doAtta(HttpServletRequest request)throws ServletException,IOException{<br />
&nbsp;&nbsp;DiskFileItemFactory factory = new DiskFileItemFactory();<br />
&nbsp;&nbsp;ServletFileUpload upload = new ServletFileUpload(factory);<br />
&nbsp;&nbsp;try {<br />
&nbsp;&nbsp;&nbsp;List items = upload.parseRequest(request);<br />
&nbsp;&nbsp;&nbsp;for (int i = 0; i &lt; items.size(); i++) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;FileItem item = (FileItem) items.get(i);<br />
&nbsp;&nbsp;&nbsp;&nbsp;if (item.isFormField()) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;parameters.put(item.getFieldName(), item.getString("UTF-8"));<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(item.getFieldName());<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(item.getString("UTF-8"));<br />
&nbsp;&nbsp;&nbsp;&nbsp;} else {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if (item.getName() != null &amp;&amp; !item.getName().equals("")) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;File temFile = new File(item.getName());<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;file = new File(sc.getRealPath("/") + savePath,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;temFile.getName());<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;item.write(file);</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;request.setAttribute("upload.message", "上传文件成功！");<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} else {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;request.setAttribute("upload.message", "没有上传文件成功！");<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;} catch (Exception e) {<br />
&nbsp;&nbsp;&nbsp;e.printStackTrace();<br />
&nbsp;&nbsp;&nbsp;request.setAttribute("upload.message", "没有上传文件成功！");<br />
&nbsp;&nbsp;}<br />
&nbsp;&nbsp;return file;<br />
&nbsp;}<br />
&nbsp;<br />
&nbsp;public void init(ServletConfig config) throws ServletException {<br />
&nbsp;&nbsp;savePath = config.getInitParameter("savePath");//得到初始化信息<br />
&nbsp;&nbsp;sc = config.getServletContext();//得到ServletContext接口的实例<br />
&nbsp;}<br />
}<br />
3 配置web.xml文件<br />
&nbsp;&lt;servlet&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;servlet-name&gt;SendCommMail&lt;/servlet-name&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;servlet-class&gt;com.webs.SendCommMail&lt;/servlet-class&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;init-param&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;param-name&gt;savePath&lt;/param-name&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;param-value&gt;uploads&lt;/param-value&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;/init-param&gt;<br />
&nbsp; &lt;/servlet&gt;<br />
&nbsp; &lt;servlet-mapping&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;servlet-name&gt;SendCommMail&lt;/servlet-name&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;url-pattern&gt;/servlet/sendMail&lt;/url-pattern&gt;<br />
&nbsp; &lt;/servlet-mapping&gt;<br />
4 页面<br />
&nbsp;&lt;body&gt;<br />
&nbsp;&nbsp;&nbsp; 发送邮件的程序&lt;br&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;form action="servlet/sendMail" name="form1"&nbsp; enctype="multipart/form-data" method="post"&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp; 收件人：&lt;input type="text" name="to"/&gt;&lt;br&gt;<br />
&nbsp;&nbsp;&nbsp; 发件人：&lt;input type="text" name="from"/&gt;&lt;br&gt;<br />
&nbsp;&nbsp;&nbsp; 主题：&lt;input type="text" name="title"/&gt;&lt;br&gt;<br />
&nbsp;&nbsp;&nbsp; 附件：&lt;input type="file" name="file"/&gt;&lt;br&gt;<br />
&nbsp;&nbsp;&nbsp; 内容：&lt;input type="text" name="context"/&gt;&lt;br&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;input type="submit"/&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;/form&gt;<br />
&nbsp; &lt;/body&gt;</p>
<img src ="http://www.blogjava.net/ywj-316/aggbug/304144.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/ywj-316/" target="_blank">junly</a> 2009-11-29 21:33 <a href="http://www.blogjava.net/ywj-316/archive/2009/11/29/304144.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>序列化与反序列化</title><link>http://www.blogjava.net/ywj-316/archive/2009/11/29/304143.html</link><dc:creator>junly</dc:creator><author>junly</author><pubDate>Sun, 29 Nov 2009 13:31:00 GMT</pubDate><guid>http://www.blogjava.net/ywj-316/archive/2009/11/29/304143.html</guid><wfw:comment>http://www.blogjava.net/ywj-316/comments/304143.html</wfw:comment><comments>http://www.blogjava.net/ywj-316/archive/2009/11/29/304143.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/ywj-316/comments/commentRss/304143.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/ywj-316/services/trackbacks/304143.html</trackback:ping><description><![CDATA[<p>序列化是把一个对象的状态写入一个字节流的过程，它执行RMI，RMI允许一台机器上的JAVA对象调用不同机器上的JAVA对象方法，对象可以作为参数提供给那个远程方法，发送机序列化该对象并传送它，接收机执行反序列化。 <br />
序列化和反序列化的关系图表可形成包含循环引用的顺序图表。这是整个序列化的总体思想。 <br />
而Serializable接口属于支持序列化的一个接口，只有一个实现它的对象可以被序列化工具存储和回复，Serializable接口没有定义任何成员，只用来表示一个累可以被序列化，若该类可以序列化，那么它的所有子类都可以。 <br />
下面是关于序列化的一个实例： <br />
程序名称：SerializationDemo.java <br />
程序主题：实现对象的序列化和反序列化 <br />
程序说明：该程序由实例化一个MyClass类的对象开始，该对象有三个实例变量，类型分别为String、int、double，是希望存储和恢复的信息。 </p>
<p>&nbsp;</p>
<p>import java.io.*;</p>
<p>public class SerializationDemo{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public static void main(String args[]){</p>
<p>//Object serialization<br />
try{<br />
&nbsp;MyClass object1=new MyClass("Hello",-7,2.7e10);<br />
&nbsp;System.out.println("object1:"+object1);<br />
&nbsp;FileOutputStream fos=new FileOutputStream("serial");<br />
&nbsp;ObjectOutputStream oos=new ObjectOutputStream(fos);<br />
&nbsp;oos.writeObject(object1);<br />
&nbsp;oos.flush();<br />
&nbsp;oos.close();<br />
&nbsp;}<br />
catch(Exception e){<br />
&nbsp;System.out.println("Exception during serialization:"+e);<br />
&nbsp;System.exit(0);<br />
&nbsp;}</p>
<p>//Object deserialization<br />
try{<br />
&nbsp;MyClass object2;<br />
&nbsp;FileInputStream fis=new FileInputStream("serial");<br />
&nbsp;ObjectInputStream ois=new ObjectInputStream(fis);<br />
&nbsp;object2=(MyClass)ois.readObject();<br />
&nbsp;ois.close();<br />
&nbsp;System.out.println("object2:"+object2);<br />
&nbsp;}<br />
catch(Exception e){<br />
&nbsp;System.out.println("Exception during deserialization:"+e);<br />
&nbsp;System.exit(0);<br />
&nbsp;}<br />
}<br />
}</p>
<p>class MyClass implements Serializable{<br />
&nbsp;String s;<br />
&nbsp;int i;<br />
&nbsp;double d;<br />
&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;}<br />
&nbsp;public String toString(){<br />
&nbsp;&nbsp;return "s="+s+";i="+i+";d="+d;<br />
&nbsp;}<br />
}</p>
<p>&nbsp;</p>
<p>程序运行结果：object1和object2的实例变量是一样的，输出如下：<br />
object1:s=Hello;i=-7;d=2.7E10<br />
object2:s=Hello;i=-7;d=2.7E10</p>
<p><br />
我补充一下： </p>
<p>Object serialization的定义： <br />
Object serialization 允许你将实现了Serializable接口的对象转换为字节序列，这些字节序列可以被完全存储以备以后重新生成原来的对象。&nbsp; </p>
<p>serialization不但可以在本机做，而且可以经由网络操作（就是猫小说的RMI）。这个好处是很大的----因为它自动屏蔽了操作系统的差异，字节顺序（用Unix下的c开发过网络编程的人应该知道这个概念，我就容易在这上面犯错）等。比如，在Window平台生成一个对象并序列化之，然后通过网络传到一台Unix机器上，然后可以在这台Unix机器上正确地重构这个对象。 </p>
<p><br />
Object serialization主要用来支持2种主要的特性： <br />
1。Java的RMI(remote method invocation).RMI允许象在本机上一样操作远程机器上的对象。当发送消息给远程对象时，就需要用到serializaiton机制来发送参数和接收返回直。 </p>
<p>2。Java的JavaBeans.&nbsp;&nbsp; Bean的状态信息通常是在设计时配置的。Bean的状态信息必须被存起来，以便当程序运行时能恢复这些状态信息。这也需要serializaiton机制。 </p>
<p>&nbsp;</p>
<p>二。sakulagi和rollingpig说的持久化我也说一下。 <br />
我觉得你们说的应该是英文里的persistence.但是Java语言里现在只支持lightweight persistence,就是轻量级持久化，这是通过serialization机制来实现的。 </p>
<p>persistence是指一个对象的生命周期不由程序是否执行来决定，即使是在程序终止时这个对象也存在。它把一个serializable的对象写到磁盘（本机或其他机器上的非RAM存储器），并在程序重新调用时再读取对象到通常的RAM存储器。 </p>
<p>为什么说Java的serialization机制实现的是lightweight persistence?因为你必须显式的序列化和反序列化程序里的对象；而不是直接由一个关键词来定义一个对象是序列化的然后由系统做相应的处理。&nbsp; 如果以后的Java版本出现一个新的关键字来实现这种机制，比如就是persistence,如果我用 </p>
<p>persistence&nbsp; (String s="chinaunix") </p>
<p>然后系统自动做猫小程序里的那些处理，那么Java就实现了persistence. </p>
<img src ="http://www.blogjava.net/ywj-316/aggbug/304143.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/ywj-316/" target="_blank">junly</a> 2009-11-29 21:31 <a href="http://www.blogjava.net/ywj-316/archive/2009/11/29/304143.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>同步锁</title><link>http://www.blogjava.net/ywj-316/archive/2009/11/29/304141.html</link><dc:creator>junly</dc:creator><author>junly</author><pubDate>Sun, 29 Nov 2009 13:30:00 GMT</pubDate><guid>http://www.blogjava.net/ywj-316/archive/2009/11/29/304141.html</guid><wfw:comment>http://www.blogjava.net/ywj-316/comments/304141.html</wfw:comment><comments>http://www.blogjava.net/ywj-316/archive/2009/11/29/304141.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/ywj-316/comments/commentRss/304141.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/ywj-316/services/trackbacks/304141.html</trackback:ping><description><![CDATA[public void synchronized getall(){}
<img src ="http://www.blogjava.net/ywj-316/aggbug/304141.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/ywj-316/" target="_blank">junly</a> 2009-11-29 21:30 <a href="http://www.blogjava.net/ywj-316/archive/2009/11/29/304141.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>线程</title><link>http://www.blogjava.net/ywj-316/archive/2009/11/29/304142.html</link><dc:creator>junly</dc:creator><author>junly</author><pubDate>Sun, 29 Nov 2009 13:30:00 GMT</pubDate><guid>http://www.blogjava.net/ywj-316/archive/2009/11/29/304142.html</guid><wfw:comment>http://www.blogjava.net/ywj-316/comments/304142.html</wfw:comment><comments>http://www.blogjava.net/ywj-316/archive/2009/11/29/304142.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/ywj-316/comments/commentRss/304142.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/ywj-316/services/trackbacks/304142.html</trackback:ping><description><![CDATA[<p>java.lang.Thread</p>
<p>【创建新线程的方法有两种】</p>
<p>1 定义线程类实现Runnable接口<br />
public class MyThred implements Runnable{<br />
&nbsp;&nbsp;&nbsp;&nbsp; @overwrite<br />
&nbsp;&nbsp;&nbsp;&nbsp; public void run(){}<br />
}</p>
<p>起用线程：<br />
MyThred myThred=new MyThred();<br />
Thread t=new Thread(myThred);<br />
t.start();</p>
<p><br />
2 定义线程类继承Thread类并重写其run方法<br />
public class MyThred extends Thread{<br />
&nbsp;&nbsp;&nbsp;&nbsp; @overwrite<br />
&nbsp;&nbsp;&nbsp;&nbsp; public void run(){}<br />
}</p>
<p>起用线程：<br />
MyThred myThred=new MyThred();<br />
myThred.start();</p>
<p>说明：一般使用接口来实现<br />
-------------------------------------------------<br />
【线程状态转换】</p>
<p>【线程控制基本方法】：<br />
isAlive() 判断线程是否还&#8220;活&#8221;着<br />
getPriority() 获得线程的优先级<br />
setPriority() 设置线程的优先级<br />
Thread.sleep() 将当前线程睡眠指定的毫秒数<br />
join()&nbsp; 调用某线程的该方法，将当前线程与该线程&#8220;合并&#8221;，即等待<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 该线程线束，再恢复当前线程的运行。<br />
yield() 让出CPU，当前线程进入就绪队列等待调度<br />
wait() 当胶线程进入对象的wait pool。<br />
notify()/notifyAll() 唤醒对象的wait pool中的一个/所有等待线程。<br />
Thread.currentThread() 得到当前线程<br />
----------------------------------------------------------------<br />
【sleep/join/yield 方法】</p>
<p>sleep示例:<br />
public class TestInterrupt {<br />
&nbsp; public static void main(String[] args) {<br />
&nbsp;&nbsp;&nbsp; MyThread thread = new MyThread();<br />
&nbsp;&nbsp;&nbsp; thread.start();<br />
&nbsp;&nbsp;&nbsp; //主线程睡眠<br />
&nbsp;&nbsp;&nbsp; try {Thread.sleep(10000);}<br />
&nbsp;&nbsp;&nbsp; catch (InterruptedException e) {}<br />
&nbsp;&nbsp;&nbsp; //停下当前线程，这个方法一般不建议使用<br />
&nbsp;&nbsp;&nbsp; thread.interrupt();<br />
&nbsp;&nbsp;&nbsp; //使用这个结束线程<br />
&nbsp;&nbsp;&nbsp; shutDown();<br />
&nbsp; }<br />
}</p>
<p>class MyThread extends Thread {<br />
&nbsp;boolean flag = true;<br />
&nbsp; public void run(){<br />
&nbsp;&nbsp;&nbsp; while(flag){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println("==="+new Date()+"===");<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; try {<br />
&nbsp;//当前子线程睡眠<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; sleep(1000);<br />
&nbsp;//sleep时被打断会抛InterruptedException<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } catch (InterruptedException e) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; }<br />
&nbsp; }<br />
&nbsp; //结束线程的方法<br />
&nbsp; public void shutDown(){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; flag = false;<br />
&nbsp; }<br />
}</p>
<p>jion示例:<br />
public class TestJoin {<br />
&nbsp; public static void main(String[] args) {<br />
&nbsp;&nbsp;&nbsp; MyThread2 t1 = new MyThread2("abcde");<br />
&nbsp;&nbsp;&nbsp; t1.start();<br />
&nbsp;&nbsp;&nbsp; try {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //当前线程合并到主线程，相当于方法调用<br />
&nbsp;&nbsp;&nbsp; &nbsp;t1.join();<br />
&nbsp;&nbsp;&nbsp; } catch (InterruptedException e) {}<br />
&nbsp;&nbsp;&nbsp; &nbsp;<br />
&nbsp;&nbsp;&nbsp; for(int i=1;i&lt;=10;i++){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println("i am main thread");<br />
&nbsp;&nbsp;&nbsp; }<br />
&nbsp; }<br />
}<br />
class MyThread2 extends Thread {<br />
&nbsp; //给当前线程起个别名<br />
&nbsp; MyThread2(String s){<br />
&nbsp; &nbsp;super(s);<br />
&nbsp; }<br />
&nbsp; <br />
&nbsp; public void run(){<br />
&nbsp;&nbsp;&nbsp; for(int i =1;i&lt;=10;i++){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println("i am "+getName());<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; try {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;sleep(1000);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } catch (InterruptedException e) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;return;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; }<br />
&nbsp; }<br />
}</p>
<p>yield示例:<br />
public class TestYield {<br />
&nbsp; public static void main(String[] args) {<br />
&nbsp;&nbsp;&nbsp; //可以用同一个线程类创建不同的线程对象，分别执行<br />
&nbsp;&nbsp;&nbsp; MyThread3 t1 = new MyThread3("t1");<br />
&nbsp;&nbsp;&nbsp; MyThread3 t2 = new MyThread3("t2");<br />
&nbsp;&nbsp;&nbsp; t1.start(); t2.start();<br />
&nbsp; }<br />
}<br />
class MyThread3 extends Thread {<br />
&nbsp; MyThread3(String s){super(s);}<br />
&nbsp; public void run(){<br />
&nbsp;&nbsp;&nbsp; for(int i =1;i&lt;=100;i++){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println(getName()+": "+i);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(i%10==0){<br />
&nbsp;//让出时间给其它线程执行<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; yield();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; }<br />
&nbsp; }<br />
}</p>
<p>--------------------------------------------------------------<br />
【线程的优先级别】getPriority()/setProority(int newPriority)</p>
<p>线程的优先级用数字表示，范围从1到10，默认为5.<br />
Thread.MIN_PRIORITY=1<br />
Thread.MAX_PRIORITY=10<br />
Thread.NORM_PRIORITY=5</p>
<p>示例：<br />
public class TestPriority {<br />
&nbsp;public static void main(String[] args) {<br />
&nbsp;&nbsp;Thread t1 = new Thread(new T1());<br />
&nbsp;&nbsp;Thread t2 = new Thread(new T2());<br />
&nbsp;&nbsp;//将t1的优先级提高3级<br />
&nbsp;&nbsp;t1.setPriority(Thread.NORM_PRIORITY + 3);<br />
&nbsp;&nbsp;t1.start();<br />
&nbsp;&nbsp;t2.start();<br />
&nbsp;}<br />
}</p>
<p>class T1 implements Runnable {<br />
&nbsp;public void run() {<br />
&nbsp;&nbsp;for(int i=0; i&lt;1000; i++) {<br />
&nbsp;&nbsp;&nbsp;System.out.println("T1: " + i);<br />
&nbsp;&nbsp;}<br />
&nbsp;}<br />
}</p>
<p>class T2 implements Runnable {<br />
&nbsp;public void run() {<br />
&nbsp;&nbsp;for(int i=0; i&lt;1000; i++) {<br />
&nbsp;&nbsp;&nbsp;System.out.println("------T2: " + i);<br />
&nbsp;&nbsp;}<br />
&nbsp;}<br />
}</p>
<p>--------------------------------------------------------------------<br />
【线程的同步】未看完</p>
<img src ="http://www.blogjava.net/ywj-316/aggbug/304142.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/ywj-316/" target="_blank">junly</a> 2009-11-29 21:30 <a href="http://www.blogjava.net/ywj-316/archive/2009/11/29/304142.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>生成jar包</title><link>http://www.blogjava.net/ywj-316/archive/2009/11/29/304140.html</link><dc:creator>junly</dc:creator><author>junly</author><pubDate>Sun, 29 Nov 2009 13:29:00 GMT</pubDate><guid>http://www.blogjava.net/ywj-316/archive/2009/11/29/304140.html</guid><wfw:comment>http://www.blogjava.net/ywj-316/comments/304140.html</wfw:comment><comments>http://www.blogjava.net/ywj-316/archive/2009/11/29/304140.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/ywj-316/comments/commentRss/304140.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/ywj-316/services/trackbacks/304140.html</trackback:ping><description><![CDATA[<p>生成jar包<br />
jar -cvf test.jar *.*</p>
<p>*.*是指当前目录下所有文件打包到目标目录下</p>
<p><br />
是否是该类或该类的子类类型的对象<br />
instanceof<br />
car instanceof Car</p>
<p>增加的for循环<br />
int[] arr={1,2,4,5,6};<br />
for(int i:arr){}//只用于显示，不可以访问i</p>
<img src ="http://www.blogjava.net/ywj-316/aggbug/304140.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/ywj-316/" target="_blank">junly</a> 2009-11-29 21:29 <a href="http://www.blogjava.net/ywj-316/archive/2009/11/29/304140.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>日期处理</title><link>http://www.blogjava.net/ywj-316/archive/2009/11/29/304139.html</link><dc:creator>junly</dc:creator><author>junly</author><pubDate>Sun, 29 Nov 2009 13:28:00 GMT</pubDate><guid>http://www.blogjava.net/ywj-316/archive/2009/11/29/304139.html</guid><wfw:comment>http://www.blogjava.net/ywj-316/comments/304139.html</wfw:comment><comments>http://www.blogjava.net/ywj-316/archive/2009/11/29/304139.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/ywj-316/comments/commentRss/304139.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/ywj-316/services/trackbacks/304139.html</trackback:ping><description><![CDATA[<p>&nbsp;Calendar&nbsp;&nbsp; g=Calendar.getInstance();&nbsp;&nbsp; <br />
&nbsp; g.add(Calendar.YEAR,1);&nbsp;&nbsp; <br />
&nbsp; SimpleDateFormat&nbsp;&nbsp; s=new&nbsp;&nbsp; SimpleDateFormat("yyyy-MM-dd&nbsp;&nbsp; HH-mm-ss",Locale.US);&nbsp;&nbsp; <br />
&nbsp; String&nbsp;&nbsp; d=s.format(g.getTime());&nbsp;&nbsp; <br />
&nbsp; System.out.println(d);</p>
<p><br />
System.currentTimeMillis();<br />
以毫秒为单位返回当前时间</p>
<p>java.util.Calendar</p>
<img src ="http://www.blogjava.net/ywj-316/aggbug/304139.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/ywj-316/" target="_blank">junly</a> 2009-11-29 21:28 <a href="http://www.blogjava.net/ywj-316/archive/2009/11/29/304139.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>判断是否属于此类型</title><link>http://www.blogjava.net/ywj-316/archive/2009/11/29/304137.html</link><dc:creator>junly</dc:creator><author>junly</author><pubDate>Sun, 29 Nov 2009 13:27:00 GMT</pubDate><guid>http://www.blogjava.net/ywj-316/archive/2009/11/29/304137.html</guid><wfw:comment>http://www.blogjava.net/ywj-316/comments/304137.html</wfw:comment><comments>http://www.blogjava.net/ywj-316/archive/2009/11/29/304137.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/ywj-316/comments/commentRss/304137.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/ywj-316/services/trackbacks/304137.html</trackback:ping><description><![CDATA[event.getValue() instanceof ActionForm 返回true或false<br />
instanceof判断是否属于此类型<br />
value instanceof Date
<img src ="http://www.blogjava.net/ywj-316/aggbug/304137.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/ywj-316/" target="_blank">junly</a> 2009-11-29 21:27 <a href="http://www.blogjava.net/ywj-316/archive/2009/11/29/304137.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>日期Format</title><link>http://www.blogjava.net/ywj-316/archive/2009/11/29/304136.html</link><dc:creator>junly</dc:creator><author>junly</author><pubDate>Sun, 29 Nov 2009 13:26:00 GMT</pubDate><guid>http://www.blogjava.net/ywj-316/archive/2009/11/29/304136.html</guid><wfw:comment>http://www.blogjava.net/ywj-316/comments/304136.html</wfw:comment><comments>http://www.blogjava.net/ywj-316/archive/2009/11/29/304136.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/ywj-316/comments/commentRss/304136.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/ywj-316/services/trackbacks/304136.html</trackback:ping><description><![CDATA[日期格式化<br />
Date currentTime = new Date();<br />
SimpleDateFormat HMFromat = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");<br />
String strCurrentTime=HMFromat.format(currentTime);
<img src ="http://www.blogjava.net/ywj-316/aggbug/304136.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/ywj-316/" target="_blank">junly</a> 2009-11-29 21:26 <a href="http://www.blogjava.net/ywj-316/archive/2009/11/29/304136.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>反射</title><link>http://www.blogjava.net/ywj-316/archive/2009/11/29/304135.html</link><dc:creator>junly</dc:creator><author>junly</author><pubDate>Sun, 29 Nov 2009 13:24:00 GMT</pubDate><guid>http://www.blogjava.net/ywj-316/archive/2009/11/29/304135.html</guid><wfw:comment>http://www.blogjava.net/ywj-316/comments/304135.html</wfw:comment><comments>http://www.blogjava.net/ywj-316/archive/2009/11/29/304135.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/ywj-316/comments/commentRss/304135.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/ywj-316/services/trackbacks/304135.html</trackback:ping><description><![CDATA[<p>java.lang.Class<br />
在类加载时，java虚拟机会自动创建相应的class对象<br />
1.获取class对象<br />
Class c=Class.froName("c");<br />
2.解析属性信息<br />
Field[] fs=c.getDeclaredFields();<br />
for(Field f:fs){<br />
&nbsp;&nbsp; System.out.println("属性："+f.toString());<br />
&nbsp;&nbsp; System.out.println("数据类型："+f.getType());<br />
&nbsp;&nbsp; System.out.println("属性名："+f.getName());<br />
&nbsp;&nbsp; int mod=f.getModifeers();<br />
&nbsp;&nbsp; System.out.println("属性修饰符："+Modifier.toString(mod));<br />
}<br />
3.解析方法信息<br />
Method[] ms=c.getDeclaredMethods();<br />
for(Method m:ms){<br />
&nbsp;&nbsp; System.out.println("方法："+m.toString());<br />
&nbsp;&nbsp; System.out.println("方法名："+m.getName());<br />
&nbsp;&nbsp; int mod=f.getModifeers();<br />
&nbsp;&nbsp; System.out.println("方法修饰符："+Modifier.toString(mod));<br />
&nbsp;&nbsp; Class pts[] = m.getParameterTypes();//得到参数列表<br />
&nbsp;&nbsp; m.getReturnType();//得到返回值类型<br />
}<br />
4.解析构造方法<br />
Constructor[]&nbsp; cs=c.getDeclaredConstructors();<br />
for(Constructor con:cs){<br />
&nbsp;&nbsp; System.out.println("构造方法："+con.toString());<br />
&nbsp;&nbsp; System.out.println("方法名："+con.getName());<br />
&nbsp;&nbsp; System.out.println("方法修饰符："+Modifier.toString(mod));<br />
&nbsp;&nbsp; Class pts[] = m.getParameterTypes();//得到参数列表<br />
&nbsp;&nbsp; m.getReturnType();//得到返回值类型<br />
}<br />
5.解析当前类类型的父类<br />
Class superClass=c.getSuperclass();<br />
6.解析当前类实现的接口<br />
Class[] interfaces=c.getInterfaces();<br />
for(Class cl:interfaces){<br />
&nbsp;&nbsp; System.out.println(cl.toString());<br />
}<br />
7.解析当前包<br />
Package p=c.getPackage();<br />
---------------------------------------------------------------</p>
<p>1.直接操作对象属性<br />
User u=new User();<br />
Class c=u.getClass();//同Class.forName("p2.User");<br />
Field f=c.getField(fieldName);<br />
Object fv=f.get(u);//得到对象u实例对应f属性的值<br />
f.set(u,value);设置u对象f属性的值为value<br />
2.调用对象成员方法<br />
Class[] argTypes={String.class,int.class};<br />
//上行等同Class[] argTypes=new Class[]{String.class,int.class};<br />
Object[] args=new Object[]{"王五",99};</p>
<p>Class c-u.getClass();<br />
Method m=c.getMethod(methodName,argTypes);<br />
Object result=m.invoke(u,args);<br />
System.out.println(result);<br />
3.调用类成员方法<br />
Class c=Class.forName("className");<br />
Method m=c.getMethod(methodName,argTypes);<br />
Object result=m.invoke(null,args);//没有对象，所以指定为null<br />
---------------------------------------------------------------<br />
获取class对象<br />
*针对引用数据类型 <br />
1.调用静态方法Class.forName()<br />
Class.forName("p1.User");<br />
2.调用Object类中定义的getClass()方法<br />
User u=new User();<br />
Class c=u.getClass();<br />
3.使用.class表达式<br />
Class c1=String.class;<br />
Class c2=p1.User.class;<br />
*针对基本数据类型及void<br />
1.使用.class表达式<br />
Class c1=int.class;<br />
Class c2=double.class;<br />
Class c3=void.class;<br />
2.调用相应封装类的.Type属性<br />
Class c1=Integer.TYPE;<br />
Class c2=Double.TYPE;<br />
Class c3=Void.TYPE;<br />
----------------------------------------------<br />
java.lang.reflect.Field<br />
1.获取Field对类(Class类提供)<br />
public Field[] getDeclaredFields()//当前类的所有属性,不包括父类<br />
public Field getDeclaredField(String name)//当前类指定属性，不包括父类<br />
public Field[] getFields()//当前类所有public的属性，包括父类<br />
public Field getField(String name)//当前类指定的public属性，包括父类<br />
2.Field类主要成员方法<br />
public Object get(Object obj)<br />
pbulic void set(Object obj,Object value)<br />
public xxx getXxx(Object obj)<br />
public void setXxx(Object obj,xxx x)//xxx为基本数据类型<br />
public String getName()<br />
public int getModifiers()//当前属性的修饰符<br />
public &lt;T extends Annotation&gt; T getAnnotation(Class&lt;T&gt; annotationClass)<br />
返回当前属性前面的注释<br />
public String toString()<br />
public boolean equals(Object obj)<br />
------------------------------------------------------------------------<br />
java.lang.reflect.Method<br />
1.获取Method对类(Class类提供)<br />
public Method[] getDeclaredMethods()//当前类的所有方法,不包括父类<br />
public Method getDeclaredMethod(String name,Class&lt;?&gt; parameterTypes)//当前类指定方法，不包括父类<br />
public Method[] getMethods()//当前类所有public的方法，包括父类<br />
public Method getMethod(String name)//当前类指定的public方法，包括父类<br />
2.Method类主要成员方法<br />
public Object invoke(Object obj,Object args)****<br />
public String getName()<br />
public Class&lt;?&gt;[] getParameterTypes()<br />
public int getModifiers()//当前属性的修饰符<br />
public Class&lt;?&gt; getReturnType()<br />
public Class&lt;?&gt;[] getExceptionTypes()<br />
public &lt;T extends Annotation&gt; T getAnnotation(Class&lt;T&gt; annotationClass)<br />
返回当前属性前面的注释<br />
public String toString()<br />
public boolean equals(Object obj)<br />
-----------------------------------------------------------<br />
java.lang.reflect.Modifier<br />
1.获取Modifier对象<br />
public int getModifieers()<br />
2.Modifier类方法<br />
public static boolean isPublic(int mod)<br />
public static boolean isPrivate(int mod)</p>
<p>--------------------------------------------------------------<br />
java.lang.reflect.Constructor<br />
public T newInstance(Object initargs)</p>
<p>Class c=Class.forName("p1.Person");<br />
Class[] argTypes={String.class,int.class};//参数列表<br />
Constructor cons=c.getConstructor(argTypes);<br />
Object obj=cons.newInstance("中国",5000);</p>
<p>调用无参构造方法<br />
cons=c.getconstructor();<br />
obj=constructor.newInstance();<br />
obj=c.newInstance();<br />
----------------------------------------------------------------<br />
java.lang.reflect.Array</p>
<p>class类方法<br />
public Class&lt;?&gt; getComponentType()//返回数组对象的数据类型</p>
<img src ="http://www.blogjava.net/ywj-316/aggbug/304135.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/ywj-316/" target="_blank">junly</a> 2009-11-29 21:24 <a href="http://www.blogjava.net/ywj-316/archive/2009/11/29/304135.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Map-iterator</title><link>http://www.blogjava.net/ywj-316/archive/2009/11/29/304132.html</link><dc:creator>junly</dc:creator><author>junly</author><pubDate>Sun, 29 Nov 2009 13:20:00 GMT</pubDate><guid>http://www.blogjava.net/ywj-316/archive/2009/11/29/304132.html</guid><wfw:comment>http://www.blogjava.net/ywj-316/comments/304132.html</wfw:comment><comments>http://www.blogjava.net/ywj-316/archive/2009/11/29/304132.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/ywj-316/comments/commentRss/304132.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/ywj-316/services/trackbacks/304132.html</trackback:ping><description><![CDATA[<p>&nbsp;</p>
<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"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><span style="color: #000000">Set&nbsp;temp</span><span style="color: #000000">=</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;HashSet();<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />Set&nbsp;entries&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;temp.entrySet();<br />
<img id="Codehighlighter1_115_201_Open_Image" onclick="this.style.display='none'; Codehighlighter1_115_201_Open_Text.style.display='none'; Codehighlighter1_115_201_Closed_Image.style.display='inline'; Codehighlighter1_115_201_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_115_201_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_115_201_Closed_Text.style.display='none'; Codehighlighter1_115_201_Open_Image.style.display='inline'; Codehighlighter1_115_201_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top"  alt="" />&nbsp;&nbsp;</span><span style="color: #0000ff">for</span><span style="color: #000000">&nbsp;(Iterator&nbsp;iter&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;entries.iterator();&nbsp;iter.hasNext();)&nbsp;</span><span id="Codehighlighter1_115_201_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"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_115_201_Open_Text"><span style="color: #000000">{<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;Map.Entry&nbsp;entry&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;(Map.Entry)&nbsp;iter.next();<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;ACL&nbsp;acl&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;(ACL)entry.getValue();<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top"  alt="" />&nbsp;&nbsp;}</span></span></div>
<img src ="http://www.blogjava.net/ywj-316/aggbug/304132.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/ywj-316/" target="_blank">junly</a> 2009-11-29 21:20 <a href="http://www.blogjava.net/ywj-316/archive/2009/11/29/304132.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>IO流</title><link>http://www.blogjava.net/ywj-316/archive/2009/11/29/304130.html</link><dc:creator>junly</dc:creator><author>junly</author><pubDate>Sun, 29 Nov 2009 13:18:00 GMT</pubDate><guid>http://www.blogjava.net/ywj-316/archive/2009/11/29/304130.html</guid><wfw:comment>http://www.blogjava.net/ywj-316/comments/304130.html</wfw:comment><comments>http://www.blogjava.net/ywj-316/archive/2009/11/29/304130.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/ywj-316/comments/commentRss/304130.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/ywj-316/services/trackbacks/304130.html</trackback:ping><description><![CDATA[<p>1 输入/输出流<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 字节流&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 字符流<br />
&nbsp;输入流&nbsp; InputStream&nbsp;&nbsp;&nbsp; Reader<br />
&nbsp;输出流&nbsp; OutputStream&nbsp;&nbsp; Writer<br />
2 字节流和处理流<br />
------------------------------------------------------------------------<br />
3 InputStream 向程序中输入数据<br />
InputStream---FileInputStream<br />
InputStream---StringBufferInputStream<br />
InputStream---ObjectInputStream<br />
基本方法<br />
-读取一个字节并以整数的形式返回<br />
-如果返回-1已到输入流的末尾<br />
int read() throws IOException<br />
-读取一系列字节并存储到一个数组buffer<br />
int read(byte[] buffer) throws IOException<br />
-读取length个字节并存到一个字节数组buffer<br />
int read(byte[] buffer,int offset[数组的那个下标开始存],int lenght) throws IOException<br />
-关闭流<br />
void close() throws IOException<br />
-------------------------------------------------------------------------------<br />
4 outputStream 输出数据<br />
OutputStream---FileOutputStream<br />
OutputStream---ObjectOutputStream<br />
-向输出流中写一个字节数据<br />
void write(int b)throws IOException<br />
-将一个字节类型的数组中的数据写入输出流<br />
void write(byte[] b)throws IOException<br />
-将一个字节类型的数组中的从指定位置off开始的len个字节写入到输出流<br />
void write(byte[] b,int off,int len)throws IOException<br />
-关闭流<br />
void close()throws IOException<br />
-将输出流中缓冲的数据全部写出到目的地(重要：先flush再close)<br />
void flush() throws IOException<br />
-----------------------------------------------------------------------------------<br />
5 Reader/Writer<br />
---------------------------------------------------<br />
6 FileInputStream/OutputStream<br />
long num=0;<br />
try{<br />
&nbsp;FileInputStream in=new FileInputStream("d:\\test.txt");<br />
&nbsp;FileOutputStream out=new FileOutputStream("d:/test1.text");<br />
&nbsp;while(int b=in.read()!=-1){<br />
&nbsp;&nbsp;out.write(b);<br />
&nbsp;}<br />
&nbsp;in.close();<br />
&nbsp;out.close();<br />
}catch(){}<br />
7 FileReader/FileWriter<br />
&nbsp; FileReader fr=null;<br />
&nbsp; FileWriter fw=null;<br />
&nbsp; int c=0;<br />
&nbsp; try{<br />
&nbsp;fr=new FileReader ("d:\\test.java");<br />
&nbsp;fw=new FileWriter ("d:/test1.java");<br />
&nbsp;while((c=fr.read)!=-1){<br />
&nbsp;&nbsp;&nbsp; System.out.print((char)c);<br />
&nbsp;&nbsp;&nbsp; fw.write(c);<br />
&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; fr.close();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; fw.close();<br />
&nbsp; }<br />
&nbsp;8 缓冲流<br />
&nbsp;常用构造方法<br />
&nbsp;BufferedReader(Reader in)<br />
&nbsp;BufferedReader(Reader in,int sz)<br />
&nbsp;BufferedWreter(Writer out)<br />
&nbsp;BufferedWreter(Writer out,int sz)<br />
&nbsp;BufferedInputStream(InputStream in)<br />
&nbsp;BufferedInputStream(InputStream in,int size)<br />
&nbsp;BufferedOutputStream(OutputStream out)<br />
&nbsp;BufferedOutputStream(OutputStream out,int size)<br />
&nbsp;*BufferedReader提供了readLine方法用于读取一行字符串<br />
&nbsp;*BufferedWreter提供了newLine用于写入一个行分隔符<br />
&nbsp;*可以使用flush方法将输出到缓冲流的数据在内存中清空立刻写入硬盘<br />
try{<br />
&nbsp;&nbsp;&nbsp; FileInputStream fis=new FileInputStream("d:\\share\\HelloWorld.java");<br />
&nbsp;&nbsp;&nbsp; BufferedInputStream bis=new BufferedInputStream (fis);<br />
&nbsp;&nbsp;&nbsp; bis.mark(100);从第100开始读<br />
}</p>
<p>try{<br />
&nbsp;&nbsp;&nbsp;&nbsp; BufferedWriter bw=new BufferedWriter (new FileWriter("d:\\test.txt"));<br />
&nbsp;&nbsp;&nbsp;&nbsp; BufferedReader br=new BufferedReader(new FileReader("d:\\test.txt"));<br />
&nbsp;&nbsp;&nbsp;&nbsp; String s=null;<br />
&nbsp;&nbsp;&nbsp;&nbsp; for(int i=0;i&lt;=100;i++){<br />
&nbsp;s=String.valueOf(Math.random());<br />
&nbsp;bw.write(s);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; bw.newLine();//写一个换行符<br />
&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp; bw.flush();//清空缓存写入文件<br />
&nbsp;&nbsp;&nbsp;&nbsp; while((s=br.readLine())!=null){<br />
&nbsp;System.out.println(s);<br />
&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp; bw.close();<br />
&nbsp;&nbsp;&nbsp;&nbsp; br.close();<br />
}<br />
9 转换流<br />
&nbsp; InputStreamReader/OutputStreamWriter<br />
&nbsp; 用于字节数据到字符数据之间的转换<br />
&nbsp; InputStreamReader 需要和 InputStream "套接"<br />
&nbsp; OutputStreamWriter 需要和 OutputStream "套接"<br />
&nbsp; InputStream isr=new InputStreamReader(System.in,"ISO8859-1");</p>
<p>try{<br />
&nbsp; OutputStreamWriter osw=new OutputStreamWriter (new FileOutputStream("d:\\test.txt"));<br />
&nbsp; osw.write("ssssssssssssssss");<br />
&nbsp; osw.close();<br />
&nbsp; osw=new OutputStreamWriter(new FileOutputStream("d:\\test.txt",true),"ISO8859-1");//true是指在原来的基础上添加<br />
&nbsp; osw.write("ddddddddddddddddddd");<br />
&nbsp; osw.close();<br />
}</p>
<p>InputStreamReader isr=new InputStreamReader(System.in);<br />
BufferedReader br=new BufferedReader(isr);<br />
String s=br.readLine();</p>
<p>10 流据流，存储和读取java原始类型<br />
DataInputStream(InputStream in)/DataOutputStream(OutputStream out)<br />
boolean readBoolean()<br />
double readDouble()<br />
String readUTF()</p>
<p>11 PrintStream / PrintWriter<br />
printStream ps=null;<br />
try{<br />
&nbsp;&nbsp; FileOutputStream fos=new FileOutStream("d:\\test.txt");<br />
&nbsp;&nbsp; ps=new PrintStream(fos);<br />
}<br />
if(ps!=null){<br />
&nbsp;&nbsp; System.setOut(ps);<br />
}<br />
int ln=0;<br />
for(char c=0;c&lt;=60000;c++){<br />
&nbsp;&nbsp; System.out.print(c+" ");<br />
&nbsp;&nbsp; if(ln++&gt;=100){<br />
&nbsp;System.out.println();<br />
&nbsp;ln=0;<br />
&nbsp;&nbsp; }<br />
}</p>
<p>12 ObjectInputStream/ObjectOutputStream<br />
对象读写必须序列化，transient关键字表示该必性不被序列化<br />
class t implements Serializable{<br />
&nbsp; int i=10;<br />
&nbsp; transient int j=9;<br />
&nbsp; double d=2.3;<br />
}</p>
<p>T t=new T();<br />
FileOutputStream fos=new FileOutputStream ();<br />
ObjectOutputStream oos=new ObjectOutputStream (fos);<br />
oos.writeObject(t);<br />
oos.flush();<br />
oos.close();<br />
13 Externalizable接口<br />
方法:<br />
&nbsp;&nbsp; void readExternal(ObjectInput in)<br />
&nbsp;&nbsp; void writeExternal(ObjectOutput out)</p>
<img src ="http://www.blogjava.net/ywj-316/aggbug/304130.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/ywj-316/" target="_blank">junly</a> 2009-11-29 21:18 <a href="http://www.blogjava.net/ywj-316/archive/2009/11/29/304130.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Apache BeanUtils</title><link>http://www.blogjava.net/ywj-316/archive/2009/11/29/304129.html</link><dc:creator>junly</dc:creator><author>junly</author><pubDate>Sun, 29 Nov 2009 13:17:00 GMT</pubDate><guid>http://www.blogjava.net/ywj-316/archive/2009/11/29/304129.html</guid><wfw:comment>http://www.blogjava.net/ywj-316/comments/304129.html</wfw:comment><comments>http://www.blogjava.net/ywj-316/archive/2009/11/29/304129.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/ywj-316/comments/commentRss/304129.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/ywj-316/services/trackbacks/304129.html</trackback:ping><description><![CDATA[BeanUtils.copyProperties 与 PropertyUtils.copyProperties 用法及区别<br />
一、简介：<br />
BeanUtils提供对 Java反射和自省API的包装。其主要目的是利用反射机制对JavaBean的属性进行处理。我们知道，一个JavaBean通常包含了大量的属性，很 多情况下，对JavaBean的处理导致大量get/set代码堆积，增加了代码长度和阅读代码的难度。<br />
二、用法：<br />
BeanUtils是这个包里比较常用的一个工具类，这里只介绍它的copyProperties()方法。该方法定义如下：<br />
public static void copyProperties(java.lang.Object dest,java.lang.Object orig)<br />
&nbsp;&nbsp; throws java.lang.IllegalAccessException,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; java.lang.reflect.InvocationTargetException<br />
如 果你有两个具有很多相同属性的JavaBean，一个很常见的情况就是Struts里的PO对象（持久对象）和对应的ActionForm，例如 Teacher和TeacherForm。我们一般会在Action里从ActionForm构造一个PO对象，传统的方式是使用类似下面的语句对属性逐 个赋值：<br />
//得到TeacherForm<br />
TeacherForm teacherForm=(TeacherForm)form;<br />
//构造Teacher对象<br />
Teacher teacher=new Teacher();<br />
//赋值<br />
teacher.setName(teacherForm.getName());<br />
teacher.setAge(teacherForm.getAge());<br />
teacher.setGender(teacherForm.getGender());<br />
teacher.setMajor(teacherForm.getMajor());<br />
teacher.setDepartment(teacherForm.getDepartment());<br />
//持久化Teacher对象到数据库<br />
HibernateDAO=;<br />
HibernateDAO.save(teacher);<br />
而使用BeanUtils后，代码就大大改观了，如下所示：<br />
//得到TeacherForm<br />
TeacherForm teacherForm=(TeacherForm)form;<br />
//构造Teacher对象<br />
Teacher teacher=new Teacher();<br />
//赋值<br />
BeanUtils.copyProperties(teacher,teacherForm);<br />
//持久化Teacher对象到数据库<br />
HibernateDAO=;<br />
HibernateDAO.save(teacher);<br />
如 果Teacher和TeacherForm间存在名称不相同的属性，则BeanUtils不对这些属性进行处理，需要程序员手动处理。例如 Teacher包含modifyDate（该属性记录最后修改日期，不需要用户在界面中输入）属性而TeacherForm无此属性，那么在上面代码的 copyProperties()后还要加上一句：<br />
teacher.setModifyDate(new Date());<br />
怎 么样，很方便吧！除BeanUtils外还有一个名为PropertyUtils的工具类，它也提供copyProperties()方法，作用与 BeanUtils的同名方法十分相似，主要的区别在于后者提供类型转换功能，即发现两个JavaBean的同名属性为不同类型时，在支持的数据类型范围 内进行转换，而前者不支持这个功能，但是速度会更快一些。BeanUtils支持的转换类型如下：<br />
* java.lang.BigDecimal<br />
* java.lang.BigInteger<br />
* boolean and java.lang.Boolean<br />
* byte and java.lang.Byte<br />
* char and java.lang.Character<br />
* java.lang.Class<br />
* double and java.lang.Double<br />
* float and java.lang.Float<br />
* int and java.lang.Integer<br />
* long and java.lang.Long<br />
* short and java.lang.Short<br />
* java.lang.String<br />
* java.sql.Date<br />
* java.sql.Time<br />
* java.sql.Timestamp <br />
这里要注意一点，java.util.Date是不被支持的，而它的子类java.sql.Date是被支持的。因此如果对象包含时间类型的属性，且希望被转换的时候，一定要使用java.sql.Date类型。否则在转换时会提示argument mistype异常。<br />
三、优缺点：<br />
Apache Jakarta Commons项目非常有用。我曾在许多不同的项目上或直接或间接地使用各种流行的commons组件。其中的一个强大的组件就是BeanUtils。我 将说明如何使用BeanUtils将local实体bean转换为对应的value 对象：<br />
BeanUtils.copyProperties(aValue, aLocal)<br />
上 面的代码从aLocal对象复制属性到aValue对象。它相当简单！它不管local（或对应的value）对象有多少个属性，只管进行复制。我们假设 local对象有100个属性。上面的代码使我们可以无需键入至少100行的冗长、容易出错和反复的get和set方法调用。这太棒了！太强大了！太有用 了！<br />
现在，还有一个坏消息：使用BeanUtils的成本惊人地昂贵！我做了一个简单的测试，BeanUtils所花费的时间要超过取数 据、将其复制到对应的 value对象（通过手动调用get和set方法），以及通过串行化将其返回到远程的客户机的时间总和。所以要小心使用这种威力！
<img src ="http://www.blogjava.net/ywj-316/aggbug/304129.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/ywj-316/" target="_blank">junly</a> 2009-11-29 21:17 <a href="http://www.blogjava.net/ywj-316/archive/2009/11/29/304129.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>网站首页静态化方案</title><link>http://www.blogjava.net/ywj-316/archive/2009/11/06/301473.html</link><dc:creator>junly</dc:creator><author>junly</author><pubDate>Fri, 06 Nov 2009 09:52:00 GMT</pubDate><guid>http://www.blogjava.net/ywj-316/archive/2009/11/06/301473.html</guid><wfw:comment>http://www.blogjava.net/ywj-316/comments/301473.html</wfw:comment><comments>http://www.blogjava.net/ywj-316/archive/2009/11/06/301473.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.blogjava.net/ywj-316/comments/commentRss/301473.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/ywj-316/services/trackbacks/301473.html</trackback:ping><description><![CDATA[<br />
<span style="background-color: yellow">1&nbsp; Freemarker网站静态化的实现(转) </span><br />
<br />
首页：
<div style="border-bottom: #cccccc 1px solid; border-left: #cccccc 1px solid; padding-bottom: 4px; background-color: #eeeeee; padding-left: 4px; width: 98%; padding-right: 5px; font-size: 13px; word-break: break-all; border-top: #cccccc 1px solid; border-right: #cccccc 1px solid; padding-top: 4px"><img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" /><span style="color: #000000">1.</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">body</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;<br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" />2.</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">div&nbsp;</span><span style="color: #ff0000">id</span><span style="color: #0000ff">="wrap"</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;<br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" />3.&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">&lt;!--</span><span style="color: #008000">头部开始</span><span style="color: #008000">--&gt;</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;<br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" />4.&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">jsp:include&nbsp;</span><span style="color: #ff0000">page</span><span style="color: #0000ff">="/html/top.html"</span><span style="color: #ff0000">&nbsp;flush</span><span style="color: #0000ff">="true"</span><span style="color: #0000ff">&gt;&lt;/</span><span style="color: #800000">jsp:include</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;<br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" />5.&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">&lt;!--</span><span style="color: #008000">头部结束</span><span style="color: #008000">--&gt;</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;<br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" />6.&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">&lt;!--</span><span style="color: #008000">导航开始</span><span style="color: #008000">--&gt;</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;<br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" />7.&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">jsp:include&nbsp;</span><span style="color: #ff0000">page</span><span style="color: #0000ff">="/html/channel.html"</span><span style="color: #ff0000">&nbsp;flush</span><span style="color: #0000ff">="true"</span><span style="color: #0000ff">&gt;&lt;/</span><span style="color: #800000">jsp:include</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;<br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" />8.&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">&lt;!--</span><span style="color: #008000">导航结束</span><span style="color: #008000">--&gt;</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;<br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" />9.&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">jsp:include&nbsp;</span><span style="color: #ff0000">page</span><span style="color: #0000ff">="/html/center.html"</span><span style="color: #ff0000">&nbsp;flush</span><span style="color: #0000ff">="true"</span><span style="color: #0000ff">&gt;&lt;/</span><span style="color: #800000">jsp:include</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;<br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" />10.&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">&lt;!--</span><span style="color: #008000">友情连接开始</span><span style="color: #008000">--&gt;</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;<br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" />11.&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">jsp:include&nbsp;</span><span style="color: #ff0000">page</span><span style="color: #0000ff">="/html/index_link.html"</span><span style="color: #ff0000">&nbsp;flush</span><span style="color: #0000ff">="true"</span><span style="color: #0000ff">&gt;&lt;/</span><span style="color: #800000">jsp:include</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;<br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" />12.&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">&lt;!--</span><span style="color: #008000">友情结束</span><span style="color: #008000">--&gt;</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;<br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" />13.&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">&lt;!--</span><span style="color: #008000">底部开始</span><span style="color: #008000">--&gt;</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;<br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" />14.&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">jsp:include&nbsp;</span><span style="color: #ff0000">page</span><span style="color: #0000ff">="/html/bottom.html"</span><span style="color: #ff0000">&nbsp;flush</span><span style="color: #0000ff">="true"</span><span style="color: #0000ff">&gt;&lt;/</span><span style="color: #800000">jsp:include</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;<br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" />15.&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">&lt;!--</span><span style="color: #008000">底部结束</span><span style="color: #008000">--&gt;</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;<br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" />16.</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">div</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;<br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" />17.</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">body</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">&nbsp;&nbsp;</span></div>
整个网站首页的基本结构是通过jsp的include标签将所有通过freemarker生成的静态页面组织起来。后台控制各个部分的静态页生成。这样做将首页进行了拆分，便于了静态页面的维护，当我们需要生成&#8220;友情链接&#8221;部分的时候就只生成友情链接部分，而不需要将整个页面都从新生成一次。 <br />
&nbsp;&nbsp; 以下是我生成静态页最核心的方法，使用freemarker。 <br />

<div style="border-bottom: #cccccc 1px solid; border-left: #cccccc 1px solid; padding-bottom: 4px; background-color: #eeeeee; padding-left: 4px; width: 98%; padding-right: 5px; font-size: 13px; word-break: break-all; border-top: #cccccc 1px solid; border-right: #cccccc 1px solid; padding-top: 4px"><img id="Codehighlighter1_7_158_Open_Image" onclick="this.style.display='none'; Codehighlighter1_7_158_Open_Text.style.display='none'; Codehighlighter1_7_158_Closed_Image.style.display='inline'; Codehighlighter1_7_158_Closed_Text.style.display='inline';" align="top" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif"  alt="" /><img style="display: none" id="Codehighlighter1_7_158_Closed_Image" onclick="this.style.display='none'; Codehighlighter1_7_158_Closed_Text.style.display='none'; Codehighlighter1_7_158_Open_Image.style.display='inline'; Codehighlighter1_7_158_Open_Text.style.display='inline';" align="top" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif"  alt="" /><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="border-bottom: #808080 1px solid; border-left: #808080 1px solid; background-color: #ffffff; display: none; border-top: #808080 1px solid; border-right: #808080 1px solid" id="Codehighlighter1_7_158_Closed_Text">/**&nbsp;*/</span><span id="Codehighlighter1_7_158_Open_Text"><span style="color: #008000">/**</span><span style="color: #008000">&nbsp;&nbsp;<br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif"  alt="" />*&nbsp;生成静态页面主方法&nbsp;&nbsp;<br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif"  alt="" />*&nbsp;</span><span style="color: #808080">@param</span><span style="color: #008000">&nbsp;context&nbsp;ServletContext&nbsp;&nbsp;<br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif"  alt="" />*&nbsp;</span><span style="color: #808080">@param</span><span style="color: #008000">&nbsp;data&nbsp;一个Map的数据结果集&nbsp;&nbsp;<br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif"  alt="" />*&nbsp;</span><span style="color: #808080">@param</span><span style="color: #008000">&nbsp;templatePath&nbsp;ftl模版路径&nbsp;&nbsp;<br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif"  alt="" />*&nbsp;</span><span style="color: #808080">@param</span><span style="color: #008000">&nbsp;targetHtmlPath&nbsp;生成静态页面的路径&nbsp;&nbsp;<br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif"  alt="" /></span><span style="color: #008000">*/</span></span><span style="color: #000000">&nbsp;&nbsp;<br />
<img id="Codehighlighter1_280_1035_Open_Image" onclick="this.style.display='none'; Codehighlighter1_280_1035_Open_Text.style.display='none'; Codehighlighter1_280_1035_Closed_Image.style.display='inline'; Codehighlighter1_280_1035_Closed_Text.style.display='inline';" align="top" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif"  alt="" /><img style="display: none" id="Codehighlighter1_280_1035_Closed_Image" onclick="this.style.display='none'; Codehighlighter1_280_1035_Closed_Text.style.display='none'; Codehighlighter1_280_1035_Open_Image.style.display='inline'; Codehighlighter1_280_1035_Open_Text.style.display='inline';" align="top" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif"  alt="" /></span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">static</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;crateHTML(ServletContext&nbsp;context,Map</span><span style="color: #000000">&lt;</span><span style="color: #000000">String,Object</span><span style="color: #000000">&gt;</span><span style="color: #000000">&nbsp;data,String&nbsp;templatePath,String&nbsp;targetHtmlPath)</span><span style="border-bottom: #808080 1px solid; border-left: #808080 1px solid; background-color: #ffffff; display: none; border-top: #808080 1px solid; border-right: #808080 1px solid" id="Codehighlighter1_280_1035_Closed_Text"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_280_1035_Open_Text"><span style="color: #000000">{&nbsp;&nbsp;&nbsp;<br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif"  alt="" />Configuration&nbsp;freemarkerCfg&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;Configuration();&nbsp;&nbsp;&nbsp;<br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif"  alt="" /></span><span style="color: #008000">//</span><span style="color: #008000">加载模版&nbsp;&nbsp;&nbsp;</span><span style="color: #008000"><br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif"  alt="" /></span><span style="color: #000000">freemarkerCfg.setServletContextForTemplateLoading(context,&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">/</span><span style="color: #000000">"</span><span style="color: #000000">);&nbsp;&nbsp;&nbsp;<br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif"  alt="" />freemarkerCfg.setEncoding(Locale.getDefault(),&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">UTF-8</span><span style="color: #000000">"</span><span style="color: #000000">);&nbsp;&nbsp;&nbsp;<br />
<img id="Codehighlighter1_481_976_Open_Image" onclick="this.style.display='none'; Codehighlighter1_481_976_Open_Text.style.display='none'; Codehighlighter1_481_976_Closed_Image.style.display='inline'; Codehighlighter1_481_976_Closed_Text.style.display='inline';" align="top" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif"  alt="" /><img style="display: none" id="Codehighlighter1_481_976_Closed_Image" onclick="this.style.display='none'; Codehighlighter1_481_976_Closed_Text.style.display='none'; Codehighlighter1_481_976_Open_Image.style.display='inline'; Codehighlighter1_481_976_Open_Text.style.display='inline';" align="top" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif"  alt="" /></span><span style="color: #0000ff">try</span><span style="color: #000000">&nbsp;</span><span style="border-bottom: #808080 1px solid; border-left: #808080 1px solid; background-color: #ffffff; display: none; border-top: #808080 1px solid; border-right: #808080 1px solid" id="Codehighlighter1_481_976_Closed_Text"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_481_976_Open_Text"><span style="color: #000000">{&nbsp;&nbsp;&nbsp;<br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">指定模版路径&nbsp;&nbsp;&nbsp;</span><span style="color: #008000"><br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif"  alt="" /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;Template&nbsp;template&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;freemarkerCfg.getTemplate(templatePath,</span><span style="color: #000000">"</span><span style="color: #000000">UTF-8</span><span style="color: #000000">"</span><span style="color: #000000">);&nbsp;&nbsp;&nbsp;<br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;template.setEncoding(</span><span style="color: #000000">"</span><span style="color: #000000">UTF-8</span><span style="color: #000000">"</span><span style="color: #000000">);&nbsp;&nbsp;&nbsp;<br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">静态页面路径&nbsp;&nbsp;&nbsp;</span><span style="color: #008000"><br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif"  alt="" /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;htmlPath&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;context.getRealPath(</span><span style="color: #000000">"</span><span style="color: #000000">/html</span><span style="color: #000000">"</span><span style="color: #000000">)</span><span style="color: #000000">+</span><span style="color: #000000">"</span><span style="color: #000000">/</span><span style="color: #000000">"</span><span style="color: #000000">+</span><span style="color: #000000">targetHtmlPath;&nbsp;&nbsp;&nbsp;<br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;File&nbsp;htmlFile&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;File(htmlPath);&nbsp;&nbsp;&nbsp;<br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Writer&nbsp;out&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;BufferedWriter(</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;OutputStreamWriter(</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;FileOutputStream(htmlFile),&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">UTF-8</span><span style="color: #000000">"</span><span style="color: #000000">));&nbsp;&nbsp;&nbsp;<br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">处理模版&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000"><br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif"  alt="" /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;template.process(data,&nbsp;out);&nbsp;&nbsp;&nbsp;<br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;out.flush();&nbsp;&nbsp;&nbsp;<br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;out.close();&nbsp;&nbsp;&nbsp;<br />
<img id="Codehighlighter1_998_1031_Open_Image" onclick="this.style.display='none'; Codehighlighter1_998_1031_Open_Text.style.display='none'; Codehighlighter1_998_1031_Closed_Image.style.display='inline'; Codehighlighter1_998_1031_Closed_Text.style.display='inline';" align="top" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif"  alt="" /><img style="display: none" id="Codehighlighter1_998_1031_Closed_Image" onclick="this.style.display='none'; Codehighlighter1_998_1031_Closed_Text.style.display='none'; Codehighlighter1_998_1031_Open_Image.style.display='inline'; Codehighlighter1_998_1031_Open_Text.style.display='inline';" align="top" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif"  alt="" />}</span></span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">catch</span><span style="color: #000000">&nbsp;(Exception&nbsp;e)&nbsp;</span><span style="border-bottom: #808080 1px solid; border-left: #808080 1px solid; background-color: #ffffff; display: none; border-top: #808080 1px solid; border-right: #808080 1px solid" id="Codehighlighter1_998_1031_Closed_Text"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_998_1031_Open_Text"><span style="color: #000000">{&nbsp;&nbsp;&nbsp;<br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;e.printStackTrace();&nbsp;&nbsp;&nbsp;<br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif"  alt="" />}</span></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;</span></div>
</span>其实很简单，只要Google一下就有很多这方面的代码。我也是Google的代码然后自己再根据实际情况修改。简单说明一下参数： <br />
ServletContext ：这个不用说了吧。做java web的应该都知道，只不过struts2中这样获取ServletActionContext.getServletContext() <br />
Map&lt;String,Object&gt; data : 模版的数据来源。freemarker通过一个Map给ftl模版送数据。 <br />
现在已友情链接为列子详细介绍静态页面如何生成。其他模块以此类推。 <br />
String templatePath : ftl所在的路径。我这里相对于网站的一个相对路径然后通过ServerContext获取绝对路径。 <br />
String targetHtmlPath : 最后生成静态页的路径：我这里相对于网站的一个相对路径然后通过ServerContext获取绝对路径。 <br />
<br />
友情链接根据这段代码&lt;jsp:include page="/html/index_link.html" flush="true"&gt;&lt;/jsp:include&gt;我们需要freemarker生成一个index_link.html文件。友情链接数据来源通过数据库查询获取。 <br />
然后再写一个方法专门生成友情链接静态页面：
<div style="border-bottom: #cccccc 1px solid; border-left: #cccccc 1px solid; padding-bottom: 4px; background-color: #eeeeee; padding-left: 4px; width: 98%; padding-right: 5px; font-size: 13px; word-break: break-all; border-top: #cccccc 1px solid; border-right: #cccccc 1px solid; padding-top: 4px"><img id="Codehighlighter1_0_72_Open_Image" onclick="this.style.display='none'; Codehighlighter1_0_72_Open_Text.style.display='none'; Codehighlighter1_0_72_Closed_Image.style.display='inline'; Codehighlighter1_0_72_Closed_Text.style.display='inline';" align="top" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif"  alt="" /><img style="display: none" id="Codehighlighter1_0_72_Closed_Image" onclick="this.style.display='none'; Codehighlighter1_0_72_Closed_Text.style.display='none'; Codehighlighter1_0_72_Open_Image.style.display='inline'; Codehighlighter1_0_72_Open_Text.style.display='inline';" align="top" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif"  alt="" /><span style="border-bottom: #808080 1px solid; border-left: #808080 1px solid; background-color: #ffffff; display: none; border-top: #808080 1px solid; border-right: #808080 1px solid" id="Codehighlighter1_0_72_Closed_Text">/**&nbsp;*/</span><span id="Codehighlighter1_0_72_Open_Text"><span style="color: #008000">/**</span><span style="color: #008000">&nbsp;&nbsp;<br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif"  alt="" />*&nbsp;生成友情链接的静态页index_link.html&nbsp;&nbsp;<br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif"  alt="" />*&nbsp;</span><span style="color: #808080">@param</span><span style="color: #008000">&nbsp;context&nbsp;&nbsp;<br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif"  alt="" />*&nbsp;</span><span style="color: #808080">@param</span><span style="color: #008000">&nbsp;data&nbsp;&nbsp;<br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif"  alt="" /></span><span style="color: #008000">*/</span></span><span style="color: #000000">&nbsp;&nbsp;<br />
<img id="Codehighlighter1_164_231_Open_Image" onclick="this.style.display='none'; Codehighlighter1_164_231_Open_Text.style.display='none'; Codehighlighter1_164_231_Closed_Image.style.display='inline'; Codehighlighter1_164_231_Closed_Text.style.display='inline';" align="top" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif"  alt="" /><img style="display: none" id="Codehighlighter1_164_231_Closed_Image" onclick="this.style.display='none'; Codehighlighter1_164_231_Closed_Text.style.display='none'; Codehighlighter1_164_231_Open_Image.style.display='inline'; Codehighlighter1_164_231_Open_Text.style.display='inline';" align="top" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif"  alt="" /></span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">static</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;createIndexFriendLink(ServletContext&nbsp;context,Map</span><span style="color: #000000">&lt;</span><span style="color: #000000">String,Object</span><span style="color: #000000">&gt;</span><span style="color: #000000">&nbsp;data)</span><span style="border-bottom: #808080 1px solid; border-left: #808080 1px solid; background-color: #ffffff; display: none; border-top: #808080 1px solid; border-right: #808080 1px solid" id="Codehighlighter1_164_231_Closed_Text"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_164_231_Open_Text"><span style="color: #000000">{&nbsp;&nbsp;&nbsp;<br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif"  alt="" />crateHTML(context,data,</span><span style="color: #000000">"</span><span style="color: #000000">index_link.ftl</span><span style="color: #000000">"</span><span style="color: #000000">,</span><span style="color: #000000">"</span><span style="color: #000000">index_link.html</span><span style="color: #000000">"</span><span style="color: #000000">);&nbsp;&nbsp;&nbsp;</span></div>
</span>此方法调用上面的createHTML方法。 <br />
然后根据以上方法我们就可以再Struts2的action里面从数据库查询数据放入map调用createIndexFriendLink()方法生成静态页了。 <br />
这是action中的一个方法: <br />
<div style="border-bottom: #cccccc 1px solid; border-left: #cccccc 1px solid; padding-bottom: 4px; background-color: #eeeeee; padding-left: 4px; width: 98%; padding-right: 5px; font-size: 13px; word-break: break-all; border-top: #cccccc 1px solid; border-right: #cccccc 1px solid; padding-top: 4px"><img id="Codehighlighter1_1_52_Open_Image" onclick="this.style.display='none'; Codehighlighter1_1_52_Open_Text.style.display='none'; Codehighlighter1_1_52_Closed_Image.style.display='inline'; Codehighlighter1_1_52_Closed_Text.style.display='inline';" align="top" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif"  alt="" /><img style="display: none" id="Codehighlighter1_1_52_Closed_Image" onclick="this.style.display='none'; Codehighlighter1_1_52_Closed_Text.style.display='none'; Codehighlighter1_1_52_Open_Image.style.display='inline'; Codehighlighter1_1_52_Open_Text.style.display='inline';" align="top" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif"  alt="" /><span style="color: #000000">&nbsp;</span><span style="border-bottom: #808080 1px solid; border-left: #808080 1px solid; background-color: #ffffff; display: none; border-top: #808080 1px solid; border-right: #808080 1px solid" id="Codehighlighter1_1_52_Closed_Text">/**&nbsp;*/</span><span id="Codehighlighter1_1_52_Open_Text"><span style="color: #008000">/**</span><span style="color: #008000">&nbsp;&nbsp;<br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;*&nbsp;生成友情链接静态页index_link.html&nbsp;&nbsp;<br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;*&nbsp;</span><span style="color: #808080">@return</span><span style="color: #008000">&nbsp;&nbsp;<br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif"  alt="" />&nbsp;</span><span style="color: #008000">*/</span></span><span style="color: #000000">&nbsp;&nbsp;<br />
<img id="Codehighlighter1_82_642_Open_Image" onclick="this.style.display='none'; Codehighlighter1_82_642_Open_Text.style.display='none'; Codehighlighter1_82_642_Closed_Image.style.display='inline'; Codehighlighter1_82_642_Closed_Text.style.display='inline';" align="top" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif"  alt="" /><img style="display: none" id="Codehighlighter1_82_642_Closed_Image" onclick="this.style.display='none'; Codehighlighter1_82_642_Closed_Text.style.display='none'; Codehighlighter1_82_642_Open_Image.style.display='inline'; Codehighlighter1_82_642_Open_Text.style.display='inline';" align="top" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif"  alt="" /></span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;String&nbsp;createLink()</span><span style="border-bottom: #808080 1px solid; border-left: #808080 1px solid; background-color: #ffffff; display: none; border-top: #808080 1px solid; border-right: #808080 1px solid" id="Codehighlighter1_82_642_Closed_Text"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_82_642_Open_Text"><span style="color: #000000">{&nbsp;&nbsp;&nbsp;<br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">权限验证&nbsp;&nbsp;&nbsp;</span><span style="color: #008000"><br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif"  alt="" /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">(</span><span style="color: #000000">!</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">this</span><span style="color: #000000">.isAccess())&nbsp;&nbsp;&nbsp;<br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">error</span><span style="color: #000000">"</span><span style="color: #000000">;&nbsp;&nbsp;&nbsp;<br />
<img id="Codehighlighter1_164_548_Open_Image" onclick="this.style.display='none'; Codehighlighter1_164_548_Open_Text.style.display='none'; Codehighlighter1_164_548_Closed_Image.style.display='inline'; Codehighlighter1_164_548_Closed_Text.style.display='inline';" align="top" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif"  alt="" /><img style="display: none" id="Codehighlighter1_164_548_Closed_Image" onclick="this.style.display='none'; Codehighlighter1_164_548_Closed_Text.style.display='none'; Codehighlighter1_164_548_Open_Image.style.display='inline'; Codehighlighter1_164_548_Open_Text.style.display='inline';" align="top" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">try</span><span style="border-bottom: #808080 1px solid; border-left: #808080 1px solid; background-color: #ffffff; display: none; border-top: #808080 1px solid; border-right: #808080 1px solid" id="Codehighlighter1_164_548_Closed_Text"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_164_548_Open_Text"><span style="color: #000000">{&nbsp;&nbsp;&nbsp;<br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">得到友情链接&nbsp;&nbsp;&nbsp;</span><span style="color: #008000"><br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif"  alt="" /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;List&nbsp;links&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;friendLinkDAO.findAll();&nbsp;&nbsp;&nbsp;<br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">准备数据&nbsp;&nbsp;&nbsp;</span><span style="color: #008000"><br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif"  alt="" /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;HashMap</span><span style="color: #000000">&lt;</span><span style="color: #000000">String,Object</span><span style="color: #000000">&gt;</span><span style="color: #000000">&nbsp;data&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;HashMap</span><span style="color: #000000">&lt;</span><span style="color: #000000">String,Object</span><span style="color: #000000">&gt;</span><span style="color: #000000">();&nbsp;&nbsp;&nbsp;<br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;data.put(</span><span style="color: #000000">"</span><span style="color: #000000">links</span><span style="color: #000000">"</span><span style="color: #000000">,&nbsp;links);&nbsp;&nbsp;&nbsp;<br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">调用静态页面方法&nbsp;&nbsp;&nbsp;</span><span style="color: #008000"><br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif"  alt="" /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;HTML.createIndexFriendLink(ServletActionContext.getServletContext(),&nbsp;data);&nbsp;&nbsp;&nbsp;<br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;addActionMessage(</span><span style="color: #000000">"</span><span style="color: #000000">静态页面生成成功！</span><span style="color: #000000">"</span><span style="color: #000000">);&nbsp;&nbsp;&nbsp;<br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">message</span><span style="color: #000000">"</span><span style="color: #000000">;&nbsp;&nbsp;&nbsp;<br />
<img id="Codehighlighter1_567_637_Open_Image" onclick="this.style.display='none'; Codehighlighter1_567_637_Open_Text.style.display='none'; Codehighlighter1_567_637_Closed_Image.style.display='inline'; Codehighlighter1_567_637_Closed_Text.style.display='inline';" align="top" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif"  alt="" /><img style="display: none" id="Codehighlighter1_567_637_Closed_Image" onclick="this.style.display='none'; Codehighlighter1_567_637_Closed_Text.style.display='none'; Codehighlighter1_567_637_Open_Image.style.display='inline'; Codehighlighter1_567_637_Open_Text.style.display='inline';" align="top" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #0000ff">catch</span><span style="color: #000000">(Exception&nbsp;e)</span><span style="border-bottom: #808080 1px solid; border-left: #808080 1px solid; background-color: #ffffff; display: none; border-top: #808080 1px solid; border-right: #808080 1px solid" id="Codehighlighter1_567_637_Closed_Text"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_567_637_Open_Text"><span style="color: #000000">{&nbsp;&nbsp;&nbsp;<br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;e.printStackTrace();&nbsp;&nbsp;&nbsp;<br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">failure</span><span style="color: #000000">"</span><span style="color: #000000">;&nbsp;&nbsp;&nbsp;<br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;<br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif"  alt="" />}</span></span><span style="color: #000000">&nbsp;&nbsp;</span></div>
List links = friendLinkDAO.findAll();通过spring注入action的hiberate DAO获取数据给list然后通过以下代码 <br />
HashMap&lt;String,Object&gt; data = new HashMap&lt;String,Object&gt;(); <br />
data.put("links", links); <br />
准备数据调用createIndexFriendLink()方法。 <br />
以下是：ftl模版源码： <br />
<div style="border-bottom: #cccccc 1px solid; border-left: #cccccc 1px solid; padding-bottom: 4px; background-color: #eeeeee; padding-left: 4px; width: 98%; padding-right: 5px; font-size: 13px; word-break: break-all; border-top: #cccccc 1px solid; border-right: #cccccc 1px solid; padding-top: 4px"><img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" /><span style="color: #0000ff">&lt;</span><span style="color: #800000">#if&nbsp;</span><span style="color: #ff0000">links?size&nbsp;!</span><span style="color: #0000ff">=&nbsp;0&gt;&nbsp;&nbsp;&nbsp;<br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" /></span><span style="color: #ff0000">&lt;div&nbsp;class</span><span style="color: #0000ff">="link"</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;<br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">strong</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">友情链接：</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">strong</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;<br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">#list&nbsp;</span><span style="color: #ff0000">links&nbsp;as&nbsp;link</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;<br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">a&nbsp;</span><span style="color: #ff0000">href</span><span style="color: #0000ff">="${link.linkUrl}"</span><span style="color: #ff0000">&nbsp;target</span><span style="color: #0000ff">="_blank"</span><span style="color: #ff0000">&nbsp;title</span><span style="color: #0000ff">="${link.linkName}"</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">${link.linkName}</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">a</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;<br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">#list</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;<br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" /></span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">div</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;<br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" /></span><span style="color: #0000ff">&lt;</span><span style="color: #800000">#else</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;<br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" /></span><span style="color: #0000ff">&lt;</span><span style="color: #800000">div&nbsp;</span><span style="color: #ff0000">class</span><span style="color: #0000ff">="link"</span><span style="color: #0000ff">&gt;&lt;/</span><span style="color: #800000">div</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;<br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" /></span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">#if</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">&nbsp;&nbsp;</span></div>
这样友情链接静态页就生成了。然后其他静态页依此葫芦画瓢。 <br />
<img src ="http://www.blogjava.net/ywj-316/aggbug/301473.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/ywj-316/" target="_blank">junly</a> 2009-11-06 17:52 <a href="http://www.blogjava.net/ywj-316/archive/2009/11/06/301473.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>JAVA语言读取MAC地址(转)</title><link>http://www.blogjava.net/ywj-316/archive/2009/11/06/301464.html</link><dc:creator>junly</dc:creator><author>junly</author><pubDate>Fri, 06 Nov 2009 09:21:00 GMT</pubDate><guid>http://www.blogjava.net/ywj-316/archive/2009/11/06/301464.html</guid><wfw:comment>http://www.blogjava.net/ywj-316/comments/301464.html</wfw:comment><comments>http://www.blogjava.net/ywj-316/archive/2009/11/06/301464.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/ywj-316/comments/commentRss/301464.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/ywj-316/services/trackbacks/301464.html</trackback:ping><description><![CDATA[<div style="border-bottom: #cccccc 1px solid; border-left: #cccccc 1px solid; padding-bottom: 4px; background-color: #eeeeee; padding-left: 4px; width: 98%; padding-right: 5px; font-size: 13px; word-break: break-all; border-top: #cccccc 1px solid; border-right: #cccccc 1px solid; padding-top: 4px"><img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" /><span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;java.io.</span><span style="color: #000000">*</span><span style="color: #000000">;&nbsp;<br />
<img id="Codehighlighter1_42_857_Open_Image" onclick="this.style.display='none'; Codehighlighter1_42_857_Open_Text.style.display='none'; Codehighlighter1_42_857_Closed_Image.style.display='inline'; Codehighlighter1_42_857_Closed_Text.style.display='inline';" align="top" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif"  alt="" /><img style="display: none" id="Codehighlighter1_42_857_Closed_Image" onclick="this.style.display='none'; Codehighlighter1_42_857_Closed_Text.style.display='none'; Codehighlighter1_42_857_Open_Image.style.display='inline'; Codehighlighter1_42_857_Open_Text.style.display='inline';" align="top" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif"  alt="" />　　</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;ReadMAC&nbsp;</span><span style="border-bottom: #808080 1px solid; border-left: #808080 1px solid; background-color: #ffffff; display: none; border-top: #808080 1px solid; border-right: #808080 1px solid" id="Codehighlighter1_42_857_Closed_Text"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_42_857_Open_Text"><span style="color: #000000">{&nbsp;<br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif"  alt="" />　　</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">static</span><span style="color: #000000">&nbsp;String&nbsp;physicalAddress&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">read&nbsp;MAC&nbsp;error!</span><span style="color: #000000">"</span><span style="color: #000000">;&nbsp;<br />
<img id="Codehighlighter1_125_130_Open_Image" onclick="this.style.display='none'; Codehighlighter1_125_130_Open_Text.style.display='none'; Codehighlighter1_125_130_Closed_Image.style.display='inline'; Codehighlighter1_125_130_Closed_Text.style.display='inline';" align="top" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif"  alt="" /><img style="display: none" id="Codehighlighter1_125_130_Closed_Image" onclick="this.style.display='none'; Codehighlighter1_125_130_Closed_Text.style.display='none'; Codehighlighter1_125_130_Open_Image.style.display='inline'; Codehighlighter1_125_130_Open_Text.style.display='inline';" align="top" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif"  alt="" />　　</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;ReadMAC()&nbsp;</span><span style="border-bottom: #808080 1px solid; border-left: #808080 1px solid; background-color: #ffffff; display: none; border-top: #808080 1px solid; border-right: #808080 1px solid" id="Codehighlighter1_125_130_Closed_Text"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_125_130_Open_Text"><span style="color: #000000">{&nbsp;<br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif"  alt="" />　　}</span></span><span style="color: #000000">&nbsp;<br />
<img id="Codehighlighter1_178_733_Open_Image" onclick="this.style.display='none'; Codehighlighter1_178_733_Open_Text.style.display='none'; Codehighlighter1_178_733_Closed_Image.style.display='inline'; Codehighlighter1_178_733_Closed_Text.style.display='inline';" align="top" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif"  alt="" /><img style="display: none" id="Codehighlighter1_178_733_Closed_Image" onclick="this.style.display='none'; Codehighlighter1_178_733_Closed_Text.style.display='none'; Codehighlighter1_178_733_Open_Image.style.display='inline'; Codehighlighter1_178_733_Open_Text.style.display='inline';" align="top" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif"  alt="" />　　</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">static</span><span style="color: #000000">&nbsp;String&nbsp;checkPhysicalAddress()</span><span style="border-bottom: #808080 1px solid; border-left: #808080 1px solid; background-color: #ffffff; display: none; border-top: #808080 1px solid; border-right: #808080 1px solid" id="Codehighlighter1_178_733_Closed_Text"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_178_733_Open_Text"><span style="color: #000000">{&nbsp;<br />
<img id="Codehighlighter1_186_653_Open_Image" onclick="this.style.display='none'; Codehighlighter1_186_653_Open_Text.style.display='none'; Codehighlighter1_186_653_Closed_Image.style.display='inline'; Codehighlighter1_186_653_Closed_Text.style.display='inline';" align="top" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif"  alt="" /><img style="display: none" id="Codehighlighter1_186_653_Closed_Image" onclick="this.style.display='none'; Codehighlighter1_186_653_Closed_Text.style.display='none'; Codehighlighter1_186_653_Open_Image.style.display='inline'; Codehighlighter1_186_653_Open_Text.style.display='inline';" align="top" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif"  alt="" />　　</span><span style="color: #0000ff">try</span><span style="border-bottom: #808080 1px solid; border-left: #808080 1px solid; background-color: #ffffff; display: none; border-top: #808080 1px solid; border-right: #808080 1px solid" id="Codehighlighter1_186_653_Closed_Text"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_186_653_Open_Text"><span style="color: #000000">{&nbsp;<br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif"  alt="" />　　String&nbsp;line;&nbsp;<br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif"  alt="" />　　Process&nbsp;process&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;Runtime.getRuntime().exec(</span><span style="color: #000000">"</span><span style="color: #000000">cmd&nbsp;/c&nbsp;ipconfig&nbsp;/all</span><span style="color: #000000">"</span><span style="color: #000000">);&nbsp;<br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif"  alt="" />　　BufferedReader&nbsp;bufferedReader&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;BufferedReader(</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;InputStreamReader(process.getInputStream()));&nbsp;<br />
<img id="Codehighlighter1_432_626_Open_Image" onclick="this.style.display='none'; Codehighlighter1_432_626_Open_Text.style.display='none'; Codehighlighter1_432_626_Closed_Image.style.display='inline'; Codehighlighter1_432_626_Closed_Text.style.display='inline';" align="top" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif"  alt="" /><img style="display: none" id="Codehighlighter1_432_626_Closed_Image" onclick="this.style.display='none'; Codehighlighter1_432_626_Closed_Text.style.display='none'; Codehighlighter1_432_626_Open_Image.style.display='inline'; Codehighlighter1_432_626_Open_Text.style.display='inline';" align="top" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif"  alt="" />　　</span><span style="color: #0000ff">while</span><span style="color: #000000">&nbsp;(&nbsp;(line</span><span style="color: #000000">=</span><span style="color: #000000">bufferedReader.readLine())&nbsp;</span><span style="color: #000000">!=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">null</span><span style="color: #000000">)</span><span style="border-bottom: #808080 1px solid; border-left: #808080 1px solid; background-color: #ffffff; display: none; border-top: #808080 1px solid; border-right: #808080 1px solid" id="Codehighlighter1_432_626_Closed_Text"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_432_626_Open_Text"><span style="color: #000000">{&nbsp;<br />
<img id="Codehighlighter1_498_621_Open_Image" onclick="this.style.display='none'; Codehighlighter1_498_621_Open_Text.style.display='none'; Codehighlighter1_498_621_Closed_Image.style.display='inline'; Codehighlighter1_498_621_Closed_Text.style.display='inline';" align="top" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif"  alt="" /><img style="display: none" id="Codehighlighter1_498_621_Closed_Image" onclick="this.style.display='none'; Codehighlighter1_498_621_Closed_Text.style.display='none'; Codehighlighter1_498_621_Open_Image.style.display='inline'; Codehighlighter1_498_621_Open_Text.style.display='inline';" align="top" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif"  alt="" />　　</span><span style="color: #0000ff">if</span><span style="color: #000000">(line.indexOf(</span><span style="color: #000000">"</span><span style="color: #000000">Physical&nbsp;Address.&nbsp;.&nbsp;.&nbsp;.&nbsp;.&nbsp;.&nbsp;.&nbsp;.&nbsp;.&nbsp;:</span><span style="color: #000000">"</span><span style="color: #000000">)&nbsp;</span><span style="color: #000000">!=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">-</span><span style="color: #000000">1</span><span style="color: #000000">)</span><span style="border-bottom: #808080 1px solid; border-left: #808080 1px solid; background-color: #ffffff; display: none; border-top: #808080 1px solid; border-right: #808080 1px solid" id="Codehighlighter1_498_621_Closed_Text"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_498_621_Open_Text"><span style="color: #000000">{&nbsp;<br />
<img id="Codehighlighter1_530_616_Open_Image" onclick="this.style.display='none'; Codehighlighter1_530_616_Open_Text.style.display='none'; Codehighlighter1_530_616_Closed_Image.style.display='inline'; Codehighlighter1_530_616_Closed_Text.style.display='inline';" align="top" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif"  alt="" /><img style="display: none" id="Codehighlighter1_530_616_Closed_Image" onclick="this.style.display='none'; Codehighlighter1_530_616_Closed_Text.style.display='none'; Codehighlighter1_530_616_Open_Image.style.display='inline'; Codehighlighter1_530_616_Open_Text.style.display='inline';" align="top" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif"  alt="" />　　</span><span style="color: #0000ff">if</span><span style="color: #000000">(line.indexOf(</span><span style="color: #000000">"</span><span style="color: #000000">:</span><span style="color: #000000">"</span><span style="color: #000000">)&nbsp;</span><span style="color: #000000">!=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">-</span><span style="color: #000000">1</span><span style="color: #000000">)</span><span style="border-bottom: #808080 1px solid; border-left: #808080 1px solid; background-color: #ffffff; display: none; border-top: #808080 1px solid; border-right: #808080 1px solid" id="Codehighlighter1_530_616_Closed_Text"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_530_616_Open_Text"><span style="color: #000000">{&nbsp;<br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif"  alt="" />　　physicalAddress&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;line.substring(line.indexOf(</span><span style="color: #000000">"</span><span style="color: #000000">:</span><span style="color: #000000">"</span><span style="color: #000000">)</span><span style="color: #000000">+</span><span style="color: #000000">2</span><span style="color: #000000">);&nbsp;<br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif"  alt="" />　　</span><span style="color: #0000ff">break</span><span style="color: #000000">;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">找到MAC,推出循环&nbsp;</span><span style="color: #008000"><br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif"  alt="" /></span><span style="color: #000000">　　}</span></span><span style="color: #000000">&nbsp;<br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif"  alt="" />　　}</span></span><span style="color: #000000">&nbsp;<br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif"  alt="" />　　}</span></span><span style="color: #000000">&nbsp;<br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif"  alt="" />　　process.waitFor();&nbsp;<br />
<img id="Codehighlighter1_672_701_Open_Image" onclick="this.style.display='none'; Codehighlighter1_672_701_Open_Text.style.display='none'; Codehighlighter1_672_701_Closed_Image.style.display='inline'; Codehighlighter1_672_701_Closed_Text.style.display='inline';" align="top" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif"  alt="" /><img style="display: none" id="Codehighlighter1_672_701_Closed_Image" onclick="this.style.display='none'; Codehighlighter1_672_701_Closed_Text.style.display='none'; Codehighlighter1_672_701_Open_Image.style.display='inline'; Codehighlighter1_672_701_Open_Text.style.display='inline';" align="top" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif"  alt="" />　　}</span></span><span style="color: #0000ff">catch</span><span style="color: #000000">(Exception&nbsp;e)</span><span style="border-bottom: #808080 1px solid; border-left: #808080 1px solid; background-color: #ffffff; display: none; border-top: #808080 1px solid; border-right: #808080 1px solid" id="Codehighlighter1_672_701_Closed_Text"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_672_701_Open_Text"><span style="color: #000000">{&nbsp;<br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif"  alt="" />　　e.printStackTrace();&nbsp;<br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif"  alt="" />　　}</span></span><span style="color: #000000">&nbsp;<br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif"  alt="" />　　</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;physicalAddress;&nbsp;<br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif"  alt="" />　　}</span></span><span style="color: #000000">&nbsp;<br />
<img id="Codehighlighter1_777_852_Open_Image" onclick="this.style.display='none'; Codehighlighter1_777_852_Open_Text.style.display='none'; Codehighlighter1_777_852_Closed_Image.style.display='inline'; Codehighlighter1_777_852_Closed_Text.style.display='inline';" align="top" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif"  alt="" /><img style="display: none" id="Codehighlighter1_777_852_Closed_Image" onclick="this.style.display='none'; Codehighlighter1_777_852_Closed_Text.style.display='none'; Codehighlighter1_777_852_Open_Image.style.display='inline'; Codehighlighter1_777_852_Open_Text.style.display='inline';" align="top" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif"  alt="" />　　</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">static</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;main(String[]&nbsp;args)&nbsp;</span><span style="border-bottom: #808080 1px solid; border-left: #808080 1px solid; background-color: #ffffff; display: none; border-top: #808080 1px solid; border-right: #808080 1px solid" id="Codehighlighter1_777_852_Closed_Text"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_777_852_Open_Text"><span style="color: #000000">{&nbsp;<br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif"  alt="" />　　System.out.println(</span><span style="color: #000000">"</span><span style="color: #000000">本机的MAC地址是:&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">+</span><span style="color: #000000">&nbsp;ReadMAC.checkPhysicalAddress());&nbsp;<br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif"  alt="" />　　}</span></span><span style="color: #000000">&nbsp;<br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif"  alt="" />　　}</span></span></div>
<strong>1 引言</strong>
<p>　　用Java编写的程序，可以很方便地运行在各种平台的环境。但在实际的开发过程中，有时不得不涉及一些底层的编程。比如为了防止软件盗用，我们希望软件只能在指定计算机上运行，所以需要程序读取该机区分于其它计算机的硬件特征，如MAC地址等。作为一种跨平台语言，给Java语言提出了挑战。本文正是针对该问题，提出一种直接用纯Java语言，读去MAC地址的编程方法。</p>
<p>　　我们知道，在每一个Java应用程序中都存在着一个与其运行环境相联系的Runtime对象。该对象可执行外部命令、查可用内存等。而多数操作系统都提供有查询该机MAC地址的命令。如在Microsoft的操作系统中，命令IPCONFIG等。本文的思路是在程序中运行一个外部命令，将该命令的运行结果作为一个流(Stream)，读取并分析之，进而实现获取MAC地址的目的。</p>
<p>　　<strong>2 Runtime类</strong></p>
<p>　　在每一个Java 应用程序里面，都有惟一的一个Runtime 对象。通过这个Runtime 对象，应用程序可以与其运行环境发生相互作用。</p>
<p>　　一般不实例化一个Runtime对象。但是可以通过调用静态方法Runtime.getRuntime( )而获得对当前Runtime对象的引用。Runtime 类的大多数方法是实例方法。</p>
<p>　　Runtime 对象的作用主要有：执行外部命令;返回空闲内存;运行垃圾回收器;加载动态库等。</p>
<p>　　Applets和其他不可信赖的程序由于没有引起一个安全异常(SecurityException)而不能调用任何的Runtime方法。</p>
<p>　　下面的例子演示了怎样使用Runtime 对象运行一个外部命令。</p>
<p>&nbsp;</p>
<table style="border-bottom: #cccccc 1px dotted; border-left: #cccccc 1px dotted; width: 963px; table-layout: fixed; height: 54px; border-top: #cccccc 1px dotted; border-right: #cccccc 1px dotted" border="0" cellspacing="0" cellpadding="6" width="963" align="center">
    <tbody>
        <tr>
            <td style="word-wrap: break-word" bgcolor="#f3f3f3"><font style="color: #990000; font-weight: bold">以下是引用片段：</font><br />
            ： <br />
            　　Process&nbsp;process&nbsp;=&nbsp;Runtime.getRuntime().exec("cmd.exe&nbsp;/c&nbsp;dir"); <br />
            　　process.waitFor(); </td>
        </tr>
    </tbody>
</table>
<p>&nbsp;</p>
<p>　　Runtime.getRuntime()返回当前应用程序的Runtime对象，该对象的exec()方法指示Java虚拟机创建一个子进程执行指定的可执行程序，并返回与该子进程对应的Process对象实例。通过Process可以控制该子进程的执行或获取该子进程的信息。第二条语句的目的是等待子进程完成后再往下执行。</p>
<p>　　上面的程序在运行时会执行dir命令。如果在Windows95/98下，命令格式可以写成"command.exe /c dir"。开关/C指明后面跟随的字符串是命令，并在执行命令后关闭DOS 窗口。</p>
<p>　　方法exec还可以打开一个不可执行的程序，但该文件存在关联的应用程序。以打开一个word文档Mydoc.doc文件为例，Java中可以有以下两种写法：</p>
<p>&nbsp;</p>
<table style="border-bottom: #cccccc 1px dotted; border-left: #cccccc 1px dotted; table-layout: fixed; border-top: #cccccc 1px dotted; border-right: #cccccc 1px dotted" border="0" cellspacing="0" cellpadding="6" width="95%" align="center">
    <tbody>
        <tr>
            <td style="word-wrap: break-word" bgcolor="#f3f3f3"><font style="color: #990000; font-weight: bold">以下是引用片段：</font><br />
            　exec(""cmd&nbsp;/E:ON&nbsp;/c&nbsp;start&nbsp;MyDoc.doc""); <br />
            　　exec("&nbsp;c:Program&nbsp;FilesMicrosoft&nbsp;Officeofficewinword.exe&nbsp;.mydoc.doc");</td>
        </tr>
    </tbody>
</table>
<p>&nbsp;</p>
<p>　　在第一种方式中，被执行的命令是start Mydoc.doc，开关E:ON 指定DOS 命令处理器允许命令扩展，而start 命令会开启一个单独的窗口执行所提供的命令。 <br />
执行一个有标准输出的DOS命令，程序执行完后往往不会自动关闭，从而导致Java应用程序阻塞在waitfor( )。导致该现象的原因可能是该命令的输出比较多，而运行窗口的输出缓冲区不够大。解决的办法是，利用Java的Process类提供的方法让Java虚拟机截获DOS运行的标准输出，在waitfor()命令之前读出该缓冲区的内容。以运行命令dir为例，典型的程序如下： </p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>
<table style="border-bottom: #cccccc 1px dotted; border-left: #cccccc 1px dotted; table-layout: fixed; border-top: #cccccc 1px dotted; border-right: #cccccc 1px dotted" border="0" cellspacing="0" cellpadding="6" width="95%" align="center">
    <tbody>
        <tr>
            <td style="word-wrap: break-word" bgcolor="#f3f3f3"><font style="color: #990000; font-weight: bold">以下是引用片段：</font><br />
            　： <br />
            　　String&nbsp;line; <br />
            　　Process&nbsp;process&nbsp;=&nbsp;Runtime.getRuntime().exec("cmd&nbsp;/c&nbsp;dir"); <br />
            　　BufferedReader&nbsp;bufferedReader&nbsp;=&nbsp;new&nbsp;BufferedReader&nbsp;(&nbsp;new&nbsp;InputStreamReader(process.getInputStream())); <br />
            　　while&nbsp;(&nbsp;(line&nbsp;=&nbsp;bufferedReader.readLine())&nbsp;!=&nbsp;-1)&nbsp;System.&nbsp;out.println(line); <br />
            　　process.waitFor(&nbsp;); <br />
            　　：3&nbsp;Process</td>
        </tr>
    </tbody>
</table>
</p>
<p>&nbsp;</p>
<p>　　Runtime.exec方法创建一个本机进程，并返回 Process 子类的一个实例，该实例可用来控制进程并获取相关信息。</p>
<p>　　抽象类Process封装了一个进程(process)，一个正在执行的程序。它主要被当作由Runtime类中的exec( )方法所创建的对象的类型的超类。在抽象类Process中，主要包含了如下一些抽象方法。</p>
<p>　　InputStream getInputStream( )：返回一个从进程的out输出流中读输入的输入流。</p>
<p>　　OutputStream getOutputStream( )：返回一个从进程的in输入流中写输出的输出流。</p>
<p>　　int waitFor( ) throws InterruptedException：返回由进程返回的退出码。这个方法直到调用它的进程中止，才会返回。</p>
<p>　　4 程序编写</p>
<p>　　我们先来分析ipconfig/all的输出格式：</p>
<p align="center"><br />
&nbsp;</p>
<p>　　从图1中我们看到MAC地址包含的行为：&#8220; Physical Address. . . . . . . . . : 00-10-DC-A9-0B-2C&#8221;。为了找到MAC地址，我们一行一行读取字符，只要找到字符串&#8220; Physical Address. . . . . . . . . :&#8221;，就可以找到MAC地址了。下面是实现的程序片段：</p>
<p>&nbsp;</p>
<p>
<table style="border-bottom: #cccccc 1px dotted; border-left: #cccccc 1px dotted; table-layout: fixed; border-top: #cccccc 1px dotted; border-right: #cccccc 1px dotted" border="0" cellspacing="0" cellpadding="6" width="95%" align="center">
    <tbody>
        <tr>
            <td style="word-wrap: break-word" bgcolor="#f3f3f3"><font style="color: #990000; font-weight: bold">以下是引用片段：</font><br />
            ： <br />
            　　Process&nbsp;process&nbsp;=&nbsp;Runtime.getRuntime().exec("cmd&nbsp;/c&nbsp;ipconfig&nbsp;/all"); <br />
            　　BufferedReader&nbsp;bufferedReader&nbsp;= <br />
            　　new&nbsp;BufferedReader(new&nbsp;InputStreamReader&nbsp;(process.getInputStream())); <br />
            　　while&nbsp;(&nbsp;(line=bufferedReader.readLine())&nbsp;!=&nbsp;null){ <br />
            　　if(line.indexOf("Physical&nbsp;Address.&nbsp;.&nbsp;.&nbsp;.&nbsp;.&nbsp;.&nbsp;.&nbsp;.&nbsp;.&nbsp;:")&nbsp;!=&nbsp;-1){ <br />
            　　if(line.indexOf(":")&nbsp;!=&nbsp;-1){ <br />
            　　physicalAddress&nbsp;=&nbsp;line.substring(line.indexOf(":")+2); <br />
            　　：</td>
        </tr>
    </tbody>
</table>
</p>
在上面的程序中，为了读取命令输出的字符，利用子进程process生成了一个数据流缓冲区。<br />
5 结束语
<p>　　作为一个跨平台语言，编写的JAVA程序一般都与硬件无关，因而能运行在不同的操作系统环境。但这给编写底层相关的程序时带来不便。</p>
<p>　　Java的应用程序都存在着一个与其运行环境相联系的Runtime对象，利用该对象可执行外部命令，在WindowsXP/NT/2000环境中的命令IPCONFIG的输出包含有MAC地址。本文编写的Java程序，执行外部命令IPCONFIG，并通过分析该命令的输入流而获得本机的MAC地址。由于IPCONFIG命令是操作系统命令，所以该方法既方便又可靠。</p>
<p>　　以上讨论的程序适合于Windows XP/NT/2000操作系统，因为它是基于该操作系统的命令IPCONFIG格式的。由于不同操作系统读取MAC地址的命令、以及命令输出格式的不同，所以该程序不能直接运用到其它系统。要移植到其它系统只需针对命令的输出格式稍作修改。</p>
<img src ="http://www.blogjava.net/ywj-316/aggbug/301464.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/ywj-316/" target="_blank">junly</a> 2009-11-06 17:21 <a href="http://www.blogjava.net/ywj-316/archive/2009/11/06/301464.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>cookie</title><link>http://www.blogjava.net/ywj-316/archive/2009/11/03/300852.html</link><dc:creator>junly</dc:creator><author>junly</author><pubDate>Tue, 03 Nov 2009 02:25:00 GMT</pubDate><guid>http://www.blogjava.net/ywj-316/archive/2009/11/03/300852.html</guid><wfw:comment>http://www.blogjava.net/ywj-316/comments/300852.html</wfw:comment><comments>http://www.blogjava.net/ywj-316/archive/2009/11/03/300852.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/ywj-316/comments/commentRss/300852.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/ywj-316/services/trackbacks/300852.html</trackback:ping><description><![CDATA[<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"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><span style="color: #008000">//</span><span style="color: #008000">servlet<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #008000">//</span><span style="color: #008000">生成cookie对名象</span><span style="color: #008000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #000000">java.util.Date&nbsp;date</span><span style="color: #000000">=</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;java.util.Date();<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />Cookie&nbsp;c</span><span style="color: #000000">=</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;Cookie(</span><span style="color: #000000">"</span><span style="color: #000000">lastVisited</span><span style="color: #000000">"</span><span style="color: #000000">,date.toString());<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />c.setMaxAge(</span><span style="color: #000000">60</span><span style="color: #000000">*</span><span style="color: #000000">60</span><span style="color: #000000">*</span><span style="color: #000000">24</span><span style="color: #000000">);</span><span style="color: #008000">//</span><span style="color: #008000">设置有效时间，单位秒</span><span style="color: #008000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #000000">c.setPath(</span><span style="color: #000000">"</span><span style="color: #000000">/</span><span style="color: #000000">"</span><span style="color: #000000">);</span><span style="color: #008000">//</span><span style="color: #008000">设置路径</span><span style="color: #008000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #000000">c.setDomain(</span><span style="color: #000000">"</span><span style="color: #000000">.v512.com</span><span style="color: #000000">"</span><span style="color: #000000">);</span><span style="color: #008000">//</span><span style="color: #008000">设置域名<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #008000">//</span><span style="color: #008000">以上都有对应的get方法</span><span style="color: #008000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #000000">response.addCookie(c);</span><span style="color: #008000">//</span><span style="color: #008000">保存对象到用户机硬盘上<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #008000">//</span><span style="color: #008000">读取Cookie</span><span style="color: #008000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #000000">Cookie[]&nbsp;cookies</span><span style="color: #000000">=</span><span style="color: #000000">request.getCookies();<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />Cookie&nbsp;c</span><span style="color: #000000">=</span><span style="color: #0000ff">null</span><span style="color: #000000">;<br />
<img id="Codehighlighter1_341_494_Open_Image" onclick="this.style.display='none'; Codehighlighter1_341_494_Open_Text.style.display='none'; Codehighlighter1_341_494_Closed_Image.style.display='inline'; Codehighlighter1_341_494_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_341_494_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_341_494_Closed_Text.style.display='none'; Codehighlighter1_341_494_Open_Image.style.display='inline'; Codehighlighter1_341_494_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top"  alt="" /></span><span style="color: #0000ff">if</span><span style="color: #000000">(cookies</span><span style="color: #000000">!=</span><span style="color: #0000ff">null</span><span style="color: #000000">)</span><span id="Codehighlighter1_341_494_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"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_341_494_Open_Text"><span style="color: #000000">{<br />
<img id="Codehighlighter1_378_492_Open_Image" onclick="this.style.display='none'; Codehighlighter1_378_492_Open_Text.style.display='none'; Codehighlighter1_378_492_Closed_Image.style.display='inline'; Codehighlighter1_378_492_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_378_492_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_378_492_Closed_Text.style.display='none'; Codehighlighter1_378_492_Open_Image.style.display='inline'; Codehighlighter1_378_492_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">for</span><span style="color: #000000">(</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;i</span><span style="color: #000000">=</span><span style="color: #000000">0</span><span style="color: #000000">;i</span><span style="color: #000000">&lt;</span><span style="color: #000000">cookies.lenght;i</span><span style="color: #000000">++</span><span style="color: #000000">)</span><span id="Codehighlighter1_378_492_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"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_378_492_Open_Text"><span style="color: #000000">{<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;c</span><span style="color: #000000">=</span><span style="color: #000000">cookies[i];<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;out.println(</span><span style="color: #000000">"</span><span style="color: #000000">cookie&nbsp;name:</span><span style="color: #000000">"</span><span style="color: #000000">+</span><span style="color: #000000">c.getName());<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;out.println(</span><span style="color: #000000">"</span><span style="color: #000000">cookie&nbsp;value:</span><span style="color: #000000">"</span><span style="color: #000000">+</span><span style="color: #000000">c.getValue());<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top"  alt="" />}</span></span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #008000">//</span><span style="color: #008000">修改Cookie</span><span style="color: #008000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #000000">Cookie[]&nbsp;cookies</span><span style="color: #000000">=</span><span style="color: #000000">reuqest.getCookies();<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />Cookie&nbsp;c</span><span style="color: #000000">=</span><span style="color: #0000ff">null</span><span style="color: #000000">;<br />
<img id="Codehighlighter1_579_779_Open_Image" onclick="this.style.display='none'; Codehighlighter1_579_779_Open_Text.style.display='none'; Codehighlighter1_579_779_Closed_Image.style.display='inline'; Codehighlighter1_579_779_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_579_779_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_579_779_Closed_Text.style.display='none'; Codehighlighter1_579_779_Open_Image.style.display='inline'; Codehighlighter1_579_779_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top"  alt="" /></span><span style="color: #0000ff">if</span><span style="color: #000000">(cookies</span><span style="color: #000000">!=</span><span style="color: #0000ff">null</span><span style="color: #000000">)</span><span id="Codehighlighter1_579_779_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"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_579_779_Open_Text"><span style="color: #000000">{<br />
<img id="Codehighlighter1_616_777_Open_Image" onclick="this.style.display='none'; Codehighlighter1_616_777_Open_Text.style.display='none'; Codehighlighter1_616_777_Closed_Image.style.display='inline'; Codehighlighter1_616_777_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_616_777_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_616_777_Closed_Text.style.display='none'; Codehighlighter1_616_777_Open_Image.style.display='inline'; Codehighlighter1_616_777_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">for</span><span style="color: #000000">(</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;i</span><span style="color: #000000">=</span><span style="color: #000000">0</span><span style="color: #000000">;i</span><span style="color: #000000">&lt;</span><span style="color: #000000">cookies.lenght;i</span><span style="color: #000000">++</span><span style="color: #000000">)</span><span id="Codehighlighter1_616_777_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"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_616_777_Open_Text"><span style="color: #000000">{<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;c</span><span style="color: #000000">=</span><span style="color: #000000">cookies[i];<br />
<img id="Codehighlighter1_677_773_Open_Image" onclick="this.style.display='none'; Codehighlighter1_677_773_Open_Text.style.display='none'; Codehighlighter1_677_773_Closed_Image.style.display='inline'; Codehighlighter1_677_773_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_677_773_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_677_773_Closed_Text.style.display='none'; Codehighlighter1_677_773_Open_Image.style.display='inline'; Codehighlighter1_677_773_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">(c.getName().equals(</span><span style="color: #000000">"</span><span style="color: #000000">lastVisited</span><span style="color: #000000">"</span><span style="color: #000000">))</span><span id="Codehighlighter1_677_773_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"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_677_773_Open_Text"><span style="color: #000000">{<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;c.setValue(</span><span style="color: #000000">"</span><span style="color: #000000">2007-10-30</span><span style="color: #000000">"</span><span style="color: #000000">);<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;c.setMaxAge(</span><span style="color: #000000">60</span><span style="color: #000000">*</span><span style="color: #000000">60</span><span style="color: #000000">*</span><span style="color: #000000">24</span><span style="color: #000000">);<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;response.addCookie(c);<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top"  alt="" />}</span></span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #008000">//</span><span style="color: #008000">删除Cookie</span><span style="color: #008000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #000000">Cookie[]&nbsp;cookies</span><span style="color: #000000">=</span><span style="color: #000000">reuqest.getCookies();<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />Cookie&nbsp;c</span><span style="color: #000000">=</span><span style="color: #0000ff">null</span><span style="color: #000000">;<br />
<img id="Codehighlighter1_864_1025_Open_Image" onclick="this.style.display='none'; Codehighlighter1_864_1025_Open_Text.style.display='none'; Codehighlighter1_864_1025_Closed_Image.style.display='inline'; Codehighlighter1_864_1025_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_864_1025_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_864_1025_Closed_Text.style.display='none'; Codehighlighter1_864_1025_Open_Image.style.display='inline'; Codehighlighter1_864_1025_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top"  alt="" /></span><span style="color: #0000ff">if</span><span style="color: #000000">(cookies</span><span style="color: #000000">!=</span><span style="color: #0000ff">null</span><span style="color: #000000">)</span><span id="Codehighlighter1_864_1025_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"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_864_1025_Open_Text"><span style="color: #000000">{<br />
<img id="Codehighlighter1_901_1023_Open_Image" onclick="this.style.display='none'; Codehighlighter1_901_1023_Open_Text.style.display='none'; Codehighlighter1_901_1023_Closed_Image.style.display='inline'; Codehighlighter1_901_1023_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_901_1023_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_901_1023_Closed_Text.style.display='none'; Codehighlighter1_901_1023_Open_Image.style.display='inline'; Codehighlighter1_901_1023_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">for</span><span style="color: #000000">(</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;i</span><span style="color: #000000">=</span><span style="color: #000000">0</span><span style="color: #000000">;i</span><span style="color: #000000">&lt;</span><span style="color: #000000">cookies.lenght;i</span><span style="color: #000000">++</span><span style="color: #000000">)</span><span id="Codehighlighter1_901_1023_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"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_901_1023_Open_Text"><span style="color: #000000">{<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;c</span><span style="color: #000000">=</span><span style="color: #000000">cookies[i];<br />
<img id="Codehighlighter1_962_1019_Open_Image" onclick="this.style.display='none'; Codehighlighter1_962_1019_Open_Text.style.display='none'; Codehighlighter1_962_1019_Closed_Image.style.display='inline'; Codehighlighter1_962_1019_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_962_1019_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_962_1019_Closed_Text.style.display='none'; Codehighlighter1_962_1019_Open_Image.style.display='inline'; Codehighlighter1_962_1019_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">(c.getName().equals(</span><span style="color: #000000">"</span><span style="color: #000000">lastVisited</span><span style="color: #000000">"</span><span style="color: #000000">))</span><span id="Codehighlighter1_962_1019_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"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_962_1019_Open_Text"><span style="color: #000000">{<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;c.setMaxAge(</span><span style="color: #000000">0</span><span style="color: #000000">);<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;response.addCookie(c);<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top"  alt="" />}</span></span></div>
  <img src ="http://www.blogjava.net/ywj-316/aggbug/300852.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/ywj-316/" target="_blank">junly</a> 2009-11-03 10:25 <a href="http://www.blogjava.net/ywj-316/archive/2009/11/03/300852.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>