﻿<?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 AJAX C++-随笔分类-JAVA技术</title><link>http://www.blogjava.net/itspy/category/17171.html</link><description /><language>zh-cn</language><lastBuildDate>Tue, 22 Apr 2008 08:37:02 GMT</lastBuildDate><pubDate>Tue, 22 Apr 2008 08:37:02 GMT</pubDate><ttl>60</ttl><item><title>log4j 行号与文件名打印问号</title><link>http://www.blogjava.net/itspy/archive/2008/04/22/194686.html</link><dc:creator>itspy</dc:creator><author>itspy</author><pubDate>Tue, 22 Apr 2008 01:52:00 GMT</pubDate><guid>http://www.blogjava.net/itspy/archive/2008/04/22/194686.html</guid><wfw:comment>http://www.blogjava.net/itspy/comments/194686.html</wfw:comment><comments>http://www.blogjava.net/itspy/archive/2008/04/22/194686.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/itspy/comments/commentRss/194686.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/itspy/services/trackbacks/194686.html</trackback:ping><description><![CDATA[<font style="background-color: #cce8cf">关键字:行号 文件名 乱码 问号 ?<br />
<br />
log4j本来设置了要打印行号与文件名的,结果有的能打印出来,有的却是乱码,查了些文档之后才发现,原来打印问题是因为编绎时没有编绎进去调试信息,所以没办法打印.<br />
<br />
但是我用的是Ant,如果在Ant编绎时,编绎进去调试信息呢,参考下面配置.<br />
<br />
<font style="background-color: #cce8cf">&nbsp;&nbsp;&lt;javac srcdir="src" destdir="bin" <span style="color: red">debug="true"&nbsp;</span> classpathref="accrual.path" &gt;<br />
</font><br />
首发于 http://blog.xfuse.cn<br />
<br />
参考文档<br />
http://ant.apache.org/manual/CoreTasks/javac.html<br />
<br />
<br />
<br />
Log4j配置<br />
<font style="background-color: #cce8cf"><font style="background-color: #cce8cf">log4j.appender.C1.layout.ConversionPattern=%F(%L)-- %-4r %-5p [%t] %37c %3x - %m%n<br />
<br />
<br />
如果是用JAVAC编绎,那么直接加参数-g就可以了.<br />
<br />
<font style="background-color: #cce8cf">用法：javac &lt;选项&gt; &lt;源文件&gt;<br />
其中，可能的选项包括：<br />
&nbsp; -g&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 生成所有调试信息<br />
&nbsp; -g:none&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 不生成任何调试信息<br />
&nbsp; -g:{lines,vars,source}&nbsp;&nbsp;&nbsp;&nbsp; 只生成某些调试信息<br />
&nbsp; -nowarn&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 不生成任何警告</font><br />
</font></font></font>
<img src ="http://www.blogjava.net/itspy/aggbug/194686.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/itspy/" target="_blank">itspy</a> 2008-04-22 09:52 <a href="http://www.blogjava.net/itspy/archive/2008/04/22/194686.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>用代理实现AJAX跨域访问时遇到HTTPS</title><link>http://www.blogjava.net/itspy/archive/2007/04/27/114125.html</link><dc:creator>itspy</dc:creator><author>itspy</author><pubDate>Fri, 27 Apr 2007 08:26:00 GMT</pubDate><guid>http://www.blogjava.net/itspy/archive/2007/04/27/114125.html</guid><wfw:comment>http://www.blogjava.net/itspy/comments/114125.html</wfw:comment><comments>http://www.blogjava.net/itspy/archive/2007/04/27/114125.html#Feedback</comments><slash:comments>4</slash:comments><wfw:commentRss>http://www.blogjava.net/itspy/comments/commentRss/114125.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/itspy/services/trackbacks/114125.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 为了方便说明，先做出一些定义。<br>代理服务器：在AJAX可以访问的域中，并且代理AJAX来访问其它网站的服务器，<br>目标服务器：AJAX真实想想访问的网址所在的服务器。<br> <br>我遇到的问题就是：代理服务器通过HTTPS访问目标服务器，但是目标服务器的证书出于一些原因并不被信任。<br><br>关键字:Ajax ,JavaScript, Coldfusion, HTTPS, cfhttp&nbsp;&nbsp;<a href='http://www.blogjava.net/itspy/archive/2007/04/27/114125.html'>阅读全文</a><img src ="http://www.blogjava.net/itspy/aggbug/114125.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/itspy/" target="_blank">itspy</a> 2007-04-27 16:26 <a href="http://www.blogjava.net/itspy/archive/2007/04/27/114125.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>2.0与1.2.8的Spring在事务管理上的区别</title><link>http://www.blogjava.net/itspy/archive/2007/03/29/107277.html</link><dc:creator>itspy</dc:creator><author>itspy</author><pubDate>Thu, 29 Mar 2007 09:20:00 GMT</pubDate><guid>http://www.blogjava.net/itspy/archive/2007/03/29/107277.html</guid><wfw:comment>http://www.blogjava.net/itspy/comments/107277.html</wfw:comment><comments>http://www.blogjava.net/itspy/archive/2007/03/29/107277.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/itspy/comments/commentRss/107277.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/itspy/services/trackbacks/107277.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 本文章比较了Spring自己带的例子：JPetStore ，通过配置文件详细讲解了，Spring1.2.8与2.0如何实现声明式事务管理。&nbsp;&nbsp;<a href='http://www.blogjava.net/itspy/archive/2007/03/29/107277.html'>阅读全文</a><img src ="http://www.blogjava.net/itspy/aggbug/107277.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/itspy/" target="_blank">itspy</a> 2007-03-29 17:20 <a href="http://www.blogjava.net/itspy/archive/2007/03/29/107277.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Spring Aop的事务配置的一点疑问</title><link>http://www.blogjava.net/itspy/archive/2007/03/27/106751.html</link><dc:creator>itspy</dc:creator><author>itspy</author><pubDate>Tue, 27 Mar 2007 12:18:00 GMT</pubDate><guid>http://www.blogjava.net/itspy/archive/2007/03/27/106751.html</guid><wfw:comment>http://www.blogjava.net/itspy/comments/106751.html</wfw:comment><comments>http://www.blogjava.net/itspy/archive/2007/03/27/106751.html#Feedback</comments><slash:comments>5</slash:comments><wfw:commentRss>http://www.blogjava.net/itspy/comments/commentRss/106751.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/itspy/services/trackbacks/106751.html</trackback:ping><description><![CDATA[Spring Aop配置中有一个事务级别是 ISOLATION_READ_COMMITTED:它的意思是 保证一个事务不会读取到另一个并行事务已修改但未提交的数据。<br /><br /><br />这样是不是有可能两个并行事务，同时读取一个数据，然后再同时修改，先后提交事务。这样就会有一个事务丢失其修改，不知道我理解的对不对。<br /><br /><br /><br /><br /> <img src ="http://www.blogjava.net/itspy/aggbug/106751.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/itspy/" target="_blank">itspy</a> 2007-03-27 20:18 <a href="http://www.blogjava.net/itspy/archive/2007/03/27/106751.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>JS实现include功能(提供完整的示例下载)</title><link>http://www.blogjava.net/itspy/archive/2007/03/21/105137.html</link><dc:creator>itspy</dc:creator><author>itspy</author><pubDate>Wed, 21 Mar 2007 01:07:00 GMT</pubDate><guid>http://www.blogjava.net/itspy/archive/2007/03/21/105137.html</guid><wfw:comment>http://www.blogjava.net/itspy/comments/105137.html</wfw:comment><comments>http://www.blogjava.net/itspy/archive/2007/03/21/105137.html#Feedback</comments><slash:comments>3</slash:comments><wfw:commentRss>http://www.blogjava.net/itspy/comments/commentRss/105137.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/itspy/services/trackbacks/105137.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 一般的语言都提供了include功能，比如JAVA，C都实现了。但是JS却没有实现。我在网上查找了一些资料，实现了一个JS的include功能，并提供完整的示例下载。&nbsp;&nbsp;<a href='http://www.blogjava.net/itspy/archive/2007/03/21/105137.html'>阅读全文</a><img src ="http://www.blogjava.net/itspy/aggbug/105137.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/itspy/" target="_blank">itspy</a> 2007-03-21 09:07 <a href="http://www.blogjava.net/itspy/archive/2007/03/21/105137.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>初步体验“AJAX不能跨域访问”(原创)［有源码，有示例］</title><link>http://www.blogjava.net/itspy/archive/2007/02/11/99262.html</link><dc:creator>itspy</dc:creator><author>itspy</author><pubDate>Sun, 11 Feb 2007 09:30:00 GMT</pubDate><guid>http://www.blogjava.net/itspy/archive/2007/02/11/99262.html</guid><wfw:comment>http://www.blogjava.net/itspy/comments/99262.html</wfw:comment><comments>http://www.blogjava.net/itspy/archive/2007/02/11/99262.html#Feedback</comments><slash:comments>7</slash:comments><wfw:commentRss>http://www.blogjava.net/itspy/comments/commentRss/99262.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/itspy/services/trackbacks/99262.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: AJAX不能跨域访问是什么意思,我想没有亲自遇到这个问题的人,可能根本就不理解.现在我给出一个例子,让大家体会一下什么是跨域访问.这个页面就是一个HTML文件,源码我附文章后面了.<br><br>大家可以亲自体会一下。不过要有Web容器才行，实在没有Web容器，用网络邻居也行。&nbsp;&nbsp;<a href='http://www.blogjava.net/itspy/archive/2007/02/11/99262.html'>阅读全文</a><img src ="http://www.blogjava.net/itspy/aggbug/99262.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/itspy/" target="_blank">itspy</a> 2007-02-11 17:30 <a href="http://www.blogjava.net/itspy/archive/2007/02/11/99262.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>打印出Ibatis最终的SQL语句</title><link>http://www.blogjava.net/itspy/archive/2007/02/11/99232.html</link><dc:creator>itspy</dc:creator><author>itspy</author><pubDate>Sun, 11 Feb 2007 03:22:00 GMT</pubDate><guid>http://www.blogjava.net/itspy/archive/2007/02/11/99232.html</guid><wfw:comment>http://www.blogjava.net/itspy/comments/99232.html</wfw:comment><comments>http://www.blogjava.net/itspy/archive/2007/02/11/99232.html#Feedback</comments><slash:comments>5</slash:comments><wfw:commentRss>http://www.blogjava.net/itspy/comments/commentRss/99232.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/itspy/services/trackbacks/99232.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 做项目时遇到这样的需求，希望能打印出最终数据库执行的SQL语句，一般遇到这些有一定通用性的问题，我都会到Appfuse中去找找例子，结果这次没有成功。<br>Appfuse是有相关的配置，但是好像没有用，不过关于Hibernate的倒是有用，我想这种问题网上肯定有人遇到过，只要找到这个人就行了。<br><br>经过切换不同的关键字，我最后找到了正确的配置。&nbsp;&nbsp;<a href='http://www.blogjava.net/itspy/archive/2007/02/11/99232.html'>阅读全文</a><img src ="http://www.blogjava.net/itspy/aggbug/99232.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/itspy/" target="_blank">itspy</a> 2007-02-11 11:22 <a href="http://www.blogjava.net/itspy/archive/2007/02/11/99232.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>三种Tomcat的插件比较</title><link>http://www.blogjava.net/itspy/archive/2007/01/17/94442.html</link><dc:creator>itspy</dc:creator><author>itspy</author><pubDate>Wed, 17 Jan 2007 09:09:00 GMT</pubDate><guid>http://www.blogjava.net/itspy/archive/2007/01/17/94442.html</guid><wfw:comment>http://www.blogjava.net/itspy/comments/94442.html</wfw:comment><comments>http://www.blogjava.net/itspy/archive/2007/01/17/94442.html#Feedback</comments><slash:comments>3</slash:comments><wfw:commentRss>http://www.blogjava.net/itspy/comments/commentRss/94442.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/itspy/services/trackbacks/94442.html</trackback:ping><description><![CDATA[
		<p dir="ltr" style="MARGIN-RIGHT: 0px">
				<br />      在Tomcat下开发一些项目时，不可避免的会用到针对Tomcat的插件来进行调试，目前我接触到的插件有如下三种，虽然它们都能对工程进行调试，它在一些其它功能上面却有其区别</p>
		<p>      Myeclipse：这个是最强大的Eclipse插件，差不多什么都有，是一个一站式的解决插件。<br />      WTP（Web Tools Platform）：是由Eclipse自己开发的插件。<br />      TomcatPlugin（sysdeo）：最老牌的Tomcat插件,也是最好用的。</p>
		<p> </p>
		<ol>
				<li>Myeclipse插件对Tomcat的支持看起来应该是最好的，特点是热部署。不管是对Servlet的修改，还是对web.xml的修改都可以。却可以做到，哪个变了，就加载哪个。它可以很方便的把你的工程直接发布到Tomcat中去，或者是以war的形式发布过去。 
</li>
				<li>WTP（Web Tools Platform）<br />：相对MyEclipse于，WTP则实现了部署的透明化，Myeclipse在启动Tomcat后，要你通过myEclipse把工程部署到Tomcat下，它会对你的Tomcat目录下添加一些文件。但是WTP则对你的Tomcat不会有任何修改。<br />但我也发现了使用WTP 部署Web工程时的一个问题，对web.xml文件的修改不会自动的被重新加载，但更改Servlet会重新加载Servlet，并且同时重新加载web.xml。<br />也就是你想重新加载web.xml，你只有佯装修改一个Servlet，才能触发重新加载web.xml。不知道以后的版本会不会修改这点。 
</li>
				<li>TomcatPlugin（sysdeo）：最老牌的tomcat插件了,相对来说在Tomcat调试领域也是最好用的了，不过它有点与WTP一样，无法自动加载web.xml变化。但它也有它的绝招，是另外两个插件不能比的。它有两种支持调试的方式： 
<ol><li>建立Tomcat工程，这时可以使用热部署，tomcatPlugin（sysdeo）由于它并不真正的部署工程，使用TomcatPlugin（sysdeo）添加一个工程时，实际上在Tomcat\conf\Catalina\localhost目录下添加了一个文件，当Tomcat启动时就会加载这个工程，这时当然也可以调试。 
</li><li>另外一种支持调试的功能是其它两个插件没有的，比如你的工程是通过ANT布置到Tomcat下去的，你的目录结构无法满足WTP与Myeclipse的要求，这时你没有办法来使用这两个插件来进行调度，但是使用TomcatPlugin却可以。你只要在设置window－&gt;preferences－&gt;tomcat－&gt;soure path即可。 </li></ol></li>
		</ol>
		<p>
				<br />个人Blog:  <a href="/itspy">http://www.blogjava.net/itspy</a></p>
		<p>
				<br />插件的适应环境：<br /><br />   如果没有特别的原因，应该尽量选择TomcatPlugin（sysdeo）。</p>
		<ol>
				<li>如果是一个全新的项目，上级完全放权了，你可以使用myEclipse与WTP，因为它能实现热部署，调度修改代码十分方便。但它们相对Tomcat来说，一个是侵入式的，一个却是无侵入的。你可以针对这个特点来在两者之间进行选择。 
</li>
				<li>如果是一个已经有一定历史积累的工程，或者是无法对目录结构进行控制的工作，这时推荐使用使用TomcatPlugin（sysdeo）。<br />因为myEclipse与WTP对工程对目录结构都有一定的要求，因为它们要把工程部署到Tomcat上去，所以对工程目录结构上都有自己的要求。比如在哪放置WEB-INFO，在哪个目录放置源文件，并且两个插件之间的工程无法形成兼容与共享。<br />但是TomcatPlugin（sysdeo）只是充当一个外挂来启动Tomcat，并把指定的源代码与Tomcat里面运行的项目关联起来，进行调试。所以它对目录结构没有要求，比较适应于无法对目录结构进行控制的项目，一个普通的Java工程即可以。 </li>
		</ol>
		<p> 个人Blog:  <a href="/itspy">http://www.blogjava.net/itspy</a><br /></p>
<img src ="http://www.blogjava.net/itspy/aggbug/94442.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/itspy/" target="_blank">itspy</a> 2007-01-17 17:09 <a href="http://www.blogjava.net/itspy/archive/2007/01/17/94442.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>在单元测试时,测试用例中的属性实现自动装载[appfuse学习笔试]</title><link>http://www.blogjava.net/itspy/archive/2007/01/03/91532.html</link><dc:creator>itspy</dc:creator><author>itspy</author><pubDate>Wed, 03 Jan 2007 06:19:00 GMT</pubDate><guid>http://www.blogjava.net/itspy/archive/2007/01/03/91532.html</guid><wfw:comment>http://www.blogjava.net/itspy/comments/91532.html</wfw:comment><comments>http://www.blogjava.net/itspy/archive/2007/01/03/91532.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/itspy/comments/commentRss/91532.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/itspy/services/trackbacks/91532.html</trackback:ping><description><![CDATA[如何在单元测试时，对Appfuse中POJO的属性进行自动装载(经过事后分析发现,不仅仅是针对POJO)<br />在Appfuse中,对DAO类进行单元测试时有如下代码<br />    private UserDao dao = null;<br />    private RoleDao rdao = null;<br />    <br />    public void setUserDao(UserDao dao) {<br />        this.dao = dao;<br />    }<br />    <br />    public void setRoleDao(RoleDao rdao) {<br />        this.rdao = rdao;<br />    }<br />通过架构,这两个Dao类都进行了自动装载,后来的使用中,我才发现,所有类似的属性都可以实现自动装载.<br /> <br /> <br />这我就奇怪了,如果这些类是在Spring的ApplicationContext中设置的,我还知道,Spring提供了很多途径来解决自动装载问题.但是这些单元测试的类,都是由它们来管理生成ApplicationContext的,怎么也实现了自动装载?<br />经常查看源码,才知道原来是Appfuse架构中对DAO进行单元测试的类有一个共同的父类AbstractDependencyInjectionSpringContextTests,这个父类得到生成的ApplicationContext,会检查自己有没有一些属性要实现自动装载的,如果有就到ApplicationContext中去找,找到了就把自己子类的属性实现自动装载.<br /> <br />最核心的代码是:AbstractDependencyInjectionSpringContextTests中有如下方法<br /> private void injectDependencies() throws Exception {<br />  if (isPopulateProtectedVariables()) {<br />   if (this.managedVariableNames == null) {<br />    initManagedVariableNames();<br />   }<br />   populateProtectedVariables();<br />  }<br />  else if (getAutowireMode() != AUTOWIRE_NO) {<br />   this.applicationContext.getBeanFactory().autowireBeanProperties(<br />    this, getAutowireMode(), isDependencyCheck());<br />  }<br /> }<br /> <br /> AbstractSingleSpringContextTests类中定义了下面的方法，这个方法实现了Junit的类TestCase定义的方法，这个方法会在每个方法之前运行。<br />   protected final void setUp() throws Exception {<br />  this.applicationContext = getContext(contextKey());//这个contextKey方法会调用BaseDaoTestCase中定义的getConfigLocations方法<br />  prepareTestInstance();<br />  onSetUp();<br /> }<img src ="http://www.blogjava.net/itspy/aggbug/91532.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/itspy/" target="_blank">itspy</a> 2007-01-03 14:19 <a href="http://www.blogjava.net/itspy/archive/2007/01/03/91532.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>在Appfuse中如何取得当前登录用户名</title><link>http://www.blogjava.net/itspy/archive/2007/01/01/91283.html</link><dc:creator>itspy</dc:creator><author>itspy</author><pubDate>Mon, 01 Jan 2007 05:44:00 GMT</pubDate><guid>http://www.blogjava.net/itspy/archive/2007/01/01/91283.html</guid><wfw:comment>http://www.blogjava.net/itspy/comments/91283.html</wfw:comment><comments>http://www.blogjava.net/itspy/archive/2007/01/01/91283.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/itspy/comments/commentRss/91283.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/itspy/services/trackbacks/91283.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: Appfuse是个比较好的J2EE开发框架，我在实际开发中遇到这样的问题，就是要对登录用户的一些关键操作进行日志记录，以备将来审记时使用，但是发现它好像没有直接提供类似的方法，只好自己去看原码来研究了。<br><br>Appfuse的登录，权限控制都是通过Acegi来实现的，通过网上查找，看资料先后找到了两个方法，和大家分享一下。&nbsp;&nbsp;<a href='http://www.blogjava.net/itspy/archive/2007/01/01/91283.html'>阅读全文</a><img src ="http://www.blogjava.net/itspy/aggbug/91283.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/itspy/" target="_blank">itspy</a> 2007-01-01 13:44 <a href="http://www.blogjava.net/itspy/archive/2007/01/01/91283.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Jpetstore(srping 版本)示例学习笔记[1]</title><link>http://www.blogjava.net/itspy/archive/2006/12/28/90461.html</link><dc:creator>itspy</dc:creator><author>itspy</author><pubDate>Thu, 28 Dec 2006 04:40:00 GMT</pubDate><guid>http://www.blogjava.net/itspy/archive/2006/12/28/90461.html</guid><wfw:comment>http://www.blogjava.net/itspy/comments/90461.html</wfw:comment><comments>http://www.blogjava.net/itspy/archive/2006/12/28/90461.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/itspy/comments/commentRss/90461.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/itspy/services/trackbacks/90461.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 我学习的版本是spring-framework-1.2.8带的版本，我主要学习的是如下几点：Spring的MVC，Struts 的MVC（可选），ibatis。&nbsp;&nbsp;<a href='http://www.blogjava.net/itspy/archive/2006/12/28/90461.html'>阅读全文</a><img src ="http://www.blogjava.net/itspy/aggbug/90461.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/itspy/" target="_blank">itspy</a> 2006-12-28 12:40 <a href="http://www.blogjava.net/itspy/archive/2006/12/28/90461.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title> Spring在Web中是如何载入相关的上下文环境</title><link>http://www.blogjava.net/itspy/archive/2006/12/21/89358.html</link><dc:creator>itspy</dc:creator><author>itspy</author><pubDate>Thu, 21 Dec 2006 13:00:00 GMT</pubDate><guid>http://www.blogjava.net/itspy/archive/2006/12/21/89358.html</guid><wfw:comment>http://www.blogjava.net/itspy/comments/89358.html</wfw:comment><comments>http://www.blogjava.net/itspy/archive/2006/12/21/89358.html#Feedback</comments><slash:comments>5</slash:comments><wfw:commentRss>http://www.blogjava.net/itspy/comments/commentRss/89358.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/itspy/services/trackbacks/89358.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要:  Spring在Web中是如何载入相关的上下文环境<br><br> 只要在web.xml设置监听器:org.springframework.web.context.ContextLoaderListener<br> <listener><br>  <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class><br> </listener><br>并且配置一下如下参考<br>	<context-param><br>		<param-name>contextConfigLocation</param-name><br>		<param-value><br>			/WEB-INF/dataAccessContext-local.xml  /WEB-INF/applicationContext.xml<br>		</param-value><br>	</context-param><br><br>但是内部细节是如何运作的呢?&nbsp;&nbsp;<a href='http://www.blogjava.net/itspy/archive/2006/12/21/89358.html'>阅读全文</a><img src ="http://www.blogjava.net/itspy/aggbug/89358.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/itspy/" target="_blank">itspy</a> 2006-12-21 21:00 <a href="http://www.blogjava.net/itspy/archive/2006/12/21/89358.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>JAVA与C++的一点比较</title><link>http://www.blogjava.net/itspy/archive/2006/11/24/83275.html</link><dc:creator>itspy</dc:creator><author>itspy</author><pubDate>Fri, 24 Nov 2006 07:31:00 GMT</pubDate><guid>http://www.blogjava.net/itspy/archive/2006/11/24/83275.html</guid><wfw:comment>http://www.blogjava.net/itspy/comments/83275.html</wfw:comment><comments>http://www.blogjava.net/itspy/archive/2006/11/24/83275.html#Feedback</comments><slash:comments>5</slash:comments><wfw:commentRss>http://www.blogjava.net/itspy/comments/commentRss/83275.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/itspy/services/trackbacks/83275.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: int a =10; a+=a-=a*=a;<br>它们的结果一是-80,还是0呢。我问过很多人，他们都猜错了。<br><br>更奇怪的是在JAVA与C中它的表现还不一样，刚好相反。&nbsp;&nbsp;<a href='http://www.blogjava.net/itspy/archive/2006/11/24/83275.html'>阅读全文</a><img src ="http://www.blogjava.net/itspy/aggbug/83275.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/itspy/" target="_blank">itspy</a> 2006-11-24 15:31 <a href="http://www.blogjava.net/itspy/archive/2006/11/24/83275.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>finalize函数的一点疑问</title><link>http://www.blogjava.net/itspy/archive/2006/11/23/83052.html</link><dc:creator>itspy</dc:creator><author>itspy</author><pubDate>Thu, 23 Nov 2006 07:21:00 GMT</pubDate><guid>http://www.blogjava.net/itspy/archive/2006/11/23/83052.html</guid><wfw:comment>http://www.blogjava.net/itspy/comments/83052.html</wfw:comment><comments>http://www.blogjava.net/itspy/archive/2006/11/23/83052.html#Feedback</comments><slash:comments>6</slash:comments><wfw:commentRss>http://www.blogjava.net/itspy/comments/commentRss/83052.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/itspy/services/trackbacks/83052.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 根据Java语言规范，JVM保证调用finalize函数之前，这个对象是不可达的，但是JVM不保证这个函数一定会被调用。另外，规范还保证finalize函数最多运行一次。<br>这句话是不是可以理解：“finalize函数可能根本就不会被运行”&nbsp;&nbsp;<a href='http://www.blogjava.net/itspy/archive/2006/11/23/83052.html'>阅读全文</a><img src ="http://www.blogjava.net/itspy/aggbug/83052.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/itspy/" target="_blank">itspy</a> 2006-11-23 15:21 <a href="http://www.blogjava.net/itspy/archive/2006/11/23/83052.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>从JAVA里面的不一致性，浅谈设计问题</title><link>http://www.blogjava.net/itspy/archive/2006/11/20/82386.html</link><dc:creator>itspy</dc:creator><author>itspy</author><pubDate>Mon, 20 Nov 2006 13:50:00 GMT</pubDate><guid>http://www.blogjava.net/itspy/archive/2006/11/20/82386.html</guid><wfw:comment>http://www.blogjava.net/itspy/comments/82386.html</wfw:comment><comments>http://www.blogjava.net/itspy/archive/2006/11/20/82386.html#Feedback</comments><slash:comments>10</slash:comments><wfw:commentRss>http://www.blogjava.net/itspy/comments/commentRss/82386.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/itspy/services/trackbacks/82386.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要:    在JAVA里面，有如下几个不一致的地方<br>   得到数组的大小，要通过length属性 <br>   得到String的大小，要用length方法<br>   得到集合（比如List,Set)的大小，要使用size方法。<br><br>难道这没有给你带来不便吗？&nbsp;&nbsp;<a href='http://www.blogjava.net/itspy/archive/2006/11/20/82386.html'>阅读全文</a><img src ="http://www.blogjava.net/itspy/aggbug/82386.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/itspy/" target="_blank">itspy</a> 2006-11-20 21:50 <a href="http://www.blogjava.net/itspy/archive/2006/11/20/82386.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>C++与JAVA在多态与覆盖上的区别（一点猜测）</title><link>http://www.blogjava.net/itspy/archive/2006/11/16/81598.html</link><dc:creator>itspy</dc:creator><author>itspy</author><pubDate>Thu, 16 Nov 2006 12:28:00 GMT</pubDate><guid>http://www.blogjava.net/itspy/archive/2006/11/16/81598.html</guid><wfw:comment>http://www.blogjava.net/itspy/comments/81598.html</wfw:comment><comments>http://www.blogjava.net/itspy/archive/2006/11/16/81598.html#Feedback</comments><slash:comments>6</slash:comments><wfw:commentRss>http://www.blogjava.net/itspy/comments/commentRss/81598.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/itspy/services/trackbacks/81598.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 本人对JAVA有一定的了解，最近开始看一些C++的东西，遇到了JAVA与C++的如下不同点：就是JAVA与C++在覆盖或者是多态性上不太一样。<br><br>现分别写了两块代码证明如下，至于为什么会有如此原因，我也不明白，希望有能懂C++与JAVA的人能出来讲解一下。&nbsp;&nbsp;<a href='http://www.blogjava.net/itspy/archive/2006/11/16/81598.html'>阅读全文</a><img src ="http://www.blogjava.net/itspy/aggbug/81598.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/itspy/" target="_blank">itspy</a> 2006-11-16 20:28 <a href="http://www.blogjava.net/itspy/archive/2006/11/16/81598.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>动态代理的一些思考和疑问:(疑问还没解决)</title><link>http://www.blogjava.net/itspy/archive/2006/11/13/80842.html</link><dc:creator>itspy</dc:creator><author>itspy</author><pubDate>Mon, 13 Nov 2006 03:36:00 GMT</pubDate><guid>http://www.blogjava.net/itspy/archive/2006/11/13/80842.html</guid><wfw:comment>http://www.blogjava.net/itspy/comments/80842.html</wfw:comment><comments>http://www.blogjava.net/itspy/archive/2006/11/13/80842.html#Feedback</comments><slash:comments>4</slash:comments><wfw:commentRss>http://www.blogjava.net/itspy/comments/commentRss/80842.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/itspy/services/trackbacks/80842.html</trackback:ping><description><![CDATA[
		<p>动态代理的一些思考和疑问:(疑问还没解决)<br />在Java中有一个动态代理技术,主要通过Proxy,InvocationHandler和Method,这三个类(接口)来实现.但是有如下一个问题不太明白,希望高手解惑.</p>
		<p>我查看了几个例子,它们实现InvocationHandler这个接口时,都通过构造函数传递进去了,实际被代理的对象,然后在实现的方法中通过method.invoke(obj,args);obj为构造函数传递进来的对象.</p>
		<p>比如下面的例子:<br />public class Handler implements InvocationHandler {</p>
		<p> MethodInterface delegate;</p>
		<p> public Handler(MethodInterface delegate) {<br />  this.delegate = delegate;<br /> }</p>
		<p> public Object invoke(Object proxy, Method method, Object[] args)<br />   throws Throwable {<br />  if (method.getName().equals("say")) {<br />   System.out.print("I have get it");<br />  }<br />  return method.invoke(this.delegate, args); <br /> }</p>
		<p>}</p>
		<p>函数invoke()传递进去的第一个参数proxy就没有被使用到,但同样实现了动态代理的效果,后面参考文献中的例子也是的,难道是这第一个参数就是多余的,如果是这样的话,就是Sun设置失误了 ^__^.</p>
		<p>sun的文档是这样解释这个参数的:proxy - the proxy instance that the method was invoked on.但这个参数有什么用的,如果不传递他进来,会有什么不便呢.</p>
		<p>
				<br />有没有人能明白这是怎么回事,或者是写个示例代码,讲讲这个第一个参数是干嘛用的?</p>
		<p> </p>
		<p> </p>
		<p>注:附两个完整的动态代理的例子<br /><a href="http://blog.csdn.net/hsyj_0001/archive/2006/04/02/647488.aspx">http://blog.csdn.net/hsyj_0001/archive/2006/04/02/647488.aspx</a><br /><a href="http://www.java2s.com/Code/Java/Development-Class/Demonstratesadynamicproxy.htm">http://www.java2s.com/Code/Java/Development-Class/Demonstratesadynamicproxy.htm</a></p>
<img src ="http://www.blogjava.net/itspy/aggbug/80842.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/itspy/" target="_blank">itspy</a> 2006-11-13 11:36 <a href="http://www.blogjava.net/itspy/archive/2006/11/13/80842.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>百度面试题目的答案[原创]</title><link>http://www.blogjava.net/itspy/archive/2006/11/10/80435.html</link><dc:creator>itspy</dc:creator><author>itspy</author><pubDate>Fri, 10 Nov 2006 08:46:00 GMT</pubDate><guid>http://www.blogjava.net/itspy/archive/2006/11/10/80435.html</guid><wfw:comment>http://www.blogjava.net/itspy/comments/80435.html</wfw:comment><comments>http://www.blogjava.net/itspy/archive/2006/11/10/80435.html#Feedback</comments><slash:comments>52</slash:comments><wfw:commentRss>http://www.blogjava.net/itspy/comments/commentRss/80435.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/itspy/services/trackbacks/80435.html</trackback:ping><description><![CDATA[
		<p>最近有同学找工作,经常在班级群里发一些大公司的面试,笔试题目.昨天收到这样一个题目,据说是百度的面试题目.</p>
		<p> 有一根27厘米的细木杆，在第3厘米、7厘米、11厘米、17厘米、23厘米这五个位置上各有一只蚂蚁。 木杆很细，不能同时通过一只蚂蚁。开始 时，蚂蚁的头朝左还是朝右是任意的，它们只会朝前走或调头， 但不会后退。当任意两只蚂蚁碰头时，两只蚂蚁会同时调头朝反方向走。假设蚂蚁们每秒钟可以走一厘米的距离。 编写程序，求所有蚂蚁都离开木杆 的最小时间和最大时间。</p>
		<p>看了这个题目之后,突然很感兴趣,今天搞了半天把它做出来了,大概花了1个半小时.大公司的题目真是考人.反正都已经用算法实现了,我就不多说了,大家看代码吧.代码里面注释我也尽量全写了.一共有两个类,一个是Ant的模型,一个是控制类.原代码,大家可以在这取得:<br /><br /><font style="BACKGROUND-COLOR: #ffc0cb">http://www.blogjava.net/Files/itspy/baidu.rar</font><br /></p>
		<p>
				<br />
				<br />//////////////////////////////////////<br />/*百度面试题<br /> * 有一根27厘米的细木杆，在第3厘米、7厘米、11厘米、17厘米、23厘米这五个位置上各有一只蚂蚁。<br /> * 木杆很细，不能同时通过一只蚂蚁。开始 时，蚂蚁的头朝左还是朝右是任意的，它们只会朝前走或调头，<br /> * 但不会后退。当任意两只蚂蚁碰头时，两只蚂蚁会同时调头朝反方向走。假设蚂蚁们每秒钟可以走一厘米的距离。<br /> * 编写程序，求所有蚂蚁都离开木杆 的最小时间和最大时间。<br /> * <br /> * <br /> * 分析:题目中的蚂蚁只可能相遇在整数点,不可以相遇在其它点,比如3.5cm处之类的,也就是可以让每只蚂蚁走 1秒,然后<br /> * 查看是否有相遇的即可.<br /> * <br /> * 这样我的程序实现思路就是,初始化5只蚂蚁,让每只蚂蚁走1秒,然后看是否有相遇的,如果有则做相应处理.当每只蚂蚁都<br /> * 走出木杆时,我就记录当前时间.这样就可以得到当前状态情况下,需要多久可以走出木杆,然后遍历所有状态则可以得到所胡<br /> * 可能.<br /> */</p>
		<p>package baidu;</p>
		<p>public class Ant {<br /> /*<br />  * step 表示蚂蚁每一个单位时间所走的长度<br />  */<br /> private final static int step = 1;</p>
		<p> /*<br />  * position表示蚂蚁所处的初始位置<br />  */<br /> private int position;</p>
		<p> /*<br />  * direction表示蚂蚁的前进方向，如果为1表示向27厘米的方向走， 如果为－1，则表示往0的方向走。<br />  */<br /> private int direction = 1;</p>
		<p> /*<br />  * 此函数运行一次，表示蚂蚁前进一个单位时间，如果已经走下木杆则会抛出异常<br />  */<br /> public void walk() {<br />  if (isOut()) {<br />   throw new RuntimeException("the ant is out");<br />  }<br />  position = position + this.direction * step;<br /> };</p>
		<p>
				<br /> /**<br />  * 检查蚂蚁是否已经走出木杆，如果走出返回true<br />  *<br />  */</p>
		<p> public boolean isOut() {<br />  return position &lt;= 0 || position &gt;= 27;<br /> }</p>
		<p> /**<br />  * 检查此蚂蚁是否已经遇到另外一只蚂蚁<br />  * @param ant<br />  * @return 如果遇到返回true<br />  */<br /> public boolean isEncounter(Ant ant) {<br />  return ant.position == this.position;<br /> }</p>
		<p> /**<br />  * 改变蚂蚁的前进方向<br />  */<br /> public void changeDistation() {<br />  direction = -1 * direction;<br /> }</p>
		<p>
				<br /> /**<br />  * 构造函数,设置蚂蚁的初始前进方向,和初始位置<br />  * @param position<br />  * @param direction<br />  */<br /> public Ant(int position, int direction) {<br />  this.position = position;<br />  if (direction != 1) {<br />   this.direction = -1;//方向设置初始位置,比如为0时,也将其设置为1.这样可以方便后面的处理<br />  } else {<br />   this.direction = 1;<br />  }<br /> }</p>
		<p>}</p>
		<p> </p>
		<p>/////////////////////////////////////////////////////////</p>
		<p>
				<br />package baidu;</p>
		<p>public class Controller {</p>
		<p> public static void main(String[] args) {</p>
		<p>  int time = 0;<br />  for (int i = 0; i &lt; 32; i++) {<br />   Ant[] antArray = getAntList(getPoistions(), getDirections(i));<br />   while (!isAllOut(antArray)) {<br />    for (Ant ant : antArray) {<br />     if (!ant.isOut()) {<br />      ant.walk();<br />     }<br />    }<br />    time++;<br />    // 查看是否有已经相遇的Ant,如果有则更改其前进方向<br />    dealEncounter(antArray);<br />   }<br />   System.out.println(time);</p>
		<p>   // 将时间归0,这样可以重新设置条件,再次得到全部走完所需要的时间.<br />   time = 0;<br />  }</p>
		<p> }</p>
		<p> /**<br />  * 这个函数的算法很乱，但暂时能解决问题<br />  * <br />  * @param list<br />  */<br /> public static void dealEncounter(Ant[] antArray) {</p>
		<p>  int num_ant = antArray.length;<br />  for (int j = 0; j &lt; num_ant; j++) {<br />   for (int k = j + 1; k &lt; num_ant; k++) {<br />    if (antArray[j].isEncounter(antArray[k])) {<br />     antArray[j].changeDistation();<br />     antArray[k].changeDistation();<br />    }<br />   }<br />  }</p>
		<p> }</p>
		<p> /**<br />  * 因为有5只Ant，所以组合之后有32种组合.刚好用5位二进制来表示,如果为0则表示Ant往0的方向走 如果为1,则表示往27的方向走<br />  * <br />  * 注:在通过Ant的构造函数设置初始值时,通过过滤把0修改成了-1.<br />  */<br /> public static int[] getDirections(int seed) {<br />  int result[] = new int[5];<br />  result[0] = seed % 2;<br />  result[1] = seed / 2 % 2;<br />  result[2] = seed / 4 % 2;<br />  result[3] = seed / 8 % 2;<br />  result[4] = seed / 16 % 2;</p>
		<p>  System.out.println("directions is " + result[0] + "|" + result[1] + "|"<br />    + result[2] + "|" + result[3] + "|" + result[4]);</p>
		<p>  return result;</p>
		<p> }</p>
		<p> /**<br />  * 批量设置Ant的初始位置,这样设置不是十分必要,可以直接在代码中设置<br />  * <br />  * @return<br />  */<br /> public static int[] getPoistions() {<br />  return new int[] { 3, 7, 11, 17, 23 };<br /> }</p>
		<p> /**<br />  * 取得设置好初始值的5只Ant<br />  * <br />  * @param positions<br />  * @param directions<br />  * @return<br />  */<br /> public static Ant[] getAntList(int[] positions, int[] directions) {<br />  Ant ant3 = new Ant(positions[0], directions[0]);<br />  Ant ant7 = new Ant(positions[1], directions[1]);<br />  Ant ant11 = new Ant(positions[2], directions[2]);<br />  Ant ant17 = new Ant(positions[3], directions[3]);<br />  Ant ant23 = new Ant(positions[4], directions[4]);</p>
		<p>  return new Ant[] { ant3, ant7, ant11, ant17, ant23 };<br /> }</p>
		<p> /**<br />  * 判断是否所有的Ant都已经走出了木杆,也就是设置退出条件<br />  * <br />  * @param antArray<br />  * @return<br />  */<br /> public static boolean isAllOut(Ant[] antArray) {<br />  for (Ant ant : antArray) {<br />   if (ant.isOut() == false) {<br />    return false;<br />   }<br />  }<br />  return true;<br /> }<br />}</p>
		<p> </p>
<img src ="http://www.blogjava.net/itspy/aggbug/80435.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/itspy/" target="_blank">itspy</a> 2006-11-10 16:46 <a href="http://www.blogjava.net/itspy/archive/2006/11/10/80435.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>对Appfuse(struts)的一点反悟</title><link>http://www.blogjava.net/itspy/archive/2006/11/09/80242.html</link><dc:creator>itspy</dc:creator><author>itspy</author><pubDate>Thu, 09 Nov 2006 12:31:00 GMT</pubDate><guid>http://www.blogjava.net/itspy/archive/2006/11/09/80242.html</guid><wfw:comment>http://www.blogjava.net/itspy/comments/80242.html</wfw:comment><comments>http://www.blogjava.net/itspy/archive/2006/11/09/80242.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/itspy/comments/commentRss/80242.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/itspy/services/trackbacks/80242.html</trackback:ping><description><![CDATA[
		<div id="mb_0">
				<div>最近因为可能的工作需要，又开始学习JAVA相关技术了<wbr>。因为没有明确的技术方向，只好还是从高层学习起<wbr>，学习各种框架设计思想，学习模式。</wbr></wbr></div>
				<div> </div>
				<div>顺手从手边拿起一本Struts书《Struts程序员查询辞典<wbr>》，看起里面的ＭＶＣ讲解，说真的这本书讲的还真不错<wbr>，以前看了好多书都不太明白的东西，这一次看什么就明白什么<wbr>。想想也可能是因为现在有了一定的实践经验，要是我以前拿到这本书<wbr>，可能也是看不懂。反正这个是无从考证了。</wbr></wbr></wbr></wbr></div>
				<div> </div>
				<div>说到这使我想起以前的一个笑话，一个傻子买了3个大饼<wbr>，吃了前两个都没吃饱，到第三个才吃饱。于是叹道：早知道<wbr>，我就只买第三个了，前两个饼没用。</wbr></wbr></div>
				<div> </div>
				<div>我看多半，是因为看的多了，加上之前在公司的实践学习的原因<wbr>，才能使我这次看这个ＭＶＣ一看就能明白书上在说什么。</wbr></div>
				<div> </div>
				<div>记得以前刚开始看Struts时，还以为struts的FormB<wbr>ean是Model层的，还是一位高手告诉我不对<wbr>，当时我还不太信（不相信权威^--^)，当然不久我就知道是我搞<wbr>错了。</wbr></wbr></wbr></div>
				<div> </div>
				<div>ＭＶＣ，其实Struts根本就没有实现Ｍ层。它都是直接使用现有<wbr>的其它技术。比如Ｍ层，就可以使用ＥＪＢ，或者是ＤＡＯ模式来实现<wbr>。从书中，我明白了，原来Model层也分了好几层，接口层<wbr>，事务逻辑层，数据访问层。以前Ａｐｐｆｕｓｅ中为什么把一个ＤＡ<wbr>Ｏ分成好几块，以前一直不太明白，这几块分别是干嘛的。</wbr></wbr></wbr></wbr></div>
				<div> </div>
				<div>现在有了一些重新的感悟写下来，不知道对不对，要有不对的请各位看<wbr>客指出。</wbr></div>
				<div>用过Appfuse的应该知道，在src/dao目录下面有四层，org.appfuse，org.appfuse.dao，org.appfuse.hibernate，org<wbr>.appfuse.model。其中第一层org.appfuse中放的东西，用处不大，里面放置了些常量定义。另外三层分别定义了<wbr>，dao的接口，dao的hibernate的实现类<wbr>，和数据传递对象（DTO)。上面这些应该都没有业务逻辑的处理才<wbr>对，以前早期开发时由于不太明白Appfuse的分层原则<wbr>，也不理解Struts分层的Model层是如何划分的<wbr>，在这些层中放入了一些业务逻辑。没有找到对应的单独的事务逻辑层<wbr>，这一层应该放在了dao的hibernate的实现类里面了。 </wbr></wbr></wbr></wbr></wbr></wbr></wbr></div>
				<div> </div>
				<div>在Appfuse中，好像添加了一个新的层，应该算做是业务逻辑层<wbr>，也就是在src/service里面。他里面定义了接口<wbr>，及接口的实现，还有这一层通用的功能块。通过我的理解<wbr>，这一层应该主要是体现业务逻辑。也就是提供给Struts层的A<wbr>ction来进行调用。</wbr></wbr></wbr></wbr></div>
				<div> </div>
				<div>也就是ＭＶＣ在Appfuse的Struts版本里面<wbr>，Ｍ实现的是对数据库的操作及一些领域模型的实现；Ｖ就视图<wbr>，这个在Appfuse里面没有什么含糊的；另外Ｃ只是相当于一个<wbr>路由的功能，把不同的请求交给不同的业务逻辑处理<wbr>，把结果交给不同的ＶＩＥＷ去显示。然后Appfuse在ＭＣ之间<wbr>添加了一个业务逻辑层(src/service)。</wbr></wbr></wbr></wbr></wbr></div>
				<div> </div>
				<div>最近的学习体会，不知对不对，希望有高手指出不对的地方。</div>
		</div>
<img src ="http://www.blogjava.net/itspy/aggbug/80242.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/itspy/" target="_blank">itspy</a> 2006-11-09 20:31 <a href="http://www.blogjava.net/itspy/archive/2006/11/09/80242.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>