<?xml version="1.0" encoding="UTF-8" ?>
<rss version="2.0">
  <channel>
    <title>byduke</title>
    <description></description>
    <link>http://byduke.javaeye.com</link>
    <language>UTF-8</language>
    <copyright>Copyright 2003-2008, JavaEye.com</copyright>
    <docs>http://blogs.law.harvard.edu/tech/rss</docs>
    <generator>JavaEye - 做最棒的软件开发交流社区</generator>
      <item>
        <title>spring整合struts</title>
        <author>byduke</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://byduke.javaeye.com">byduke</a>&nbsp;
          链接：<a href="http://byduke.javaeye.com/blog/188626" style="color:red;">http://byduke.javaeye.com/blog/188626</a>&nbsp;
          发表时间: 2008年05月01日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          spring整合struts有3种方式，其中一种是继承ActionSupport类，还有一种是spring有一个自己提供的继承了RequestProcess的类，把struts的控制器替换一下。这两种方式我都不想介绍了，我想说的是第三种方式，也是比较好的一种，就是把struts的Action交给spring的IoC容器管理，其好处不言而喻，Action完全可以享受spring的IoC管理带来的好处，比如方便的进行依赖注入，可以对Action的范围进行控制，并且还可以保证它的线呈安全性，同时它还可以享受spring AOP带来的特性等等一系列的优点。<br /><br />其实这中整合方式非常简单，在struts-config.xml文件中配置action-mapping中的每个action的时候，这些action的type不再是对应的Action实现类了，而是spring提供好的，org.springframework.web.struts.DelegatingActionProxy,这是一个Action的动态代理类，用来拦截每个action请求，如下就是配置信息<br /><pre name="code" class="java">
&lt;action path="/login"     type="org.springframework.web.struts.DelegatingActionProxy" input="/index.jsp" name="loginForm" validate="true" scope="request">
      &lt;forward name="sucess" path="/main.jsp" />
      &lt;forward name="error" path="/index.jsp" />
&lt;/action>
</pre><br />然后在spring的配置文件中需要对真正的Action实现类进行注册，实际上就是定义好一个bean<br /><pre name="code" class="java">
&lt;bean name="/login" class="struts.action.OpAction" >&lt;/bean>
</pre><br />这里需要注意的地方是 bean是用name来定义标识而不是id，因为它需要根据请求的action路径来定位bean，而请求路径中包含"/"，如果用id是会出错误的，所以要使用name属性。<br />这样就完成了整合配置了，真正的Action实现类依然是继承Action没有任何改变。Action里面如果需要service那么还可以进行依赖注入，同时还可以改变Action实现类的访问范围。我个人比较倾向于这样的管理形式<img src="/images/smiles/icon_lol.gif"/>
          <br/>
          <span style="color:red;">
            <a href="http://byduke.javaeye.com/blog/188626#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Thu, 01 May 2008 15:42:38 +0800</pubDate>
        <link>http://byduke.javaeye.com/blog/188626</link>
        <guid>http://byduke.javaeye.com/blog/188626</guid>
      </item>
      <item>
        <title>究竟为什么我们要用Spring</title>
        <author>byduke</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://byduke.javaeye.com">byduke</a>&nbsp;
          链接：<a href="http://byduke.javaeye.com/blog/187785" style="color:red;">http://byduke.javaeye.com/blog/187785</a>&nbsp;
          发表时间: 2008年04月28日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          Spring做为一个优秀的框架被很多人推崇，当然，在这些人中并不是全部，或者可以说是其中的相当一部分并不是真正了解Sping的优点，只是大家认为它好，就说它好。那么究竟Sping到底好在哪呢？说它可以和很多框架无缝的连接在一起，感觉很通用，这确实是它的优点。不过对于struts和hibernate来说，我不使用spring也是一样可以完成整合，而且它们之间也不会产生什么矛盾，那么为什么我非要弄出来一个什么SSH三个框架整合到一起去呢？这个问题也有好多人提出过。那也就是对于为什么要使用Spring产生了疑问。<br /><br />    首先我们要先明确一点，由于加入了很多的Support，比如说JdbcDaoSupport等，Spring对于项目的代码编写来说简单很多，但是由于项目中的dao和service都要交给spring的bean容器管理，有时候可能action也交有bean容器管理，那么对于spring的配置文件来说，编写就显得过于复杂，需要很多的bean。虽然JAVA编码减少了，但是大部分的时间程序员都在和复杂的配置文件做斗争。由此可见，项目中加入spring并不是向一些人说的提升了开发效率，所以把提升开发效率作为spring的优势来说有些勉强。<br />    <br />    那么为什么我们还要提倡使用spring呢？我认为spring由bean容器管理带来的优势和一些动态代理的实现对于我们项目系统框架的搭建起着非常重要的作用，Spring的AOP更是独放异彩。<br /><br />    比如说我们把action交给spring管理，那么我们就可以在bean容器中改变action的单例非线程安全的模式，可以把它变成一个原形（非单例）模式。比如我们需要对action进行一下访问记录，在action我们设置一个私有属性，保存一些信息，每个用户进入action后都对这个私有属性进行一下设置，比较加入一些用户独有的特殊标志。但是由于action本身就是单例模式，这样就造成了所有用户操作的都是同样一个action，对同一个属性进行操作，而且action本身就是非线程安全的，那么很有可能张三的属性在没有具体操作之前就被李四改掉了。这样就非常危险了，那么如果通过spring的bean容器管理以后就可以刨除这个缺陷，它可以通过spring的bean容器的特性来设定其scope范围由默认的singleton变成prototype模式，这样就可以对每次访问都产生一个新的action来处理，避免了这样的错误产生。对于这样的表现层框架，我们可以不通过改变其原代码就能控制它的生命周期来讲是非常激动人心的。而且spring提供了很多的动态代理类可以让我们去实现诸如声明式事物控制，action管理，AOP等强大功能。对于AOP来说，我们可以不用去手写一个动态代理类就可以实现横切逻辑的准确织入，可以随意去把我们的代码拆分开；甚至可以想象一下，我们的项目都可以拆分成一个小块一个小块的，然后依靠横切逻辑随意织入，当然，对于项目本身而言，它内部的逻辑大多数情况下是不可拆分的。不过对于系统性能监测或者是事物这些东西来说，本身就是可重复定义在多个业务逻辑上面的，所以他们使用Sping AOP操作起来就非常的舒服。而且spring2.0加人了很多的AOP增强，可以通过tx/aop命名空间进行声明式事物控制，甚至通过对元数据的支持可以更加简单的实现事物管理，还可以通过引介增加来动态控制一些事物的进展情况，比如人为控制系统性能检测日志的开启和关闭。所以Spring在系统框架集成方面作出的贡献是不可替代的。<br /><br />    最后说一下Spring是非常优秀的框架，如果你只把它看成是提升开发效率的工具，那么你大可以不必使用它，因为它本身对开发效率来讲并没有提升很多，往往因为它的加入范围复杂了开发流程，service,dao中的实现类和接口必须分开，因为Rod 本人比较推崇面向接口编程。使用它是在写诗，是在完成一项伟大的杰作，可以说spring是java所有框架中最优秀的一个。它让我们认识到了java这个广大领域中那些深层次的知识，它让我们的思想更加成熟，对于项目框架的控制更加灵活。<img src="/images/smiles/icon_arrow.gif"/>
          <br/>
          <span style="color:red;">
            <a href="http://byduke.javaeye.com/blog/187785#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Mon, 28 Apr 2008 22:35:26 +0800</pubDate>
        <link>http://byduke.javaeye.com/blog/187785</link>
        <guid>http://byduke.javaeye.com/blog/187785</guid>
      </item>
      <item>
        <title>Spring AOP</title>
        <author>byduke</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://byduke.javaeye.com">byduke</a>&nbsp;
          链接：<a href="http://byduke.javaeye.com/blog/187769" style="color:red;">http://byduke.javaeye.com/blog/187769</a>&nbsp;
          发表时间: 2008年04月28日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          想写点AOP的东西，但是不知道从何说起，因为可写的实在是太多了。先说说什么是AOP吧。AOP是面向切面编程，也有叫面向方面编程，不过我觉得第一种叫法更加切合实际一些。<br />听起来似乎很抽象，其实它很好理解。<br /><br />     首先说说OOP，大家都知道的OOP叫面向对象编程。它的思想经常是体现在当两个以上的类或抽象类或接口有共有的属性或者方法时，把他们向上抽象，形成一个新的类或抽象类或接口。比如说，猩猩类和人类都有年龄和性别的属性，同时都有吃东西的方法，那么这两个类就可以向上抽象为一个动物类，这个类拥有年龄和和性别的属性，同时还有吃东西的方法。然后猩猩类和人类都继承动物类，OOP往往是这样去描述一些事物，说白了，它往往是一个向上抽象的过程，体现出来的是类和对象的宏观关系。<br /><br />     下面说AOP，大家想一个这样的例子，比如我们常见的JDBC操作，对于两个方法，一个是queryAll，另外一个是queryByPage，两个方法都是标准的JDBC操作，创建驱动，建立连接，创建STATEMENTS，创建RESULT，转化对象和关系型数据，关闭创建的对象。<br /><br />     对于queryAll和queryByPage两个方法都是如是操作，这样我们会发现，这两个方法惟独只有中间的转化对象和关系型数据是不同的，其他的几乎都一个样，如果我们希望类似使用OOP的形式，把其他相同的部分提取出来，不需要进行重复的操作，那么使用OOP的思想，想要向上抽象几乎是不可能的了，因为它们放生在方法内部，直接作用于方法体内，OOP只能对于那些类体内的元素进行向上抽象。不过大家可以想象一下，如果向上抽象不行的话，我们不妨考虑一下，如果把两个方法并排放置，进行横向切割，沿转化对象和关系型数据这个位置进行上切割和下切割，然后把切割出去的模块横向抽取，形成2个单独的方法，然后再根据需要把他们有机的织入到切割前的位置，这样就可以完以前一样的步骤，而且单独分出来的东西还可以再根据需要织入到其他的转化当中。这就是AOP的主要思想，也是一种横切思想，一种面向切面编程的思想。其实有很多我们常遇见的情况都可以依靠它来解决，比如说性能监测和事物的管理等。<br /><br />    今天先写这些吧！！呵呵，改天有时间继续写。<br />    本人QQ：84627476 小平头爱小狗 有兴趣的可以加QQ一起讨论一下
          <br/>
          <span style="color:red;">
            <a href="http://byduke.javaeye.com/blog/187769#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Mon, 28 Apr 2008 21:14:39 +0800</pubDate>
        <link>http://byduke.javaeye.com/blog/187769</link>
        <guid>http://byduke.javaeye.com/blog/187769</guid>
      </item>
      <item>
        <title>hibernate3+spring2.0 + OpenSessionInViewFilter</title>
        <author>byduke</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://byduke.javaeye.com">byduke</a>&nbsp;
          链接：<a href="http://byduke.javaeye.com/blog/179045" style="color:red;">http://byduke.javaeye.com/blog/179045</a>&nbsp;
          发表时间: 2008年04月03日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          spring2.0和hibernate3.0整合存在挺多问题，其中ASM.jar包的版本冲突暂且不说，就光一个OpenSessionInViewFilter就够恶心人了。今天终于把它搞定了。按照原始的事务声明和配置形式对于spring2.0+hibernate3.0+OpenSessionInVewFilter已经不生效了，因为spring2.0里面的OpenSessionInViewFilter的getSession方法中会对session的flushMode设定一个默认为NEVER的值，而这个值在hibernate3.0似乎是不能理解的。<br />   所以一旦你使用默认形式去管理session就会出一个<br /><pre name="code" class="java">Write operations are not allowed in read-only mode(FlushMode.NEVER/MANUAL): Turn your Session into FlushMode.COMMIT/AUTO or remove 'readOnly' marker from transaction definition. </pre><br />   的异常。产生的原因就是和session的flushMode有关系，我们来看一下OpenSessionInViewFilter这个类里面的getSession方法<br /><pre name="code" class="java">
protected Session getSession(SessionFactory sessionFactory) throws DataAccessResourceFailureException {   
        Session session = SessionFactoryUtils.getSession(sessionFactory, true);  
        FlushMode flushMode = getFlushMode();   
        if (flushMode != null) {   
            session.setFlushMode(flushMode);   
        }   
        return session;   
    } 
</pre><br />这里面FlushMode flushMode = getFlushMode(); 得到的flushMode就是NEVER然后再扔到session 里面当然不行喽，解决办法就是继承OpenSessionInViewFilter类，然后重写这个方法，加句 this.setFlushMode(FlushMode.AUTO);或者干脆把session里面直接扔个FlushMode.AUTO，然后再重写一个叫closeSession的方法，记住一定要重写，因为增加了flushMode以后要调用session.flush()才可以正常提交数据,其实重写closeSession就是为了加1句session.flush()，然后下面调用super.closeSession()方法就行了。<img src="/images/smiles/icon_redface.gif"/>
          <br/>
          <span style="color:red;">
            <a href="http://byduke.javaeye.com/blog/179045#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Thu, 03 Apr 2008 02:59:16 +0800</pubDate>
        <link>http://byduke.javaeye.com/blog/179045</link>
        <guid>http://byduke.javaeye.com/blog/179045</guid>
      </item>
      <item>
        <title>一个基于Java和ajax得Web层聊天室</title>
        <author>byduke</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://byduke.javaeye.com">byduke</a>&nbsp;
          链接：<a href="http://byduke.javaeye.com/blog/48321" style="color:red;">http://byduke.javaeye.com/blog/48321</a>&nbsp;
          发表时间: 2007年01月18日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p>这几天开发了一个基于Java和Ajax得聊天室。代码就不传在这里了，主要和大家分享一下开发机制。</p>
<p>先说一下这个聊天室得功能:</p>
<p>&nbsp;&nbsp;&nbsp; 1、聊天室可以实现如聊天对话，表情发送，字体变色，昵称发言，查看聊天记录等正常聊天室得功能。</p>
<p>&nbsp;&nbsp;&nbsp; 2、这个聊天室可以实现类似分房间似得聊天，也就是说您如果进入得是A房间，那么您只能看到A房间用户发送得信息，如果您登陆得是B房间，那您只能看到B房间得信息。</p>
<p>&nbsp;&nbsp;&nbsp; 3、该聊天室提供了用户登陆数统计。</p>
<p>&nbsp;&nbsp;&nbsp; 4、基于本聊天室得开发机制，还可以实现如私人对话等的功能，扩展性还是比较强的 ：）。</p>
<p>再说一下开发机制吧:(开发思路)</p>
<p>&nbsp;&nbsp;&nbsp; 对于基于web层的聊天室已经不是新鲜事了，但是用Java开发的还是比较少。原因可能是没有一套好的实现机制，我现在就分享一下个人开发心得，也算是抛砖引玉了，大家可以去粗取精，优化一下，希望早日能让web聊天代替老式的客户端聊天。：），不说废话了，进入正题。首先需要明确的是基于<strong>ajax的</strong>web层聊天室一定是需要用户端(浏览器端)的代码内有一个计时器，定期从server端取数据，然后反馈给客户端进行查看。这时本人处理的方式是在一个server端持久变量里面存入一个当前最大对话数--"消息索引号"，该索引号用于记录当前最大的索引号数。当server端接收到用户发送的1条消息的时候，这个索引号就会自增1。然后该消息和这个索引号一起绑定到一个类似HashMap的变量中,索引号是key消息就是value,这样可以形成一个类似队列的组合。当每个浏览器用户登陆以后从该索引号中取得当前最大的索引号作为自己的初始索引号，然后再发送获取消息的命令的时候连带着这个索引号一同发送到server端，server端根据用户发送的索引号再保存全部对话的持久变量(application)中取出索引号大于用户当前索引号的全部聊天信息作为反馈内容，这样可以大量减少数据反回量。然后再把用户取得消息的最大索引返回给浏览器端，让用户保存起来作为下次消息接收的当前索引号。依次反复。</p>
<p>&nbsp;&nbsp;&nbsp; 以上这些就可以实现基础的聊天室功能，发送消息，取得消息，然后基于hashmap的特殊特性可以完成分房间记录对话，如果套入session的机制的话，可以实现私有聊天，(sessionid和消息绑定，传递给特定的session接收)。并且建立定时清空app的机制，把消息记录写入xml文件，然后再浏览器端解析xml文件，可以达到查看历史记录的目的。个人认为拓展性还是比较强的。：）</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp; 有兴趣讨论的可以加我 QQ 84627476 小平头爱小狗</p>
          <br/>
          <span style="color:red;">
            <a href="http://byduke.javaeye.com/blog/48321#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Thu, 18 Jan 2007 12:14:31 +0800</pubDate>
        <link>http://byduke.javaeye.com/blog/48321</link>
        <guid>http://byduke.javaeye.com/blog/48321</guid>
      </item>
  </channel>
</rss>