﻿<?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-自歌自舞自开怀，无拘无束无碍</title><link>http://www.blogjava.net/j-girl/</link><description /><language>zh-cn</language><lastBuildDate>Thu, 30 Apr 2026 06:31:48 GMT</lastBuildDate><pubDate>Thu, 30 Apr 2026 06:31:48 GMT</pubDate><ttl>60</ttl><item><title>一个小框架的形成原理（一）</title><link>http://www.blogjava.net/j-girl/archive/2009/04/11/265051.html</link><dc:creator>西西里</dc:creator><author>西西里</author><pubDate>Sat, 11 Apr 2009 13:48:00 GMT</pubDate><guid>http://www.blogjava.net/j-girl/archive/2009/04/11/265051.html</guid><wfw:comment>http://www.blogjava.net/j-girl/comments/265051.html</wfw:comment><comments>http://www.blogjava.net/j-girl/archive/2009/04/11/265051.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/j-girl/comments/commentRss/265051.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/j-girl/services/trackbacks/265051.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: &nbsp; 以下是本人在学习过程中做的一点点小小的总结，在这里留个副本！现有代码存在的问题：为了解决每个业务模块对应一个Servlet，Servlet过多的问题解决办法：使用一个新的Servlet，汇总了所有的业务模块Servlet，增加逻辑判断，具体调用哪个业务Servletpublic class ServletAction extends HttpServlet {...&nbsp;&nbsp;<a href='http://www.blogjava.net/j-girl/archive/2009/04/11/265051.html'>阅读全文</a><img src ="http://www.blogjava.net/j-girl/aggbug/265051.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/j-girl/" target="_blank">西西里</a> 2009-04-11 21:48 <a href="http://www.blogjava.net/j-girl/archive/2009/04/11/265051.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>比较完美的单例模式</title><link>http://www.blogjava.net/j-girl/archive/2009/04/02/263620.html</link><dc:creator>西西里</dc:creator><author>西西里</author><pubDate>Thu, 02 Apr 2009 13:46:00 GMT</pubDate><guid>http://www.blogjava.net/j-girl/archive/2009/04/02/263620.html</guid><wfw:comment>http://www.blogjava.net/j-girl/comments/263620.html</wfw:comment><comments>http://www.blogjava.net/j-girl/archive/2009/04/02/263620.html#Feedback</comments><slash:comments>12</slash:comments><wfw:commentRss>http://www.blogjava.net/j-girl/comments/commentRss/263620.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/j-girl/services/trackbacks/263620.html</trackback:ping><description><![CDATA[<div id="blogDetailDiv" style="font-size: 16px">public class UserService {<br />
&nbsp;&nbsp;&nbsp;&nbsp;private UserService userService = null;<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;private UserService() {}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;public static UserService getInstance() {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(userService == null) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;synchronized(UserService.class) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(userService == null) {userService = new UserService();}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;return userService;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
}<!--v:3.1--> </div>
<img src ="http://www.blogjava.net/j-girl/aggbug/263620.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/j-girl/" target="_blank">西西里</a> 2009-04-02 21:46 <a href="http://www.blogjava.net/j-girl/archive/2009/04/02/263620.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>简单的JavaEE异常处理机制</title><link>http://www.blogjava.net/j-girl/archive/2009/04/02/263530.html</link><dc:creator>西西里</dc:creator><author>西西里</author><pubDate>Thu, 02 Apr 2009 06:01:00 GMT</pubDate><guid>http://www.blogjava.net/j-girl/archive/2009/04/02/263530.html</guid><wfw:comment>http://www.blogjava.net/j-girl/comments/263530.html</wfw:comment><comments>http://www.blogjava.net/j-girl/archive/2009/04/02/263530.html#Feedback</comments><slash:comments>3</slash:comments><wfw:commentRss>http://www.blogjava.net/j-girl/comments/commentRss/263530.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/j-girl/services/trackbacks/263530.html</trackback:ping><description><![CDATA[&nbsp;
<p style="margin: 0cm 0cm 0pt"><span style="font-size: 10pt">首先，当</span><span style="font-size: 10pt; font-family: Calibri">DAO</span><span style="font-size: 10pt">层</span><span style="font-size: 10pt; font-family: Calibri">Catch</span><span style="font-size: 10pt">到</span><span style="font-size: 10pt; font-family: Calibri">SQL</span><span style="font-size: 10pt">异常，</span><span style="font-size: 10pt">应该让相应的事务回滚，并继续抛出该异常</span></p>
<p style="margin: 0cm 0cm 0pt 27pt"><span style="font-size: 10pt; font-family: Calibri">conn.rollback();</span></p>
<p style="margin: 0cm 0cm 0pt 27pt"><span style="font-size: 10pt; font-family: Calibri">throw e;</span></p>
<p style="margin: 0cm 0cm 0pt 27pt"><span style="font-size: 10pt">在方法声明时</span><span style="font-size: 10pt; font-family: Calibri">throws</span><span style="font-size: 10pt">这个异常；</span></p>
<p style="margin: 0cm 0cm 0pt"><span style="font-size: 10pt">第二，在</span><span style="font-size: 10pt; font-family: Calibri">Service</span><span style="font-size: 10pt">层调用到</span><span style="font-size: 10pt; font-family: Calibri">Dao</span><span style="font-size: 10pt">层时，</span><span style="font-size: 10pt; font-family: Calibri">try catch</span><span style="font-size: 10pt">这个异常，在</span><span style="font-size: 10pt; font-family: Calibri">catch</span><span style="font-size: 10pt">住中把它处理为</span><span style="font-size: 10pt; font-family: Calibri">Runtime</span><span style="font-size: 10pt">Exception</span><span style="font-size: 10pt">异常；</span></p>
<p style="margin: 0cm 0cm 0pt 27pt"><span style="font-size: 10pt">处理过程是：自定义一个继承自</span><span style="font-size: 10pt; font-family: Calibri">Runtime</span><span style="font-size: 10pt">Exception</span><span style="font-size: 10pt">的异常类AppRuntimeException；</span></p>
<p style="margin: 0cm 0cm 0pt 27pt"><span style="font-size: 10pt; font-family: Calibri">catch(){</span></p>
<p style="margin: 0cm 0cm 0pt 54pt"><span style="font-size: 10pt; font-family: Calibri">new&nbsp;</span><span style="font-size: 10pt">AppRuntimeException();</span></p>
<p style="margin: 0cm 0cm 0pt 27pt"><span style="font-size: 10pt; font-family: Calibri">}</span></p>
<p style="margin: 0cm 0cm 0pt"><span style="font-size: 10pt">第三，在</span><span style="font-size: 10pt; font-family: Calibri">Servlet</span><span style="font-size: 10pt">中使用配置文件</span><span style="font-size: 10pt; font-family: Calibri">web.xml</span><span style="font-size: 10pt">注册这个</span><span style="font-size: 10pt; font-family: Calibri">Exception</span><span style="font-size: 10pt">，或者注册为</span><span style="font-size: 10pt; font-family: Calibri">RuntimeException</span><span style="font-size: 10pt">，调用</span><span style="font-size: 10pt; font-family: Calibri">Service</span><span style="font-size: 10pt">时，如果发生这个异常，则会跳转到相关的友好的面向用户的错误页面；</span></p>
<p style="margin: 0cm 0cm 0pt 27pt"><span style="font-size: 10pt">注意：如果页面未转向，则可能是反射过程中抛出的其他异常截获了我们自定义的这个</span><span style="font-size: 10pt; font-family: Calibri">RuntimeException</span><span style="font-size: 10pt">，我们可以在这个异常中做出处理，让它转换为我们自定义的</span><span style="font-size: 10pt; font-family: Calibri">RuntimeException</span><span style="font-size: 10pt">；</span></p>
<p style="margin: 0cm 0cm 0pt"><span style="font-size: 10pt">第四，以上我们只是简单的处理了异常，一般正常的与业务相关的异常；</span></p>
<img src ="http://www.blogjava.net/j-girl/aggbug/263530.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/j-girl/" target="_blank">西西里</a> 2009-04-02 14:01 <a href="http://www.blogjava.net/j-girl/archive/2009/04/02/263530.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>LocalThread思考</title><link>http://www.blogjava.net/j-girl/archive/2009/04/01/263376.html</link><dc:creator>西西里</dc:creator><author>西西里</author><pubDate>Wed, 01 Apr 2009 07:30:00 GMT</pubDate><guid>http://www.blogjava.net/j-girl/archive/2009/04/01/263376.html</guid><wfw:comment>http://www.blogjava.net/j-girl/comments/263376.html</wfw:comment><comments>http://www.blogjava.net/j-girl/archive/2009/04/01/263376.html#Feedback</comments><slash:comments>4</slash:comments><wfw:commentRss>http://www.blogjava.net/j-girl/comments/commentRss/263376.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/j-girl/services/trackbacks/263376.html</trackback:ping><description><![CDATA[&nbsp;
<p style="margin: 0cm 0cm 0pt 1.45pt"><span style="font-size: 10pt"><span style="font-family: 宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="font-size: 18pt"><span style="font-size: 14pt"><span style="font-family: 宋体">为了解决一个事务的多个数据模型使用多个<span lang="EN-US">Connection的情况，首先想到的是在执行每个原子级数据模型的操作的时候直接在方法的参数中传进来一个<span lang="EN-US">Connection，</span></span></span><span style="font-family: 宋体"><span style="font-family: 宋体">下一个操作也把这个同一个<span lang="EN-US">Connection传进来，但是这样带来的问题有两个，一是，设计问题，针对数据库的操作ＤＡＯ的方法中的参数<span style="font-family: 宋体">一般都应该是针对数据库查询的查询条件，把<span lang="EN-US">Connection放在这里作为参数显然不合适；第二，<span lang="EN-US">Connection作为多个数据模型操作的共享，只在最后一个操作<span style="font-family: 宋体">中才被关闭，这对于如果只有单个操作的事务执行时，<span lang="EN-US">Connection将不会被关闭。</span></span></span></span></span></span></span></span><span style="font-family: 宋体">&nbsp;</span></span></span></span></span><span style="font-family: 宋体"><span style="font-size: 14pt"><span style="font-size: 18pt"><span style="font-size: 10pt"><span style="font-size: 18pt">&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp; <br />
<span style="font-size: 14pt"><span style="font-family: 宋体">&nbsp;&nbsp;&nbsp; 为了解决这些问题，需要有一个专门生产<span lang="EN-US">Connection的类，供<span lang="EN-US">DAO层各方法调用，但是几个方法如果是同一事务时，他们拿到的<span lang="EN-US">Connection应该是同一个；<span lang="EN-US"><o:p></o:p></span></span></span></span></span></span></span></span></span></span></span><span style="font-family: 宋体"><span style="font-size: 14pt"><span style="font-size: 18pt"><span style="font-size: 10pt"><span style="font-size: 18pt">&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;<span style="font-size: 14pt">由此，生产<span lang="EN-US">Connection</span>的类，有两个方法，一是生产<span lang="EN-US">Connecton</span>，放到一个容器中，即<span lang="EN-US">set</span>方法，二是得到<span lang="EN-US">Conneciton</span>，即<span lang="EN-US">get</span>方法；</span></span></span></span></span></span></p>
<p style="margin: 0cm 0cm 0pt 1.45pt"><span style="font-family: 宋体"><span style="font-size: 14pt"><span style="font-size: 18pt"><span style="font-size: 18pt"><span style="font-size: 14pt"><span style="font-size: 14pt"><span lang="EN-US" style="font-size: 10pt">&nbsp;&nbsp;&nbsp;<span style="font-size: 14pt">&nbsp;&nbsp;</span></span><span style="font-size: 10pt"><span style="font-size: 14pt">当同一事务的多个方法调用时，拿到同一个容器中的<span lang="EN-US">Connection</span>即可保证他们拿到的是同一个<span lang="EN-US">Connection</span>对象；<span lang="EN-US"><o:p></o:p></span></span></span></span></span></span></span></span></span></p>
<p style="margin: 0cm 0cm 0pt 1.45pt"><span style="font-family: 宋体"><span style="font-size: 14pt"><span style="font-size: 18pt"><span style="font-size: 18pt"><span style="font-size: 14pt"><span style="font-size: 14pt"><span style="font-size: 14pt"><span lang="EN-US" style="font-size: 10pt">&nbsp;&nbsp;&nbsp;<span style="font-size: 14pt">&nbsp; </span></span><span style="font-size: 10pt"><span style="font-size: 14pt">为了保证拿到的是同一个容器，使用类级别的变量，<span lang="EN-US">static Hashtable;<o:p></o:p></span></span></span></span></span></span></span></span></span></span></p>
<p style="margin: 0cm 0cm 0pt 1.45pt"><span style="font-family: 宋体"><span style="font-size: 14pt"><span style="font-size: 18pt"><span style="font-size: 18pt"><span style="font-size: 14pt"><span style="font-size: 14pt"><span style="font-size: 14pt"><span style="font-size: 14pt"><span lang="EN-US" style="font-size: 10pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="font-size: 14pt"><span style="font-family: 宋体"><span lang="EN-US">采取<span lang="EN-US">static类变量的方式，解决了以上引起的设计问题？<span lang="EN-US"><o:p></o:p></span></span></span></span></span></span></span></span></span></span></span></span></span></span><span style="font-family: 宋体"><span style="font-size: 14pt"><span style="font-size: 18pt"><span style="font-size: 18pt"><span style="font-size: 14pt"><span style="font-size: 14pt"><span style="font-size: 14pt"><span style="font-size: 14pt"><span lang="EN-US" style="font-size: 10pt">&nbsp;&nbsp;&nbsp;&nbsp;<br />
</span><span style="font-size: 10pt"><span style="font-size: 14pt"><span style="font-family: 宋体">&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; 因为<span lang="EN-US">static的方法是位于方法区中的，多个线程共享，所以又引发了线程不安全的问题；<span lang="EN-US"><o:p></o:p></span></span></span></span></span></span></span></span></span></span></span></span></span><span style="font-family: 宋体"><span style="font-size: 14pt"><span style="font-size: 18pt"><span style="font-size: 18pt"><span style="font-size: 14pt"><span style="font-size: 14pt"><span style="font-size: 14pt"><span style="font-size: 14pt"><span lang="EN-US" style="font-size: 10pt; font-family: 宋体; mso-bidi-font-family: 宋体; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA">&nbsp;&nbsp;&nbsp;&nbsp;<br />
</span><span style="font-size: 10pt; font-family: 宋体; mso-bidi-font-family: 宋体; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA"><span style="font-size: 14pt"><span style="font-family: 宋体"><span style="font-family: 宋体; mso-bidi-font-family: 宋体; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA">&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; 所以使用<span lang="EN-US">API中的<span lang="EN-US">ThreadLocal类型的变量，使得多个线程各自拥有自己的一个容器，从而解决了线程不安全的问题。</span></span></span></span> </span></span></span></span></span></span></span></span></span></span></p>
<img src ="http://www.blogjava.net/j-girl/aggbug/263376.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/j-girl/" target="_blank">西西里</a> 2009-04-01 15:30 <a href="http://www.blogjava.net/j-girl/archive/2009/04/01/263376.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>