﻿<?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-zhip-随笔分类-Java</title><link>http://www.blogjava.net/zhip/category/15388.html</link><description>&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;冬去春来&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp&lt;strong&gt;&lt;font style="FONT-SIZE: 9pt; FILTER: shadow(color=#cccccc); COLOR: #0060f0; HEIGHT: 1px"&gt;郑重声明：本Blog纯属个人学习、工作需要，记录相关资料。请不要发表任何有人身攻击的言论，谢谢！！&lt;/font&gt;&lt;a href='Http://www.zhipsoft.cn' target='_blank'&gt;www.zhipsoft.cn&lt;/a&gt;&lt;/strong&gt;</description><language>zh-cn</language><lastBuildDate>Tue, 04 Jan 2011 23:25:21 GMT</lastBuildDate><pubDate>Tue, 04 Jan 2011 23:25:21 GMT</pubDate><ttl>60</ttl><item><title>【已解决】Webloigc92 报下面的错误，有知道的大侠指点一下啊，谢谢。急急~~</title><link>http://www.blogjava.net/zhip/archive/2009/07/03/285298.html</link><dc:creator>zhip</dc:creator><author>zhip</author><pubDate>Fri, 03 Jul 2009 02:44:00 GMT</pubDate><guid>http://www.blogjava.net/zhip/archive/2009/07/03/285298.html</guid><wfw:comment>http://www.blogjava.net/zhip/comments/285298.html</wfw:comment><comments>http://www.blogjava.net/zhip/archive/2009/07/03/285298.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/zhip/comments/commentRss/285298.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zhip/services/trackbacks/285298.html</trackback:ping><description><![CDATA[<p><br />
Webloigc92 报下面的错误，有知道的大侠指点一下啊，谢谢。急急~~</p>
<p><br />
&lt;2009-7-3 上午09时36分23秒 CST&gt; &lt;Error&gt; &lt;HTTP&gt; &lt;BEA-101019&gt; &lt;[weblogic.servlet.internal.WebAppServletContext@5d7554 - appName: 'traffic', name: 'WebRoot', </p>
<p>context-path: ''] Servlet failed with IOException <br />
java.io.IOException: failed to read '2' bytes from InputStream; clen: 6016 remaining: 2 count: 6014 <br />
at weblogic.servlet.internal.ChunkOutput.writeStream(ChunkOutput.java:417) <br />
at weblogic.servlet.internal.ChunkOutputWrapper.writeStream(ChunkOutputWrapper.java:168) <br />
at weblogic.servlet.internal.ServletOutputStreamImpl.writeStream(ServletOutputStreamImpl.java:498) <br />
at weblogic.servlet.internal.ServletOutputStreamImpl.writeStream(ServletOutputStreamImpl.java:486) <br />
at weblogic.servlet.FileServlet.sendFile(FileServlet.java:405) <br />
Truncated. see log file for complete stacktrace <br />
&gt; </p>
<p><br />
是不是下面的代码有什么问题？ <br />
InputStream fis = null; <br />
BufferedOutputStream bos = null; <br />
try { <br />
String dpId = session.getAttribute("dp_id")==null?"":session.getAttribute("dp_id").toString(); <br />
String nameReport=request.getParameter("nameReport"); <br />
String workbook = request.getParameter("workbook"); <br />
if(workbook==null || "".equals(workbook)){ <br />
workbook = session.getAttribute("dp_id").toString(); <br />
} <br />
String tempworkbook = workbook +"/"; <br />
tempworkbook = tempworkbook.replaceAll("主工作薄/",dpId+"/"); <br />
if(tempworkbook.endsWith("/")){ <br />
tempworkbook = tempworkbook.substring(0,tempworkbook.length()-1); <br />
} <br />
fis = request.getInputStream(); <br />
bos = new BufferedOutputStream(new FileOutputStream(new File(strAbsPath+"workbookspace\\"+tempworkbook+"\\"+nameReport+".cll"))); <br />
int b = fis.read(); <br />
while (b != -1) { <br />
bos.write(b); <br />
b = fis.read(); <br />
} <br />
}catch (Exception e) { <br />
e.printStackTrace(); <br />
}finally{ <br />
bos.flush(); <br />
bos.close(); <br />
fis.close(); <br />
bos = null; <br />
fis = null; <br />
}<br />
<br />
原因：因为workbook路径中包含了空格。</p>
 <img src ="http://www.blogjava.net/zhip/aggbug/285298.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zhip/" target="_blank">zhip</a> 2009-07-03 10:44 <a href="http://www.blogjava.net/zhip/archive/2009/07/03/285298.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>针对不重新发送信息，则无法刷新网页。的终极解决方法</title><link>http://www.blogjava.net/zhip/archive/2008/09/25/231144.html</link><dc:creator>zhip</dc:creator><author>zhip</author><pubDate>Thu, 25 Sep 2008 08:53:00 GMT</pubDate><guid>http://www.blogjava.net/zhip/archive/2008/09/25/231144.html</guid><wfw:comment>http://www.blogjava.net/zhip/comments/231144.html</wfw:comment><comments>http://www.blogjava.net/zhip/archive/2008/09/25/231144.html#Feedback</comments><slash:comments>3</slash:comments><wfw:commentRss>http://www.blogjava.net/zhip/comments/commentRss/231144.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zhip/services/trackbacks/231144.html</trackback:ping><description><![CDATA[<p>JAVA:</p>
<p>public class UtilTool {</p>
<p>&nbsp;&nbsp;&nbsp; public static Map getParameterMap(HttpServletRequest request) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Map paramMap = new LinkedHashMap();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String pathInfoStr = request.getPathInfo();</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (pathInfoStr != null &amp;&amp; pathInfoStr.length() &gt; 0) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (!pathInfoStr.endsWith("/")) pathInfoStr += "/";</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int current = pathInfoStr.indexOf('/');<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int last = current;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; while ((current = pathInfoStr.indexOf('/', last + 1)) != -1) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String element = pathInfoStr.substring(last + 1, current);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; last = current;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (element.charAt(0) == '~' &amp;&amp; element.indexOf('=') &gt; -1) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String name = element.substring(1, element.indexOf('='));<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String value = element.substring(element.indexOf('=') + 1);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; paramMap.put(name, value);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; java.util.Enumeration e = request.getParameterNames();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; while (e.hasMoreElements()) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String name = (String) e.nextElement();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; paramMap.put(name, request.getParameter(name));<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (paramMap.size() == 0) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Map multiPartMap = (Map) request.getAttribute("multiPartMap");<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (multiPartMap != null &amp;&amp; multiPartMap.size() &gt; 0) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; paramMap.putAll(multiPartMap);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return paramMap;<br />
&nbsp;&nbsp;&nbsp; }</p>
<p>&nbsp;</p>
<p>&nbsp; public static String requestParameter(HttpServletRequest request){<br />
&nbsp;&nbsp; String fromstr="&lt;form name='request' method='POST'&gt;";<br />
&nbsp;&nbsp; Enumeration requestKeys = request.getParameterNames();<br />
&nbsp;&nbsp; Map requestValues=UtilTool.getParameterMap(request);<br />
&nbsp;&nbsp; String rkey = null;<br />
&nbsp;&nbsp; for(;requestKeys.hasMoreElements();){<br />
&nbsp;&nbsp;&nbsp; rkey = (String) requestKeys.nextElement();<br />
&nbsp;&nbsp;&nbsp; fromstr+="&lt;input name='"+rkey+"' value='"+requestValues.get(rkey)+"' type='hidden'&gt;";<br />
&nbsp;&nbsp; }<br />
&nbsp;&nbsp; fromstr+="&lt;/form&gt;&lt;script&gt;function reload(){request.submit()}&lt;/script&gt;";<br />
&nbsp;&nbsp; return fromstr;<br />
&nbsp;}<br />
}</p>
<p>Jsp调用：</p>
<p>&lt;%=UtilTool.requestParameter(request)%&gt;</p>
<p><br />
这样当需要调用弹出窗口并刷新当前页时如：<br />
针对当前页的刷新</p>
<p>window.location.reload();<br />
改为<br />
reload();</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<img src ="http://www.blogjava.net/zhip/aggbug/231144.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zhip/" target="_blank">zhip</a> 2008-09-25 16:53 <a href="http://www.blogjava.net/zhip/archive/2008/09/25/231144.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Java代码编写的30条建议</title><link>http://www.blogjava.net/zhip/archive/2008/04/16/193271.html</link><dc:creator>zhip</dc:creator><author>zhip</author><pubDate>Wed, 16 Apr 2008 00:54:00 GMT</pubDate><guid>http://www.blogjava.net/zhip/archive/2008/04/16/193271.html</guid><wfw:comment>http://www.blogjava.net/zhip/comments/193271.html</wfw:comment><comments>http://www.blogjava.net/zhip/archive/2008/04/16/193271.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/zhip/comments/commentRss/193271.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zhip/services/trackbacks/193271.html</trackback:ping><description><![CDATA[<div class="newscon">(1) 类名首字母应该大写。字段、方法以及对象（句柄）的首字母应小写。对于所有标识符，其中包含的所有单词都应紧靠在一起，而且大写中间单词的首字母。例如： <br />
ThisIsAClassName <br />
thisIsMethodOrFieldName <br />
若在定义中出现了常数初始化字符，则大写static final基本类型标识符中的所有字母。这样便可标志出它们属于编译期的常数。 <br />
Java包（Package）属于一种特殊情况：它们全都是小写字母，即便中间的单词亦是如此。对于域名扩展名称，如com，org，net或者edu等，全部都应小写（这也是Java 1.1和Java 1.2的区别之一）。 <br />
<br />
(2) 为了常规用途而创建一个类时，请采取"经典形式"，并包含对下述元素的定义： <br />
<br />
equals() <br />
hashCode() <br />
toString() <br />
clone()（implement Cloneable） <br />
implement Serializable <br />
<br />
(3) 对于自己创建的每一个类，都考虑置入一个main()，其中包含了用于测试那个类的代码。为使用一个项目中的类，我们没必要删除测试代码。若进行了任何形式的改动，可方便地返回测试。这些代码也可作为如何使用类的一个示例使用。 <br />
<br />
(4) 应将方法设计成简要的、功能性单元，用它描述和实现一个不连续的类接口部分。理想情况下，方法应简明扼要。若长度很大，可考虑通过某种方式将其分割成较短的几个方法。这样做也便于类内代码的重复使用（有些时候，方法必须非常大，但它们仍应只做同样的一件事情）。 <br />
<br />
(5) 设计一个类时，请设身处地为客户程序员考虑一下（类的使用方法应该是非常明确的）。然后，再设身处地为管理代码的人考虑一下（预计有可能进行哪些形式的修改，想想用什么方法可把它们变得更简单）。 <br />
(6) 使类尽可能短小精悍，而且只解决一个特定的问题。下面是对类设计的一些建议： <br />
■一个复杂的开关语句：考虑采用"多形"机制 <br />
■数量众多的方法涉及到类型差别极大的操作：考虑用几个类来分别实现 <br />
■许多成员变量在特征上有很大的差别：考虑使用几个类 <br />
<br />
(7) 让一切东西都尽可能地"私有"--private。可使库的某一部分"公共化"（一个方法、类或者一个字段等等），就永远不能把它拿出。若强行拿出，就可能破坏其他人现有的代码，使他们不得不重新编写和设计。若只公布自己必须公布的，就可放心大胆地改变其他任何东西。在多线程环境中，隐私是特别重要的一个因素--只有private字段才能在非同步使用的情况下受到保护。 <br />
<br />
(8) 谨惕"巨大对象综合症"。对一些习惯于顺序编程思维、且初涉OOP领域的新手，往往喜欢先写一个顺序执行的程序，再把它嵌入一个或两个巨大的对象里。根据编程原理，对象表达的应该是应用程序的概念，而非应用程序本身。 <br />
<br />
(9) 若不得已进行一些不太雅观的编程，至少应该把那些代码置于一个类的内部。 <br />
<br />
(10) 任何时候只要发现类与类之间结合得非常紧密，就需要考虑是否采用内部类，从而改善编码及维护工作（参见第14章14.1.2小节的"用内部类改进代码"）。 <br />
<br />
(11) 尽可能细致地加上注释，并用javadoc注释文档语法生成自己的程序文档。 <br />
<br />
(12) 避免使用"魔术数字"，这些数字很难与代码很好地配合。如以后需要修改它，无疑会成为一场噩梦，因为根本不知道"100"到底是指"数组大小"还是"其他全然不同的东西"。所以，我们应创建一个常数，并为其使用具有说服力的描述性名称，并在整个程序中都采用常数标识符。这样可使程序更易理解以及更易维护。 <br />
<br />
(13) 涉及构建器和异常的时候，通常希望重新丢弃在构建器中捕获的任何异常--如果它造成了那个对象的创建失败。这样一来，调用者就不会以为那个对象已正确地创建，从而盲目地继续。 <br />
<br />
(14) 当客户程序员用完对象以后，若你的类要求进行任何清除工作，可考虑将清除代码置于一个良好定义的方法里，采用类似于cleanup()这样的名字，明确表明自己的用途。除此以外，可在类内放置一个boolean（布尔）标记，指出对象是否已被清除。在类的finalize()方法里，请确定对象已被清除，并已丢弃了从RuntimeException继承的一个类（如果还没有的话），从而指出一个编程错误。在采取象这样的方案之前，请确定finalize()能够在自己的系统中工作（可能需要调用System.runFinalizersOnExit(true)，从而确保这一行为）。 <br />
<br />
(15) 在一个特定的作用域内，若一个对象必须清除（非由垃圾收集机制处理），请采用下述方法：初始化对象；若成功，则立即进入一个含有finally从句的try块，开始清除工作。 <br />
<br />
(16) 若在初始化过程中需要覆盖（取消）finalize()，请记住调用super.finalize()（若Object属于我们的直接超类，则无此必要）。在对finalize()进行覆盖的过程中，对super.finalize()的调用应属于最后一个行动，而不应是第一个行动，这样可确保在需要基础类组件的时候它们依然有效。 <br />
<br />
(17) 创建大小固定的对象集合时，请将它们传输至一个数组（若准备从一个方法里返回这个集合，更应如此操作）。这样一来，我们就可享受到数组在编译期进行类型检查的好处。此外，为使用它们，数组的接收者也许并不需要将对象"造型"到数组里。 <br />
<br />
(18) 尽量使用interfaces，不要使用abstract类。若已知某样东西准备成为一个基础类，那么第一个选择应是将其变成一个interface（接口）。只有在不得不使用方法定义或者成员变量的时候，才需要将其变成一个abstract（抽象）类。接口主要描述了客户希望做什么事情，而一个类则致力于（或允许）具体的实施细节。 <br />
<br />
(19) 在构建器内部，只进行那些将对象设为正确状态所需的工作。尽可能地避免调用其他方法，因为那些方法可能被其他人覆盖或取消，从而在构建过程中产生不可预知的结果（参见第7章的详细说明）。 <br />
<br />
(20) 对象不应只是简单地容纳一些数据；它们的行为也应得到良好的定义。 <br />
<br />
(21) 在现成类的基础上创建新类时，请首先选择"新建"或"创作"。只有自己的设计要求必须继承时，才应考虑这方面的问题。若在本来允许新建的场合使用了继承，则整个设计会变得没有必要地复杂。 <br />
<br />
(22) 用继承及方法覆盖来表示行为间的差异，而用字段表示状态间的区别。一个非常极端的例子是通过对不同类的继承来表示颜色，这是绝对应该避免的：应直接使用一个"颜色"字段。 <br />
<br />
(23) 为避免编程时遇到麻烦，请保证在自己类路径指到的任何地方，每个名字都仅对应一个类。否则，编译器可能先找到同名的另一个类，并报告出错消息。若怀疑自己碰到了类路径问题，请试试在类路径的每一个起点，搜索一下同名的.class文件。 <br />
<br />
(24) 在Java 1.1 AWT中使用事件"适配器"时，特别容易碰到一个陷阱。若覆盖了某个适配器方法，同时拼写方法没有特别讲究，最后的结果就是新添加一个方法，而不是覆盖现成方法。然而，由于这样做是完全合法的，所以不会从编译器或运行期系统获得任何出错提示--只不过代码的工作就变得不正常了。 <br />
<br />
(25) 用合理的设计方案消除"伪功能"。也就是说，假若只需要创建类的一个对象，就不要提前限制自己使用应用程序，并加上一条"只生成其中一个"注释。请考虑将其封装成一个"独生子"的形式。若在主程序里有大量散乱的代码，用于创建自己的对象，请考虑采纳一种创造性的方案，将些代码封装起来。 <br />
<br />
(26) 警惕"分析瘫痪"。请记住，无论如何都要提前了解整个项目的状况，再去考察其中的细节。由于把握了全局，可快速认识自己未知的一些因素，防止在考察细节的时候陷入"死逻辑"中。 <br />
<br />
(27) 警惕"过早优化"。首先让它运行起来，再考虑变得更快--但只有在自己必须这样做、而且经证实在某部分代码中的确存在一个性能瓶颈的时候，才应进行优化。除非用专门的工具分析瓶颈，否则很有可能是在浪费自己的时间。性能提升的隐含代价是自己的代码变得难于理解，而且难于维护。 <br />
<br />
(28) 请记住，阅读代码的时间比写代码的时间多得多。思路清晰的设计可获得易于理解的程序，但注释、细致的解释以及一些示例往往具有不可估量的价值。无论对你自己，还是对后来的人，它们都是相当重要的。如对此仍有怀疑，那么请试想自己试图从联机Java文档里找出有用信息时碰到的挫折，这样或许能将你说服。 <br />
<br />
(29) 如认为自己已进行了良好的分析、设计或者实施，那么请稍微更换一下思维角度。试试邀请一些外来人士--并不一定是专家，但可以是来自本公司其他部门的人。请他们用完全新鲜的眼光考察你的工作，看看是否能找出你一度熟视无睹的问题。采取这种方式，往往能在最适合修改的阶段找出一些关键性的问题，避免产品发行后再解决问题而造成的金钱及精力方面的损失。 <br />
<br />
(30) 良好的设计能带来最大的回报。简言之，对于一个特定的问题，通常会花较长的时间才能找到一种最恰当的解决方案。但一旦找到了正确的方法，以后的工作就轻松多了，再也不用经历数小时、数天或者数月的痛苦挣扎。我们的努力工作会带来最大的回报（甚至无可估量）。而且由于自己倾注了大量心血，最终获得一个出色的设计方案，成功的快感也是令人心动的。坚持抵制草草完工的诱惑--那样做往往得不偿失 <br />
<br />
(3) 对于自己创建的每一个类，都考虑置入一个main()，其中包含了用于测试那 个类的代码。为使用一个项目中的类，我们没必要删除测试代码。若进行了任 何形式的改动，可方便地返回测试。这些代码也可作为如何使用类的一个示例 使用。 <br />
<br />
this is absolutly bad! <br />
<br />
(4) 应将方法设计成简要的、功能性单元，用它描述和实现一个不连续的类接 口部分。理想情况下，方法应简明扼要。若长度很大，可考虑通过某种方式将 其分割成较短的几个方法。这样做也便于类内代码的重复使用（有些时候，方 法必须非常大，但它们仍应只做同样的一件事情）。 <br />
<br />
(5) 设计一个类时，请设身处地为客户程序员考虑一下（类的使用方法应该是 非常明确的）。然后，再设身处地为管理代码的人考虑一下（预计有可能进行 哪些形式的修改，想想用什么方法可把它们变得更简单）。 <br />
(6) 使类尽可能短小精悍，而且只解决一个特定的问题。下面是对类设计的一 些建议： <br />
■一个复杂的开关语句：考虑采用"多形"机制 <br />
■数量众多的方法涉及到类型差别极大的操作：考虑用几个类来分别实现 <br />
■许多成员变量在特征上有很大的差别：考虑使用几个类 <br />
<br />
(7) 让一切东西都尽可能地"私有"--private。可使库的某一部分"公共化"（一个 方法、类或者一个字段等等），就永远不能把它拿出。若强行拿出，就可能破 坏其他人现有的代码，使他们不得不重新编写和设计。若只公布自己必须公布 的，就可放心大胆地改变其他任何东西。在多线程环境中，隐私是特别重要的 一个因素--只有private字段才能在非同步使用的情况下受到保护。 <br />
<br />
not necessary , pretotect or package level also fine in most case <br />
<br />
(8) 谨惕"巨大对象综合症"。对一些习惯于顺序编程思维、且初涉OOP领域的新 手，往往喜欢先写一个顺序执行的程序，再把它嵌入一个或两个巨大的对象 里。根据编程原理，对象表达的应该是应用程序的概念，而非应用程序本身。 <br />
<br />
(9) 若不得已进行一些不太雅观的编程，至少应该把那些代码置于一个类的内 部。 <br />
<br />
(10) 任何时候只要发现类与类之间结合得非常紧密，就需要考虑是否采用内部 类，从而改善编码及维护工作（参见第14章14.1.2小节的"用内部类改进代 码"）。 <br />
<br />
(11) 尽可能细致地加上注释，并用javadoc注释文档语法生成自己的程序文档。 <br />
<br />
(12) 避免使用"魔术数字"，这些数字很难与代码很好地配合。如以后需要修改 它，无疑会成为一场噩梦，因为根本不知道"100"到底是指"数组大小"还是"其 他全然不同的东西"。所以，我们应创建一个常数，并为其使用具有说服力的描 述性名称，并在整个程序中都采用常数标识符。这样可使程序更易理解以及更 易维护。 <br />
<br />
(13) 涉及构建器和异常的时候，通常希望重新丢弃在构建器中捕获的任何异常- -如果它造成了那个对象的创建失败。这样一来，调用者就不会以为那个对象已 正确地创建，从而盲目地继续。 <br />
<br />
(14) 当客户程序员用完对象以后，若你的类要求进行任何清除工作，可考虑将 清除代码置于一个良好定义的方法里，采用类似于cleanup()这样的名字，明确 表明自己的用途。除此以外，可在类内放置一个boolean（布尔）标记，指出 对象是否已被清除。在类的finalize()方法里，请确定对象已被清除，并已丢弃 了从RuntimeException继承的一个类（如果还没有的话），从而指出一个编程 错误。在采取象这样的方案之前，请确定finalize()能够在自己的系统中工作 （可能需要调用System.runFinalizersOnExit(true)，从而确保这一行为）。 <br />
<br />
(15) 在一个特定的作用域内，若一个对象必须清除（非由垃圾收集机制处 理），请采用下述方法：初始化对象；若成功，则立即进入一个含有finally从 句的try块，开始清除工作。 <br />
<br />
(16) 若在初始化过程中需要覆盖（取消）finalize()，请记住调用 super.finalize()（若Object属于我们的直接超类，则无此必要）。在对finalize() 进行覆盖的过程中，对super.finalize()的调用应属于最后一个行动，而不应是第 一个行动，这样可确保在需要基础类组件的时候它们依然有效。 <br />
<br />
(17) 创建大小固定的对象集合时，请将它们传输至一个数组（若准备从一个方 法里返回这个集合，更应如此操作）。这样一来，我们就可享受到数组在编译 期进行类型检查的好处。此外，为使用它们，数组的接收者也许并不需要将对 象"造型"到数组里。 <br />
<br />
(18) 尽量使用interfaces，不要使用abstract类。若已知某样东西准备成为一个 基础类，那么第一个选择应是将其变成一个interface（接口）。只有在不得不 使用方法定义或者成员变量的时候，才需要将其变成一个abstract（抽象） 类。接口主要描述了客户希望做什么事情，而一个类则致力于（或允许）具体 的实施细节。 <br />
<br />
they are total diffrent , <br />
<br />
(19) 在构建器内部，只进行那些将对象设为正确状态所需的工作。尽可能地避 免调用其他方法，因为那些方法可能被其他人覆盖或取消，从而在构建过程中 产生不可预知的结果（参见第7章的详细说明）。 <br />
<br />
(20) 对象不应只是简单地容纳一些数据；它们的行为也应得到良好的定义。 <br />
<br />
(21) 在现成类的基础上创建新类时，请首先选择"新建"或"创作"。只有自己的设 计要求必须继承时，才应考虑这方面的问题。若在本来允许新建的场合使用了 继承，则整个设计会变得没有必要地复杂。 <br />
<br />
(22) 用继承及方法覆盖来表示行为间的差异，而用字段表示状态间的区别。一 个非常极端的例子是通过对不同类的继承来表示颜色，这是绝对应该避免的： 应直接使用一个"颜色"字段。 <br />
<br />
(23) 为避免编程时遇到麻烦，请保证在自己类路径指到的任何地方，每个名字 都仅对应一个类。否则，编译器可能先找到同名的另一个类，并报告出错消 息。若怀疑自己碰到了类路径问题，请试试在类路径的每一个起点，搜索一下 同名的.class文件。 <br />
<br />
classpath is not that simple <br />
<br />
(24) 在Java 1.1 AWT中使用事件"适配器"时，特别容易碰到一个陷阱。若覆盖了 某个适配器方法，同时拼写方法没有特别讲究，最后的结果就是新添加一个方 法，而不是覆盖现成方法。然而，由于这样做是完全合法的，所以不会从编译 器或运行期系统获得任何出错提示--只不过代码的工作就变得不正常了。 <br />
<br />
(25) 用合理的设计方案消除"伪功能"。也就是说，假若只需要创建类的一个对 象，就不要提前限制自己使用应用程序，并加上一条"只生成其中一个"注释。 请考虑将其封装成一个"独生子"的形式。若在主程序里有大量散乱的代码，用 于创建自己的对象，请考虑采纳一种创造性的方案，将些代码封装起来。 <br />
<br />
(26) 警惕"分析瘫痪"。请记住，无论如何都要提前了解整个项目的状况，再去 考察其中的细节。由于把握了全局，可快速认识自己未知的一些因素，防止在 考察细节的时候陷入"死逻辑"中。 <br />
<br />
(27) 警惕"过早优化"。首先让它运行起来，再考虑变得更快--但只有在自己必须 这样做、而且经证实在某部分代码中的确存在一个性能瓶颈的时候，才应进行 优化。除非用专门的工具分析瓶颈，否则很有可能是在浪费自己的时间。性能 提升的隐含代价是自己的代码变得难于理解，而且难于维护。 <br />
<br />
but know early and design better at first is always necesary, or else <br />
you die <br />
<br />
(28) 请记住，阅读代码的时间比写代码的时间多得多。思路清晰的设计可获得 易于理解的程序，但注释、细致的解释以及一些示例往往具有不可估量的价 值。无论对你自己，还是对后来的人，它们都是相当重要的。如对此仍有怀 疑，那么请试想自己试图从联机Java文档里找出有用信息时碰到的挫折，这样 或许能将你说服。 <br />
<br />
(29) 如认为自己已进行了良好的分析、设计或者实施，那么请稍微更换一下思 维角度。试试邀请一些外来人士--并不一定是专家，但可以是来自本公司其他 部门的人。请他们用完全新鲜的眼光考察你的工作，看看是否能找出你一度熟 视无睹的问题。采取这种方式，往往能在最适合修改的阶段找出一些关键性的 问题，避免产品发行后再解决问题而造成的金钱及精力方面的损失。 <br />
<br />
(30) 良好的设计能带来最大的回报。简言之，对于一个特定的问题，通常会花 较长的时间才能找到一种最恰当的解决方案。但一旦找到了正确的方法，以后 的工作就轻松多了，再也不用经历数小时、数天或者数月的痛苦挣扎。我们的 努力工作会带来最大的回报（甚至无可估量）。而且由于自己倾注了大量心 血，最终获得一个出色的设计方案，成功的快感也是令人心动的。坚持抵制草 草完工的诱惑--那样做往往得不偿失</div>
<img src ="http://www.blogjava.net/zhip/aggbug/193271.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zhip/" target="_blank">zhip</a> 2008-04-16 08:54 <a href="http://www.blogjava.net/zhip/archive/2008/04/16/193271.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Java数据导入Excel</title><link>http://www.blogjava.net/zhip/archive/2007/07/10/129373.html</link><dc:creator>zhip</dc:creator><author>zhip</author><pubDate>Tue, 10 Jul 2007 08:09:00 GMT</pubDate><guid>http://www.blogjava.net/zhip/archive/2007/07/10/129373.html</guid><wfw:comment>http://www.blogjava.net/zhip/comments/129373.html</wfw:comment><comments>http://www.blogjava.net/zhip/archive/2007/07/10/129373.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.blogjava.net/zhip/comments/commentRss/129373.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zhip/services/trackbacks/129373.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: package com.bossy.base;import java.io.File;import java.io.FileInputStream;import java.io.FileOutputStream;import java.io.IOException;import java.util.ArrayList;import java.util.List;import jxl.Wor...&nbsp;&nbsp;<a href='http://www.blogjava.net/zhip/archive/2007/07/10/129373.html'>阅读全文</a><img src ="http://www.blogjava.net/zhip/aggbug/129373.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zhip/" target="_blank">zhip</a> 2007-07-10 16:09 <a href="http://www.blogjava.net/zhip/archive/2007/07/10/129373.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[转]查询代码网址</title><link>http://www.blogjava.net/zhip/archive/2007/06/12/123512.html</link><dc:creator>zhip</dc:creator><author>zhip</author><pubDate>Tue, 12 Jun 2007 00:52:00 GMT</pubDate><guid>http://www.blogjava.net/zhip/archive/2007/06/12/123512.html</guid><wfw:comment>http://www.blogjava.net/zhip/comments/123512.html</wfw:comment><comments>http://www.blogjava.net/zhip/archive/2007/06/12/123512.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/zhip/comments/commentRss/123512.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zhip/services/trackbacks/123512.html</trackback:ping><description><![CDATA[<p>查询代码网址 <br>&nbsp;&nbsp;&nbsp; 这些是我经常使用的一些Java代码查询网站，希望在这里能起到抛砖引玉的效果，大家群策群力，一起分享Java快乐。<br>&nbsp;<br>&nbsp; 1. java2s&nbsp; <a href="http://www.java2s.com/">http://www.java2s.com/</a><br>&nbsp;&nbsp; 这个网站非常好，分成三大类，分别是Example、Products、 Articles，每个大类下又分别设许多小类，还有搜索功能，这样查找起来非常方便。。比如，如果要学习SWT/JFace，只要把Example下的SWT JFace Eclipse 研究一下也就可以了。另外，这个网站还有JavaScript DHTML、 C# / C Sharp、 C / ANSI-C、 SQL / MySQL等类。总之，非常好。</p>
<p>&nbsp; 2. codeZoo <a href="http://www.codezoo.com/">http://www.codezoo.com/</a><br>&nbsp;&nbsp; 这是O'Reily旗下的，除了Java之外，还有Ruby、Python。<br>&nbsp;<br>&nbsp; 3. Java学习源代码检索系统&nbsp; <a href="http://www.chinaitlab.com/www/school/codesearch/index.html">http://www.chinaitlab.com/www/school/codesearch/index.html</a><br>&nbsp;&nbsp; 难得看见国产的，好歹也要支持一下，分类也算清楚。<br>&nbsp;<br>&nbsp; 4. Koders&nbsp; <a href="http://www.koders.com/">http://www.koders.com/</a><br>&nbsp;&nbsp; 是个综合查询的网站，不过它好像是从代码中查找关键词，包含的语言挺多的。<br>&nbsp; <br>&nbsp; 5. Resources for Java server-side developers&nbsp; <a href="http://www.java201.com/">http://www.java201.com/</a><br>&nbsp;&nbsp; 确切的说，它是一个资源收集的网站，代码查询并不多。不过它分类相当细，如Articles、Books、Examples、Extensions、Frameworks等类，你可以输入Spring或Hibernate作为关键词搜索一下看看。<br>&nbsp;<br>&nbsp;&nbsp; 存货不多，以后有了再补充。 </p>
<img src ="http://www.blogjava.net/zhip/aggbug/123512.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zhip/" target="_blank">zhip</a> 2007-06-12 08:52 <a href="http://www.blogjava.net/zhip/archive/2007/06/12/123512.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>J2EE中的优化方案</title><link>http://www.blogjava.net/zhip/archive/2007/06/12/123509.html</link><dc:creator>zhip</dc:creator><author>zhip</author><pubDate>Tue, 12 Jun 2007 00:49:00 GMT</pubDate><guid>http://www.blogjava.net/zhip/archive/2007/06/12/123509.html</guid><wfw:comment>http://www.blogjava.net/zhip/comments/123509.html</wfw:comment><comments>http://www.blogjava.net/zhip/archive/2007/06/12/123509.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/zhip/comments/commentRss/123509.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zhip/services/trackbacks/123509.html</trackback:ping><description><![CDATA[<p>&nbsp;J2EE中的优化方案</p>
<p>1.使用StringBuffer代替String </p>
<p>String是用来存储字符串常量的，如果要执行&#8220;+&#8221;的操作，系统会生成一些临时的对象，并对这些对象进行管理，造成不必要的开销。 </p>
<p>如果字符串有连接的操作，替代的做法是用StringBuffer类的append方法。 </p>
<p>当字符串的大小超过缺省16时，代码实现了容量的扩充，为了避免对象的重新扩展其容量，那么最好用StringBuffer sb=new StringBuffer（30） </p>
<p>2.优化循环体 </p>
<p>Vector vect = new Vector(1000);<br>for( inti=0; i＜vect.size(); i++){<br>　...<br>} </p>
<p>　　for循环部分改写成： </p>
<p>int size = vect.size();<br>for( int i=0; i＞size; i++){<br>　...<br>} </p>
<p>如果size=1000，就避免了1000次的size（）调用开销，避免了重复调用.</p>
<p>3.对象的创建 </p>
<p>尽量少用new来初始化一个类的实例，当一个对象是用new进行初始化时，其构造函数链的所有构造函数都被调用到，所以new操作符是很消耗系统资源的，new一个对象耗时往往是局部变量赋值耗时的上千倍。同时，当生成对象后，系统还要花时间进行垃圾回收和处理。 </p>
<p>当new创建对象不可避免时，注意避免多次的使用new初始化一个对象。 </p>
<p>尽量在使用时再创建该对象。 </p>
<p>NewObject object = new NewObject();<br>int value;<br>if(i＞0 )<br>{<br>　value =object.getValue();<br>} </p>
<p>　　可以修改为： </p>
<p>int value;<br>if(i＞0 )<br>{<br>　NewObject object = new NewObject();<br>　Value =object.getValue();<br>} </p>
<p>4.慎用异常处理 </p>
<p>　　异常是Java的一种错误处理机制，对程序来说是非常有用的，但是异常对性能不利。抛出异常首先要创建一个新的对象，并进行相关的处理，造成系统的开销，所以异常应该用在错误处理的情况，不应该用来控制程序流程，流程尽量用while，if等处理。</p>
<p>在不是很影响代码健壮性的前提下，可以把几个try/catch块合成一个。 </p>
<p>讨论：需要处理的异常处理和不需要处理的异常处理在捕捉异常类型上应该采取什么策略。 </p>
<p>5.变量的使用 </p>
<p>&nbsp;&nbsp; 尽量使用局部变量，调用方法时传递的参数以及在调用中创建的临时变量都保存在栈（Stack） 中，速度较快。其他变量，如静态变量、实例变量等，都在堆（Heap）中创建，速度较慢。 </p>
<p>尽量使用静态变量，即加修饰符static，如果类中的变量不会随他的实例而变化，就可以定义为静态变量，从而使他所有的实例都共享这个变量。 </p>
<p>（但是静态变量不能滥用，如果这个变量用的比较少而声明成静态变量，不仅效率不会提高，还会影响性能） </p>
<p>&nbsp; </p>
<p>6.I/O操作 </p>
<p>&nbsp;&nbsp;&nbsp; 输入/输出（I/O）包括很多方面，我们知道，进行I/O操作是很费系统资源的。程序中应该尽量少用I/O操作。使用时可以注意： . 合理控制输出函数System.out.println()对于大多时候是有用的，特别是系统调试的时候，但也会产生大量的信息出现在控制台和日志上，同时输出时，有序列化和同步的过程，造成了开销。 </p>
<p>&nbsp;&nbsp;&nbsp; 特别是在发行版中，要合理的控制输出，可以在项目开发时，设计好一个Debug的工具类，在该类中可以实现输出开关，输出的级别，根据不同的情况进行不同的输出的控制。 </p>
<p>&nbsp;&nbsp;&nbsp; 我们在调试程序的时候，我们喜欢用System.out.println()这样的打印语句来跟踪我们的错误。但在程序发布的时候我们却没有把这样的语句都删除掉，在项目的运行中，也会影响效能。 </p>
<p>7.使用缓存 </p>
<p>　　读写内存要比读写文件要快很多，应尽可能使用缓冲。 </p>
<p>　　尽可能使用带有Buffer的类代替没有Buffer的类，如可以用BufferedReader 代替Reader，用BufferedWriter代替Writer来进行处理I/O操作。 </p>
<p>同样可以用BufferedInputStream代替InputStream都可以获得性能的提高。 <br>&nbsp;<br>8.Servlet的效率问题 </p>
<p>　　Servlet采用请求——响应模式提供Web服务，通过ServletResponse以及ServletRequest这两个对象来输出和接收用户传递的参数，在服务器端处理用户的请求，根据请求访问数据库、访问别的Servlet方法、调用EJB等等，然后将处理结果返回给客户端。 </p>
<p>　　&#183;尽量不使用同步 </p>
<p>Servlet是多线程的，以处理不同的请求，基于前面同步的分析，如果有太多的同步就失去了多线程的优势了。 </p>
<p>同步大多数使用在一个完整的事务中，避免事务中多方操作而引起的数据不同步现象。能用逻辑控制的尽量的用逻辑控制。 </p>
<p>　　&#183;不用保存太多的信息在HttpSession中 </p>
<p>　　很多时候，存储一些对象在HttpSession中是有必要的，可以加快系统的开发，如网上商店系统会把购物车信息保存在该用户的Session中，但当存储大量的信息或是大的对象在会话中是有害的，特别是当系统中用户的访问量很大，对内存的需求就会很高。 </p>
<p>具体开发时，在这两者之间应作好权衡。 </p>
<p>我们在写web应用时，经常只需要request的地方而使用了session，这样会是效率大大的降低的。但是我们用到了session，在项目的开发中又不能很好的利用session，这样对效率都是有影响的。比如说，我们把用户信息放在了session中，但是我们有时候在判断用户是否登录的时候，我们倾向去数据库里查这个是否有这个用户，又是用了request，但是这样是没有必要的，因为我们只需要判断session就行了。如果并发数量比较大的时候，服务器的负载就会过重。 </p>
<p>　　&#183;清除Session </p>
<p>　　通常情况，当达到设定的超时时间时，同时有些Session没有了活动，服务器会释放这些没有活动的Session，.. 不过这种情况下，特别是多用户并访时，系统内存要维护多个的无效Session。 </p>
<p>　　当用户退出时，应该手动释放，回收资源，实现如下：.. </p>
<p>HttpSession theSession = request.getSession();<br>// 获取当前Session<br>if(theSession != null){<br>　theSession.invalidate(); // 使该Session失效<br>} </p>
<p>9.数据库的操作 </p>
<p>在J2EE开发的应用系统中，数据库访问一般是个必备的环节。数据库用来存储业务数据，供应用程序访问。 </p>
<p>　　在Java技术的应用体系中，应用程序是通过JDBC（Java Database Connectivity）实现的接口来访问数据库的，JDBC支持&#8220;建立连接、SQL语句查询、处理结果&#8221;等基本功能。在应用JDBC接口访问数据库的过程中，只要根据规范来实现，就可以达到要求的功能。 </p>
<p>　　但是，有些时候进行数据查询的效率着实让开发人员不如所愿，明明根据规范编写的程序，运行效果却很差，造成整个系统的执行效率不高。 </p>
<p>　　&#183;使用速度快的JDBC驱动 </p>
<p>　　JDBC API包括两种实现接口形式，一种是纯Java实现的驱动，一种利用ODBC驱动和数据库客户端实现，具体有四种驱动模式并各有不同的应用范围，针对不同的应用开发要选择合适的JDBC驱动，在同一个应用系统中，如果选择不同的JDBC驱动，在效率上会有差别。 </p>
<p>例如，有一个企业应用系统，不要求支持不同厂商的数据库，这时就可以选择模式4的JDBC驱动，该驱动一般由数据库厂商实现的基于本地协议的驱动，直接调用数据库管理系统使用的协议，减少了模式3中的中间层。 </p>
<p>　　&#183;使用JDBC连接池 </p>
<p>　　为了提高访问数据库的性能，我们还可以使用JDBC 2.0的一些规范和特性，JDBC是占用资源的，在使用数据库连接时可以使用连接池Connection Pooling，避免频繁打开、关闭Connection。而我们知道，获取Connection是比较消耗系统资源的。 </p>
<p>　　Connection缓冲池是这样工作的：当一个应用程序关闭一个数据库连接时，这个连接并不真正释放而是被循环利用，建立连接是消耗较大的操作，循环利用连接可以显著的提高性能，因为可以减少新连接的建立。 </p>
<p>　　一个通过DataSource获取缓冲池获得连接，并连接到一个CustomerDB数据源的代码演示如下： </p>
<p>Context ctx = new InitialContext();<br>DataSource dataSource = (DataSource) ctx.lookup("jdbc/CustomerDB");<br>Connection conn = dataSource.getConnection("password","username"); </p>
<p>　　&#183;缓存DataSource </p>
<p>　　一个DataSource对象代表一个实际的数据源。这个数据源可以是从关系数据库到表格形式的文件，完全依赖于它是怎样实现的，一个数据源对象注册到JNDI名字服务后，应用程序就可以从JNDI服务器上取得该对象，并使用之和数据源建立连接。 </p>
<p>　　通过上面的例子，我们知道DataSource是从连接池获得连接的一种方式，通过JNDI方式获得，是占用资源的。 </p>
<p>　　为了避免再次的JNDI调用，可以系统中缓存要使用的DataSource。 </p>
<p>　　&#183;关闭所有使用的资源 </p>
<p>　　系统一般是并发的系统，在每次申请和使用完资源后，应该释放供别人使用，数据库资源每个模式的含义可以参考SUN JDBC的文档，不同是比较宝贵的，使用完成后应该保证彻底的释放。 </p>
<p>　　请看下面的代码段： </p>
<p>Connection conn = null;<br>Statement stmt = null;<br>ResultSet rs = null;<br>try {<br>　DataSource dataSource = getDataSource();<br>　// 取的DataSource的方法，实现略。<br>　conn = datasource.getConnection();<br>　stmt = conn.createStatement();<br>　rs = stmt.executeQuery("SELECT * FROM ...");<br>　... // 其他处理<br>　rs.close();<br>　stmt.close();<br>　conn.close();<br>}catch (SQLException ex) {<br>　... // 错误处理<br>} </p>
<p>　　粗看似乎没有什么问题，也有关闭相关如Connection等系统资源的代码，但当出现异常后，关闭资源的代码可能并不被执行，为保证资源的确实已被关闭，应该把资源关闭的代码放到finally块： </p>
<p>Connection conn = null;<br>Statement stmt = null;<br>ResultSet rs = null;<br>try {<br>　DataSource dataSource = getDataSource();<br>　// 取的DataSource的方法，实现略。<br>　conn = datasource.getConnection();<br>　stmt = conn.createStatement();<br>　rs = stmt.executeQuery("SELECT * FROM ...");</p>
<p>　... // 其他处理<br>}catch (SQLException ex) {<br>　... // 错误处理</p>
<p>}finally{<br>　if (rs!=null) {<br>　　try {<br>　　　rs.close(); // 关闭ResultSet}<br>　　catch (SQLException ex) {<br>　　　... // 错误处理<br>　　}<br>　}</p>
<p>　if (stmt!=null){<br>　　try {<br>　　　stmt.close(); // 关闭Statement}<br>　　catch (SQLException ex) {<br>　　　... // 错误处理<br>　　}<br>　}<br>　if (conn!=null){<br>　　try {<br>　　　conn.close(); // 关闭Connection}<br>　　catch (SQLException ex) {<br>　　　... // 错误处理<br>　　}<br>　}<br>} </p>
<p>　　&#183;大型数据量处理 </p>
<p>　　当我们在读取诸如数据列表、报表等大量数据时，可以发现使用EJB的方法是非常慢的，这时可以使用直接访问数据库的方法，用SQL直接存取数据，从而消除EJB的经常开支（例如远程方法调用、事务管理和数据序列化，对象的构造等）。 </p>
<p>　　&#183;缓存经常使用的数据 </p>
<p>　　对于构建的业务系统，如果有些数据要经常要从数据库中读取，同时，这些数据又不经常变化，这些数据就可以在系统中缓存起来，使用时直接读取缓存，而不用频繁的访问数据库读取数据。 </p>
<p>　　缓存工作可以在系统初始化时一次性读取数据，特别是一些只读的数据，当数据更新时更新数据库内容，同时更新缓存的数据值。 </p>
<p>一个例子是，在一套企业应用系统中，企业的信息数据（如企业的名称）在多个业务应用模块中使用，这时就可以把这些数据缓存起来，需要时直接读取缓存的企业信息数据。 </p>
<p>我们经常使用Hibernate这样的持久数据层的框架，就很好的利用了缓存的作用，所以在一定程度上弥补了封装而带来的效率丢失问题。但是在使用缓存的时候应该注意，因为访问的内存数据而不是真实的数据库数据，所以会出现脏读的情况。同时也并不是所有的东西都应该放在缓存中，不经常用到的我们就没有必要放在缓存中。有时候我们配合xml文件来使用，也不失一种好的方法。 </p>
<p>&nbsp; </p>
<p>一般意义上说，参与系统运行的代码都会对性能产生影响，实际应用中应该养成良好的编程规范、编写高质量的代码，当系统性能出现问题时，要找到主要影响性能的瓶颈所在，然后集中精力优化这些代码，能达到事半功倍的效果。 </p>
<p>　　J2EE性能的优化包括很多方面的，要达到一个性能优良的系统，除了关注代码之外，还应该根据系统实际的运行情况，从服务器软硬件环境、集群技术、系统构架设计、系统部署环境、数据结构、算法设计等方面综合考虑。 </p>
<p>&nbsp;</p>
<img src ="http://www.blogjava.net/zhip/aggbug/123509.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zhip/" target="_blank">zhip</a> 2007-06-12 08:49 <a href="http://www.blogjava.net/zhip/archive/2007/06/12/123509.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>［转］Struts Menu开发向导 </title><link>http://www.blogjava.net/zhip/archive/2007/03/29/107204.html</link><dc:creator>zhip</dc:creator><author>zhip</author><pubDate>Thu, 29 Mar 2007 05:40:00 GMT</pubDate><guid>http://www.blogjava.net/zhip/archive/2007/03/29/107204.html</guid><wfw:comment>http://www.blogjava.net/zhip/comments/107204.html</wfw:comment><comments>http://www.blogjava.net/zhip/archive/2007/03/29/107204.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/zhip/comments/commentRss/107204.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zhip/services/trackbacks/107204.html</trackback:ping><description><![CDATA[
		<div class="postTitle">
				<a class="postTitle2" id="viewpost1_TitleUrl" href="/fastzch/archive/2005/11/28/21615.html">
						<font color="#1a8bc8">［译］Struts Menu开发向导</font>
				</a>
		</div>
		<span id="zoom"> 官方英文版向导（<a href="http://struts-menu.sourceforge.net/userguide.html"><a href="http://struts-menu.sourceforge.net/userguide.html" target="_blank"><font color="#666666">http://struts-menu.sourceforge.net/userguide.html</font></a></a>） 
<p>一、从1.X升级到2.X需要做以下事情：<br />1、改变你的taglib声明中的URI。<br /><font style="BACKGROUND-COLOR: #ffe000"> &lt;% at taglib uri="</font><a href="http://struts-menu%20dot%20sf.net/tag"><font style="BACKGROUND-COLOR: #ffe000"><a href="http://struts-menu.sf.net/tag" target="_blank"><font color="#666666">http://struts-menu.sf.net/tag</font></a></font></a><font style="BACKGROUND-COLOR: #ffe000">" prefix="menu" %&gt;<br /></font>2、改变&lt;plug-in&gt;,使用新的包名"net.sf.navigator." 。<br /> <font style="BACKGROUND-COLOR: #ffe000">&lt;plug-in className="net.sf.navigator.menu.MenuPlugIn"&gt;</font><br />3、改变你的menu-config.xml文件，使用新的包名"net.sf.navigator." 。<br /><font style="BACKGROUND-COLOR: #ffe000"> &lt;Displayer name="Simple"<br />   type="net.sf.navigator.displayer.SimpleMenuDisplayer"/&gt;</font></p><p>二、快速开始：<br />1、下载最新的struts-menu版本；<br />2、解包到本地目录；<br />3、下载Tomcat或者其它Servlet容器；<br />4、把struts-menu.war包放入Tomcat安装目录的wabapps目录下，并重启Tomcat服务。<br />5、打开htpp://localhost:8080/struts-menu/</p><p>三、把Struts Menu整合到你的应用程序中：<br />Struts Menu能够被轻易的整合到你的Struts应用程序中，它也可以整合到一个非Struts的应用程序中，但是我不喜欢这样做，所以在此没有提供相应的教程。这里将一步步的带你整合这个标签库。<br />你需要把struts-menu.jar放到你的WEB-INF/lib目录下。然后使用URI标签声明你的JSP文件中想使用的这个标签库。<br />如果使用Struts Menu 2.1，你还需要 Jakarta's Standard Tag Library JAR包放入你的WEB-INF/lib目录下。下载地址：<a href="http://ibiblio.org/maven/taglibs/jars/standard-1.0.4.jar"><a href="http://ibiblio.org/maven/taglibs/jars/standard-1.0.4.jar" target="_blank"><font color="#666666">http://ibiblio.org/maven/taglibs/jars/standard-1.0.4.jar</font></a></a>，这个文件包括例程WAR包文件和二进制发布包。<br />1、放入struts-menu.jar包到你的应用程序的WEB-INF/lib目录中。<br />2、在你的struts-config.xml文件中加入plug-in设置。<br /><font style="BACKGROUND-COLOR: #ffe000"> &lt;plug-in className="net.sf.navigator.menu.MenuPlugIn"&gt;<br />   &lt;set-property property="menuConfig"<br />     value="/WEB-INF/menu-config.xml"/&gt;<br /> &lt;/plug-in&gt;</font><br />3、你将需要在你的应用程序的/WEB-INF/menu-config.xml文件中定义你的菜单，这里提供一个简单的片断：<br /><font style="BACKGROUND-COLOR: #ffe000"> &lt;Menu name="contactMenu" title="Contact" location="?Contact"&gt;<br />   &lt;Item name="email" title="E-Mail" location="?EMail"/&gt;<br />   &lt;Item name="phone" title="Phone" location="?Phone"/&gt;<br /> &lt;/Menu&gt;</font><br />　　更多全面的例程，请查看应用程序的web/WEB-INF目录中的menu-config.xml文件，你可以截取一段作为你需要的菜单。完整的属性列表，可以查看MenuBase class's javadocs（<a href="http://struts-menu.sourceforge.net/apidocs/net/sf/navigator/menu/MenuBase.html"><a href="http://struts-menu.sourceforge.net/apidocs/net/sf/navigator/menu/MenuBase.html" target="_blank"><font color="#666666">http://struts-menu.source......avigator/menu/MenuBase.html</font></a></a>）。<br />4、在你的JSP文件的顶部加入taglib声明：<br /> <font style="BACKGROUND-COLOR: #ffe000">&lt;% at taglib uri="</font><a href="http://struts-menu%20dot%20sf.net/tag"><font style="BACKGROUND-COLOR: #ffe000"><a href="http://struts-menu.sf.net/tag" target="_blank"><font color="#666666">http://struts-menu.sf.net/tag</font></a></font></a><font style="BACKGROUND-COLOR: #ffe000">" prefix="menu" %&gt;</font><br />5、在你的JSP文件中要放置菜单的位置加入taglib代码：<br /><font style="BACKGROUND-COLOR: #ffe000"> &lt;menu:useMenuDisplayer name="TabbedMenu"<br />   bundle="org.apache.struts.action.MESSAGE"&gt;<br />   &lt;menu:displayMenu name="Home"/&gt;<br />   &lt;menu:displayMenu name="About"/&gt;<br /> &lt;/menu:useMenuDisplayer&gt;</font><br />　　属性name="TabbedMenu"被定义在menu-config.xml文件的顶部：<br /><font style="BACKGROUND-COLOR: #ffe000"> &lt;Displayer name="TabbedMenu"<br />   type="net.sf.navigator.displayer.TabbedMenuDisplayer"/&gt;</font></p><p><font style="BACKGROUND-COLOR: #a0ff00">(译注：其实到此步即可在你的JSP文件中添加相应的菜单了，只不过是没有结合Velocity。在menu-config.xml文件的头部可以定义多个Displayer，每个Displayer都有name和type属性，name属性与JSP文件中menu:useMenuDisplayer标签的name属性相对应，即表明使用何种样式，具体的样式定义便在type属性中定义，type属性中是一个class。在menu-config.xml文件中的菜单定义中的name属性则与JSP文件中的menu:displayMenu标签的name属性相对应。)</font></p><p>使用定制的Velocity模版实施你的菜单，你需要整合Velocity到你的WEB应用程序中。如果需要这样做的话，请完成下面的步骤：<br />1、确定你的menu-config.xml文件有“Velocity”的displayer定义：<br /><font style="BACKGROUND-COLOR: #ffe000"> &lt;Displayer name="Velocity" <br />     type="net.sf.navigator.displayer.VelocityMenuDisplayer"/&gt;</font><br />2、加入Velocity的JARs包到你的WEB-INF/lib目录中，下载velocity-1.4-rc1.jar（<a href="http://www.ibiblio.org/maven/velocity/jars/velocity-1.4-rc1.jar"><a href="http://www.ibiblio.org/maven/velocity/jars/velocity-1.4-rc1.jar" target="_blank"><font color="#666666">http://www.ibiblio.org/ma......y/jars/velocity-1.4-rc1.jar</font></a></a>）和velocity-tools-view-1.0.jar（<a href="http://www.ibiblio.org/maven/velocity-tools/jars/velocity-tools-view-1.0.jar"><a href="http://www.ibiblio.org/maven/velocity-tools/jars/velocity-tools-view-1.0.jar" target="_blank"><font color="#666666">http://www.ibiblio.org/ma......velocity-tools-view-1.0.jar</font></a></a>）。 <br />3、加入globalMacros.vm（<a href="http://cvs.sourceforge.net/viewcvs.py/*checkout*/struts-menu/navigator/web/WEB-INF/classes/globalMacros.vm?content-type=text%2Fplain&amp;rev=1.1"><a href="http://cvs.sourceforge.net/viewcvs.py/" target="_blank"><font color="#666666">http://cvs.sourceforge.net/viewcvs.py/</font></a>*checkout*/struts-menu/navigator/web/WEB-INF/classes/globalMacros.vm?content-type=text%2Fplain&amp;rev=1.1</a>（右键另存为））到你的WEB-INF/lib目录中。<br />4、改变你的JSP文件中displayer的值为“Velocity”，“config”属性指向一个文件（如config="/templates/tabs.html"）或者如果tabs.htm在你的WEB-INF/classes目录中的话，则可设config="tabs.html"。</p><p>这里提供了一些使用Velocity的displayer例子，可在sample application（<a href="http://demo.raibledesigns.com/struts-menu/index.jsp"><a href="http://demo.raibledesigns.com/struts-menu/index.jsp" target="_blank"><font color="#666666">http://demo.raibledesigns.com/struts-menu/index.jsp</font></a></a>）中查看。它总是在你的菜单需要的时候显示CSS，JavaScript和图像文件。下面有一些在当前的Struts Menu中用到的Velocity模版的例子的链接：<br /> CoolMenus: Demo（<a href="http://demo.raibledesigns.com/struts-menu/velocity-coolmenu4.jsp"><a href="http://demo.raibledesigns.com/struts-menu/velocity-coolmenu4.jsp" target="_blank"><font color="#666666">http://demo.raibledesigns......menu/velocity-coolmenu4.jsp</font></a></a>）, <br />  　 Template（<a href="http://struts-menu.sourceforge.net/templates/coolmenus.html"><a href="http://struts-menu.sourceforge.net/templates/coolmenus.html" target="_blank"><font color="#666666">http://struts-menu.sourceforge.net/templates/coolmenus.html</font></a></a>） <br /> NiceTabs: Demo, Template <br /> Tabs: Demo, Template <br /> XTree: Demo, Template </p><p>所有相关的有用的文件如果你需要的话都可以在下面的站点上下载：<br /> Images （<a href="http://struts-menu.sourceforge.net/menu-images/"><a href="http://struts-menu.sourceforge.net/menu-images/" target="_blank"><font color="#666666">http://struts-menu.sourceforge.net/menu-images/</font></a></a>）<br /> Stylesheets （<a href="http://struts-menu.sourceforge.net/styles/"><a href="http://struts-menu.sourceforge.net/styles/" target="_blank"><font color="#666666">http://struts-menu.sourceforge.net/styles/</font></a></a>）<br /> Scripts （<a href="http://struts-menu.sourceforge.net/scripts/"><a href="http://struts-menu.sourceforge.net/scripts/" target="_blank"><font color="#666666">http://struts-menu.sourceforge.net/scripts/</font></a></a>）<br /> Templates （<a href="http://struts-menu.sourceforge.net/templates/"><a href="http://struts-menu.sourceforge.net/templates/" target="_blank"><font color="#666666">http://struts-menu.sourceforge.net/templates/</font></a></a>）</p><p>更多的基于roles的显示/隐藏菜单的信息，请查看FAQs（<a href="http://struts-menu.sourceforge.net/faq.html"><a href="http://struts-menu.sourceforge.net/faq.html" target="_blank"><font color="#666666">http://struts-menu.sourceforge.net/faq.html</font></a></a>）。</p><p>四、在Struts之外使用Struts Menu:<br />在2.2版中，Menu Repository能够使用MenuContextListener载入：<br /><font style="BACKGROUND-COLOR: #ffe000"> &lt;!--<br />    - Loads the menu-config.xml for struts-menu at startup,<br />    - by default from "/WEB-INF/menu-config.xml".<br />    - To override this, add a context-param named "menuConfigLocation"<br />    - web.xml file.<br />    --&gt;<br /> &lt;listener&gt;<br />     &lt;listener-class&gt;net.sf.navigator.menu.MenuContextListener&lt;/listener-class&gt;<br /> &lt;/listener&gt;</font></p><p>或者如果你使用Spring，甚至更容易。仅仅需要加入下面的部分到你的applicationContext.xml文件中：<br /><font style="BACKGROUND-COLOR: #ffe000"> &lt;bean id="menu" class="net.sf.navigator.menu.MenuLoader"&gt;<br />   &lt;property name="menuConfig"&gt;<br />     &lt;value&gt;/WEB-INF/menu-config.xml&lt;/value&gt;<br />   &lt;/property&gt;<br /> &lt;/bean&gt;<br /> &lt;!-- The menuConfig property is an optional attribute.  It is set to<br />     /WEB-INF/menu-config.xml by default. --&gt;</font><br />感谢Dan Luputan提供MenuLoader类的源代码。</p><p>五、从源文件编译：<br />要从源文件编译这个项目，执行下面的步骤：<br />1、下载并安装Maven（<a href="http://maven.apache.org/"><a href="http://maven.apache.org/" target="_blank"><font color="#666666">http://maven.apache.org/</font></a></a>）；<br />2、创建一个环境变量MAVEN＿HOME指出你的Maven的安装目录，然后添加$MAVEN_HOME/bin到你的PATH变量中；<br />3、操纵这个目录你可以扩展源代码，执行“maven.jar”创建target/struts-menu.jar。</p><p>要展开struts-menu例程，需要下面的步骤：<br />1、下载和安装Tomcat；<br />2、创建一个环境变量CATALINA＿HOME指出你的Tomcat的安装目录；<br />3、执行“maven deploy”把应用程序展开到Tomcat中；<br />4、打开<a href="http://localhost:8080/struts-menu"><a href="http://localhost:8080/struts-menu" target="_blank"><font color="#666666">http://localhost:8080/struts-menu</font></a></a>在你喜爱的浏览器中。</p><p>如果你喜欢使用Eclipse开发项目，请参考此份开发向导（<a href="http://struts-menu.sourceforge.net/devguide.html"><a href="http://struts-menu.sourceforge.net/devguide.html" target="_blank"><font color="#666666">http://struts-menu.sourceforge.net/devguide.html</font></a></a>）。 </p></span>
<img src ="http://www.blogjava.net/zhip/aggbug/107204.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zhip/" target="_blank">zhip</a> 2007-03-29 13:40 <a href="http://www.blogjava.net/zhip/archive/2007/03/29/107204.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>错误处理Log</title><link>http://www.blogjava.net/zhip/archive/2007/01/07/92183.html</link><dc:creator>zhip</dc:creator><author>zhip</author><pubDate>Sat, 06 Jan 2007 20:49:00 GMT</pubDate><guid>http://www.blogjava.net/zhip/archive/2007/01/07/92183.html</guid><wfw:comment>http://www.blogjava.net/zhip/comments/92183.html</wfw:comment><comments>http://www.blogjava.net/zhip/archive/2007/01/07/92183.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/zhip/comments/commentRss/92183.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zhip/services/trackbacks/92183.html</trackback:ping><description><![CDATA[
		<p>1、关于java.lang.OutOfMemoryError: Java heap space<br /><br />java -Xms&lt;initial heap size&gt; -Xmx&lt;maximum heap size&gt;<br />Defaults are:<br />java -Xms32m -Xmx128m</p>
		<p>如果你用win<br />/tomcat/bin/catalina.bat 加上下面的命令:<br />set JAVA_OPTS=-Xms32m -Xmx256m</p>
		<p>如果你用unix/linux<br />/tomcat/bin/catalina.sh 加上下面的命令:<br />JAVA_OPTS="-Xms32m -Xmx256m"</p>
		<p> 其中, -Xms128m指Java使用的最少内存为32M，最大使用内存为256M</p>
		<p>
				<br />这里以tomcat环境为例，其它WEB服务器如jboss,weblogic等是同一个道理。<br />一、java.lang.OutOfMemoryError: PermGen space</p>
		<p>PermGen space的全称是Permanent Generation space,是指内存的永久保存区域,<br />这块内存主要是被JVM存放Class和Meta信息的,Class在被Loader时就会被放到PermGen space中,<br />它和存放类实例(Instance)的Heap区域不同,GC(Garbage Collection)不会在主程序运行期对<br />PermGen space进行清理，所以如果你的应用中有很多CLASS的话,就很可能出现PermGen space错误,<br />这种错误常见在web服务器对JSP进行pre compile的时候。如果你的WEB APP下都用了大量的第三方jar, 其大小<br />超过了jvm默认的大小(4M)那么就会产生此错误信息了。<br />解决方法： 手动设置MaxPermSize大小</p>
		<p>修改TOMCAT_HOME/bin/catalina.sh<br />在“echo "Using CATALINA_BASE:   $CATALINA_BASE"”上面加入以下行：<br />JAVA_OPTS="-server -XX:PermSize=64M -XX:MaxPermSize=128m<br />建议：将相同的第三方jar文件移置到tomcat/shared/lib目录下，这样可以达到减少jar 文档重复占用内存的目的。</p>
		<p>二、java.lang.OutOfMemoryError: Java heap space<br />Heap size 设置<br />JVM堆的设置是指java程序运行过程中JVM可以调配使用的内存空间的设置.JVM在启动的时候会自动设置Heap size的值，<br />其初始空间(即-Xms)是物理内存的1/64，最大空间(-Xmx)是物理内存的1/4。可以利用JVM提供的-Xmn -Xms -Xmx等选项可<br />进行设置。Heap size 的大小是Young Generation 和Tenured Generaion 之和。<br />提示：在JVM中如果98％的时间是用于GC且可用的Heap size 不足2％的时候将抛出此异常信息。<br />提示：Heap Size 最大不要超过可用物理内存的80％，一般的要将-Xms和-Xmx选项设置为相同，而-Xmn为1/4的-Xmx值。 <br />解决方法：手动设置Heap size<br />修改TOMCAT_HOME/bin/catalina.sh<br />在“echo "Using CATALINA_BASE:   $CATALINA_BASE"”上面加入以下行：<br />JAVA_OPTS="-server -Xms800m -Xmx800m   -XX:MaxNewSize=256m"</p>
		<p>三、实例，以下给出1G内存环境下java jvm 的参数设置参考：</p>
		<p>JAVA_OPTS="-server -Xms800m -Xmx800m  -XX:PermSize=64M -XX:MaxNewSize=256m -XX:MaxPermSize=128m -Djava.awt.headless=true "<br /><br />2、<font color="#000000">Tomcat启动时报filterStart出错(Error filterStart)</font><br /></p>
		<p>试着把tomat/server/lib目录下的commons-digester.jar,commons-beanutils.jar拷贝到common/lib/目录</p>
		<p>这种方法也许可以帮助解决此问题。</p>
<img src ="http://www.blogjava.net/zhip/aggbug/92183.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zhip/" target="_blank">zhip</a> 2007-01-07 04:49 <a href="http://www.blogjava.net/zhip/archive/2007/01/07/92183.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>如何打jar包</title><link>http://www.blogjava.net/zhip/archive/2006/11/20/82332.html</link><dc:creator>zhip</dc:creator><author>zhip</author><pubDate>Mon, 20 Nov 2006 09:22:00 GMT</pubDate><guid>http://www.blogjava.net/zhip/archive/2006/11/20/82332.html</guid><wfw:comment>http://www.blogjava.net/zhip/comments/82332.html</wfw:comment><comments>http://www.blogjava.net/zhip/archive/2006/11/20/82332.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/zhip/comments/commentRss/82332.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zhip/services/trackbacks/82332.html</trackback:ping><description><![CDATA[
		<p>jar 应用 先打开命令提示符(win2000或在运行筐里执行cmd命令，win98为DOS提示符)，输入jar -help,然后回车(如果你盘上已经有了jdk1.1或以上版本)，看到什么：<br />用法：jar {ctxu}[vfm0Mi] [jar-文件] [manifest-文件] [-C 目录] 文件名 ... </p>
		<p>选项：<br />-c 创建新的存档 <br />-t 列出存档内容的列表 <br />-x 展开存档中的命名的（或所有的〕文件 <br />-u 更新已存在的存档 <br />-v 生成详细输出到标准输出上 <br />-f 指定存档文件名 <br />-m 包含来自标明文件的标明信息 <br />-0 只存储方式；未用ZIP压缩格式 <br />-M 不产生所有项的清单（manifest〕文件 <br />-i 为指定的jar文件产生索引信息 <br />-C 改变到指定的目录，并且包含下列文件： </p>
		<p>如果一个文件名是一个目录，它将被递归处理。<br />清单（manifest〕文件名和存档文件名都需要被指定，按'm' 和 'f'标志指定的相同顺序. </p>
		<p>示例1：将两个class文件存档到一个名为 'classes.jar' 的存档文件中： <br />jar cvf classes.jar Foo.class Bar.class </p>
		<p>示例2：用一个存在的清单（manifest）文件 'mymanifest' 将 foo/ 目录下的所有文件存档到一个名为 'classes.jar' 的存档文件中： <br />jar cvfm classes.jar mymanifest -C foo/ . </p>
		<p>来个小例子试试看： <br />我们只有一个HelloWorld，如下：<br />public class HelloWorld{ <br />    public static void main(String[] args){ <br />        System.out.println("Hi, Hello World!"); <br />    } <br />}<br />我将这个java文件存到C盘跟目录下，ok，接下来， </p>
		<p>在先前打开的命令提示符下(跳转到C盘提示符下)，我们输入javac HelloWorld.java，然后继续输入：jar cvf hello.jar HelloWorld.class，回车后去你的C盘看看，多了什么，没错 hello.jar 。 </p>
		<p>基本的步骤我们现在都知道了，你可以自己去尝试一下随着jar后面的参数的不同，结果有什么变化。 </p>
		<p>紧接着我们看看如何运行我们的jar包。 </p>
		<p>在进入正题之前，你要先打开我们刚刚做好的jar包看看，多了什么呢，META-INF目录？再看看里面是什么，还有一个MANIFEST.MF文件是不是？用文本编辑器(我这里是UltraEdit)打开它看看： <br />Manifest-Version: 1.0 <br />Created-By: 1.4.2 (Sun Microsystems Inc.) </p>
		<p>就是这样。这里我们对它进行修改，加一句：Main-Class: HelloWorld (在第三行)。这个就是我们之前写的那个类，也就是我们的入口类。也即， <br />Manifest-Version: 1.0 <br />Created-By: 1.4.2 (Sun Microsystems Inc.) <br />Main-Class: HelloWorld </p>
		<p>接下来，我们在命令提示符里执行： <br />jar umf MANIFEST.MF app.jar </p>
		<p>这样我们使用了我们自己的MANIFEST.MF文件对原来默认的进行了更新。你不妨可以再进去看看是不是添上了Main-Class: HelloWorld这一句。 </p>
		<p>Ok，这个最后的一步了，来验证我们做的一切，在命令提示符中输入： <br />java -jar hello.jar(执行) </p>
		<p>出现了什么，――Hi, Hello World! <br />我们再来看看jar文件在tomcat中发布，注意：在tomcat中我们就不能再用jar这种格式，而改war格式，它是专门用于web应用的，其实整个过程下来基本上和jar是类似的： </p>
		<p>先准备我们要打包的资源。 </p>
		<p>找到存放tomcat的webapps目录，进到其中，新建一个文件夹，这里命名为hello，再进去新建WEB-INF文件夹，再进去新建 classes文件夹，此时我们也将我们唯一的servlet，HelloWorld.java放到这里，在与classes目录同级下建立一文件 web.xml。Ok，目前我们初步建立了一个简单的web应用。 </p>
		<p>在命令提示符下进到先前创制的hello目录下，执行 jar cvf hello.war * ，我们便得到hello.war。将它拷贝至webapps目录下，ok，来看最后一步，打开tomcat的目录conf中的server.xml，加入：<br />reloadable="true"/&gt; <br />大功告成！运行它，启动tomcat，后在浏览器中输入<a href="http://localhost:8080/hello/HelloWorld"><font color="#fecd2a">http://localhost:8080/hello/HelloWorld</font></a>，有了吗？ </p>
		<p>好了，就这么多，希望对你有点帮助。</p>
		<p>补充： <br />############ </p>
		<p>jar基本操作： </p>
		<p>############ </p>
		<p>1. 创建jar文件 <br />jar cf jar-file input-file(s) <br />c---want to Create a JAR file. <br />f---want the output to go to a file rather than to stdout. <br />eg: 1)jar cf myjar.jar query_maintain_insert.htm <br />2)jar cvf myjar.jar query_maintain_insert.htm <br />v---Produces verbose(详细的) output. <br />3)jar cvf myjar.jar query_maintain_insert.htm mydirectory <br />4)jar cv0f myjar.jar query_maintain_insert.htm mydirectory <br />0---don't want the JAR file to be compressed. <br />5)jar cmf MANIFEST.MF myjar.jar yahh.txt <br />m---Used to include manifest information from an existing manifest file. <br />6)jar cMf MANIFEST.MF myjar.jar yahh.txt <br />M---the default manifest file should not be produced. <br />7)jar cvf myjar.jar * <br />*---create all contents in current directory. <br />2. 察看jar文件 <br />jar tf jar-file <br />t---want to view the Table of contents of the JAR file. <br />eg: 1)jar vft yahh.jar <br />v---Produces verbose(详细的) output. <br />3. 提取jar文件 <br />jar xf jar-file [archived-file(s)] <br />x---want to extract files from the JAR archive. <br />eg: 1)jar xf yahh.jar yahh.txt(仅提取文件yahh.txt) <br />2)jar xf yahh.jar alex/yahhalex.txt(仅提取目录alex下的文件yahhalex.txt) <br />3)jar xf yahh.jar(提取该jar包中的所有文件或目录) <br />4. 修改Manifest文件 <br />jar cmf manifest-addition jar-file input-file(s) <br />m---Used to include manifest information from an existing manifest file. <br />5. 更新jar文件<br />jar uf jar-file input-file(s) <br />u---want to update an existing JAR file. </p>
		<p>--&gt;生成exe:&lt;--</p>
		<p>
				<br />第一種：在jbuilder中：      <br />首先你要保证Run菜单--&gt;Run    Project能顺利运行      <br />然后Wizards菜单--&gt;Native    Executable    Builder      <br />选中Compress    the    contents    of    the    archive(产生jar文件的话)      <br />Next--&gt;Next--&gt;选中Always    include    all    classes    and    resources再Next--&gt;Next--&gt;Next      <br />选中Windows    GUI"exe"(产生EXE文件的话)--&gt;Finish      <br />再在项目的文件列表中的Native    Executable右击--&gt;Make就可以了      <br />   <br />第二種：在cmd    下生成jar文件      <br />abc.txt内容如下：      <br />Manifest-Version:    1.0          <br />Main-Class:    main-class-name(回車)      <br />在cmd下：          <br />javac    *.java      <br />jar    cvfm    abc.jar    abc.txt    *.class      <br />示例——生成能通过鼠标双击就执行的.jar文件      <br />一、            编写Java源程序Test.java如下：      </p>
		<p>//    Test.java      <br />import    javax.swing.*;      <br />/**      <br />*    @(#)    Test.java      <br />*    Copyleft    (c)    2002    RatKing      <br />*    @author    &lt;a    href="<a href="mailto:ratking@ynet.com&quot;&gt;RatKing&lt;/a"><font color="#fecd2a">ratking@ynet.com"&gt;RatKing&lt;/a</font></a>&gt;      <br />*    @version    0.1,    2002-11-7      <br />*    描述：一个<nobr><a class="iAs" oncontextmenu="return false;" onmousemove="kwM(4);" onmouseover="kwE(event,4);" style="CURSOR: hand; COLOR: #0000ff; BACKGROUND-COLOR: transparent; TEXT-DECORATION: underline" onclick="window.open('http://114.vnet.cn/search_web.html?id=148&amp;kw=测试','_blank');" onmouseout="kwL(event);" target="_blank">测试</a></nobr>用的Java    Application      <br />*/      <br />public    class    Test    extends    JFrame    {      <br />             public    Test(String    title)    {      <br />                             super(title);      <br />                             this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);      <br />                             this.getContentPane().add(new    JLabel("测试！",    JLabel.CENTER),    SwingConstants.CENTER);      <br />                             this.pack();      <br />             }      <br />   <br />             public    static    void    main(String[]    args)    {      <br />                             try    {      <br />                                             //UIManager.setLookAndFeel(UIManager.getCrossPlatformLookAndFeelClassName());      <br />                                             UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());      <br />                             }    catch(Exception    e)    {      <br />                                             e.printStackTrace();      <br />                             }      <br />                             Test    t    =    new    Test("Test    -    测试");      <br />                             t.setVisible(true);      <br />             }      <br />}      <br />   </p>
		<p>二、编译Test.java为Test.class（当然假设你事先已经设置好了JDK的环境变量PATH和CLASSPATH）      <br />在命令行执行编译命令：      <br />javac    Test.java      <br />   <br />三、用文本编辑器（比如记事本/UltraEdit等    -    甚至用ECHO命令加管道“&gt;&gt;”）编写如下manifest文件，并保存为abc.txt      <br />   <br />Manifest-Version:    1.0      <br />Main-Class:    Test      <br />   <br />【注意】文件abc.txt内必须是3行文本：      <br />第一行的内容依次是：“Manifest”、英文减号、“Version”、英文冒号、英文空格、数字“1”、英文句号、数字“0”      <br />第二行的英文冒号与Test之间必须要有一个英文空格！！！      <br />第三行是一个空行，也就是说，你要在Test之后键入一个回车，然后才可以存盘退出！！！      <br />如果冒号后面没有空格，可以生成jar文件但不能执行；如果Test后没有回车符，则生成jar文件时会报错。      <br />   <br />四、将Test.class打包成.jar文件，并使用abc.txt指明哪一个是带有public    static    void    main()的“主函数”      <br />在命令行执行编译命令：      <br />jar    cvfm    Test.jar    abc.txt    *.class      <br />   <br />你可以使用WinZip之类的解压<nobr><a class="iAs" oncontextmenu="return false;" onmousemove="kwM(2);" onmouseover="kwE(event,2);" style="CURSOR: hand; COLOR: #0000ff; BACKGROUND-COLOR: transparent; TEXT-DECORATION: underline" onclick="window.open('http://114.vnet.cn/search_web.html?id=148&amp;kw=软件','_blank');" onmouseout="kwL(event);" target="_blank">软件</a></nobr>看一看刚刚生成的Test.jar文件里到底有什么。      <br />   <br />五、用鼠标双击Test.jar的图标，应该可以看到Test执行后的窗口。      <br />   <br />〖说明〗如果你正确地安装了Java运行环境（JRE），那么.jar的图标应该是象一页纸并有一个A的形状，就如同写字板的图标。      <br />如果你的.jar文件默认的打开关联不对，可以重新设置：      <br />我的<nobr><a class="iAs" oncontextmenu="return false;" onmousemove="kwM(6);" onmouseover="kwE(event,6);" style="CURSOR: hand; COLOR: #0000ff; BACKGROUND-COLOR: transparent; TEXT-DECORATION: underline" onclick="window.open('http://114.vnet.cn/search_web.html?id=148&amp;kw=电脑','_blank');" onmouseout="kwL(event);" target="_blank">电脑</a></nobr>-&gt;查看(Win9x)或工具(Win2k)-&gt;文件夹选项-&gt;文件类型-&gt;选择JAR文件-&gt;编辑该类型文件的属性-&gt;操作栏填入[    open    ](不填引号和中括号[])，并在“执行操作的应用程序”栏填入[    "C:\Program    Files\Java\j2re1.4.1\bin\javaw.exe"    -jar    "%1"    %*    ](填两对英文引号，不填[])      <br />并按“确定”、“关闭”退出对.jar文件关联的编辑。      <br />（你的javaw.exe文件是不是位于C:\Program    Files\Java\j2re1.4.1\bin\路径下，视你自己电脑的情况而定）      </p>
		<p>
				<br />我这也是网上的贴子  <br />---------------------------------------------------------------  </p>
		<p>JB中生成.exe文件  <br />1、菜单中选择【Wizards】－【Native  Executable  Builder....】弹出对话框  <br />2、在弹出的对话框中第一步（Step  1  of  7）的【Name】输入一个名称，并取消【Always  create  archive  when  building  the  project】点击【Next】  <br />3、根据需要悬着需要的类，再选择【Include  class  dependencies】，点击【Next】  <br />4、根据需要悬着需要的库文件，再选择下面的4个单选,反复所有的需要的库，点击【Next】  <br />5、默认点击【Next】  <br />6、在（Step  5  of  7）的时候选择一个主类运行点击【Next】  <br />7、在（Step  6  of  7）的时候选择运行平台【Next】  <br />8、默认点击【Finish】，这时候在工程的目录窗口出现了一个在（Step  1  of  7）输入的【Name】目录  <br />9、右击这个目录，选择【Rebuild....】，Jbuilder就开始编译和创建执行文件或是Jar文件了  <br />10、等完成之后，该目录下右几个文件，一般是有至少一个jar文件，或是一个exe文件  <br />11、在Window打开工程所在的目录，就可以看到里面的有几个刚才编译的文件  <br />12、执行jar就是用java  -jar  ***.jar、执行exe直接双击  </p>
		<p>
				<br />---------------------------------------------------------------  </p>
		<p>1、不建议使用jb因为打包后，可执行文件的图标改不了且jb的可执行文件实际上是可执行的jar文件，可以将其exe扩展名改为jar一样可执行。  <br />2、还是使用jsmooth较好，首先编写menifest文件目的指明main类，使用jar命令打包成可执行jar文件，让后使用开源的jsmooth做成exe。 </p>
<img src ="http://www.blogjava.net/zhip/aggbug/82332.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zhip/" target="_blank">zhip</a> 2006-11-20 17:22 <a href="http://www.blogjava.net/zhip/archive/2006/11/20/82332.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>使用javamail发送html邮件[转]</title><link>http://www.blogjava.net/zhip/archive/2006/09/28/72606.html</link><dc:creator>zhip</dc:creator><author>zhip</author><pubDate>Thu, 28 Sep 2006 07:57:00 GMT</pubDate><guid>http://www.blogjava.net/zhip/archive/2006/09/28/72606.html</guid><wfw:comment>http://www.blogjava.net/zhip/comments/72606.html</wfw:comment><comments>http://www.blogjava.net/zhip/archive/2006/09/28/72606.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/zhip/comments/commentRss/72606.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zhip/services/trackbacks/72606.html</trackback:ping><description><![CDATA[
		<table cellspacing="0" cellpadding="0" width="100%" border="0">
				<tbody>
						<tr>
								<td>
										<p>使用javamail发送html邮件比较复杂<br /></p>
										<p>
												<a href="http://www.52z.com/soft/1644.html">http://www.52z.com/soft/1644.html</a>
												<br />
												<a href="http://down.jdxz.net/downinfo/8080.html">http://down.jdxz.net/downinfo/8080.html</a>
												<br />
												<a href="http://www.skycn.com/soft/10940.html">http://www.skycn.com/soft/10940.html</a>
												<br />package org.tatan.mail;</p>
										<p>import javax.mail.internet.InternetAddress;<br />import javax.mail.internet.MimeMessage;<br />import javax.mail.internet.MimeUtility;<br />import javax.mail.Session;<br />import javax.mail.MessagingException;<br />import javax.mail.Transport;</p>
										<p>public class SendHtmlMail {<br />    public static void sendMessage(String smtpHost,<br />                                   String from, String to,<br />                                   String subject, String messageText)<br />            throws MessagingException,java.io.UnsupportedEncodingException {</p>
										<p>        // Step 1:  Configure the mail session<br />        System.out.println("Configuring mail session for: " + smtpHost);<br />        java.util.Properties props = new java.util.Properties();<br />        props.setProperty("mail.smtp.auth", "true");//指定是否需要SMTP验证<br />        props.setProperty("mail.smtp.host", smtpHost);//指定SMTP服务器<br />        props.put("mail.transport.protocol", "smtp");<br />        Session mailSession = Session.getDefaultInstance(props);<br />        mailSession.setDebug(true);//是否在控制台显示debug信息</p>
										<p>        // Step 2:  Construct the message<br />        System.out.println("Constructing message -  from=" + from + "  to=" + to);<br />        InternetAddress fromAddress = new InternetAddress(from);<br />        InternetAddress toAddress = new InternetAddress(to);</p>
										<p>        MimeMessage testMessage = new MimeMessage(mailSession);<br />        testMessage.setFrom(fromAddress);<br />        testMessage.addRecipient(javax.mail.Message.RecipientType.TO, toAddress);<br />        testMessage.setSentDate(new java.util.Date());<br />        testMessage.setSubject(MimeUtility.encodeText(subject,"gb2312","B"));</p>
										<p>        testMessage.setContent(messageText, "text/html;charset=gb2312");<br />        System.out.println("Message constructed");</p>
										<p>        // Step 3:  Now send the message<br />        Transport transport = mailSession.getTransport("smtp");<br />        transport.connect(smtpHost, "webmaster", "password");<br />        transport.sendMessage(testMessage, testMessage.getAllRecipients());<br />        transport.close();</p>
										<p>
												<br />        System.out.println("Message sent!");<br />    }</p>
										<p>    public static void main(String[] args) {</p>
										<p>        String smtpHost = "localhost";<br />        String from = "<a href="mailto:webmaster@mymail.com">webmaster@mymail.com</a>";<br />        String to = "<a href="mailto:mfc42d@sohu.com">mfc42d@sohu.com</a>";<br />        String subject = "html邮件测试"; //subject javamail自动转码</p>
										<p>        StringBuffer theMessage = new StringBuffer();<br />        theMessage.append("&lt;h2&gt;&lt;font color=red&gt;这倒霉孩子&lt;/font&gt;&lt;/h2&gt;");<br />        theMessage.append("&lt;hr&gt;");<br />        theMessage.append("&lt;i&gt;年年失望年年望&lt;/i&gt;");</p>
										<p>        try {<br />            SendHtmlMail.sendMessage(smtpHost, from, to, subject, theMessage.toString());<br />        }<br />        catch (javax.mail.MessagingException exc) {<br />            exc.printStackTrace();<br />        }<br />        catch (java.io.UnsupportedEncodingException exc) {<br />            exc.printStackTrace();<br />        }<br />    }<br />}<br />邮件头(参见RFC822，RFC2047)只能包含US-ASCII字符。<br />邮件头中任何包含非US-ASCII字符的部分必须进行编码，使其只包含US-ASCII字符。<br />但是java mail可以根据JVM发送中文邮件自行编码，，用它自带的MimeUtility类的encodeText方法对中文信息进行编码也可以。<br />邮件正文必须有charset=gb2312否则为<br />Content-Type: text/html; charset=us-ascii<br />Content-Transfer-Encoding: 7bit<br />打开邮件为乱码,设置charset=gb2312后<br />Content-Type: text/html;charset=gb2312<br />Content-Transfer-Encoding: quoted-printable<br />它不能用MimeUtility里的方法来编码。<br />邮件正文的编码方式的信息是要放在Content-Transfer-Encoding这个邮件头参数中的，<br />而MimeUtility里面的方法是将编码方式的信息放在编码后的正文内容中。<br />所以如果你对正文也用MimeUtility进行处理，那么其他邮件程序就不会正常显示你编码的邮件，<br />因为其他邮件软件如outlook,foxmail只会根据Content-Transfer-Encoding这个里面的信息来对邮件正文进行解码。</p>
								</td>
						</tr>
				</tbody>
		</table>
<img src ="http://www.blogjava.net/zhip/aggbug/72606.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zhip/" target="_blank">zhip</a> 2006-09-28 15:57 <a href="http://www.blogjava.net/zhip/archive/2006/09/28/72606.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>javamail发送带有附件的html邮件[转]</title><link>http://www.blogjava.net/zhip/archive/2006/09/28/72600.html</link><dc:creator>zhip</dc:creator><author>zhip</author><pubDate>Thu, 28 Sep 2006 07:51:00 GMT</pubDate><guid>http://www.blogjava.net/zhip/archive/2006/09/28/72600.html</guid><wfw:comment>http://www.blogjava.net/zhip/comments/72600.html</wfw:comment><comments>http://www.blogjava.net/zhip/archive/2006/09/28/72600.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/zhip/comments/commentRss/72600.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zhip/services/trackbacks/72600.html</trackback:ping><description><![CDATA[
		<p>package org.tatan.mail;</p>
		<p>import javax.mail.Session;<br />import javax.mail.MessagingException;<br />import javax.mail.Multipart;<br />import javax.mail.Transport;<br />import javax.mail.internet.InternetAddress;<br />import javax.mail.internet.MimeMessage;<br />import javax.mail.internet.MimeBodyPart;<br />import javax.mail.internet.MimeMultipart;<br />import javax.activation.FileDataSource;<br />import javax.activation.DataHandler;</p>
		<p>
				<br />public class SendAttachMail {<br />    public static void sendMessage(String smtpHost,<br />                                   String from, String to,<br />                                   String subject, String messageText,<br />                                   String fileName)<br />            throws MessagingException {</p>
		<p>        // Step 1:  Configure the mail session<br />        java.util.Properties props = new java.util.Properties();<br />        props.setProperty("mail.smtp.auth", "true");//指定是否需要SMTP验证<br />        props.setProperty("mail.smtp.host", smtpHost);//指定SMTP服务器<br />        props.put("mail.transport.protocol", "smtp");<br />        Session mailSession = Session.getDefaultInstance(props);<br />        mailSession.setDebug(true);//是否在控制台显示debug信息</p>
		<p>        // Step 2:  Construct the message<br />        System.out.println("Constructing message -  from=" + from + "  to=" + to);<br />        InternetAddress fromAddress = new InternetAddress(from);<br />        InternetAddress toAddress = new InternetAddress(to);</p>
		<p>        MimeMessage testMessage = new MimeMessage(mailSession);<br />        testMessage.setFrom(fromAddress);<br />        testMessage.addRecipient(javax.mail.Message.RecipientType.TO, toAddress);<br />        testMessage.setSentDate(new java.util.Date());<br />        testMessage.setSubject(subject);</p>
		<p>        //  Step 3:  Create a body part to hold the "text" portion of the message<br />        System.out.println("Constructing 'text' body part");<br />        MimeBodyPart textBodyPart = new MimeBodyPart();<br />        textBodyPart.setContent(messageText,"text/html;charset=gb2312");</p>
		<p>        //  Step 4:  Create a body part to hold the "file" portion of the message<br />        System.out.println("Attaching 'file' body part: " + fileName);<br />        MimeBodyPart fileBodyPart = new MimeBodyPart();<br />        FileDataSource fds = new FileDataSource("c:\\a.rar");<br />        fileBodyPart.setDataHandler(new DataHandler(fds));<br />        fileBodyPart.setFileName(fds.getName());<br />        System.out.println("Finished attaching file");</p>
		<p>        // Step 5:  Create a Multipart/container and add the parts<br />        Multipart container = new MimeMultipart();<br />        container.addBodyPart(textBodyPart);<br />        container.addBodyPart(fileBodyPart);</p>
		<p>        // Step 6:  Add the Multipart to the actual message<br />        testMessage.setContent(container);<br />        System.out.println("Message constructed");</p>
		<p>        // Step 7:  Now send the message<br />        Transport transport = mailSession.getTransport("smtp");<br />        transport.connect(smtpHost, "webmaster", "password");<br />        transport.sendMessage(testMessage, testMessage.getAllRecipients());<br />        transport.close();</p>
		<p>
				<br />        System.out.println("Message sent!");<br />    }</p>
		<p>    public static void main(String[] args) {</p>
		<p>        String fileName = "a.rar";<br />        String smtpHost = "localhost";<br />        String from = "<a href="mailto:webmaster@mymail.com">webmaster@mymail.com</a>";<br />        String to = "<a href="mailto:mfc42d@sohu.com">mfc42d@sohu.com</a>";<br />        String subject = "html邮件附件测试"; //subject javamail自动转码<br />         StringBuffer theMessage = new StringBuffer();<br />        theMessage.append("&lt;h2&gt;&lt;font color=red&gt;这倒霉孩子&lt;/font&gt;&lt;/h2&gt;");<br />        theMessage.append("&lt;hr&gt;");<br />        theMessage.append("&lt;i&gt;年年失望年年望&lt;/i&gt;");</p>
		<p>        try {<br />            SendAttachMail.sendMessage(smtpHost, from, to, subject, theMessage.toString(), fileName);<br />        }<br />        catch (javax.mail.MessagingException exc) {<br />            exc.printStackTrace();<br />        }<br />    }<br />}<br /></p>
<img src ="http://www.blogjava.net/zhip/aggbug/72600.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zhip/" target="_blank">zhip</a> 2006-09-28 15:51 <a href="http://www.blogjava.net/zhip/archive/2006/09/28/72600.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>各种连接池的比较</title><link>http://www.blogjava.net/zhip/archive/2006/09/21/71154.html</link><dc:creator>zhip</dc:creator><author>zhip</author><pubDate>Thu, 21 Sep 2006 08:49:00 GMT</pubDate><guid>http://www.blogjava.net/zhip/archive/2006/09/21/71154.html</guid><wfw:comment>http://www.blogjava.net/zhip/comments/71154.html</wfw:comment><comments>http://www.blogjava.net/zhip/archive/2006/09/21/71154.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/zhip/comments/commentRss/71154.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zhip/services/trackbacks/71154.html</trackback:ping><description><![CDATA[<div><a><font color=#000000>hibernate开发组推荐c3p0，spring开发组推荐dbcp，但是dbcp连接池有weblogic连接池同样的问题，就是强行关闭连接或数据库重启后，无法 reconnect ，告诉连接被重置,这个设置可以解决。hibernate in action推荐c3p0和proxool。</font> </a>
<p>强烈推荐proxool，因为他不但可以监控后台。还可以有效的释放连接。在connection close时，也就是归还connection，<br>关闭所有的statement，并且判断是否autocommit，如果不行，就rollback，并且设置true，<br>可以参考proxool的org.logicalcobwebs.proxool.ConnectionResetter类<br>connection pool把connection reset置回initial state。<br>dbcp的配置<br>&lt;bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close"&gt;<br>&lt;property name="driverClassName" value="${db.driverClassName}"/&gt;<br>&lt;property name="url" value="${db.url}"/&gt;<br>&lt;property name="username" value="${db.username}"/&gt;<br>&lt;property name="password" value="${db.password}"/&gt;</p>
<p>&nbsp;<font color=#ff0066>&lt;property name="validationQuery"&gt;<br>&lt;value&gt;SELECT 1&lt;/value&gt;<br>&lt;/property&gt;<br>&lt;property name="testOnBorrow"&gt;<br>&lt;value&gt;true&lt;/value&gt;<br>&lt;/property&gt;<br></font>&lt;/bean&gt;</p>
<p>c3p0的配置， 注意是''driverClass' , 'jdbcUrl', 'user' , 'password' </p>
<p>&lt;bean id="dataSource"<br>&nbsp;&nbsp;class="com.mchange.v2.c3p0.ComboPooledDataSource"<br>&nbsp;&nbsp;destroy-method="close"&gt;<br>&nbsp;&nbsp;&lt;property name="driverClass"&gt;<br>&nbsp;&nbsp;&nbsp;&lt;value&gt;oracle.jdbc.driver.OracleDriver&lt;/value&gt;<br>&nbsp;&nbsp;&lt;/property&gt;<br>&nbsp;&nbsp;&lt;property name="jdbcUrl"&gt;<br>&nbsp;&nbsp;&nbsp;&lt;value&gt;jdbc:oracle:thin:@218.202.151.179:58580:ORA9I&lt;/value&gt;<br>&nbsp;&nbsp;&lt;/property&gt;<br>&nbsp;&nbsp;&lt;property name="user"&gt;<br>&nbsp;&nbsp;&nbsp;&lt;value&gt;oa&lt;/value&gt;<br>&nbsp;&nbsp;&lt;/property&gt;<br>&nbsp;&nbsp;&lt;property name="password"&gt;<br>&nbsp;&nbsp;&nbsp;&lt;value&gt;XXXX&lt;/value&gt;<br>&nbsp;&nbsp;&lt;/property&gt;<br>&nbsp;&nbsp;&lt;property name="minPoolSize"&gt;<br>&nbsp;&nbsp;&nbsp;&lt;value&gt;15&lt;/value&gt;<br>&nbsp;&nbsp;&lt;/property&gt;<br>&nbsp;&nbsp;&lt;property name="acquireIncrement"&gt;<br>&nbsp;&nbsp;&nbsp;&lt;value&gt;5&lt;/value&gt;<br>&nbsp;&nbsp;&lt;/property&gt;<br>&nbsp;&nbsp;&lt;property name="maxPoolSize"&gt;<br>&nbsp;&nbsp;&nbsp;&lt;value&gt;25&lt;/value&gt;<br>&nbsp;&nbsp;&lt;/property&gt;</p>
<p>&nbsp;</p>
<p>或</p>
<p>&lt;bean id="c3p0DataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource" <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; destroy-method="close"&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;property name="driverClass"&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;value&gt;${db.driverClass}&lt;/value&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/property&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;property name="jdbcUrl"&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;value&gt;${db.url}&lt;/value&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/property&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;!--<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;property name="user"&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;value&gt;${db.user}&lt;/value&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/property&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;property name="password"&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;value&gt;${db.pass}&lt;/value&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/property&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; --&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;property name="properties"&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;props&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;prop key="c3p0.acquire_increment"&gt;5&lt;/prop&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;prop key="c3p0.idle_test_period"&gt;100&lt;/prop&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;prop key="c3p0.max_size"&gt;100&lt;/prop&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;prop key="c3p0.max_statements"&gt;0&lt;/prop&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;prop key="c3p0.min_size"&gt;10&lt;/prop&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;prop key="user"&gt;${db.user}&lt;/prop&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;prop key="password"&gt;${db.pass}&lt;/prop&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/props&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/property&gt;<br>&nbsp;&nbsp;&nbsp; &lt;/bean&gt;<br>xapool的配置<br>&nbsp;&lt;bean id="dataSource" class="org.enhydra.jdbc.pool.StandardPoolDataSource" destroy-method="stopPool"&gt;<br>&nbsp;&nbsp;&nbsp; &lt;constructor-arg index="0"&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;bean class="org.enhydra.jdbc.standard.StandardConnectionPoolDataSource"&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;property name="driverName"&gt;&lt;value&gt;com.mysql.jdbc.Driver&lt;/value&gt;&lt;/property&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;property name="url"&gt;&lt;value&gt;jdbc:mysql://localhost/dbname&lt;/value&gt;&lt;/property&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/bean&gt;<br>&nbsp;&nbsp;&nbsp; &lt;/constructor-arg&gt;<br>&nbsp;&nbsp;&nbsp; &lt;property name="user"&gt;&lt;value&gt;root&lt;/value&gt;&lt;/property&gt;<br>&nbsp;&nbsp;&nbsp; &lt;property name="password"&gt;&lt;value&gt;mypass&lt;/value&gt;&lt;/property&gt;<br>&nbsp;&nbsp;&nbsp; &lt;property name="minSize"&gt;&lt;value&gt;1&lt;/value&gt;&lt;/property&gt;<br>&nbsp;&nbsp;&nbsp; &lt;property name="maxSize"&gt;&lt;value&gt;5&lt;/value&gt;&lt;/property&gt;<br>&nbsp;&nbsp;&nbsp; &lt;property name="jdbcTestStmt"&gt;&lt;value&gt;select 1&lt;/value&gt;&lt;/property&gt;<br>&nbsp; &lt;/bean&gt;<br>c-jdbc的配置<br>&lt;bean id="dataSource" class="org.objectweb.cjdbc.driver.DataSource"&gt;<br>&nbsp;&nbsp;&nbsp; &lt;property name="url"&gt;&lt;value&gt;jdbc:cjdbc://127.0.0.1:25322/vdb?user=vuser&lt;/value&gt;&lt;/property&gt;<br>&nbsp; &lt;/bean&gt;</p>
<p>weblogic的连接池解决办法:Test Reserved Connections: 如果选择了这个选项，服务器会在把连接提供给客户端之前<br>对其进行测试。 Test Created Connections: 如果选择了这个选项，就会在创建一个JDBC<br>连接之后和在把它添加到JDBC连接池中的可用连接列表之前，对该JDBC连接进行测试。</p>
<p>tomcat的jndi关于dbcp的配置:</p>
<p>&lt;parameter&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;name&gt;factory&lt;/name&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;value&gt;org.apache.commons.dbcp.BasicDataSourceFactory&lt;/value&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/parameter&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;parameter&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;name&gt;driverClassName&lt;/name&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;value&gt;com.sybase.jdbc2.jdbc.SybDriver&lt;/value&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/parameter&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;parameter&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;name&gt;url&lt;/name&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;value&gt;xyz&lt;/value&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/parameter&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;parameter&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;name&gt;username&lt;/name&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;value&gt;xyz&lt;/value&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/parameter&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;parameter&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;name&gt;password&lt;/name&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;value&gt;xyz&lt;/value&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/parameter&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;parameter&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;name&gt;maxActive&lt;/name&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;value&gt;5&lt;/value&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/parameter&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;parameter&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;name&gt;maxIdle&lt;/name&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;value&gt;5&lt;/value&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/parameter&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;parameter&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;name&gt;maxWait&lt;/name&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;value&gt;-1&lt;/value&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/parameter&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;parameter&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;name&gt;removeAbandoned&lt;/name&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;value&gt;true&lt;/value&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/parameter&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;parameter&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;name&gt;validationQuery&lt;/name&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;value&gt;select count(*) from sometable where 1 = 0&lt;/value&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/parameter&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;parameter&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;name&gt;testOnBorrow&lt;/name&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;value&gt;true&lt;/value&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/parameter&gt;<br>=================================================================<br></p>
<h4 class=TextColor1 id=subjcns!FFB54A583BC34D22!489 style="MARGIN-BOTTOM: 0px">c3p0 连接池</h4>
<div id=msgcns!FFB54A583BC34D22!489>
<div>&nbsp;&nbsp;&nbsp; Hibernate 配置文件主要用于配置数据库连接和Hibernate运行时所需要的各种属性（如，连接池，SQL方言，是否现实SQL日志等）。<br>&nbsp;&nbsp;&nbsp; Hibernate 同时支持&nbsp;xml&nbsp;格式的配置文件各传统的 properties 文件配置形式，这里采用 xml&nbsp;。<br>&nbsp;&nbsp;&nbsp; 配置文件名默认为 hibernate.cfg.xml（或 hibernage.properties），Hibernate在初始化期间自动在 classPath中寻找这个文件，并读取其中的配置信息，并加载。<br>&nbsp;&nbsp;&nbsp; 以下是 hibernate.cfg.xml&nbsp;文件（在项目 HibernateProject 的src 下放以下内容）：<br>&lt;?xml version="1.0" encoding="GB2312"?&gt;<br>&lt;!DOCTYPE hibernate-configuration PUBLIC<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "-//Hibernate/Hibernate Configuration DTD 3.0//EN"<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "<a href="http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd"><u><font color=#0000ff>http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd</font></u></a>"&gt;
<p>&lt;hibernate-configuration&gt;<br>&nbsp;&lt;session-factory&gt;<br>&nbsp;&nbsp;<br>&nbsp;&nbsp;&lt;!-- 是否将运行期生成的SQL输出到日志以供调试 --&gt;<br>&nbsp;&nbsp;&lt;property name="hibernate.show_sql"&gt;<br>&nbsp;&nbsp;&nbsp;true<br>&nbsp;&nbsp;&lt;/property&gt;<br>&nbsp;&nbsp;<br>&nbsp;&nbsp;&lt;!-- SQL 方言--&gt;<br>&nbsp;&nbsp;&lt;property name="hibernate.dialect"&gt;<br>&nbsp;&nbsp;&nbsp;org.hibernate.dialect.SQLServerDialect<br>&nbsp;&nbsp;&lt;/property&gt;<br>&nbsp;&nbsp;<br>&nbsp;&nbsp;&lt;!-- 数据库用户 --&gt;<br>&nbsp;&nbsp;&lt;property name="hibernate.connection.username"&gt;<br>&nbsp;&nbsp;&nbsp;sa<br>&nbsp;&nbsp;&lt;/property&gt;<br>&nbsp;&nbsp;<br>&nbsp;&nbsp;&lt;!-- 数据库密码 --&gt;<br>&nbsp;&nbsp;&lt;property name="hibernate.connection.password"&gt;<br>&nbsp;&nbsp;&nbsp;123456<br>&nbsp;&nbsp;&lt;/property&gt;<br>&nbsp;&nbsp;<br>&nbsp;&nbsp;&lt;!-- 数据库 JDBC 驱动--&gt;<br>&nbsp;&nbsp;&nbsp;&lt;property name="hibernate.connection.driver_class"&gt;<br>&nbsp;&nbsp;&nbsp;com.microsoft.jdbc.sqlserver.SQLServerDriver<br>&nbsp;&nbsp;&lt;/property&gt;<br>&nbsp;&nbsp;<br>&nbsp;&nbsp;&lt;!-- 数据库 URL --&gt;<br>&nbsp;&nbsp;&lt;property name="hibernate.connection.url"&gt;<br>&nbsp;&nbsp;&nbsp;jdbc:microsoft:sqlserver://127.0.0.1:1433;DatabaseName=hbdb<br>&nbsp;&nbsp;&lt;/property&gt;<br>&nbsp;&nbsp;<br>&nbsp;&nbsp;&lt;!-- 事务管理类型 --&gt;<br>&nbsp; &lt;!-- Hibernate 3 对包名做了修改 （ net.sf.hibernate&nbsp; =&gt; org.hibernate ）--&gt;<br>&nbsp;&nbsp;&lt;property name="hibernate.transaction.factory_class"&gt;<br>&nbsp;&nbsp;&nbsp;org.hibernate.transaction.JDBCTransactionFactory<br>&nbsp;&nbsp;&lt;/property&gt;<br>&nbsp;&nbsp;<br>&nbsp;&nbsp;&lt;!-- c3p0 连接池 --&gt;<br>&nbsp;&nbsp;&lt;property name="hibernate.connection.provider_class"&gt;org.hibernate.connection.C3P0ConnectionProvider&lt;/property&gt;<br>&nbsp;&nbsp;&lt;property name="hibernate.c3p0.max_size"&gt;2&lt;/property&gt;<br>&nbsp;&nbsp;&lt;property name="hibernate.c3p0.min_size"&gt;2&lt;/property&gt;<br>&nbsp;&nbsp;&lt;property name="hibernate.c3p0.timeout"&gt;50000&lt;/property&gt;<br>&nbsp;&nbsp;&lt;property name="hibernate.c3p0.max_statements"&gt;100&lt;/property&gt;<br>&nbsp;&nbsp;&lt;property name="hibernate.c3p0.idle_test_period"&gt;3000&lt;/property&gt;<br>&nbsp;&nbsp;&lt;property name="hibernate.c3p0.acquire_increment"&gt;2&lt;/property&gt;<br>&nbsp;&nbsp;&lt;property name="hibernate.c3p0.validate"&gt;false&lt;/property&gt;<br>&nbsp;<br>&nbsp;&nbsp;<br>&nbsp;&nbsp;&lt;!-- 映射的配置文件，对应数据库表 KELA_STUDENT 的映射文件，在后面将看到这个文件的配置 --&gt;<br>&nbsp;&nbsp;&lt;mapping resource="com/kela/hb/pojo/KelaStudent.hbm.xml"/&gt;<br>&nbsp;&lt;/session-factory&gt;<br>&lt;/hibernate-configuration&gt;</p>
</div>
</div>
</div>
<img src ="http://www.blogjava.net/zhip/aggbug/71154.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zhip/" target="_blank">zhip</a> 2006-09-21 16:49 <a href="http://www.blogjava.net/zhip/archive/2006/09/21/71154.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>java连接常见数据库的连接字符串 </title><link>http://www.blogjava.net/zhip/archive/2006/09/20/70873.html</link><dc:creator>zhip</dc:creator><author>zhip</author><pubDate>Wed, 20 Sep 2006 10:04:00 GMT</pubDate><guid>http://www.blogjava.net/zhip/archive/2006/09/20/70873.html</guid><wfw:comment>http://www.blogjava.net/zhip/comments/70873.html</wfw:comment><comments>http://www.blogjava.net/zhip/archive/2006/09/20/70873.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/zhip/comments/commentRss/70873.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zhip/services/trackbacks/70873.html</trackback:ping><description><![CDATA[1. MySQL(<a href="http://www.mysql.com)mm.mysql-2.0.2-bin.jar /"><font color="#0066cc">http://www.mysql.com)mm.mysql-2.0.2-bin.jar </font></a>;<br />Class.forName( "org.gjt.mm.mysql.Driver" ); <br />cn = DriverManager.getConnection( "jdbc:mysql://MyDbComputerNameOrIP:3306/myDatabaseName", sUsr, sPwd ); <br />driver-url:<a href="http://www.blogjava.net/zhip/admin/&quot;jdbc:mysql://127.0.0.1:3306/ctcv?autoReconnect=true&amp;amp;useUnicode=true&amp;amp;characterEncoding=utf-8"><font color="#0000ff">jdbc:mysql://127.0.0.1:3306/ctcv?autoReconnect=true&amp;amp;useUnicode=true&amp;amp;characterEncoding=utf-8</font></a><br />driver-class：com.mysql.jdbc.Driver<br />2. PostgreSQL(<a href="http://www.de.postgresql.org)pgjdbc2.jar /"><font color="#0066cc">http://www.de.postgresql.org)pgjdbc2.jar </font></a>;<br />Class.forName( "org.postgresql.Driver" ); <br />cn = DriverManager.getConnection( "jdbc:postgresql://MyDbComputerNameOrIP/myDatabaseName", sUsr, sPwd ); <br />3. Oracle(<a href="http://www.oracle.com/ip/deploy/database/oracle9i/)classes12.zip "><font color="#0066cc">http://www.oracle.com/ip/deploy/database/oracle9i/)classes12.zip </font></a>;<br />Class.forName( "oracle.jdbc.driver.OracleDriver" ); <br />cn = DriverManager.getConnection( "jdbc:oracle:thin:@MyDbComputerNameOrIP:1521:ORCL", sUsr, sPwd ); <br />4. Sybase(<a href="http://jtds.sourceforge.net)jconn2.jar /"><font color="#0066cc">http://jtds.sourceforge.net)jconn2.jar </font></a>;<br />Class.forName( "com.sybase.jdbc2.jdbc.SybDriver" ); <br />cn = DriverManager.getConnection( "jdbc:sybase:Tds:MyDbComputerNameOrIP:2638", sUsr, sPwd ); <br />// (Default-Username/Password: "dba"/"sql") <br />5. Microsoft SQLServer(<a href="http://jtds.sourceforge.net) /"><font color="#0066cc">http://jtds.sourceforge.net) </font></a>;<br />Class.forName( "net.sourceforge.jtds.jdbc.Driver" ); <br />cn = DriverManager.getConnection( "jdbc:jtds:sqlserver://MyDbComputerNameOrIP:1433/master", sUsr, sPwd ); <br />6. Microsoft SQLServer(<a href="http://www.microsoft.com) /"><font color="#0066cc">http://www.microsoft.com) </font></a>;<br />Class.forName( "com.microsoft.jdbc.sqlserver.SQLServerDriver" ); <br />cn = DriverManager.getConnection( "jdbc:microsoft:sqlserver://MyDbComputerNameOrIP:1433;databaseName=master", sUsr, sPwd ); <br />7. ODBC <br />Class.forName( "sun.jdbc.odbc.JdbcOdbcDriver" ); <br />Connection cn = DriverManager.getConnection( "jdbc:odbc:" + sDsn, sUsr, sPwd );<br />8.DB2<br />Class.forName("Com.ibm.db2.jdbc.net.DB2Driver");<br />String url="jdbc:db2://192.9.200.108:6789/SAMPLE"<br />cn = DriverManager.getConnection( url, sUsr, sPwd );<br /><img src ="http://www.blogjava.net/zhip/aggbug/70873.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zhip/" target="_blank">zhip</a> 2006-09-20 18:04 <a href="http://www.blogjava.net/zhip/archive/2006/09/20/70873.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>