﻿<?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/wangyugod/category/6049.html</link><description>知耻而后勇，知不足而进</description><language>zh-cn</language><lastBuildDate>Wed, 30 Jan 2008 10:07:18 GMT</lastBuildDate><pubDate>Wed, 30 Jan 2008 10:07:18 GMT</pubDate><ttl>60</ttl><item><title>对hibernate的新认识</title><link>http://www.blogjava.net/wangyugod/archive/2008/01/30/178483.html</link><dc:creator>船夫</dc:creator><author>船夫</author><pubDate>Wed, 30 Jan 2008 03:14:00 GMT</pubDate><guid>http://www.blogjava.net/wangyugod/archive/2008/01/30/178483.html</guid><wfw:comment>http://www.blogjava.net/wangyugod/comments/178483.html</wfw:comment><comments>http://www.blogjava.net/wangyugod/archive/2008/01/30/178483.html#Feedback</comments><slash:comments>5</slash:comments><wfw:commentRss>http://www.blogjava.net/wangyugod/comments/commentRss/178483.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/wangyugod/services/trackbacks/178483.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: &nbsp;&nbsp;<a href='http://www.blogjava.net/wangyugod/archive/2008/01/30/178483.html'>阅读全文</a><img src ="http://www.blogjava.net/wangyugod/aggbug/178483.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/wangyugod/" target="_blank">船夫</a> 2008-01-30 11:14 <a href="http://www.blogjava.net/wangyugod/archive/2008/01/30/178483.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>JSP编译过程</title><link>http://www.blogjava.net/wangyugod/archive/2007/12/18/168444.html</link><dc:creator>船夫</dc:creator><author>船夫</author><pubDate>Tue, 18 Dec 2007 04:06:00 GMT</pubDate><guid>http://www.blogjava.net/wangyugod/archive/2007/12/18/168444.html</guid><wfw:comment>http://www.blogjava.net/wangyugod/comments/168444.html</wfw:comment><comments>http://www.blogjava.net/wangyugod/archive/2007/12/18/168444.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/wangyugod/comments/commentRss/168444.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/wangyugod/services/trackbacks/168444.html</trackback:ping><description><![CDATA[<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
-->很久以来，都知道JSP其实就是Servlet，今天心血来潮，想把里面的具体代码看一遍，并记录心得。<br />
一个编译好的JSP类如下：<span style="color: #0000ff;"><br />
public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">final</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">class</span><span style="color: #000000;">&nbsp;index_jsp&nbsp;</span><span style="color: #0000ff;">extends</span><span style="color: #000000;">&nbsp;HttpJspBase<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">implements</span><span style="color: #000000;">&nbsp;JspSourceDependent<br />
</span><span style="color: #008000;">//上述类为</span><span style="color: #008000;">index.jsp被编译后得到的类<br />
</span><span style="color: #008000;">//</span><span style="color: #008000;">HttpJspBase是extends&nbsp;HttpServlet的一个类<br />
</span><span style="color: #008000;">//</span><span style="color: #008000;">JspSourceDependent是一个接口，只声明了一个方法、、getDependants(),返回当前page所依赖的文件的名称，文件包括以下几种<br />
</span><span style="color: #008000;">//</span><span style="color: #008000;">1)&nbsp;files&nbsp;that&nbsp;are&nbsp;included&nbsp;by&nbsp;page&nbsp;directives&nbsp;<br />
</span><span style="color: #008000;">//</span><span style="color: #008000;">2)&nbsp;files&nbsp;that&nbsp;are&nbsp;included&nbsp;by&nbsp;include-prelude&nbsp;and&nbsp;include-coda&nbsp;in&nbsp;jsp:config&nbsp;<br />
</span><span style="color: #008000;">//</span><span style="color: #008000;">3)&nbsp;files&nbsp;that&nbsp;are&nbsp;tag&nbsp;files&nbsp;and&nbsp;referenced&nbsp;<br />
</span><span style="color: #008000;">//</span><span style="color: #008000;">4)&nbsp;TLDs&nbsp;referenced</span></div>
其核心方法为：<br />
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #000000;">&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;_jspService(HttpServletRequest&nbsp;request,&nbsp;HttpServletResponse&nbsp;response)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">throws</span><span style="color: #000000;">&nbsp;IOException,&nbsp;ServletException{<br />
<img src="http://www.blogjava.net/Images/dot.gif" alt="" /><img src="http://www.blogjava.net/Images/dot.gif" alt="" /><img src="http://www.blogjava.net/Images/dot.gif" alt="" /><img src="http://www.blogjava.net/Images/dot.gif" alt="" /><img src="http://www.blogjava.net/Images/dot.gif" alt="" /><img src="http://www.blogjava.net/Images/dot.gif" alt="" />.<br />
}</span></div>
该方法重载HttpJspBase中的_jspService方法，进行页面解析，包括对scriptlet的加载，html的生成，自定义Tag的解析等等<br />
HttpJspBase的service再对_jspService再进行调用，最终生成HTML页面<br />
<img src ="http://www.blogjava.net/wangyugod/aggbug/168444.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/wangyugod/" target="_blank">船夫</a> 2007-12-18 12:06 <a href="http://www.blogjava.net/wangyugod/archive/2007/12/18/168444.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Annotation初步了解</title><link>http://www.blogjava.net/wangyugod/archive/2007/12/17/168264.html</link><dc:creator>船夫</dc:creator><author>船夫</author><pubDate>Mon, 17 Dec 2007 08:33:00 GMT</pubDate><guid>http://www.blogjava.net/wangyugod/archive/2007/12/17/168264.html</guid><wfw:comment>http://www.blogjava.net/wangyugod/comments/168264.html</wfw:comment><comments>http://www.blogjava.net/wangyugod/archive/2007/12/17/168264.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/wangyugod/comments/commentRss/168264.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/wangyugod/services/trackbacks/168264.html</trackback:ping><description><![CDATA[今天在看Tapestry代码的时候，突然想了解一下annotation到底是干什么的，有什么好处？花了3个小时的时间，从JDK API开始，大致了解了一下。<br />
<br />
annotation实际上就是给一些特定的类和其属性，方法等加上一些注释(annotation),这些注释是以属性name,value进行设置的，这些属性在Annotation Class中以方法的形式存在，如下： <br />
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #000000;">@Documented &nbsp;&nbsp;  &nbsp;&nbsp;  &nbsp;&nbsp;  &nbsp;&nbsp;  &nbsp;&nbsp;  //是否需要产生javadoc<br />
@Target(java.lang.annotation.ElementType.METHOD)&nbsp;&nbsp; //应用目标，这里是应用到field属性上面<br />
@Retention(RetentionPolicy.RUNTIME)&nbsp;&nbsp;  //该策略指明该注释会被加载到jvm中，即在运行时，我们可以得到该注释的内容，另外两个策略，SOURCE, CLASS都不会加载到jvm中<br />
</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;@</span><span style="color: #0000ff;">interface</span><span style="color: #000000;">&nbsp;TestAnnoation&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;value();&nbsp;&nbsp; //属性value<br />
&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;time();&nbsp;&nbsp;  &nbsp; //属性time<br />
}</span></div>
以上为自定义的annotation,是应用在成员变量上的，使用该annotation情况如下<br />
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">class</span><span style="color: #000000;">&nbsp;Test&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;@TestAnnoation(time</span><span style="color: #000000;">=</span><span style="color: #000000;">"</span><span style="color: #000000;">12:30</span><span style="color: #000000;">"</span><span style="color: #000000;">,value</span><span style="color: #000000;">=</span><span style="color: #000000;">"</span><span style="color: #000000;">20</span><span style="color: #000000;">"</span><span style="color: #000000;">)<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;String&nbsp;test(){<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;  &nbsp;&nbsp;  System.out.println("test!");<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;  &nbsp;&nbsp;  return null;<br />
&nbsp;&nbsp;&nbsp; };<br />
}</span></div>
<br />
可以使用java的反射来进行获取，通过：<br />
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #000000;">Class&nbsp;cls&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;Class.forName(</span><span style="color: #000000;">"</span><span style="color: #000000;">Test</span><span style="color: #000000;">"</span><span style="color: #000000;">);<br />
cls.isAnnotationPresent(AnnotationClass.</span><span style="color: #0000ff;">class</span><span style="color: #000000;">);</span><span style="color: #008000;">//</span><span style="color: #008000;">判断是否存在annotation</span><span style="color: #008000;"><br />
</span><span style="color: #000000;">TestAnnotation&nbsp;ta&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;(TestAnnotation)cls.getAnnotation(AnnotationClass.</span><span style="color: #0000ff;">class</span><span style="color: #000000;">);</span><span style="color: #008000;">//</span><span style="color: #008000;">获得AnnotationClass实例，后调用这个实例可以获得在AnnotationClass中定义的一些属性</span><span style="color: #008000;"><br />
</span><span style="color: #000000;">System.out.println(ta.time());&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">输出注释time内容</span><span style="color: #008000;"><br />
</span><span style="color: #000000;">System.out.println(ta.value());&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">输出注释value内容</span></div>
<br />
我个人认为annotation的好处是将一些配置直接写在代码上，很直观；以前在使用hibernate的时候，PO对象和对应的mapping xml是分开的，不够直观，若是使用annotation就会很直观的看出这个对象的映射属性以及它的一些特殊属性（如lazy=true）之类的，在JPA中就把这种配置方式换成了annotation。<br />
<br />
在JE上有很多关于使用annotation和xml的争论，我认为在小规模使用上可以使用annotation，就像JPA这种，每个PO上面都需要进行配置，即使使用XML也不能简化；而在大规模使用，如spring所维护的一些service的事务配置上避免使用annotation，因为每个service类中都需要配置，而使用AOP根据XML配置可以一下就搞定。<br />
<br />
关于ElementType的其他属性：<br />
TYPE(类型), FIELD(属性), METHOD(方法), PARAMETER(参数),
CONSTRUCTOR(构造函数),LOCAL_VARIABLE(局部变量),
ANNOTATION_TYPE,PACKAGE(包),其中的TYPE(类型)是指可以用在Class,Interface,Enum和
Annotation类型上.<br />
<br />
<img src ="http://www.blogjava.net/wangyugod/aggbug/168264.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/wangyugod/" target="_blank">船夫</a> 2007-12-17 16:33 <a href="http://www.blogjava.net/wangyugod/archive/2007/12/17/168264.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>XSL取得当前循环的位置</title><link>http://www.blogjava.net/wangyugod/archive/2007/12/14/167723.html</link><dc:creator>船夫</dc:creator><author>船夫</author><pubDate>Fri, 14 Dec 2007 03:33:00 GMT</pubDate><guid>http://www.blogjava.net/wangyugod/archive/2007/12/14/167723.html</guid><wfw:comment>http://www.blogjava.net/wangyugod/comments/167723.html</wfw:comment><comments>http://www.blogjava.net/wangyugod/archive/2007/12/14/167723.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/wangyugod/comments/commentRss/167723.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/wangyugod/services/trackbacks/167723.html</trackback:ping><description><![CDATA[最近在一个项目中用到了XSLT,目的是将返回的XML数据记录通过XSL转换为HTML，在for-each的循环中取得当前记录的位置，通过实践，找到了解决的办法，主要是使用xsl的position函数<br />
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #008080;">1</span>&nbsp;<span style="color: #000000;">&lt;</span><span style="color: #000000;">xsl:</span><span style="color: #0000ff;">for</span><span style="color: #000000;">-</span><span style="color: #000000;">each&nbsp;select</span><span style="color: #000000;">=</span><span style="color: #000000;">"</span><span style="color: #000000;">QRoleInline-list/QRoleInline</span><span style="color: #000000;">"</span><span style="color: #000000;">&gt;</span><span style="color: #000000;"><br />
</span><span style="color: #008080;">2</span>&nbsp;<span style="color: #000000;">&lt;</span><span style="color: #000000;">xsl:</span><span style="color: #0000ff;">if</span><span style="color: #000000;">&nbsp;test</span><span style="color: #000000;">=</span><span style="color: #000000;">"</span><span style="color: #000000;">not(position()&nbsp;=&nbsp;1)</span><span style="color: #000000;">"</span><span style="color: #000000;">&gt;&lt;</span><span style="color: #000000;">xsl:text</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">,</span><span style="color: #000000;">&lt;/</span><span style="color: #000000;">xsl:text</span><span style="color: #000000;">&gt;&lt;/</span><span style="color: #000000;">xsl:</span><span style="color: #0000ff;">if</span><span style="color: #000000;">&gt;&lt;</span><span style="color: #000000;">xsl:value</span><span style="color: #000000;">-</span><span style="color: #000000;">of&nbsp;select</span><span style="color: #000000;">=</span><span style="color: #000000;">"</span><span style="color: #000000;">@roleName</span><span style="color: #000000;">"</span><span style="color: #000000;">/&gt;</span><span style="color: #000000;"><br />
</span><span style="color: #008080;">3</span>&nbsp;<span style="color: #000000;">&lt;/</span><span style="color: #000000;">xsl:</span><span style="color: #0000ff;">for</span><span style="color: #000000;">-</span><span style="color: #000000;">each</span><span style="color: #000000;">&gt;<br />
</span></div>
使用position函数可以取得当前行在循环中的位置，从1开始。上述代码是判断如果位置为第一个， 则需要加逗号。<br />
<br />
还有一个函数current()是负责取到当前节点对象的。<br />
<img src ="http://www.blogjava.net/wangyugod/aggbug/167723.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/wangyugod/" target="_blank">船夫</a> 2007-12-14 11:33 <a href="http://www.blogjava.net/wangyugod/archive/2007/12/14/167723.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>走出ClassLoader迷局  --转至sharajava的博克http://www.blogjava.net/sharajava/archive/2006/07/25/59946.html</title><link>http://www.blogjava.net/wangyugod/archive/2006/07/27/60363.html</link><dc:creator>船夫</dc:creator><author>船夫</author><pubDate>Thu, 27 Jul 2006 07:23:00 GMT</pubDate><guid>http://www.blogjava.net/wangyugod/archive/2006/07/27/60363.html</guid><wfw:comment>http://www.blogjava.net/wangyugod/comments/60363.html</wfw:comment><comments>http://www.blogjava.net/wangyugod/archive/2006/07/27/60363.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/wangyugod/comments/commentRss/60363.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/wangyugod/services/trackbacks/60363.html</trackback:ping><description><![CDATA[
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; LINE-HEIGHT: 150%">
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">答</span>
				<span lang="EN-US">: </span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">这个问题经常出现在编写框架代码</span>
				<span lang="EN-US">, </span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">需要动态加载很多类和资源的时候</span>
				<span lang="EN-US">. </span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">通常当你需要动态加载资源的时候</span>
				<span lang="EN-US">, </span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">你至少有三个</span>
				<span lang="EN-US">ClassLoader</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">可以选择</span>
				<span lang="EN-US">: </span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 42pt; TEXT-INDENT: -21pt; LINE-HEIGHT: 150%; mso-list: l1 level1 lfo1; tab-stops: list 42.0pt">
				<span lang="EN-US" style="FONT-FAMILY: Wingdings; mso-bidi-font-family: Wingdings; mso-fareast-font-family: Wingdings">
						<span style="mso-list: Ignore">²<span style="FONT: 7pt 'Times New Roman'">        </span></span>
				</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">系统类加载器或叫作应用类加载器</span>
				<span lang="EN-US">(system classloader or application classloader)</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 42pt; TEXT-INDENT: -21pt; LINE-HEIGHT: 150%; mso-list: l1 level1 lfo1; tab-stops: list 42.0pt">
				<span lang="EN-US" style="FONT-FAMILY: Wingdings; mso-bidi-font-family: Wingdings; mso-fareast-font-family: Wingdings">
						<span style="mso-list: Ignore">²<span style="FONT: 7pt 'Times New Roman'">        </span></span>
				</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">当前类加载器</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 42pt; TEXT-INDENT: -21pt; LINE-HEIGHT: 150%; mso-list: l1 level1 lfo1; tab-stops: list 42.0pt">
				<span lang="EN-US" style="FONT-FAMILY: Wingdings; mso-bidi-font-family: Wingdings; mso-fareast-font-family: Wingdings">
						<span style="mso-list: Ignore">²<span style="FONT: 7pt 'Times New Roman'">        </span></span>
				</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">当前线程类加载器</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; LINE-HEIGHT: 150%">
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">上面的问题指的是最后一种类加载器</span>
				<span lang="EN-US">. </span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">哪种类加载器是正确的选择呢</span>
				<span lang="EN-US">?</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; LINE-HEIGHT: 150%">
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">第一种选择可以很容易地排除</span>
				<span lang="EN-US">: </span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">系统类加载器</span>
				<span lang="EN-US">(system classloader). </span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">这个类加载器处理</span>
				<span lang="EN-US">-classpath</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">下的类加载工作</span>
				<span lang="EN-US">, </span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">可以通过</span>
				<span lang="EN-US">ClassLoader.getSystemClassLoader()</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">方法调用</span>
				<span lang="EN-US">. ClassLoader</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">下所有的</span>
				<span lang="EN-US">getSystemXXX()</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的静态方法都是通过这个方法定义的</span>
				<span lang="EN-US">. </span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">在你的代码中</span>
				<span lang="EN-US">, </span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">你应该尽量少地调用这个方法</span>
				<span lang="EN-US">,</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">以其它的类加载器作为代理</span>
				<span lang="EN-US">. </span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">否则你的代码将只能工作在简单的命令行应用中</span>
				<span lang="EN-US">, </span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">这个时候系统类加载器</span>
				<span lang="EN-US">(system classloader)</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">是</span>
				<span lang="EN-US">JVM</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">最后创建的类加载器</span>
				<span lang="EN-US">. </span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">一但你把代码移到</span>
				<span lang="EN-US">EJB, Web</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">应用或</span>
				<span lang="EN-US">Java Web Start</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">应用中</span>
				<span lang="EN-US">, </span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">一定会出问题</span>
				<span lang="EN-US">. </span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; LINE-HEIGHT: 150%">
				<span lang="EN-US">
						<span style="mso-tab-count: 1">      </span>
				</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">所以我们来看第二种选择</span>
				<span lang="EN-US">: </span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">当前上下文环境下的类加载器</span>
				<span lang="EN-US">. </span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">根据定义</span>
				<span lang="EN-US">, </span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">当前类加载器就是你当前方法所属的类的加载器</span>
				<span lang="EN-US">. </span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">在运行时类之间动态联编</span>
				<span lang="EN-US">, </span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">及调用</span>
				<span lang="EN-US">Class.forName,() Class.getResource()</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">等类似方法时</span>
				<span lang="EN-US">, </span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">这个类加载器会被隐含地使用</span>
				<span lang="EN-US">. </span>
				<span lang="EN-US" style="COLOR: #ffcc00; FONT-FAMILY: 宋体">It is also used by syntactic constructs like X.class class literals.</span>
				<span lang="EN-US" style="FONT-FAMILY: 宋体">
						<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" /?>
						<o:p>
						</o:p>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; LINE-HEIGHT: 150%">
				<span lang="EN-US" style="FONT-FAMILY: 宋体">
						<span style="mso-tab-count: 1">    </span>
				</span>
				<span style="FONT-FAMILY: 宋体">线程上下文类型加载器是在<span lang="EN-US">Java 2</span>平台上被引入的<span lang="EN-US">. </span>每一个线程都有一个类加载器与之对应<span lang="EN-US">(</span>除非这个线程是被本地代码创建的<span lang="EN-US">). </span>这个类加载器是通过<span lang="EN-US">Thread.setContextClassLoaser()</span>方法设置的<span lang="EN-US">. </span>如果你不在线程构造后调用这个方法<span lang="EN-US">, </span>这个线程将从它的父线程中继承相应的上下文类加载器<span lang="EN-US">. </span>如果在整个应用中你不做任何特殊设置<span lang="EN-US">, </span>所有的线程将都以系统类加载器<span lang="EN-US">(system classloader)</span>作为自己的线程上下文类加载器<span lang="EN-US">. </span>自从<span lang="EN-US">Web</span>和<span lang="EN-US">J2EE</span>应用服务器使用成熟的类加载器机制来实现诸如<span lang="EN-US">JNDI, </span>线程池<span lang="EN-US">, </span>组件热部署等功能以来<span lang="EN-US">, </span>这种在整个应用中不做任何线程类加载器设置的情况就很少了<span lang="EN-US">.<o:p></o:p></span></span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; LINE-HEIGHT: 150%">
				<span lang="EN-US" style="FONT-FAMILY: 宋体">
						<span style="mso-tab-count: 1">    </span>
				</span>
				<span style="FONT-FAMILY: 宋体">为什么线程上下文类加载器存在于如此重要的位置呢<span lang="EN-US">? </span>这个概念在<span lang="EN-US">J2SE</span>中的引入并不引人注目<span lang="EN-US">. </span>很多开发人员对这一概念迷惑的原因是<span lang="EN-US">Sun</span>公司在这方面缺乏适当的指引和文档<span lang="EN-US">. <o:p></o:p></span></span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; LINE-HEIGHT: 150%">
				<span lang="EN-US" style="FONT-FAMILY: 宋体">
						<span style="mso-tab-count: 1">    </span>
				</span>
				<span style="FONT-FAMILY: 宋体">事实上<span lang="EN-US">, </span>上下文类加载器提供了类加载机制的后门<span lang="EN-US">, </span>这一点也在<span lang="EN-US">J2SE</span>中被引入了<span lang="EN-US">. </span>通常<span lang="EN-US">, </span>在<span lang="EN-US">JVM</span>中的所有类加载器被组织成了有继承层次的结构<span lang="EN-US">, </span>每一个类加载器<span lang="EN-US">(</span>除了引导<span lang="EN-US">JVM</span>的原始类加载器<span lang="EN-US">)</span>都有一个父加载器<span lang="EN-US">. </span>每当被请示加载类时<span lang="EN-US">, </span>类加载器都会首先请求其父类加载器<span lang="EN-US">, </span>只有当父类加载器不能加载时<span lang="EN-US">, </span>才会自己进行类加载<span lang="EN-US">.<o:p></o:p></span></span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; LINE-HEIGHT: 150%">
				<span lang="EN-US" style="FONT-FAMILY: 宋体">
						<span style="mso-tab-count: 1">   </span>
				</span>
				<span style="FONT-FAMILY: 宋体">有时候这种类加载的顺序安排不能正常工作<span lang="EN-US">, </span>通常当必须动态加载应用程序开发人员提供的资源的时候<span lang="EN-US">. </span>以<span lang="EN-US">JNDI</span>为例<span lang="EN-US">: </span>它的内容<span lang="EN-US">(</span>从<span lang="EN-US">J2SE1.3</span>开始<span lang="EN-US">)</span>就在<span lang="EN-US">rt.jar</span>中的引导类中实现了<span lang="EN-US">, </span>但是这些<span lang="EN-US">JNDI</span>核心类需要动态加载由独立厂商实现并部署在应用程序的<span lang="EN-US">classpath</span>下的<span lang="EN-US">JNDI</span>提供者<span lang="EN-US">. </span>这种情况就要求一个父<span lang="EN-US">classloader(</span>本例<span lang="EN-US">, </span>就是引导类加载器<span lang="EN-US">)</span>去加载对于它其中一个子<span lang="EN-US">classloader(</span>本例<span lang="EN-US">, </span>系统类加载器<span lang="EN-US">)</span>可见的类<span lang="EN-US">. </span>这时通常的类加载代理机制不能实现这个要求<span lang="EN-US">. </span>解决的办法<span lang="EN-US">(workaround)</span>就是<span lang="EN-US">, </span>让<span lang="EN-US">JNDI</span>核心类使用当前线程上下文的类加载器<span lang="EN-US">, </span>这样<span lang="EN-US">, </span>就基本的类加载代理机制的相反方向建立了一条有效的途径<span lang="EN-US">. <o:p></o:p></span></span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; LINE-HEIGHT: 150%">
				<span lang="EN-US" style="FONT-FAMILY: 宋体">
						<span style="mso-tab-count: 1">    </span>
				</span>
				<span style="FONT-FAMILY: 宋体">另外<span lang="EN-US">, </span>上面一段可能让你想起一些其它的事情<span lang="EN-US">: XML</span>解析<span lang="EN-US">Java API(JAXP). </span>是的<span lang="EN-US">, </span>当<span lang="EN-US">JAXP</span>只是<span lang="EN-US">J2SE</span>的扩展进<span lang="EN-US">, </span>它很自然地用当前类加载器来引导解析器的实现<span lang="EN-US">. </span>而当<span lang="EN-US">JAXP</span>被加入到<span lang="EN-US">J2SE1.4</span>的核心类库中时<span lang="EN-US">, </span>它的类加载也就改成了用当前线程类加载器<span lang="EN-US">, </span>与<span lang="EN-US">JNDI</span>的情况完全类似<span lang="EN-US">(</span>也使很多程序员很迷惑<span lang="EN-US">). </span>明白为什么我说来自<span lang="EN-US">Sun</span>的指导很缺乏了吧<span lang="EN-US">?<o:p></o:p></span></span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; LINE-HEIGHT: 150%">
				<span lang="EN-US" style="FONT-FAMILY: 宋体">
						<span style="mso-tab-count: 1">   </span>
				</span>
				<span style="FONT-FAMILY: 宋体">在以上的介绍之后<span lang="EN-US">, </span>我们来看关键问题<span lang="EN-US">: </span>这两种选择<span lang="EN-US">(</span>当前类加载器和当前线程类加载器<span lang="EN-US">)</span>都不是在所有环境下都适用<span lang="EN-US">. </span>有些人认为当前线程类加载器应该成为新的标准策略<span lang="EN-US">. </span>但是<span lang="EN-US">, </span>如果这样<span lang="EN-US">, </span>当多个线程通过共享数据进行交互的时<span lang="EN-US">, </span>将会呈现出一幅极其复杂的类加载的画面<span lang="EN-US">, </span>除非它们全部使用了同一个上下文的类加载器<span lang="EN-US">. </span>进一步说<span lang="EN-US">, </span>在某些遗留下来的解决方案中<span lang="EN-US">, </span>委派到当前类加载器的方法已经是标准<span lang="EN-US">. </span>比如对<span lang="EN-US">Class.forName(String)</span>的直接调用<span lang="EN-US">(</span>这也是我为什么推荐尽量避免对这个方法进行调用的原因<span lang="EN-US">). </span>即使你努力去只调用上下文相关的类加载器<span lang="EN-US">, </span>仍然会有一些代码会不由你控制<span lang="EN-US">. </span>这种不受控制的类加载委派机制是混入是很危险的<span lang="EN-US">. <o:p></o:p></span></span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; LINE-HEIGHT: 150%">
				<span lang="EN-US" style="FONT-FAMILY: 宋体">
						<span style="mso-tab-count: 1">    </span>
				</span>
				<span style="FONT-FAMILY: 宋体">更严重的问题<span lang="EN-US">, </span>某些应用服务器把环境上下文及当前类加载器设置到不同的类加载器实例上<span lang="EN-US">, </span>而这些类加载器有相同的类路径但却没有委派机制中的父子关系<span lang="EN-US">. </span>想想这为什么十分可怕<span lang="EN-US">. </span>要知道类加载器定义并加载的类实例会带有一个<span lang="EN-US">JVM</span>内部的<span lang="EN-US">ID</span>号<span lang="EN-US">. </span>如果当前类加载器加载一个类<span lang="EN-US">X</span>的实例<span lang="EN-US">, </span>这个实例调用<span lang="EN-US">JNDI</span>查找类<span lang="EN-US">Y</span>的实例<span lang="EN-US">, </span>些时的上下文的类加载器也可以定义了加载类<span lang="EN-US">Y</span>实例<span lang="EN-US">. </span>这个类<span lang="EN-US">Y</span>的定义就与当前类加载器看到的类<span lang="EN-US">Y</span>的定义不同<span lang="EN-US">. </span>如果进行强制类型转换<span lang="EN-US">, </span>则产生异常<span lang="EN-US">. <o:p></o:p></span></span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; LINE-HEIGHT: 150%">
				<span lang="EN-US" style="FONT-FAMILY: 宋体">
						<span style="mso-tab-count: 1">   </span>
				</span>
				<span style="FONT-FAMILY: 宋体">这种混乱的情况还将在<span lang="EN-US">Java</span>中存在一段时间<span lang="EN-US">. </span>对于那些需要动态加载资源的<span lang="EN-US">J2SE</span>的<span lang="EN-US">API, </span>我们来猜想它们的类加策略<span lang="EN-US">. </span>例如<span lang="EN-US">:<o:p></o:p></span></span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 42pt; TEXT-INDENT: -21pt; LINE-HEIGHT: 150%; mso-list: l0 level1 lfo2; tab-stops: list 42.0pt">
				<span lang="EN-US" style="FONT-FAMILY: Wingdings; mso-bidi-font-family: Wingdings; mso-fareast-font-family: Wingdings">
						<span style="mso-list: Ignore">Ø<span style="FONT: 7pt 'Times New Roman'">         </span></span>
				</span>
				<span lang="EN-US" style="FONT-FAMILY: 宋体">JNDI</span>
				<span style="FONT-FAMILY: 宋体">使用线程上下文类加载器<span lang="EN-US"><o:p></o:p></span></span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 42pt; TEXT-INDENT: -21pt; LINE-HEIGHT: 150%; mso-list: l0 level1 lfo2; tab-stops: list 42.0pt">
				<span lang="EN-US" style="FONT-FAMILY: Wingdings; mso-bidi-font-family: Wingdings; mso-fareast-font-family: Wingdings">
						<span style="mso-list: Ignore">Ø<span style="FONT: 7pt 'Times New Roman'">         </span></span>
				</span>
				<span lang="EN-US" style="FONT-FAMILY: 宋体">Class.getResource()</span>
				<span style="FONT-FAMILY: 宋体">和<span lang="EN-US">Class.forName()</span>使用当前类加载器<span lang="EN-US"><o:p></o:p></span></span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 42pt; TEXT-INDENT: -21pt; LINE-HEIGHT: 150%; mso-list: l0 level1 lfo2; tab-stops: list 42.0pt">
				<span lang="EN-US" style="FONT-FAMILY: Wingdings; mso-bidi-font-family: Wingdings; mso-fareast-font-family: Wingdings">
						<span style="mso-list: Ignore">Ø<span style="FONT: 7pt 'Times New Roman'">         </span></span>
				</span>
				<span lang="EN-US" style="FONT-FAMILY: 宋体">JAXP(J2SE 1.4</span>
				<span style="FONT-FAMILY: 宋体">及之后<span lang="EN-US">)</span>使用线程上下文类加载器<span lang="EN-US"><o:p></o:p></span></span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 42pt; TEXT-INDENT: -21pt; LINE-HEIGHT: 150%; mso-list: l0 level1 lfo2; tab-stops: list 42.0pt">
				<span lang="EN-US" style="FONT-FAMILY: Wingdings; mso-bidi-font-family: Wingdings; mso-fareast-font-family: Wingdings">
						<span style="mso-list: Ignore">Ø<span style="FONT: 7pt 'Times New Roman'">         </span></span>
				</span>
				<span lang="EN-US" style="FONT-FAMILY: 宋体">java.util.ResourceBundle</span>
				<span style="FONT-FAMILY: 宋体">使用调用者的当前类加载器<span lang="EN-US"><o:p></o:p></span></span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 42pt; TEXT-INDENT: -21pt; LINE-HEIGHT: 150%; mso-list: l0 level1 lfo2; tab-stops: list 42.0pt">
				<span lang="EN-US" style="COLOR: #ffcc00; FONT-FAMILY: Wingdings; mso-bidi-font-family: Wingdings; mso-fareast-font-family: Wingdings">
						<span style="mso-list: Ignore">Ø<span style="FONT: 7pt 'Times New Roman'">         </span></span>
				</span>
				<span lang="EN-US" style="COLOR: #ffcc00; FONT-FAMILY: 宋体">URL protocol handlers specified via java.protocol.handler.pkgs system property are looked up in the bootstrap and system classloaders only<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 42pt; TEXT-INDENT: -21pt; LINE-HEIGHT: 150%; mso-list: l0 level1 lfo2; tab-stops: list 42.0pt">
				<span lang="EN-US" style="FONT-FAMILY: Wingdings; mso-bidi-font-family: Wingdings; mso-fareast-font-family: Wingdings">
						<span style="mso-list: Ignore">Ø<span style="FONT: 7pt 'Times New Roman'">         </span></span>
				</span>
				<span lang="EN-US" style="FONT-FAMILY: 宋体">Java</span>
				<span style="FONT-FAMILY: 宋体">序列化<span lang="EN-US">API</span>默认使用调用者当前的类加载器<span lang="EN-US"><o:p></o:p></span></span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 21pt; LINE-HEIGHT: 150%">
				<span style="FONT-FAMILY: 宋体">这些类及资源的加载策略问题<span lang="EN-US">, </span>肯定是<span lang="EN-US">J2SE</span>领域中文档最及说明最缺乏的部分了<span lang="EN-US">.<o:p></o:p></span></span>
		</p>
<img src ="http://www.blogjava.net/wangyugod/aggbug/60363.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/wangyugod/" target="_blank">船夫</a> 2006-07-27 15:23 <a href="http://www.blogjava.net/wangyugod/archive/2006/07/27/60363.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>项目中遇到的一个Spring事务管理的问题</title><link>http://www.blogjava.net/wangyugod/archive/2006/07/24/59870.html</link><dc:creator>船夫</dc:creator><author>船夫</author><pubDate>Mon, 24 Jul 2006 10:40:00 GMT</pubDate><guid>http://www.blogjava.net/wangyugod/archive/2006/07/24/59870.html</guid><wfw:comment>http://www.blogjava.net/wangyugod/comments/59870.html</wfw:comment><comments>http://www.blogjava.net/wangyugod/archive/2006/07/24/59870.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/wangyugod/comments/commentRss/59870.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/wangyugod/services/trackbacks/59870.html</trackback:ping><description><![CDATA[今天从CVS上checkout项目的时候,出现了一个问题,我以前写的模块功能本来是好的,但是checkout之后就出了问题,我想一定是配置文件更新出错了,努力寻找,发现没有问题.后来经同事说他更改了一个方法,而我的代码中有对那个方法的调用,终于知道了问题的所在.<br />程序中抛出的异常是<br /><div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><span style="COLOR: #000000">java.lang.IllegalStateException: No value </span><span style="COLOR: #0000ff">for</span><span style="COLOR: #000000"> key [org.hibernate.impl.SessionFactoryImpl@7a3d45f0] bound to thread [Servlet.Engine.Transports : </span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">]</span></div>我发现是在我spring的sevice方法中调用了他的方法,他的方法又调用了另一个service方法,导致出现了这个问题.<br /><br />这个问题只要把他的那个方法修改一下,或者从我的service方法中移出就可以解决.<br /><br />我想spring中肯定应该有些配置能使两个service方法处于同一个事务中,但是我还没找到.希望知道的高手能提点一下,谢谢<br /><img src ="http://www.blogjava.net/wangyugod/aggbug/59870.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/wangyugod/" target="_blank">船夫</a> 2006-07-24 18:40 <a href="http://www.blogjava.net/wangyugod/archive/2006/07/24/59870.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>在WSAD 5.1中使用log4j遇到的问题</title><link>http://www.blogjava.net/wangyugod/archive/2006/07/21/59308.html</link><dc:creator>船夫</dc:creator><author>船夫</author><pubDate>Thu, 20 Jul 2006 17:23:00 GMT</pubDate><guid>http://www.blogjava.net/wangyugod/archive/2006/07/21/59308.html</guid><wfw:comment>http://www.blogjava.net/wangyugod/comments/59308.html</wfw:comment><comments>http://www.blogjava.net/wangyugod/archive/2006/07/21/59308.html#Feedback</comments><slash:comments>4</slash:comments><wfw:commentRss>http://www.blogjava.net/wangyugod/comments/commentRss/59308.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/wangyugod/services/trackbacks/59308.html</trackback:ping><description><![CDATA[
		<p>使用log4j作为日志输出工具，设置根级别为warn，然后分别设置了hibernate和spring等的级别为debug,自己项目的级别也设置为debug，但是很奇怪的事情出现了：<br />我启动wasd的测试服务器，打出来的日志只有我本项目的debug级以上的信息，spring和hibernate的都打不出来；<br />我使用main函数运行我项目中的一个方法，所有的debug信息，spring和hibernate以及我本项目的debug信息一样都没少。<br />我的配置是绝对没有问题的，我实在想不出来怎么会出现这种问题，见鬼了，哪位高手遇到过这种情况，告知一下解决方法，谢谢</p>
<img src ="http://www.blogjava.net/wangyugod/aggbug/59308.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/wangyugod/" target="_blank">船夫</a> 2006-07-21 01:23 <a href="http://www.blogjava.net/wangyugod/archive/2006/07/21/59308.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>表的外键约束[ZT]</title><link>http://www.blogjava.net/wangyugod/archive/2006/03/16/35665.html</link><dc:creator>船夫</dc:creator><author>船夫</author><pubDate>Thu, 16 Mar 2006 07:44:00 GMT</pubDate><guid>http://www.blogjava.net/wangyugod/archive/2006/03/16/35665.html</guid><wfw:comment>http://www.blogjava.net/wangyugod/comments/35665.html</wfw:comment><comments>http://www.blogjava.net/wangyugod/archive/2006/03/16/35665.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/wangyugod/comments/commentRss/35665.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/wangyugod/services/trackbacks/35665.html</trackback:ping><description><![CDATA[<DIV align=left><FONT size=2>1。创建测试表 <BR>SQL&gt; create table lesson(lesson_name varchar2(20), classroom varchar2(10)); </DIV>
<P>表已创建。 </P>
<P>SQL&gt; create table teacher(name varchar2(20),lesson_name varchar2(20)); </P>
<P>表已创建。 </P>
<P>SQL&gt; alter table lesson add constraint pk_lesson primary key(lesson_name); </P>
<P>表已更改。 </P>
<P>SQL&gt; alter table teacher add constraint fk_lessonname foreign key(lesson_name) <BR>2 references lesson(lesson_name); </P>
<P>表已更改。 </P>
<P><BR>2。插入测试数据 <BR>SQL&gt; insert into lesson values('english','class 1'); </P>
<P>已创建 1 行。 </P>
<P>SQL&gt; insert into lesson values('music','class 2'); </P>
<P>已创建 1 行。 </P>
<P><BR>3。测试有外键的字段是否可以为空 <BR>SQL&gt; insert into teacher values('wang','hello'); <BR>insert into teacher values('wang','hello') <BR>* <BR>ERROR 位于第 1 行: <BR>ORA-02291: 违反完整约束条件 (SYSTEM.FK_LESSONNAME) - 未找到父项关键字 </P>
<P>SQL&gt; insert into teacher values('wang','music'); </P>
<P>已创建 1 行。 </P>
<P>SQL&gt; insert into teacher values('wang',null); </P>
<P>已创建 1 行。 </P>
<P><BR>结论：有外键约束的字段可以为空。如果不为空的话，则一定要满足外键的约束关系</P></FONT><img src ="http://www.blogjava.net/wangyugod/aggbug/35665.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/wangyugod/" target="_blank">船夫</a> 2006-03-16 15:44 <a href="http://www.blogjava.net/wangyugod/archive/2006/03/16/35665.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>java实现文件传输</title><link>http://www.blogjava.net/wangyugod/archive/2005/12/20/24733.html</link><dc:creator>船夫</dc:creator><author>船夫</author><pubDate>Tue, 20 Dec 2005 03:22:00 GMT</pubDate><guid>http://www.blogjava.net/wangyugod/archive/2005/12/20/24733.html</guid><wfw:comment>http://www.blogjava.net/wangyugod/comments/24733.html</wfw:comment><comments>http://www.blogjava.net/wangyugod/archive/2005/12/20/24733.html#Feedback</comments><slash:comments>4</slash:comments><wfw:commentRss>http://www.blogjava.net/wangyugod/comments/commentRss/24733.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/wangyugod/services/trackbacks/24733.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: &nbsp;&nbsp;1import&nbsp;java.awt.*;&nbsp;&nbsp;&nbsp;2import&nbsp;java.awt.event.*;&nbsp;&nbsp;&nbsp;3import&nbsp;javax.swing.*;&nbsp;&nbsp;&nbsp;4import&nbsp;javax.swing.event.*;&nbsp;&nbsp;&nbsp;5i...&nbsp;&nbsp;<a href='http://www.blogjava.net/wangyugod/archive/2005/12/20/24733.html'>阅读全文</a><img src ="http://www.blogjava.net/wangyugod/aggbug/24733.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/wangyugod/" target="_blank">船夫</a> 2005-12-20 11:22 <a href="http://www.blogjava.net/wangyugod/archive/2005/12/20/24733.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Velocity 简介</title><link>http://www.blogjava.net/wangyugod/archive/2005/12/01/22057.html</link><dc:creator>船夫</dc:creator><author>船夫</author><pubDate>Thu, 01 Dec 2005 00:36:00 GMT</pubDate><guid>http://www.blogjava.net/wangyugod/archive/2005/12/01/22057.html</guid><wfw:comment>http://www.blogjava.net/wangyugod/comments/22057.html</wfw:comment><comments>http://www.blogjava.net/wangyugod/archive/2005/12/01/22057.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/wangyugod/comments/commentRss/22057.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/wangyugod/services/trackbacks/22057.html</trackback:ping><description><![CDATA[<DIV class=comText>1.Velocity 的使用 <BR><BR>Velocity是一个开放源吗的模版引擎，由apache.org小组负责开发，现在最新的版本是Velocity1.3.1，<A href="http://jakarta.apache.org/velocity/index.html" target=_blank>http://jakarta.apache.org/velocity/index.html</A> 可以了解Velocity的最新信息。 <BR>Velocity允许我们在模版中设定变量，然后在运行时，动态的将数据插入到模版中，替换这些变量。 <BR>例如： <BR>&lt;html&gt; <BR>&lt;body&gt;HELLO $CUSTOMERNAME&lt;/body&gt; <BR>&lt;/html&gt; <BR>我们可以在运行时得到客户的名字，然后把它插入到这个模版中替换变量$CUSTOMERNAME，整个替换过程是由Velocity进行控制的，而且java的调用代码也非常简单，如我们可以在java代码中这样调用 <BR>/***********************************************************/ <BR>//这个文件中设定了Velocity使用的log4j的配置和Velocity的模版文件所在的目录 <BR>Velocity.init("D:\\Template\\resource\\jt.properties"); <BR>//模版文件名，模版文件所在的路径在上一条语句中已经设置了 <BR>Template template = Velocity.getTemplate("hello.vm", "gb2312"); <BR>//实例化一个Context <BR>VelocityContext context = new VelocityContext(); <BR>//把模版变量的值设置到context中 <BR>context.put("CUSTOMERNAME", "My First Template Engine ---- Velocity."); <BR>//开始模版的替换 <BR>template.merge(context, writer); <BR>//写到文件中 <BR>PrintWriter filewriter = new PrintWriter(new FileOutputStream(outpath),true); <BR>filewriter.println(writer.toString()); <BR>filewriter.close(); <BR>/***********************************************************/ <BR><BR>这就是整个java的代码，非常的简单。如果我们有多个模版变量，我们仅需要把这些模版变量的值设置到context中。 <BR>下面我们简单的分析一下，Velocity引擎读取模板文件时，它直接输出文件中所有的文本，但以$字符开头的除外，$符号标识着一个模版变量位置， <BR>context.put("CUSTOMERNAME", "My First Template Engine ---- Velocity."); <BR>当 Velocity 模板引擎解析并输出模板的结果时，模板中所有出现$CUSTOMERNAME的地方都将插入客户的名字，即被加入到VelocityContext的对象的toString()方法返回值将替代Velocity变量（模板中以$开头的变量）。 <BR>模板引擎中最强大、使用最频繁的功能之一是它通过内建的映像（Reflection）引擎查找对象信息的能力。这个映像引擎允许用一种方便的Java“.”类似的操作符，提取任意加入到VelocityContext的对象的任何公用方法的值，或对象的任意数据成员。 <BR>映像引擎还带来了另外一个改进：快速引用JavaBean的属性。使用JavaBean属性的时候，我们可以忽略get方法和括号。请看下面这个模板的例子。 <BR>&lt;html&gt; <BR>&lt;body&gt; <BR>Name:$Customer.Name() <BR>Address:$Customer.Address() <BR>Age:$Customer.Age() <BR>&lt;/body&gt; <BR>&lt;/html&gt; <BR><BR>java的代码： <BR>/***********************************************************/ <BR>//设置客户信息 <BR>Customer mycustomer = new Customer(); <BR>mycustomer.setName("Velocity"); <BR>mycustomer.setAddress("jakarta.apache.org/velocity/index.html"); <BR>mycustomer.setAge(2); <BR>//这个文件中设定了 Velocity 使用的 Log4j 的配置和Velocity的模版文件所在的目录Velocity.init("D:\\Template\\resource\\jt.properties"); <BR>//模版文件名，模版文件所在的路径在上一条语句中已经设置了 <BR>Template template = Velocity.getTemplate("hello.vm", "gb2312"); <BR>//实例化一个Context <BR>VelocityContext context = new VelocityContext(); <BR>//把模版变量的值设置到context中 <BR>context.put("Customer", mycustomer); <BR>//开始模版的替换 <BR>template.merge(context, writer); <BR>//写到文件中 <BR>PrintWriter filewriter = new PrintWriter(new FileOutputStream(outpath),true); <BR>filewriter.println(writer.toString()); <BR>filewriter.close(); <BR>输出结果： <BR>&lt;html&gt; <BR>&lt;body&gt; <BR>Name:Velocity <BR>Address:jakarta.apache.org/velocity/index.html <BR>Age:2 <BR>&lt;/body&gt; <BR>&lt;/html&gt; <BR>除了替换变量之外，象Velocity高级引擎还能做其他许多事情，它们有用来比较和迭代的内建指令，通过这些指令我们可以完成程序语言中的条件判断语句和循环语句等。 <BR>例如，我们想要输出年龄等于2的所有客户的信息，我们可以这样定义我们的模版 <BR>模版： <BR>&lt;html&gt; <BR>&lt;body&gt; <BR>&lt;table&gt; <BR>&lt;tr&gt; <BR>&lt;td&gt;名称&lt;/td&gt; <BR>&lt;td&gt;地址&lt;/td&gt; <BR>&lt;td&gt;年龄&lt;/td&gt; <BR>&lt;/tr&gt; <BR>#foreach ($Customer in $allCustomer) <BR>#if($Customer.Age()=="2") <BR>&lt;tr&gt; <BR>&lt;td&gt;$Customer.Name()&lt;/td&gt; <BR>&lt;td&gt;$Customer.Address()&lt;/td&gt; <BR>&lt;td&gt;$Customer.Age()&lt;/td&gt; <BR>&lt;/tr&gt; <BR>#end <BR>#end <BR>&lt;/table&gt; <BR>&lt;/body&gt; <BR>&lt;/html&gt; <BR><BR>java的代码： <BR>/******************************************************/ <BR>//设置客户信息 <BR>ArrayList allMyCustomer = new ArrayList(); <BR>//客户1 <BR>Customer mycustomer1 = new Customer(); <BR>mycustomer1.setName("Velocity"); <BR>mycustomer1.setAddress("jakarta.apache.org/velocity/index.html"); <BR>mycustomer1.setAge(2); <BR>//客户2 <BR>Customer mycustomer2 = new Customer(); <BR>mycustomer2.setName("Tomcat"); <BR>mycustomer2.setAddress("jakarta.apache.org/tomcat/index.html"); <BR>mycustomer2.setAge(3); <BR>//客户3 <BR>Customer mycustomer3 = new Customer(); <BR>mycustomer3.setName("Log4J"); <BR>mycustomer3.setAddress("jakarta.apache.org/log4j/docs/index.html"); <BR>mycustomer3.setAge(2); <BR>//添加到allMyCustomer(ArrayList)中. <BR>allMyCustomer.add(mycustomer1); <BR>allMyCustomer.add(mycustomer2); <BR>allMyCustomer.add(mycustomer3); <BR>//这个文件中设定了Velocity使用的log4j的配置和Velocity的模版文件所在的目 <BR>Velocity.init("D:\\Template\\resource\\jt.properties"); <BR>//模版文件名，模版文件所在的路径在上一条语句中已经设置了 <BR>Template template =Velocity.getTemplate("hello.vm", "gb2312"); <BR>//实例化一个Context <BR>VelocityContext context = new VelocityContext(); <BR>/** 注意这里我们仅仅需要给一个模版变量负值 */ <BR>context.put("allCustomer", allMyCustomer); <BR>//开始模版的替换 <BR>template.merge(context, writer); <BR>//写到文件中 <BR>PrintWriter filewriter = new PrintWriter(new FileOutputStream(outpath),true); <BR>filewriter.println(writer.toString()); <BR>filewriter.close(); <BR>/******************************************************/ <BR>结果： <BR>&lt;html&gt; <BR>&lt;body&gt; <BR>&lt;table&gt; <BR>&lt;tr&gt; <BR>&lt;td&gt;名称&lt;/td&gt; <BR>&lt;td&gt;地址&lt;/td&gt; <BR>&lt;td&gt;年龄&lt;/td&gt; <BR>&lt;/tr&gt; <BR>&lt;tr&gt; <BR>&lt;td&gt;Velocity&lt;/td&gt; <BR>&lt;td&gt;jakarta.apache.org/velocity/index.html&lt;/td&gt; <BR>&lt;td&gt;2&lt;/td&gt; <BR>&lt;/tr&gt; <BR>&lt;tr&gt; <BR>&lt;td&gt;Log4J&lt;/td&gt; <BR>&lt;td&gt;jakarta.apache.org/log4j/docs/index.html&lt;/td&gt; <BR>&lt;td&gt;2&lt;/td&gt; <BR>&lt;/tr&gt; <BR>&lt;/table&gt; <BR>&lt;/body&gt; <BR>&lt;/html&gt; <BR><BR>#if 语句完成逻辑判断，这个我想不用多说了。 <BR>allCustomer对象包含零个或者多个Customer对象。由于ArrayList (List, HashMap, HashTable, Iterator, Vector等)属于Java Collections Framework的一部分，我们可以用#foreach指令迭代其内容。我们不用担心如何定型对象的类型——映像引擎会为我们完成这个任务。#foreach指令的一般格式是“#foreach in ”。#foreach指令迭代list，把list中的每个元素放入item参数，然后解析#foreach块内的内容。对于list内的每个元素，#foreach块的内容都会重复解析一次。从效果上看，它相当于告诉模板引擎说：“把list中的每一个元素依次放入item变量，每次放入一个元素，输出一次#foreach块的内容”。 <BR><BR>2.MVC设计模型 <BR><BR>使用模板引擎最大的好处在于，它分离了代码（或程序逻辑）和表现（输出）。由于这种分离，你可以修改程序逻辑而不必担心邮件消息本身；类似地，你（或公关部门的职员）可以在不重新编译程序的情况下，重新编写客户列表。实际上，我们分离了系统的数据模式（Data Model，即提供数据的类）、控制器（Controller，即客户列表程序）以及视图（View，即模板）。这种三层体系称为Model-View-Controller模型（MVC）。 <BR>如果遵从MVC模型，代码分成三个截然不同的层，简化了软件开发过程中所有相关人员的工作。 <BR>结合模板引擎使用的数据模式可以是任何Java对象，最好是使用Java Collection Framework的对象。控制器只要了解模板的环境（如VelocityContext），一般这种环境都很容易使用。 <BR>一些关系数据库的“对象-关系”映射工具能够和模板引擎很好地协同，简化JDBC操作；对于EJB，情形也类似。 模板引擎与MVC中视图这一部分的关系更为密切。模板语言的功能很丰富、强大，足以处理所有必需的视图功能，同时它往往很简单，不熟悉编程的人也可以使用它。模板语言不仅使得设计者从过于复杂的编程环境中解脱出来，而且它保护了系统，避免了有意或无意带来危险的代码。例如，模板的编写者不可能编写出导致无限循环的代码，或侵占大量内存的代码。不要轻估这些安全机制的价值；大多数模板编写者不懂得编程，从长远来看，避免他们接触复杂的编程环境相当于节省了你自己的时间。 许多模板引擎的用户相信，在采用模板引擎的方案中，控制器部分和视图部分的明确分离，再加上模板引擎固有的安全机制，使得模板引擎足以成为其他内容发布系统（比如JSP）的替代方案。因此，Java模板引擎最常见的用途是替代JSP也就不足为奇了。 <BR><BR>3.HTML处理 <BR><BR>由于人们总是看重模板引擎用来替换JSP的作用，有时他们会忘记模板还有更广泛的用途。到目前为止，模板引擎最常见的用途是处理HTML Web内容。但我还用模板引擎生成过SQL、email、XML甚至Java源代码。</DIV><img src ="http://www.blogjava.net/wangyugod/aggbug/22057.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/wangyugod/" target="_blank">船夫</a> 2005-12-01 08:36 <a href="http://www.blogjava.net/wangyugod/archive/2005/12/01/22057.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>IBATIS SQLMap详解</title><link>http://www.blogjava.net/wangyugod/archive/2005/11/09/19034.html</link><dc:creator>船夫</dc:creator><author>船夫</author><pubDate>Wed, 09 Nov 2005 11:17:00 GMT</pubDate><guid>http://www.blogjava.net/wangyugod/archive/2005/11/09/19034.html</guid><wfw:comment>http://www.blogjava.net/wangyugod/comments/19034.html</wfw:comment><comments>http://www.blogjava.net/wangyugod/archive/2005/11/09/19034.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/wangyugod/comments/commentRss/19034.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/wangyugod/services/trackbacks/19034.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: Tag： IBATIS &nbsp;&nbsp; SQL &nbsp;&nbsp; Maps &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&n...&nbsp;&nbsp;<a href='http://www.blogjava.net/wangyugod/archive/2005/11/09/19034.html'>阅读全文</a><img src ="http://www.blogjava.net/wangyugod/aggbug/19034.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/wangyugod/" target="_blank">船夫</a> 2005-11-09 19:17 <a href="http://www.blogjava.net/wangyugod/archive/2005/11/09/19034.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[数据库]JDBC连接数据库经验技巧集萃（转载自Blog For Everyone）</title><link>http://www.blogjava.net/wangyugod/archive/2005/11/08/18713.html</link><dc:creator>船夫</dc:creator><author>船夫</author><pubDate>Tue, 08 Nov 2005 03:46:00 GMT</pubDate><guid>http://www.blogjava.net/wangyugod/archive/2005/11/08/18713.html</guid><wfw:comment>http://www.blogjava.net/wangyugod/comments/18713.html</wfw:comment><comments>http://www.blogjava.net/wangyugod/archive/2005/11/08/18713.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/wangyugod/comments/commentRss/18713.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/wangyugod/services/trackbacks/18713.html</trackback:ping><description><![CDATA[Java数据库连接（JDBC）由一组用 Java 编程语言编写的类和接口组成。JDBC 为工具/数据库开发人员提供了一个标准的 API，使他们能够用纯Java API 来编写数据库应用程序。然而各个开发商的接口并不完全相同，所以开发环境的变化会带来一定的配置变化。本文主要集合了不同数据库的连接方式。<BR><BR>　　<B>一、连接各种数据库方式速查表</B><BR><BR>　　下面罗列了各种数据库使用JDBC连接的方式，可以作为一个手册使用。 <BR><BR>　　1、Oracle8/8i/9i数据库（thin模式） <BR><BR>
<TABLE borderColor=#ffcc66 width="90%" align=center bgColor=#dadacf border=1>
<TBODY>
<TR>
<TD>Class.forName("oracle.jdbc.driver.OracleDriver").newInstance(); <BR>String url="jdbc:oracle:thin:@localhost:1521:orcl"; //orcl为数据库的SID <BR>String user="test"; <BR>String password="test"; <BR>Connection conn= DriverManager.getConnection(url,user,password); </TD></TR></TBODY></TABLE><BR>　　2、DB2数据库 <BR><BR>
<TABLE borderColor=#ffcc66 width="90%" align=center bgColor=#dadacf border=1>
<TBODY>
<TR>
<TD>Class.forName("com.ibm.db2.jdbc.app.DB2Driver ").newInstance(); <BR>String url="jdbc:db2://localhost:5000/sample"; //sample为你的数据库名 <BR>String user="admin"; <BR>String password=""; <BR>Connection conn= DriverManager.getConnection(url,user,password); </TD></TR></TBODY></TABLE><BR>　　3、Sql Server7.0/2000数据库 <BR><BR>
<TABLE borderColor=#ffcc66 width="90%" align=center bgColor=#dadacf border=1>
<TBODY>
<TR>
<TD>Class.forName("com.microsoft.jdbc.sqlserver.SQLServerDriver").newInstance(); <BR>String url="jdbc:microsoft:sqlserver://localhost:1433;DatabaseName=mydb"; <BR>//mydb为数据库 <BR>String user="sa"; <BR>String password=""; <BR>Connection conn= DriverManager.getConnection(url,user,password); </TD></TR></TBODY></TABLE><BR>　　4、Sybase数据库 <BR><BR>
<TABLE borderColor=#ffcc66 width="90%" align=center bgColor=#dadacf border=1>
<TBODY>
<TR>
<TD>Class.forName("com.sybase.jdbc.SybDriver").newInstance(); <BR>String url =" jdbc:sybase:Tds:localhost:5007/myDB";//myDB为你的数据库名 <BR>Properties sysProps = System.getProperties(); <BR>SysProps.put("user","userid"); <BR>SysProps.put("password","user_password"); <BR>Connection conn= DriverManager.getConnection(url, SysProps); </TD></TR></TBODY></TABLE><BR>　　5、Informix数据库 <BR><BR>
<TABLE borderColor=#ffcc66 width="90%" align=center bgColor=#dadacf border=1>
<TBODY>
<TR>
<TD>Class.forName("com.informix.jdbc.IfxDriver").newInstance(); <BR>String url = "jdbc:informix-sqli://123.45.67.89:1533/myDB:INFORMIXSERVER=myserver; <BR>user=testuser;password=testpassword"; //myDB为数据库名 <BR>Connection conn= DriverManager.getConnection(url); </TD></TR></TBODY></TABLE><BR>　　6、MySQL数据库 <BR><BR>
<TABLE borderColor=#ffcc66 width="90%" align=center bgColor=#dadacf border=1>
<TBODY>
<TR>
<TD>Class.forName("org.gjt.mm.mysql.Driver").newInstance(); <BR>String url ="jdbc:mysql://localhost/myDB?user=soft&amp;password=soft1234&amp;useUnicode=true&amp;characterEncoding=8859_1" <BR>//myDB为数据库名 <BR>Connection conn= DriverManager.getConnection(url); </TD></TR></TBODY></TABLE><BR>　　7、PostgreSQL数据库 <BR><BR>
<TABLE borderColor=#ffcc66 width="90%" align=center bgColor=#dadacf border=1>
<TBODY>
<TR>
<TD>Class.forName("org.postgresql.Driver").newInstance(); <BR>String url ="jdbc:postgresql://localhost/myDB" //myDB为数据库名 <BR>String user="myuser"; <BR>String password="mypassword"; <BR>Connection conn= DriverManager.getConnection(url,user,password); </TD></TR></TBODY></TABLE><BR>　　8、access数据库直连用ODBC的<BR><BR>
<TABLE borderColor=#ffcc66 width="90%" align=center bgColor=#dadacf border=1>
<TBODY>
<TR>
<TD>Class.forName("sun.jdbc.odbc.JdbcOdbcDriver") ;<BR>String url="jdbc:odbc:Driver={MicroSoft Access Driver (*.mdb)};DBQ="+application.getRealPath("/Data/ReportDemo.mdb");<BR>Connection conn = DriverManager.getConnection(url,"","");<BR>Statement stmtNew=conn.createStatement() ;</TD></TR></TBODY></TABLE><BR>　　<B>二、JDBC连接MySql方式</B><BR><BR>　　下面是使用JDBC连接MySql的一个小的教程 <BR><BR>　　1、查找驱动程序<BR><BR>　　MySQL目前提供的java驱动程序为Connection/J，可以从MySQL官方网站下载，并找到mysql-connector-java-3.0.15-ga-bin.jar文件，此驱动程序为纯java驱动程序，不需做其他配置。<BR><BR>　　2、动态指定classpath<BR><BR>　　如果需要执行时动态指定classpath，就在执行时采用－cp方式。否则将上面的.jar文件加入到classpath环境变量中。<BR><BR>　　3、加载驱动程序<BR><BR>
<TABLE borderColor=#ffcc66 width="90%" align=center bgColor=#dadacf border=1>
<TBODY>
<TR>
<TD>try{<BR>　Class.forName(com.mysql.jdbc.Driver);<BR>　System.out.println(Success loading Mysql Driver!);<BR>}catch(Exception e)<BR>{<BR>　System.out.println(Error loading Mysql Driver!);<BR>　e.printStackTrace();<BR>}</TD></TR></TBODY></TABLE><BR>　　4、设置连接的url<BR><BR>
<TABLE borderColor=#ffcc66 width="90%" align=center bgColor=#dadacf border=1>
<TBODY>
<TR>
<TD>jdbc：mysql：//localhost/databasename[?pa=va][＆pa=va]</TD></TR></TBODY></TABLE><BR><SPAN class=f14>　　<B>三、以下列出了在使用JDBC来连接Oracle数据库时可以使用的一些技巧</B><BR><BR>　　1、在客户端软件开发中使用Thin驱动程序<BR><BR>　　在开发Java软件方面，Oracle的数据库提供了四种类型的驱动程序，二种用于应用软件、applets、servlets等客户端软件，另外二种用于数据库中的Java存储过程等服务器端软件。在客户机端软件的开发中，我们可以选择OCI驱动程序或Thin驱动程序。OCI驱动程序利用Java本地化接口（JNI），通过Oracle客户端软件与数据库进行通讯。Thin驱动程序是纯Java驱动程序，它直接与数据库进行通讯。为了获得最高的性能，Oracle建议在客户端软件的开发中使用OCI驱动程序，这似乎是正确的。但我建议使用Thin驱动程序，因为通过多次测试发现，在通常情况下，Thin驱动程序的性能都超过了OCI驱动程序。<BR><BR>　　2、关闭自动提交功能，提高系统性能<BR><BR>　　在第一次建立与数据库的连接时，在缺省情况下，连接是在自动提交模式下的。为了获得更好的性能，可以通过调用带布尔值false参数的Connection类的setAutoCommit()方法关闭自动提交功能，如下所示：<BR><BR>　　conn.setAutoCommit(false);<BR><BR>　　值得注意的是，一旦关闭了自动提交功能，我们就需要通过调用Connection类的commit()和rollback()方法来人工的方式对事务进行管理。<BR><BR>　　3、在动态SQL或有时间限制的命令中使用Statement对象<BR><BR>　　在执行SQL命令时，我们有二种选择：可以使用PreparedStatement对象，也可以使用Statement对象。无论多少次地使用同一个SQL命令，PreparedStatement都只对它解析和编译一次。当使用Statement对象时，每次执行一个SQL命令时，都会对它进行解析和编译。这可能会使你认为，使用PreparedStatement对象比使用Statement对象的速度更快。然而，我进行的测试表明，在客户端软件中，情况并非如此。因此，在有时间限制的SQL操作中，除非成批地处理SQL命令，我们应当考虑使用Statement对象。<BR><BR>　　此外，使用Statement对象也使得编写动态SQL命令更加简单，因为我们可以将字符串连接在一起，建立一个有效的SQL命令。因此，我认为，Statement对象可以使动态SQL命令的创建和执行变得更加简单。<BR><BR>　　4、利用helper函数对动态SQL命令进行格式化<BR><BR>　　在创建使用Statement对象执行的动态SQL命令时，我们需要处理一些格式化方面的问题。例如，如果我们想创建一个将名字O'Reilly插入表中的SQL命令，则必须使用二个相连的“''”号替换O'Reilly中的“'”号。完成这些工作的最好的方法是创建一个完成替换操作的helper方法，然后在连接字符串心服用公式表达一个SQL命令时，使用创建的helper方法。与此类似的是，我们可以让helper方法接受一个Date型的值，然后让它输出基于Oracle的to_date()函数的字符串表达式。<BR><BR>　　5、利用PreparedStatement对象提高数据库的总体效率<BR><BR>　　在使用PreparedStatement对象执行SQL命令时，命令被数据库进行解析和编译，然后被放到命令缓冲区。然后，每当执行同一个PreparedStatement对象时，它就会被再解析一次，但不会被再次编译。在缓冲区中可以发现预编译的命令，并且可以重新使用。在有大量用户的企业级应用软件中，经常会重复执行相同的SQL命令，使用PreparedStatement对象带来的编译次数的减少能够提高数据库的总体性能。如果不是在客户端创建、预备、执行PreparedStatement任务需要的时间长于Statement任务，我会建议在除动态SQL命令之外的所有情况下使用PreparedStatement对象。<BR><BR>　　6、在成批处理重复的插入或更新操作中使用PreparedStatement对象<BR><BR>　　如果成批地处理插入和更新操作，就能够显著地减少它们所需要的时间。Oracle提供的Statement和 CallableStatement并不真正地支持批处理，只有PreparedStatement对象才真正地支持批处理。我们可以使用addBatch()和executeBatch()方法选择标准的JDBC批处理，或者通过利用PreparedStatement对象的setExecuteBatch()方法和标准的executeUpdate()方法选择速度更快的Oracle专有的方法。要使用Oracle专有的批处理机制，可以以如下所示的方式调用setExecuteBatch()：<BR><BR>
<TABLE borderColor=#ffcc66 width="90%" align=center bgColor=#dadacf border=1>
<TBODY>
<TR>
<TD>PreparedStatement pstmt3D null;<BR>try {<BR>　((OraclePreparedStatement)pstmt).setExecuteBatch(30);<BR>　...<BR>　pstmt.executeUpdate();<BR>} </TD></TR></TBODY></TABLE><BR>　　调用setExecuteBatch()时指定的值是一个上限，当达到该值时，就会自动地引发SQL命令执行，标准的executeUpdate()方法就会被作为批处理送到数据库中。我们可以通过调用PreparedStatement类的sendBatch()方法随时传输批处理任务。<BR><BR>　　7、使用Oracle locator方法插入、更新大对象（LOB）<BR><BR>　　Oracle的PreparedStatement类不完全支持BLOB和CLOB等大对象的处理，尤其是Thin驱动程序不支持利用PreparedStatement对象的setObject()和setBinaryStream()方法设置BLOB的值，也不支持利用setCharacterStream()方法设置CLOB的值。只有locator本身中的方法才能够从数据库中获取LOB类型的值。可以使用PreparedStatement对象插入或更新LOB，但需要使用locator才能获取LOB的值。由于存在这二个问题，因此，我建议使用locator的方法来插入、更新或获取LOB的值。<BR><BR>　　8、使用SQL92语法调用存储过程<BR><BR>　　在调用存储过程时，我们可以使用SQL92或Oracle PL/SQL，由于使用Oracle PL/SQL并没有什么实际的好处，而且会给以后维护你的应用程序的开发人员带来麻烦，因此，我建议在调用存储过程时使用SQL92。<BR><BR>　　9、使用Object SQL将对象模式转移到数据库中<BR><BR>　　既然可以将Oracle的数据库作为一种面向对象的数据库来使用，就可以考虑将应用程序中的面向对象模式转到数据库中。目前的方法是创建Java bean作为伪装的数据库对象，将它们的属性映射到关系表中，然后在这些bean中添加方法。尽管这样作在Java中没有什么问题，但由于操作都是在数据库之外进行的，因此其他访问数据库的应用软件无法利用对象模式。如果利用Oracle的面向对象的技术，可以通过创建一个新的数据库对象类型在数据库中模仿其数据和操作，然后使用JPublisher等工具生成自己的Java bean类。如果使用这种方式，不但Java应用程序可以使用应用软件的对象模式，其他需要共享你的应用中的数据和操作的应用软件也可以使用应用软件中的对象模式。<BR><BR>　　10、利用SQL完成数据库内的操作<BR><BR>　　我要向大家介绍的最重要的经验是充分利用SQL的面向集合的方法来解决数据库处理需求，而不是使用Java等过程化的编程语言。<BR><BR>　　如果编程人员要在一个表中查找许多行，结果中的每个行都会查找其他表中的数据，最后，编程人员创建了独立的UPDATE命令来成批地更新第一个表中的数据。与此类似的任务可以通过在set子句中使用多列子查询而在一个UPDATE命令中完成。当能够在单一的SQL命令中完成任务，何必要让数据在网上流来流去的？我建议用户认真学习如何最大限度地发挥SQL的功能。</SPAN><img src ="http://www.blogjava.net/wangyugod/aggbug/18713.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/wangyugod/" target="_blank">船夫</a> 2005-11-08 11:46 <a href="http://www.blogjava.net/wangyugod/archive/2005/11/08/18713.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>