<?xml version="1.0" encoding="UTF-8" ?>
<rss version="2.0">
  <channel>
    <title>lsy</title>
    <description>今日学习内容：
http://java.sun.com/docs/books/tutorial/javabeans/</description>
    <link>http://lsy.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>设置参数解决内存溢出</title>
        <author>lsy</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://lsy.javaeye.com">lsy</a>&nbsp;
          链接：<a href="http://lsy.javaeye.com/blog/215223" style="color:red;">http://lsy.javaeye.com/blog/215223</a>&nbsp;
          发表时间: 2008年07月15日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          在Java应用开发过程中碰到的内存溢出一般就是两类：<br />java.lang.OutOfMemoryError: Java heap space <br />java.lang.OutOfMemoryError: PermGen space <br /><br /><br />为了解决这两类问题，那么了解一下JVM的内存模型就很有必要了，在Java堆中粗略的可以分为两部分，一个是permanent generation space，从它的字面意思理解可以认为是用作存放一些不会变化，或者变化不大的数据，这里主要就是存放对象和方法，这是JVM自身需要操作用的存储空间；另一部分heap space就是留给我们应用程序的空间了，这里存放我们对象的instance。合理的设置这些参数不但可以避免上述错误的发生，还可以优化应用程序。至于如何优化程序，提高系统性能，这可不是三言两语道得明了，还得实践里面出真知<img src="/images/smiles/icon_idea.gif"/><br /><br />可以通过调整下列四个参数大下解决上述问题<br />-Xms??M -Xmx??M -XX:MaxNewSize=??M -XX:MaxPermSize=??M<br />查看JVM最大可用内存可以输入下列命令知晓<br />java -Xmx??M -version
          <br/>
          <span style="color:red;">
            <a href="http://lsy.javaeye.com/blog/215223#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>Tue, 15 Jul 2008 22:02:35 +0800</pubDate>
        <link>http://lsy.javaeye.com/blog/215223</link>
        <guid>http://lsy.javaeye.com/blog/215223</guid>
      </item>
      <item>
        <title>Struts2 对比 Struts</title>
        <author>lsy</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://lsy.javaeye.com">lsy</a>&nbsp;
          链接：<a href="http://lsy.javaeye.com/blog/207284" style="color:red;">http://lsy.javaeye.com/blog/207284</a>&nbsp;
          发表时间: 2008年06月24日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          最近看到一篇好文引用过来，作者sojava，原文地址<a href="http://blog.csdn.net/sojava/archive/2008/05/15/2448977.aspx" target="_blank">http://blog.csdn.net/sojava/archive/2008/05/15/2448977.aspx</a><br /><br /><div class="quote_title">引用</div><div class="quote_div"><br /><strong>在Action 实现类方面的对比</strong>：Struts 1 要求Action 类继承一个抽象基类；Struts 1 的 一个具体问题是使用抽象类编程而不是接口。Struts 2 Action 类可以实现一个Action接口，也可以实现其他接口，使可选和定制的服务成为可能。Struts2 提供一ActionSupport  基类去实现常用的接口。即使 Action  接口不是必须实现的，只有一个包含execute 方法的POJO 类都可以用作 Struts 2 的Action 。<br /><br /><strong>线程模式方面的对比</strong>：Struts 1 Action 是单例模式并且必须是线程安全的，因为仅有Action 的一个实例来处理所有的请求。单例策略限制了Struts 1 Action 能做的事，并且要在开发时特别小心。Action 资源必须是线程安全的或同步的；Struts 2 Action对象为每一个请求产生一个实例，因此没有线程安全问题。<br /><br /><strong>Servlet 依赖方面的对比</strong>：Struts 1 Action 依赖于 Servlet API，因为Struts 1 Action 的execute 方法中有HttpServletRequest 和HttpServletResponse 方法。Struts 2 Action 不再依赖于 Servlet API，从而允许Action 脱离Web 容器运行，从而降低了测试Action 的难度。当然，如果Action 需要直接访问HttpServletRequest 和HttpServletResponse 参数，Struts 2 Action 仍然可以访问它们。但是，大部分时候，Action 都无需直接访问HttpServetRequest 和HttpServletResponse，从而给开发者更多灵活的选择。<br /><br /><strong>可测性方面的对比</strong>：测试Struts 1 Action 的一个主要问题是execute 方法依赖于Servlet API，这使得Action 的测试要依赖于Web 容器。为了脱离Web 容器测试 Struts1 的Action，必须借助于第三方扩展：Struts TestCase，该扩展下包含了系列的Mock 对象(模拟了HttpServetRequest 和HttpServletResponse 对象），从而可以脱离Web 容器测 试Struts 1 的Action 类。Struts 2 Action 可以通过初始化、设置属性、调用方法来测试。<br /><br /><strong>封装请求参数的对比</strong>：Struts 1 使用ActionForm 对象封装用户的请求参数，所有的 ActionForm 必须继承一个基类：ActionForm。普通的JavaBean 不能用作ActionForm，因此，开发者必须创建大量的ActionForm 类封装用户请求参数。虽然 Struts 1 提供了动态 ActionForm来简化 ActionForm的开发，但依然需要在配置文件中定义ActionForm；Struts2 直接使用Action 属性来封装用户请求属性，避免了开发者需要大量开发 ActionForm 类的烦琐，实际上，这些属性还可以是包含子属性的 Ric对象类型。如果开发者依然怀念 Struts 1  ActionForm 的模式，Struts2 提供ModelDriven 模式，可以让开发者使用单独的Model 对象来封装用户请求参数，但该Model 对象无需继承任何 Struts 2 基类，是一个POJO，从而降低了代码污染。<br /><br /><strong>表达式语言方面的对比</strong>：Struts1 整合了 JSTL，因此可以使用JSTL 表达式语言。这种表达式语言有基本对象图遍历，但在对集合和索引属性的支持上则功能不强；Struts 2 可以使用JSTL，但它整合了一种更强大和灵活的表达式语言：OGNL（Object Graph Notation Language），因此，Struts 2 下的表达式语言功能更加强大。绑定值到视图的对比：Struts1 使用标准JSP 机制把对象绑定到视图页面；Struts2 使用“ValueStack ”技术，使标签库能够访问值，而不需要把对象和视图页面绑定在一起。<br /><br /><strong>类型转换的对比</strong>：Struts1  ActionForm  属性通常都是 String  类型。Struts     1 使用commons-Beanutils 进行类型转换，每个类一个转换器，转换器是不可配置的；Struts 2 使用OGNL 进行类型转换，支持基本数据类型和常用对象之间的转换。<br /><br /><strong>数据校验的对比</strong>：Struts1 支持在 ActionForm 重写validate 方法中手动校验，或者通过整合 Commons-validator 框架来完成数据校验。Struts 2 支持通过重写validate方法进行校验，也支持整合XWork 校验框架进行校验。<br /><br /><strong>Action 执行控制的对比</strong>：Struts 1 支持每一个模块对应一个请求处理（即生命周期的概念），但是模块中的所有Action 必须共享相同的生命周期。Struts 2 支持通过拦截器堆栈（Interceptor    Stacks）为每一个Action 创建不同的生命周期。开发者可以根据需要创建相应堆栈，从而和不同的Action 一起使用。经过上面简要介绍，不难发现，Struts 2 确实在 Struts 1 上做出了巨大的改进，的确是一个非常具有实用价值的MVC 框架。<br /></div>
          <br/>
          <span style="color:red;">
            <a href="http://lsy.javaeye.com/blog/207284#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>Tue, 24 Jun 2008 00:19:45 +0800</pubDate>
        <link>http://lsy.javaeye.com/blog/207284</link>
        <guid>http://lsy.javaeye.com/blog/207284</guid>
      </item>
      <item>
        <title>如果我是PL</title>
        <author>lsy</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://lsy.javaeye.com">lsy</a>&nbsp;
          链接：<a href="http://lsy.javaeye.com/blog/190321" style="color:red;">http://lsy.javaeye.com/blog/190321</a>&nbsp;
          发表时间: 2008年05月06日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          常常听到，或者看到有对自己上级的抱怨或者恶评，其实只要是有从属关系存在的地方，多多少少都会产生积怨。这里我大概列举为三种类型：<br />1、极其严重：非技术出生，并且缺乏管理能力，只会站在你的背后盯着你干活，并且否定你的付出。<br />2、严重：技术出生，但是缺乏领导能力，这样的领导能够切身体会开发人员的真实感受和难处，但是苦于缺乏一定的管理能力，该团队的能量也不能得到爆发，尽管他也很无奈。<br />3、一般：技术出生，优秀的领导管理能力，但是还缺乏一些必备额外因素，比如一颗平常心，难于于自己的团队成员同甘共苦。<br /><br />这里先说明一下，这些论定肯定也有自身原因，更甚者本质就是个人无知，恶意诽谤，但这些都不是讨论的目的，这里讨论的目的是把自己假设成为PL或者PM，那么应该如何才能让团队成员各尽其才，将团队打造成为一支具备强烈凝聚力，战斗力骠悍的兵团。<br /><br />希望大家都来设想一下，或是有经验的认识介绍一下，让更多的优秀团队如雨后春笋不停的冒哈。^_^
          <br/>
          <span style="color:red;">
            <a href="http://lsy.javaeye.com/blog/190321#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>Tue, 06 May 2008 17:45:36 +0800</pubDate>
        <link>http://lsy.javaeye.com/blog/190321</link>
        <guid>http://lsy.javaeye.com/blog/190321</guid>
      </item>
      <item>
        <title>BPEL 或 ESB：应该使用哪一个？</title>
        <author>lsy</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://lsy.javaeye.com">lsy</a>&nbsp;
          链接：<a href="http://lsy.javaeye.com/blog/188591" style="color:red;">http://lsy.javaeye.com/blog/188591</a>&nbsp;
          发表时间: 2008年05月01日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          今天在DW上无意看到一篇文章，觉得写的很好，大家不妨也瞅瞅。<a href="http://www.ibm.com/developerworks/cn/websphere/library/techarticles/0803_fasbinder2/0803_fasbinder2.html" target="_blank">http://www.ibm.com/developerworks/cn/websphere/library/techarticles/0803_fasbinder2/0803_fasbinder2.html</a><br /><br />全文从各个方面阐述当面对一个问题的时候，解决方案的抉择问题。其中心内容就是当发布一个服务以供外围系统使用的时候，这时候你手中的两件利器BPEL和ESB你究竟青睐谁更多一些，其实上也就是当BPEL和ESB在功能上有重叠的问题，给架构者带来了取舍的难题。<br /><br />在文中归纳的所有观点中，我觉得有一点点中了其中利害关系：<br /><strong>如果需求是以数据为中心的，则显然要选择 ESB</strong><br /><strong>如果需求是以流程为中心的，则显然要选择 WS-BPEL</strong><br /><br />没错，说的准确到位，在我们的项目中也一直是遵守这个原则的，作者的观点和我们的执行没有冲突。是否是在SOA的实践中同时找到了组建的规则呢？真的这么巧合吗？<br /><br />我作为一个底层的编码人员，所以只能以有限的认识谈观点。感觉文中不乏忽悠的地方，所以很多地方的理解还不是深刻到位，所以有说的不对的地方，还请大家指教。我感觉这篇文章的教育意义并不是很大，至少在我看来，我不会因为在适用场合中因为选择ESB或者是BPEL的问题上犯愁。举个例子来对比说明一下：<br />ESB和BPEL在SOA的实现过程中扮演着重用的角色，同样姚明和麦迪也是火箭队不可或缺的关键先生，但是ESB擅长处理数据，尤其是海量数据，能够提供路由转发规则极其复杂的数据服务，但是他对数据的流程操作就显得的相形见拙了；但是BPEL作为一门流程定义语言，他完善的数据操作规范，使得他对数据各类操作游刃有余，但是你要让BPEL传输10K以上的数据，并实现多点传输的话，那真是要了命了，你的Server绝对抱怨你不懂的利用它。所以虽然ESB和BPEL都能够作为Web Service，但是它们的适用场景不用说就是前面提到的两点。这里回过头来说姚明和麦迪，虽然两人都能拿球得分，但是姚明擅长的位置是中锋，习惯得分方式是内线强大，但是麦迪舒服的位置的小前锋，习惯的得分方式是外线干拔跳投，所以说这个时候你还需要去告诉埃德尔曼，姚明应该打中锋，麦迪应该占前锋的位置吗？哈哈，这不是开玩笑么！<br /><br />再说说文中说到ESB和BPEL重叠的地方，ESB可以通过中介流来调用其他服务，而BPEL可以通过<br />内部流程调用其他服务，也就是说它们都能够利用或者重新组装其他服务来提供新的服务这项本领，所以功能上重叠了。晕载，晕载，如果这样将功能重复强加于二者身上，不免有些牵强了。没错，ESB可以调用其他服务，但是ESB能控制如何调用？调用多少次？分之调用？能够回退调用吗？能够人工干预吗？反过来，BPEL调用其他服务传递的参数还是局限于SOAP消息，BEPL能接受其他格式，诸如文本文件的数据么？说到数据传递，这是ESB的强项，虽然BPEL也能干一些，但是仅仅局限于利用XSLT，对于复杂的路由规则，消息转换或者协议分发，那就无所作为了。<br /><br />所以我个人理解，在SOA的实现过程中ESB和BPEL不会出现抉择上的难题。如理解有误，欢迎大家指正，讨论。<img src="/images/smiles/icon_wink.gif"/>
          <br/>
          <span style="color:red;">
            <a href="http://lsy.javaeye.com/blog/188591#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>Thu, 01 May 2008 02:03:35 +0800</pubDate>
        <link>http://lsy.javaeye.com/blog/188591</link>
        <guid>http://lsy.javaeye.com/blog/188591</guid>
      </item>
      <item>
        <title>初学WebSphere Application Server</title>
        <author>lsy</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://lsy.javaeye.com">lsy</a>&nbsp;
          链接：<a href="http://lsy.javaeye.com/blog/184484" style="color:red;">http://lsy.javaeye.com/blog/184484</a>&nbsp;
          发表时间: 2008年04月19日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          收集整理了一些关于WebSphere Application Server(WAS)的学习资料，并总结一下自己的学习笔记。希望对和我一样对WebSphere感兴趣的新手们有所帮助。<br />WebSphere是IBM的核心软件设施，而WAS就是这个核心软件设施中的基础，其他WebSphere的产品都是运行其上的。所以学习好WAS就为学习IBM核心中间件技术或是其他WebSphere产品打下坚实的基础。<br />这里说一下WebSphere Application Server Community Edition，它是一个全面支持J2EE1.4标准的轻量级应用服务器，构建与Apache Geronimo基础之上，完全免费，而且建立于之上的应用可以轻松迁移至WebSphere Application Server上，是学习WebSphere系列产品的一个不错的起步。而WAS是一个全面满足企业级应用开发标准的应用服务器。其中WAS又划分为3个独立的版本，Express，Base 和 Network Deployment。Express和Base本质上是一样的，区别于各自的费用和IBM提供的技术支持及服务，而Network Deployment 则提供了更加高级的特性，例如高可用性，扩展性，集群和管理多个应用服务器的能力。<br />在学习WAS的过程中，有几个比较重要的概念是需要理解清楚的。他们分别是Node，Node Agent，Node Group，Profile, Cell, Server.首先说Server，其实就是我们理解Application Instance。每一个Server都和一个Profile(概要文件)对应，Profile是Server的处理分组，对受管于它的Server进行了全局配置。而Node是一个管理中用到的概念，它和Profile对应，也就是说Node和Profile可能管理着一个或者多个Server。不过对于Base和Express若想建立多个Server，那么它们必须通过创建Profile(Node)来实现，所以这些Server之间彼此独立，各自保留有自己的配置，对于同一台计算机，只要保证它们的Http Port不同，那么它们可以独立运行。而对于Network Deployment版本的WAS就可以在一个Profile(Node)中创建多个Server，而且在deployment manager中通过Node Agent来管理Node(Profile)，从而管理每一个Server。Cell是一个管理配置上的概念，是管理员将节点间逻辑关联起来的实现方法。管理员根据具体的业务环境，制定对其整体系统集成环境有意义的条件来定义和组织构成单元的节点。就一般情况来说，可以将单元看作是最大的作用域。至于Node Group是在WAS V6.0提出来的新概念，它是在Cell中Node的逻辑分组，Node Group用来验证所属Nodes是否有能力执行允许的功能。举个例子，一个Node Group里面同时存在z/OS的nodes和非z/OS的nodes是不可能的，你可以建立多个Node Group来管理其他nodes。<br />对于应用管理配置方面，WAS有三个入口可以让你方便的管理应用服务器。它们分别是：1.Administrative Console，一个基于Web的应用程序入口，用户可以根据各自的权限职责来管理特定组件和服务，为应用服务器做定制。Administrative Console是WAS的一个系统应用，所以不会被当作其他企业应用程序显示在console上。作为独立的应用服务器，Administrative Console运行在application server上，而对于Network Deployment 分布式服务器环境中，Administrative Console则运行中deployment manager。在这种环境中，当一个node增加时，他所对应的Administrative Console应用程序将会被删除，同时配置文件将会集成到管理cell的存储库中，从而由deploment manager维护。2.命令，在&lt;install_server_root>/bin下面有很多可以执行的批处理文件，例如你可以执行startServer.bat命令来启动应用服务器。3.脚本，这是一个非常灵活并且迅速完成配置的方式，使用这种方式可以自动处理多个server或者node的配置。目前WAS V6.0支持jcal和jpython脚本语言，不过这适合于高级管理配置管理员，我个人更倾向于使用第一种方式。<br />好了，现在基本的概念清楚了，那么通过学习developerworks的HelloWorld系列，开始一步一步学习使用WAS吧。加油吧！<img src="/images/smiles/icon_wink.gif"/><br /><br />WebSphere 新手入门<br /><a href="http://www.ibm.com/developerworks/cn/websphere/newto/index.html" target="_blank">http://www.ibm.com/developerworks/cn/websphere/newto/index.html</a><br />WebSphere Application Server 新手入门 <a href="http://www.ibm.com/developerworks/cn/websphere/zones/was/newto/index.html" target="_blank">http://www.ibm.com/developerworks/cn/websphere/zones/was/newto/index.html</a><br />WebSphere Application Server Community Edition 入门 <br /><a href="http://www.ibm.com/developerworks/cn/websphere/techjournal/0512_gawor/0512_gawor.html" target="_blank">http://www.ibm.com/developerworks/cn/websphere/techjournal/0512_gawor/0512_gawor.html</a><br />WebSphere Application Server 红皮书<br /><a href="http://www.redbooks.ibm.com/redpapers/pdfs/redp3918.pdf" target="_blank">http://www.redbooks.ibm.com/redpapers/pdfs/redp3918.pdf</a><br />WebSphere Roadmap<br /><a href="http://publib.boulder.ibm.com/infocenter/wasinfo/v6r1/index.jsp?topic=/com.ibm.websphere.wsfep.multiplatform.doc/info/ae/ae/tejb_dvdp.html" target="_blank">http://publib.boulder.ibm.com/infocenter/wasinfo/v6r1/index.jsp?topic=/com.ibm.websphere.wsfep.multiplatform.doc/info/ae/ae/tejb_dvdp.html</a>
          <br/>
          <span style="color:red;">
            <a href="http://lsy.javaeye.com/blog/184484#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>Sat, 19 Apr 2008 23:17:48 +0800</pubDate>
        <link>http://lsy.javaeye.com/blog/184484</link>
        <guid>http://lsy.javaeye.com/blog/184484</guid>
      </item>
      <item>
        <title>Debugging with the Maven Jetty Plugin in Eclipse</title>
        <author>lsy</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://lsy.javaeye.com">lsy</a>&nbsp;
          链接：<a href="http://lsy.javaeye.com/blog/183521" style="color:red;">http://lsy.javaeye.com/blog/183521</a>&nbsp;
          发表时间: 2008年04月16日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <a href="http://docs.codehaus.org/display/JETTY/Debugging+with+the+Maven+Jetty+Plugin+inside+Eclipse" target="_blank">http://docs.codehaus.org/display/JETTY/Debugging+with+the+Maven+Jetty+Plugin+inside+Eclipse</a><br />Step 1<br />Go to the Run/External Tools/External Tools ..." menu item on the "Run" menu bar. Select "Program" and click the "New" button. On the "Main" tab, fill in the "Location:" as the full path to your "mvn" executable. For the "Working Directory:" select the workspace that matches your webapp. For "Arguments:" add jetty:run.<br /><br />Move to the "Environment" tab and click the "New" button to add a new variable named MAVEN_OPTS with the value:<br /><br />-Xdebug -Xnoagent -Djava.compiler=NONE -Xrunjdwp:transport=dt_socket,address=4000,server=y,suspend=y<br /><br />If you supply suspend=n instead of suspend=y you can start immediately without running the debugger and launch the debugger at anytime you really wish to debug.<br /><br />Step 2<br /><br />Then, pull up the "Run/Debug/Debug ..." menu item and select "Remote Java Application" and click the "New" button. Fill in the dialog by selecting your webapp project for the "Project:" field, and ensure you are using the same port number as you specified in the address= property above.<br /><br />Now all you need to do is to Run/External Tools and select the name of the maven tool setup you created in step 1 to start the plugin and then Run/Debug and select the name of the debug setup you setup in step2.<br /><br />From instructions provided by Rolf Strijdhorst on the Maven mailing list<br /><br />Stopping Jetty<br /><br />In order to stop the jetty server the "Allow termination of remote VM" should be checked in debug dialog in Step 2. When you have the jetty server running and the debugger connected you can switch to the debug perspective. In the debug view, right click on the Java HotSpot(TM) Client VM[localhost:4000] and  chose terminate. This will stop the debugger and the jetty server.
          <br/>
          <span style="color:red;">
            <a href="http://lsy.javaeye.com/blog/183521#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>Wed, 16 Apr 2008 20:55:11 +0800</pubDate>
        <link>http://lsy.javaeye.com/blog/183521</link>
        <guid>http://lsy.javaeye.com/blog/183521</guid>
      </item>
      <item>
        <title>转载--云南小吃-过桥米线</title>
        <author>lsy</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://lsy.javaeye.com">lsy</a>&nbsp;
          链接：<a href="http://lsy.javaeye.com/blog/86995" style="color:red;">http://lsy.javaeye.com/blog/86995</a>&nbsp;
          发表时间: 2007年06月05日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          过桥米线由汤、片和米线、佐料三部分组成。吃时用大磁碗一只，先放熟鸡油、味精、胡椒面，然后将鸡、鸭、排骨、猪筒子骨等熬出的汤舀入碗内端上桌备用。此时滚汤被厚厚的一层油盖住不冒气，但食客千万不可先喝汤，以免烫伤。要先把鸽鸡磕入碗内，接着把生鱼片、生肉片、鸡肉、猪肝、腰花、鱿鱼、海参、肚片等生的肉食依次放入，并有筷子轻轻拨动，好让生肉烫熟。然后放入香脆、叉烧等熟肉，再加入豌豆类、嫩韭菜、菠菜、豆腐皮、米线，最后加入酱油、辣子油。吃起来味道特别浓郁鲜美，营养非常丰富，常常令中外食客赞不绝口。过桥米线集中地体现了滇菜而丰盛的原料，精湛的技术和特殊的吃法，在国内外享有盛名。<br /><br />    过桥米线已有100多年的历史，它的起源还有一个美丽动人的故事。<br /><br />    过桥米线最初起源于滇南的蒙自县城。相传在城外有一个南湖（现在犹存），湖水清澈如碧，湖畔垂柳成行。湖心有个小岛，岛上不公有亭台楼阁，而且翠竹成林，古木参天，景色优美幽静，空气清新宜人，是附近学子们攻读诗书的好地方，有个书生到湖心的小岛去读书备考，但因为埋头用功，常常忘记吃妻子送去的饭菜，等到吃的时候往往又凉了。由于饮食不正常，天长日久，身体日见消瘦，贤妻十分心疼。有一次，妻子杀了一只肥母鸡，用砂锅熬好后送去，很长时间仍角温热，便用当地人喜欢吃的米线和其他佐料放入，味道很鲜美，收生也喜欢吃，贤惠的妻子就常常仿此做好送去。后来，书生金榜题名，但他念念不望妻子的盛情，戏说是吃了妻子送的鸡汤米线才考中的。因为他妻子送米线到岛上要经过一道曲径小桥，书生便把这种做法的米线叫做"过桥米线"，此事一时传为美谈。人们纷纷仿照书生妻的做法吃米线，过桥米线从此流传开来。经过后人的加工改进，过桥米线越做越好，越传越远。<br /><br />顺便说一句：广东的"过桥米线"仿制水平实在是太烂了
          <br/>
          <span style="color:red;">
            <a href="http://lsy.javaeye.com/blog/86995#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>Tue, 05 Jun 2007 13:14:51 +0800</pubDate>
        <link>http://lsy.javaeye.com/blog/86995</link>
        <guid>http://lsy.javaeye.com/blog/86995</guid>
      </item>
      <item>
        <title>Spring JDBC 接口学习</title>
        <author>lsy</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://lsy.javaeye.com">lsy</a>&nbsp;
          链接：<a href="http://lsy.javaeye.com/blog/85651" style="color:red;">http://lsy.javaeye.com/blog/85651</a>&nbsp;
          发表时间: 2007年06月01日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <strong>org.springframework.jdbc.core.PreparedStatementCreator</strong><br />用JdbcTemplate提供的Connection创建PreparedStatement对象，子类需要提供SQL以及为PreparedStatement对象设置必要的参数。<br /><pre name="code" class="java">
PreparedStatementCreator psc = new PreparedStatementCreator(){
public PreparedStatement createPreparedStatement(Connection con) throws SQLException {
　　　　　　　　　PreparedStatement pstmt = con.prepareStatement("select * from user where name=? and age=?");
　　　　　　　　　pstmt.setString(1, "lsy");
                pstmt.setInt(2, 24);
　　　　　　　　　return pstmt;
　　　　　　}

};
</pre><br /><strong>接口org.springframework.jdbc.core.PreparedStatementSetter</strong><br />用于PrepraredStatement对象动态设置参数，PrepraredStatement对象由JdbcTemplate对象创建。<br /><pre name="code" class="java">
jdbcTemplate.update("INSERT INTO USER VALUES(?, ?, ?, ?)",
                     new PreparedStatementSetter() {
                         public void setValues(PreparedStatement ps) throws SQLException {
                             ps.setString(1, id);
                             ps.setString(2, name);
                             ps.setString(3, sex);
                             ps.setInt(4, age);
                         }
                     });
</pre><br /><strong>org.springframework.jdbc.core.RowCallbackHandler</strong><br />用于处理查询结果，获得ResultSet对象里的数据。<br /><pre name="code" class="java">
final User user = new User();
jdbcTemplate.query("SELECT * FROM USER WHERE user_id = ?",
                    new Object[] {id},
                    new RowCallbackHandler() {
                        public void processRow(ResultSet rs) throws SQLException {
                            user.setId(rs.getString("user_id"));
                            user.setName(rs.getString("name"));
                            user.setSex(rs.getString("sex").charAt(0));
                            user.setAge(rs.getInt("age"));
                        }
                    });
</pre><br /><strong>org.springframework.jdbc.core.RowMapper</strong><br />用于处理查询结果，获得ResultSet对象里的数据，把每一行的数据放在一个DTO对象里，然后由JdbcTemplate对象把所有DTO对象放在一个List。<br /><pre name="code" class="java">
class UserRowMapper implements RowMapper {
    public Object mapRow(ResultSet rs, int index) throws SQLException {
        User user = new User();

        user.setId(rs.getString("user_id"));
        user.setName(rs.getString("name"));
        user.setSex(rs.getString("sex").charAt(0));
        user.setAge(rs.getInt("age"));

        return user;
    }
}
String sql = "SELECT * FROM USER";
jdbcTemplate.query(sql, new RowMapperResultReader(new UserRowMapper()));
</pre><br /><strong>org.springframework.jdbc.core.ResultSetExtractor</strong><br />需要执行ResultSet.next()方法。<br /><pre name="code" class="java">
ResultSetExtractor rse = new ResultSetExtractor(){
public Object extractData(ResultSet rs) throws SQLException, DataAccessException {
　　　　　　　　　List list = new ArrayList();
　　　　　　　　　while(rs.next()) {
　　　　　　　　　　　　list.add(new String[]{rs.getString("user_id"), rs.getString("name")});
　　　　　　　　　}
　　　　　　　　　return list;
　　　　　　}
};
</pre>
          <br/>
          <span style="color:red;">
            <a href="http://lsy.javaeye.com/blog/85651#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>Fri, 01 Jun 2007 13:33:50 +0800</pubDate>
        <link>http://lsy.javaeye.com/blog/85651</link>
        <guid>http://lsy.javaeye.com/blog/85651</guid>
      </item>
      <item>
        <title>DataBase Language</title>
        <author>lsy</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://lsy.javaeye.com">lsy</a>&nbsp;
          链接：<a href="http://lsy.javaeye.com/blog/84533" style="color:red;">http://lsy.javaeye.com/blog/84533</a>&nbsp;
          发表时间: 2007年05月29日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          DDL<br /><br />Data Definition Language (DDL) statements are used to define the database structure or schema. Some examples:<br /><br />CREATE - to create objects in the database <br />ALTER - alters the structure of the database <br />DROP - delete objects from the database <br />TRUNCATE - remove all records from a table, including all spaces allocated for the records are removed <br />COMMENT - add comments to the data dictionary <br />RENAME - rename an object <br /><br />DML<br /><br />Data Manipulation Language (DML) statements are used for managing data within schema objects. Some examples:<br /><br />SELECT - retrieve data from the a database <br />INSERT - insert data into a table <br />UPDATE - updates existing data within a table <br />DELETE - deletes all records from a table, the space for the records remain <br />MERGE - UPSERT operation (insert or update) <br />CALL - call a PL/SQL or Java subprogram <br />EXPLAIN PLAN - explain access path to data <br />LOCK TABLE - control concurrency <br /><br />DCL<br /><br />Data Control Language (DCL) statements. Some examples:<br /><br />GRANT - gives user's access privileges to database <br />REVOKE - withdraw access privileges given with the GRANT command <br /><br />TCL<br /><br />Transaction Control (TCL) statements are used to manage the changes made by DML statements. It allows statements to be grouped together into logical transactions.<br /><br />COMMIT - save work done <br />SAVEPOINT - identify a point in a transaction to which you can later roll back <br />ROLLBACK - restore database to original since the last COMMIT <br />SET TRANSACTION - Change transaction options like isolation level and what rollback segment to use
          <br/>
          <span style="color:red;">
            <a href="http://lsy.javaeye.com/blog/84533#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>Tue, 29 May 2007 18:36:08 +0800</pubDate>
        <link>http://lsy.javaeye.com/blog/84533</link>
        <guid>http://lsy.javaeye.com/blog/84533</guid>
      </item>
      <item>
        <title>数据库语言</title>
        <author>lsy</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://lsy.javaeye.com">lsy</a>&nbsp;
          链接：<a href="http://lsy.javaeye.com/blog/84532" style="color:red;">http://lsy.javaeye.com/blog/84532</a>&nbsp;
          发表时间: 2007年05月29日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          DDL<br /><br />Data Definition Language (DDL) statements are used to define the database structure or schema. Some examples:<br /><br />CREATE - to create objects in the database <br />ALTER - alters the structure of the database <br />DROP - delete objects from the database <br />TRUNCATE - remove all records from a table, including all spaces allocated for the records are removed <br />COMMENT - add comments to the data dictionary <br />RENAME - rename an object <br /><br />DML<br /><br />Data Manipulation Language (DML) statements are used for managing data within schema objects. Some examples:<br /><br />SELECT - retrieve data from the a database <br />INSERT - insert data into a table <br />UPDATE - updates existing data within a table <br />DELETE - deletes all records from a table, the space for the records remain <br />MERGE - UPSERT operation (insert or update) <br />CALL - call a PL/SQL or Java subprogram <br />EXPLAIN PLAN - explain access path to data <br />LOCK TABLE - control concurrency <br /><br />DCL<br /><br />Data Control Language (DCL) statements. Some examples:<br /><br />GRANT - gives user's access privileges to database <br />REVOKE - withdraw access privileges given with the GRANT command <br /><br />TCL<br /><br />Transaction Control (TCL) statements are used to manage the changes made by DML statements. It allows statements to be grouped together into logical transactions.<br /><br />COMMIT - save work done <br />SAVEPOINT - identify a point in a transaction to which you can later roll back <br />ROLLBACK - restore database to original since the last COMMIT <br />SET TRANSACTION - Change transaction options like isolation level and what rollback segment to use
          <br/>
          <span style="color:red;">
            <a href="http://lsy.javaeye.com/blog/84532#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>Tue, 29 May 2007 18:35:05 +0800</pubDate>
        <link>http://lsy.javaeye.com/blog/84532</link>
        <guid>http://lsy.javaeye.com/blog/84532</guid>
      </item>
      <item>
        <title>EJB3.0学习之路 让第一个Stateless Session Bean跑起来</title>
        <author>lsy</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://lsy.javaeye.com">lsy</a>&nbsp;
          链接：<a href="http://lsy.javaeye.com/blog/73857" style="color:red;">http://lsy.javaeye.com/blog/73857</a>&nbsp;
          发表时间: 2007年04月24日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          随着Spring的兴起，EJB2.0被彻底击败，但是EJB3.0却痛定思痛，总结经验教训以一个崭新的面貌问世，而他究竟怎么，能否以流行的敏捷性开发框架抗衡，这里我们可以先了解一下他，然后再来下定论，下面就开始吧：<br />软件环境：<br />IDE:Eclipse 3.2<br />jdk1.5.0<br />Application Server:jboss-4.2.0.CR1<br />JBoss Eclipse IDE: JBossIDE-2.0.0.Beta2-ALL.zip<br />EJB3.0<br /><br />后三项都可以在 http://www.jboss.com/downloads/index 中下载。下载完成后，下面就开始吧：<br />（一）环境设置<br />1. 将jboss-4.2.0.CR1解压释放，我的目录是D:\Java\jboss-4.2.0.CR1<br />2. 环境变量添加 JBOSS_HOME，指向该目录<br />3. 解压释放JBossIDE-2.0.0.Beta2-ALL.zip，将plugins和features目录下的文件拷贝到eclipse的<br />目录下，删除原始eclipse\configuration的文件全部删除（除了config.ini文件），重新启动eclipse，<br />点击Window-->Preferences,如果能够看到图一，和图二中的东东，那么JBoss Eclipse IDE，就安装成<br />功了。图二蓝色标注的部分是JBoss Rule的东西，不是本文讨论的内容，所以不用管他。<br />4. 点击图二红色标注的部分，New-->New Server-->JBoss Inc-->JBoss AS 4.0, 点击Next, 点击Home按钮指向JBoss的安装目录，这里我的是D:\Java\jboss-4.2.0.CR1，然后为这个server取一个名字<br />jboss-4.2.0.CR1，Configuration选择default，点击default，名字还是叫做jboss-4.2.0.CR1，然后点击finish。到此为止全部环境已经设置好了。<br />（二）建立工程<br />1. File-->New-->Other-->EJB3.0-->EJB3.0 Project,取一个名字Ejb3Tutorial，点击Next按钮，选择刚才安装JBoss AS jboss-4.2.0.CR1，点击Finish。这时一个EJB3.0的工程就建好了。但是发现有一个错误，打开Window-->Show view-->Problems,打开透视图以后发现这个错误<br />Project Ejb3Tutorial is missing required library: 'D:\Java\jboss-4.2.0.CR1\server\default\deploy\ejb3.deployer\jboss-ejb3x.jar'<br />这时右键打开工程属性，Properties-->Java Build Path-->Libraries,打开JBoss EJB3 Libraries[default],<br />发现确实有一个librariy有警告，错误信息很明显，就是missing 。这时在%JBOSS_HOME%\client可以找到这个librariy，把他拷贝到D:\Java\jboss-4.2.0.CR1\server\default\deploy目录下，然后refresh一下，此时错误信息就没有了，一切准备就绪。<br />2. 我们的这一个例子以JBoss提供的教程来实现，一共3个接口，一个实现类，还有一个cilent。代码如下：<pre name="code" class="java">public interface Calculator {
	int add(int x, int y);

	int subtract(int x, int y);
}

@Local
public interface CalculatorLocal extends Calculator
{
}

@Remote
public interface CalculatorRemote extends Calculator
{
}

@Stateless
public class CalculatorBean implements CalculatorRemote, CalculatorLocal {
	public int add(int x, int y) {
		return x + y;
	}

	public int subtract(int x, int y) {
		return x - y;
	}
}

public class Client {
	public static void main(String[] args) throws Exception {
		InitialContext ctx = new InitialContext();
		Calculator calculator = (Calculator) ctx.lookup("CalculatorBean/remote");
		System.out.println("1 + 1 = " + calculator.add(1, 1));
		System.out.println("1 - 1 = " + calculator.subtract(1, 1));
	}
}</pre><br />很简单是吧？哦，也许吧。<br />第一种方式：也就是上述代码那样，CalculatorLocal被@Local标注，以说明他是一个本地接口而CalculatorRemote被@Remote标注，说明他是一个远程接口。而CalculatorBean被@Stateless标注，并实现了上述接口，说明他是实现了上述接口的无状态会话bean。这种做法是JBoss推荐的，也是我个人比较喜欢的，从接口一眼就可以看出这个接口是为本地还是远程所提供服务的。<br /><br />第二种方式：分别删除这两个接口的@Local和@Remote标注，然后在CalculatorBean加注@Local <br />({CalculatorLocal.class})和@Remote ({CalculatorRemote.class})。<br /><br />第三种方式：和以前的EJB，删除全部标注，写部署文件ejb-jar.xml。<br /><br />哈哈，真是萝卜白菜各有所爱嘛。<br />这里顺便提及一下JNDI绑定的问题：<br />The Calculator bean will have two JNDI bindings for the remote and Local interface. By default, JBoss will use ejbName/local and ejbName/remote for the local and remote interfaces, respectively. <br />从Client的代码可以看出，Client就正是采用了JBoss这种默认的绑定方法，而我们也可以实现自己的绑定，这也很简单，用@LocalBinding和@RemoteBinding这两个标注就可以了。如上，如果我们在Calculator bean上标注@LocalBinding(jndiBinding="myFirst/Local")和@RemoteBinding(jndiBinding="myFirst/Remote")的话，那么客户端调用就应该相应的改为ctx.lookup("myFirst/Local")和ctx.lookup("myFirst/Remote")了。<br />（三）. 编译，运行<br />好了，到此所有工作都已经完成了，编译运行吧。这里由于JBoss 可以热部署EJB3.0,所以先启动服务。这里可以到%JBOSS_HOME%\bin 下执行run命令，也可以在eclipse中，Window-->Show view-->Servers, 选中我们建立的jboss-4.2.0.CR1，然后右键start启动JBoss AS.<br />在这个例子中，有一个build.xml文件，我们进入这个项目的文件路径下，我的是D:\workspace\Ejb3Tutorial，然后执行ant run命令，可以成功看到：<br />run:<br />     [java] 1 + 1 = 2<br />     [java] 1 - 1 = 0<br />这就算成功了，因为ant run命令首先将我们的代码编译并打包到%JBOSS_HOME%\server\default\deploy目录下，然后执行Client的调用。当然我们也可以在eclipse中执行，右键选中build.xml,Run As --> External Tools,选中targets这里构上run，ejbjar，后者是打包的deploy目录，而前者是执行Client，但是依赖后者，所以之间选择run就可以了。然后点击run按钮，可以在Console透视图可以看到：<br />Buildfile: D:\workspace\Ejb3Tutorial\build.xml<br />prepare:<br />compile:<br />ejbjar:<br />run:<br />     [java] 1 + 1 = 2<br />     [java] 1 - 1 = 0<br />BUILD SUCCESSFUL<br />Total time: 2 seconds<br /><br />好了，到这里我们的第一个无状态会话bean就开发完成，别且看到了正确的结果。可以看到EJB3.0消除了home接口，和一些其他的东东，而采用Annotation来设计实现，这样的无侵入架构真的让人对他很有期待，等着看吧。^_^
          <br/>
          <span style="color:red;">
            <a href="http://lsy.javaeye.com/blog/73857#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>Tue, 24 Apr 2007 14:49:43 +0800</pubDate>
        <link>http://lsy.javaeye.com/blog/73857</link>
        <guid>http://lsy.javaeye.com/blog/73857</guid>
      </item>
      <item>
        <title>设计使用MultiActionController心得</title>
        <author>lsy</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://lsy.javaeye.com">lsy</a>&nbsp;
          链接：<a href="http://lsy.javaeye.com/blog/73310" style="color:red;">http://lsy.javaeye.com/blog/73310</a>&nbsp;
          发表时间: 2007年04月23日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          今天总结一下在一个Spring的项目中使用MultiActionController的应用小结。<br />在项目开发过程中，面对一个需要对一个域对象进行查询明细，查询列表和查询该域对象的关联对象的案例，这里不包括对域对象进行更新的工作，这样如果采用实现Controller接口的话，每个实现类执行handleRequest返回ModelAndView来达到目的，很自然的将会产生3个实现类，这样项目的类文件数量增多，而且在以后维护工作中，虽然在一个用例中，仍然不得不从配置文件下手，一个一个根据映射找出对应的相应的Controller，这添加了维护的难度，所以这里我们很自然的采用了MultiActionController做实现。代码基本类似如下：<br /><pre name="code" class="java">public class BookMultiController extends MultiActionController{
	
	//(1)
	public ModelAndView getBook(HttpServletRequest request,
			HttpServletResponse response) {
		ModelAndView mv = new ModelAndView("book/book_detail");
		Book book = bookManager.getBook(request.getParameter("bookId"));
		mv.addObject("book", book);
		return mv;
	}
	
	//(2)
	public ModelAndView getBookList(HttpServletRequest request,
			HttpServletResponse response) {
		ModelAndView mv = new ModelAndView("book/book_list");
		Book book = new Book();
		BeanUtils.populate(book, request.getParameterMap());
		List list = bookManager.getBooks(book);
		mv.addObject("bookList", list);
		return mv;
	}
	
	//(3)
	public ModelAndView getAuthorByBook(HttpServletRequest request,
			HttpServletResponse response) {
		ModelAndView mv = new ModelAndView("author/author_detail");
		Author author = authorManager.getAuthorByBookId(request.getParameter("bookId"));
		mv.addObject("author", author);
		return mv;
	}
}</pre><br />在Url配置映射方面，我们使用了org.springframework.web.servlet.mvc.multiaction.ParameterMethodNameResolver，所以上述代码<br />的访问是：<br />book.do?method=getBook&bookId=123;<br />book.do?method=getBookList&bookName=JavaDesign&price=100;<br />book.do?method=getAuthorByBook&bookId=123;<br />这样实现下来似乎很不错了。但是在开发过程中，这样情况还会出现很多，当我们碰到一个综合查询的时候，往往会有一颗树，点击树的每一个节点，通过传递一些参数，我们需要看到想要的结果显示在正确的页面。如果采用实现Controller的方法，那么每一个节点的点击将具体的对应到一个相应，通过处理返回ModelAndView。如果考虑这颗树的节点很多，那么是否应该随着节点的不断增加，controller也不断的增加，配置文件的不断增加呢？如果不这样，是否还是考虑使用MultiActionController呢？在这里我们的选择还是使用MultiActionController来实现，不过带来的后果就是有多少个节点，就意味着MultiActionController有多少个对应的方法执行来返回ModelAndView。在这里已经假设节点有很多的情况，那么就意味着这个Controller随着执行方法的增加，代码也会会很冗长。如果有30个节点的话，上面的方法将会有30个，代码一多，这时仔细看看，其实他们都很薄，也都很相似。这里薄和相似是他们<br />都没有像SimpleFormController那样需要绑定对象，对对象进行验证，保存和更新的动作，他们都是从用户请求那里拿到参数，然后返回给用户希望得到的东西，这就足够了。所以我们在这个基础上加了一些东西，让这些事情做起来更容易一些，在MultiActionController注入了一个IRequestHandler，由它来完成上述的需求，这样30个方法的查询，实现起来至多也就是2个。拿一开始的用例来举例，代码：<br /><pre name="code" class="java">	public ModelAndView query(HttpServletRequest request,
			HttpServletResponse response) {
		requestHandler.dynamicInvocate(request);
		Solution solution = requestHandler.getSolution();
		return new ModelAndView(solution.getPage(),solution.getModelName(),solution.getModel());
	}
	
	public ModelAndView queryBook(HttpServletRequest request,
			HttpServletResponse response) {
		Book book = new Book();
		BeanUtils.populate(book, request.getParameterMap());
		Map&lt;String,Object> map = new HashMap&lt;String,Object>();
		map.put("book", book);
		requestHandler.dynamicInvocate(request, map);
		Solution solution = requestHandler.getSolution();
		return new ModelAndView(solution.getPage(),solution.getModelName(),solution.getModel());
	}</pre><br />对应的访问变成：<br />query.do?method=query&purpose=getBook&bookId=123;<br />query.do?method=queryBook&purpose=getBookList&bookName=JavaDesign&price=100;<br />query.do?method=query&purpose=getAuthorByBook&bookId=123;<br />这里IRequestHandler有两个版本的dynamicInvocate，第一个最为简单，就是从请求控制域获取参数然后执行调用，并最终返回一个Solution对象，这里面封装了模型和视图。而第二个版本，则可以实现更多的参数传递的调用。如一开始的代码清单(2)中，是没有办法直接从请求中获取Book对象的，这样构建一个Map传递给调用，也能成功的得到模型和视图。完成了这些，回过头来再次考虑刚才那个拥有30个节点的树，如果足够幸运，所有的查询都是从request，或者session中获取的参数，那么只有一个MultiActionController类文件，并且只有一个方法。值得一提的是这个requestHandler我们是使用方法注入的，也就是他始终是以原型的形式出现，不会造成一些负面的影响，在我们系统测试运行期间，他运作的很好，效果还算满意。<br />大家对这样的设计有何看法，欢迎大家讨论。
          <br/>
          <span style="color:red;">
            <a href="http://lsy.javaeye.com/blog/73310#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, 23 Apr 2007 10:18:58 +0800</pubDate>
        <link>http://lsy.javaeye.com/blog/73310</link>
        <guid>http://lsy.javaeye.com/blog/73310</guid>
      </item>
      <item>
        <title>转载一个昆明话四级考试</title>
        <author>lsy</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://lsy.javaeye.com">lsy</a>&nbsp;
          链接：<a href="http://lsy.javaeye.com/blog/73026" style="color:red;">http://lsy.javaeye.com/blog/73026</a>&nbsp;
          发表时间: 2007年04月21日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          第一部分，听力（10%） <br />　　听对话完成1――10题，注意每段对话听三遍，每题各1分。 （略） <br />　　问题<br />　　(1)“这盘折耳根看的起曹乃耐呢”，意思是：这盘菜看起来 <br />　　A.水太多了 <br />　　B.很恶心 <br />　　C.很好吃的样子 <br />　　D.可以吃好长时间的样子 <br />　　<br />　　(2)“你皆”这个称谓常用在下列哪个对象？ <br />　　A.同辈年长的女性 <br />　　B.让你受不了的人 <br />　　C.年纪大的人 <br />　　D.宠物的泛爱称 <br />　　　<br />　　(3)a对b说：“善附你啦，格愿么是莫一天就来优的我”  <br />　　a和b的关系最可能是： <br />　　A.回家太晚呢娃娃和父母 <br />　　B.考试的学生和监考老师 <br />　　C.受到表扬的部下和上级 <br />　　D.分手的恋人 <br />　　<br />　　第二部分，单项选择（20%） <br />　　完成1――10题，在A、B、C、D四个选项中选择符合题意的选项，注意每题只有一个答案，每题各计2分。 <br />　　（1）昆明话中“大街小巷”的正确发音应该是（ ） <br />　　A da jie xiao xiang <br />　　B da jie xiao han <br />　　C da gai xiao hang <br />　　D da gai xiao han <br />　　（2）昆明人见面打招呼时一般不会说话的是（ ） <br />　　A 你整哪样 <br />　　B 你咯吃得啦 <br />　　C 你刻哪点 <br />　　D 出来玩改 <br />　　（3）昆明话中“hai zi”一词表示的意思是（ ） <br />　　A 海子 <br />　　B 孩子 <br />　　C 鞋子 <br />　　D 写字 <br />　　（4）昆明人经常挂在嘴边的“买买”所表示的意思是（ ） <br />　　A 表示强烈的购买欲望 <br />　　B 表示强烈的惊讶 <br />　　C表示强烈的愤怒 <br />　　D 表示十分高兴 <br />　　（5）昆明话中“改”一词一般用于下列那些句型（ ） <br />　　A 陈述句和疑问句 <br />　　B 疑问句和感叹句 <br />　　C 感叹句和祈使句 <br />　　D祈使句和疑问句 <br />　　（6）一位父亲抱着孩子在圆通山动物园，指着一个残疾的动物对孩子说：“买买，赶点看，特只有一个国！”这位父亲说的“国”指的是（ ） <br />　　A 上肢 <br />　　B 翅膀 <br />　　C 角 <br />　　D 爪子 <br />　　（7）对于比较傻的人，昆明人一般会这样骂他 a憨不咙咚 b憨包气喘 c憨包 d憨咪日眼 其中，最无贬义和最具贬义的分别是（ ） <br />　　A a 和c <br />　　B b 和c <br />　　C a 和d <br />　　D b 和d <br />　　（8）昆明的学校放学以后，很多学生都会留在学校里“爪一哈球”，他们所进行的球类运动是（ ） <br />　　A 足球 <br />　　B 篮球 <br />　　C 排球 <br />　　D 羽毛球 <br />　　（9）昆明人发生口角之争，以武力相威胁时，男人一般会威胁说“你咯是想我挺你两托才好过”此时他所说的动作是（ ） <br />　　A 用脚题对方两脚 <br />　　B 用拳击打对方两拳 <br />　　C 用肘击对方两下 <br />　　D 用膝盖顶对方两下 <br />　　（10）昆明人在以下哪一种情况下对别人说“嘎”一词（ ） <br />　　A 要求对方注意自己 <br />　　B 要求对方理解自己 <br />　　C 要求对方帮助自己 <br />　　D 要求对方同意自己的要求 <br />　　 <br />　　第三部分，名词解释（20%） <br />　　请用普通话形式解释下列短语，每题各计4分。 <br />　　（1）板扎 <br />　　（2）兜资鬼火起 <br />　　（3）猫哩儿 <br />　　（4）大拽拽呢 <br />　　（5）茂司 <br />　　<br />　　第四部分 阅读理解（30%） <br />　　阅读下面一段文章，并完成文章后面的1――5题。其中1――4题每题5分，第5题10分 <br />　　昆明呢菜该子不反中国别呢地方呢菜该子。以前昆明太落后啦，所以菜该子基本都是露天呢。在80年代以前，五华区首主要就是如安该、龙强该、小西门活威掩该几个地方，其他么还有些小汗汗首也有小呢该子。卖菜呢督是郊区呢农民，大清八早呢担挑的菜进城来卖，有些贩子也倒菜来卖。呢哈一到快要中午呢时候，买买，菜该子首都是人，喃来喃克，有时候么有些犯子在称上玩名堂，啄发现么还跟恩街嚷。还有踩啄脚呢，夺啄手呢，包包啄拎的呢，拿老昆明呢话讲就是A 。反正啊，呢哈呢菜该子我是最怕克啦。后来志几年改革开放，城市在发展，呢些菜该子好些也啄册的啦，后首政府又从新规划，在小区首盖起新呢菜该子来，喔唷，现在志些菜该子是板扎啦，里首摊位是固定呢，卖菜呢活卖肉呢督分开的，还有像米线了，豌豆粉了呢些也有专门呢铺面。现在小区首呢菜该子督有玻璃钢呢顶，下雨天也不会啄夺啄。每个菜该子首还有猫守的，比以前好多的啦。现在我是最喜欢活媳妇克我皆楼底些呢菜该子转转啦。 <br />　　<br />　　请回答以下问题 <br />　　（1）文章第一段中的“小汗汗”指的是（ ） <br />　　A 小的河流 <br />　　B 小的楼房 <br />　　C 小的路口 <br />　　D 小的胡同 <br />　　（2）文章第一段中A处应该填的词语是（ ） <br />　　A 鬼米日眼呢 <br />　　B 脏巴拉施呢 <br />　　C 乱麻麻呢 <br />　　D 核七吗古洞呢 <br />　　（3）文章第二段中的“猫”指的是（ ） <br />　　A 工商管理人员 <br />　　B 菜农 <br />　　C 清洁工人 <br />　　D 买菜的市民 <br />　　（4）以下四项中符合文章内容的是（ ） <br />　　A 昆明在80年代主要有四个菜市场，向全昆明市民提供禽蛋肉菜。 <br />　　B 昆明的菜市场在中午是最热闹的，熙熙攘攘。 <br />　　C 不法商贩短斤少两的行为在被揭穿以后狼狈逃离市场。 <br />　　D 导致作者不愿意去菜市场买菜的原因是菜市场很脏。 <br />　　（5）请归纳本文中心思想（限30字以内） <br />　　<br />　　第五部分，作文（20%） <br />　　题目：结合你学习昆明话的过程，谈谈你为什么要学习昆明话以及学习昆明话的感受。题目 <br />　　自拟。 <br />　　要求：必须使用昆明方言写作，立意新颖，卷面整洁。文笔、语法、思想内容各6分，试卷 <br />　　清洁分2分。字数要求200字。
          <br/>
          <span style="color:red;">
            <a href="http://lsy.javaeye.com/blog/73026#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>Sat, 21 Apr 2007 13:03:33 +0800</pubDate>
        <link>http://lsy.javaeye.com/blog/73026</link>
        <guid>http://lsy.javaeye.com/blog/73026</guid>
      </item>
      <item>
        <title>生日前看病感触</title>
        <author>lsy</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://lsy.javaeye.com">lsy</a>&nbsp;
          链接：<a href="http://lsy.javaeye.com/blog/71957" style="color:red;">http://lsy.javaeye.com/blog/71957</a>&nbsp;
          发表时间: 2007年04月17日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p>好久没有博了，今天来记点&ldquo;大事&rdquo;。明天就是自己24岁生日了，这里发个帖子自己跟自己贺一贺。</p>
<p>说来也巧，今天门牙坏了，去广东省第二人民医院看。一早下来，除了看牙，顺便还做了个身体检查，看看表8：10到医院，10：00出院，第一次在广州看病，感觉很好，拼一张卡，一个cs的系统，效率好高，从挂号，就诊，收费，去药，医院上下所有人，病人于医生都是用卡，不得不佩服广州医院的效率，难怪中国南方最好的医院大多数都集中在广东啊。厉害。</p>
          <br/>
          <span style="color:red;">
            <a href="http://lsy.javaeye.com/blog/71957#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>Tue, 17 Apr 2007 18:42:06 +0800</pubDate>
        <link>http://lsy.javaeye.com/blog/71957</link>
        <guid>http://lsy.javaeye.com/blog/71957</guid>
      </item>
      <item>
        <title>切身感受Spring AOP的魅力</title>
        <author>lsy</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://lsy.javaeye.com">lsy</a>&nbsp;
          链接：<a href="http://lsy.javaeye.com/blog/69333" style="color:red;">http://lsy.javaeye.com/blog/69333</a>&nbsp;
          发表时间: 2007年04月09日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          今天说一下昨天的感受，事情是这样的：<br />在项目即将验收钱，架构师群发了一个消息，所有操作海量数据表的Dao在执行查询之前要加上这么一句：<br /><pre name="code" class="java">this.getHibernateTemplate().setMaxResults(1000);</pre><br />并列出一个海量数据表的清单，大概40－50个左右，由于时间仓促，情况太突然，大家也没有多想，于是改吧。这么十几号人改了大概半小时。好，也算是勉强混过去了。<br />可是事后一看代码，同一个dao的N多个方法都加上了这一句，唉。。。。。<br />学习spring的时候书上教导spring的aop是如何如何的好，如何如何的帮助OO解决问题，但是由于涉足java不久，大家的代码也是那样的写，自己也就跟着这么写，说实话感受真的不是太深刻。但是后来我突然想到了既然是要在执行方法之前加上那么一句，干脆用BeforeAdvice试试看吧。于是修改成：<br /><pre name="code" class="java">	public void before(Method method, Object[] args, Object target)
			throws Throwable {
		if (target instanceof AbstractDAO) {
			AbstractDAO dao = (AbstractDAO) target;
			dao.getHibernateTemplate().setMaxResults(1000);
		}
	}</pre><br /><pre name="code" class="java">    &lt;bean id="daoBeforeAdvice" class="com.km.dao.hibernate.DaoBeforeAdvice"/>
    
    &lt;bean class="org.springframework.aop.framework.autoproxy.BeanNameAutoProxyCreator">
	  &lt;property name="beanNames">&lt;value>*Dao&lt;/value>&lt;/property>
	  &lt;property name="interceptorNames">
	    &lt;list>
	      &lt;value>daoBeforeAdvice&lt;/value>
	    &lt;/list>
	  &lt;/property>
	&lt;/bean></pre><br />一调试，居然和预期的结果一样，想想昨晚的狼狈，唉，一切尽在不言中。这次真正感受到了Spring Aop的威力。
          <br/>
          <span style="color:red;">
            <a href="http://lsy.javaeye.com/blog/69333#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, 09 Apr 2007 19:00:24 +0800</pubDate>
        <link>http://lsy.javaeye.com/blog/69333</link>
        <guid>http://lsy.javaeye.com/blog/69333</guid>
      </item>
      <item>
        <title>很想学习javaEye</title>
        <author>lsy</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://lsy.javaeye.com">lsy</a>&nbsp;
          链接：<a href="http://lsy.javaeye.com/blog/50439" style="color:red;">http://lsy.javaeye.com/blog/50439</a>&nbsp;
          发表时间: 2007年01月25日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          javaEye真的做的很棒,这点相信没有人会置疑.所以想打听下其实现的手段,运用的技术,学习先进的技术.请了解的朋友介绍下,比如在javaEye的站内搜索 <img src="/images/smiles/icon_wink.gif"/>
          <br/>
          <span style="color:red;">
            <a href="http://lsy.javaeye.com/blog/50439#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, 25 Jan 2007 21:29:40 +0800</pubDate>
        <link>http://lsy.javaeye.com/blog/50439</link>
        <guid>http://lsy.javaeye.com/blog/50439</guid>
      </item>
      <item>
        <title>强烈反对工作不能上网</title>
        <author>lsy</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://lsy.javaeye.com">lsy</a>&nbsp;
          链接：<a href="http://lsy.javaeye.com/blog/49897" style="color:red;">http://lsy.javaeye.com/blog/49897</a>&nbsp;
          发表时间: 2007年01月24日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p>在公司工作我觉得上网还是有必要的,碰到个什么问题不能google,baidu怎么搞?而公司高管却说上网影响工作,降低效率,很恼火啊.不知道大家如何看待上网这个问题?</p>
          <br/>
          <span style="color:red;">
            <a href="http://lsy.javaeye.com/blog/49897#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>Wed, 24 Jan 2007 12:56:52 +0800</pubDate>
        <link>http://lsy.javaeye.com/blog/49897</link>
        <guid>http://lsy.javaeye.com/blog/49897</guid>
      </item>
      <item>
        <title>Oracle 行列转换</title>
        <author>lsy</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://lsy.javaeye.com">lsy</a>&nbsp;
          链接：<a href="http://lsy.javaeye.com/blog/49873" style="color:red;">http://lsy.javaeye.com/blog/49873</a>&nbsp;
          发表时间: 2007年01月24日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p>因为数据是Oracle,所以可以使用Decode函数.我的表结构是这样的:</p>
<p>
<table cellspacing="1" border="1" summary="" width="332" cellpadding="1" style="WIDTH: 332px; HEIGHT: 79px">
    <tbody>
        <tr>
            <td>id</td>
            <td>gender</td>
            <td>age</td>
        </tr>
        <tr>
            <td>1</td>
            <td>boy</td>
            <td>22</td>
        </tr>
        <tr>
            <td>2</td>
            <td>boy</td>
            <td>23</td>
        </tr>
        <tr>
            <td>3</td>
            <td>girl</td>
            <td>20</td>
        </tr>
    </tbody>
</table>
</p>
<p>现在需求是按照性别分组,统计出年龄段的记录来</p>
<p>&nbsp;<font face="Arial">SELECT&nbsp;&nbsp; gender, SUM (20age) AS age20, SUM (21age) AS age21,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SUM (22age) AS age22, SUM (23age) AS age23 , SUM (24age) AS age24<br />
&nbsp;&nbsp;&nbsp; FROM (SELECT&nbsp;&nbsp; gender, DECODE (age, 20, COUNT (*), 0) AS 20age,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; DECODE (age, 21, COUNT (*), 0) AS 21age,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; DECODE (age, 22, COUNT (*), 0) AS 22age,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; DECODE (age, 23, COUNT (*), 0) AS 23age,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; DECODE (age, 24, COUNT (*), 0) AS 24age<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; FROM USERS<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; GROUP BY gender)<br />
GROUP BY gender</font></p>
<p>这样结果就是:</p>
<p>
<table cellspacing="1" border="1" summary="" width="483" cellpadding="1" style="WIDTH: 483px; HEIGHT: 63px">
    <tbody>
        <tr>
            <td>gender</td>
            <td>age20</td>
            <td>age21</td>
            <td>age22</td>
            <td>age23</td>
            <td>age24</td>
        </tr>
        <tr>
            <td>boy</td>
            <td>123</td>
            <td>64</td>
            <td>32</td>
            <td>18</td>
            <td>53</td>
        </tr>
        <tr>
            <td>girl</td>
            <td>56</td>
            <td>23</td>
            <td>55</td>
            <td>123</td>
            <td>26</td>
        </tr>
    </tbody>
</table>
</p>
<p>很好用...</p>
          <br/>
          <span style="color:red;">
            <a href="http://lsy.javaeye.com/blog/49873#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>Wed, 24 Jan 2007 11:51:37 +0800</pubDate>
        <link>http://lsy.javaeye.com/blog/49873</link>
        <guid>http://lsy.javaeye.com/blog/49873</guid>
      </item>
      <item>
        <title>拷贝对象要细心</title>
        <author>lsy</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://lsy.javaeye.com">lsy</a>&nbsp;
          链接：<a href="http://lsy.javaeye.com/blog/46189" style="color:red;">http://lsy.javaeye.com/blog/46189</a>&nbsp;
          发表时间: 2007年01月11日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          在说对象的拷贝问题之前，先提一下java对参数的传递。在Java语言中通过<strong>值传递</strong>机制将所有实参的值传递给方法，这就意味着方法将接受所有实参<br />的一个拷贝，看下面的代码：<pre name="code" class="java">	public static void main(String[] args) {
		int i = 1;
		int j = 2;
		change(i,j);
		System.out.println(i+j);
	}
	public static void change(int i, int j){
		i += 10;
		j += 10;
	}</pre><br />打印结果是3，并不会影响到原来的变量值。但是如果方法接受的实参类型不是基本类型的变量，而是对象，那么Java语言运用的机制就是<strong>引用传递</strong>。继续看代码：<br />先定义两个Dog类：<pre name="code" class="java">public class Flea{
	private String size;
	public Flea(String size) {
		this.size = size;
	}
}
public class Dog {
	private String name; 
	private int age; 	
	private Flea flea;
	public Dog(String aName,int age) { 
		this.name = aName; 
		this.age = age; 
		this.flea = new Flea("small");		
	}
	public String toString(){
		return "Dog age is "+age+"! Dog's flea size is "+flea.getSize();
	}
}</pre><br />接着<pre name="code" class="java">	public static void main(String[] args) {
		Dog dog = new Dog("Tom",10);
		change(dog);
		System.out.println(dog);
	}
	public static void change(Dog dog){
		dog.setAge(100);
		dog.getFlea().setSize("big");
	}</pre><br />打印结果应该是Dog age is 100 ! Dog's flea size is big。这是因为传递给方法的变量是一个对象引用的副本，也就是说dog是一个对象的引用，而传递给方法的是dog这个引用的副本，因此二者引用的是同一个对象，因此在方法中对象改变了，那么方法外对象也会改变。这是要做的事情就是在对象传递给方法之前先做拷贝。因此修改一下Dog.java<br /><pre name="code" class="java">public class Flea implements Cloneable {
	private String size;
	public Flea(String size) {
		this.size = size;
	}
	public Object clone() {
		Flea newFlea = null;
		try{
			newFlea = super.clone();
		}
		catch(CloneNotSupportedException e){}
		return newFlea;
	}
}
public class Dog implements Cloneable{
	private String name; 
	private int age; 	
	public Dog(String aName, int age) { 
		this.name = aName; 
		this.age = age; 	
		this.flea = new Flea("small");
	}
	public Object clone() {
		Dog newDog = null;
		try{
			newDog = super.clone();
		}
		catch(CloneNotSupportedException e){}
		return newDog;
	}
	public String toString(){
		return "Dog age is "+age+"! Dog's flea size is "+flea.getSize();
	}
}</pre><br />接下来调整一下测试代码：<br /><pre name="code" class="java">	public static void main(String[] args) {
		Dog dog = new Dog("Tom",10);
		Dog cDog = (Dog)dog.clone();
		change(dog);
		System.out.println(dog);
		System.out.println(cDog);
	}</pre><br />可以看到打印结果是:<br />Dog age is 100! Dog's flea size is big<br />Dog age is 10! Dog's flea size is big<br />这时结果仍然不能让人满意，因为虽然Dog的age被保留了下来，但是Dog的Flea的size确仍然被改变了。这就是需要注意的地方，拷贝对象时留意对象的嵌套对象的拷贝，如此修改一下Dog的clone方法：<pre name="code" class="java">	public Object clone() {
		Dog newDog = null;
		try{
			newDog = (Dog)super.clone();
			newDog.flea = (Flea)flea.clone();//加上这一行
		}
		catch(CloneNotSupportedException e){}
		return newDog;
	}</pre><br />再次运行一次，可以看到结果是：<br />Dog age is 100! Dog's flea size is big<br />Dog age is 10! Dog's flea size is small<br />这样就可以保留在调用方法之前的对象了。^_^
          <br/>
          <span style="color:red;">
            <a href="http://lsy.javaeye.com/blog/46189#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>Thu, 11 Jan 2007 09:34:43 +0800</pubDate>
        <link>http://lsy.javaeye.com/blog/46189</link>
        <guid>http://lsy.javaeye.com/blog/46189</guid>
      </item>
      <item>
        <title>小记：使用Oracle rownum分页</title>
        <author>lsy</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://lsy.javaeye.com">lsy</a>&nbsp;
          链接：<a href="http://lsy.javaeye.com/blog/45720" style="color:red;">http://lsy.javaeye.com/blog/45720</a>&nbsp;
          发表时间: 2007年01月10日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          在oracle数据库中查询结果的行号使用伪列ROWNUM表示（从1开始）。但rownum是在查询之后排序之前赋值的，所以查询employee按birthday排序的第100到120条记录应该这么写：<br /><pre name="code" class="java">select * from(

               select my_table.*, rownum as my_rownum from (

                           select name, birthday from employee order by birthday

               )my_table where rownum &lt;120

) where my_rownum>=100</pre><br />另外对记录的页数算法应该是：<br /><br />page = (rowCounts + pageSize-1) /pageSize;
          <br/>
          <span style="color:red;">
            <a href="http://lsy.javaeye.com/blog/45720#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>Wed, 10 Jan 2007 11:40:09 +0800</pubDate>
        <link>http://lsy.javaeye.com/blog/45720</link>
        <guid>http://lsy.javaeye.com/blog/45720</guid>
      </item>
      <item>
        <title>总结学习Oracle Secure Enterprise Search </title>
        <author>lsy</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://lsy.javaeye.com">lsy</a>&nbsp;
          链接：<a href="http://lsy.javaeye.com/blog/44461" style="color:red;">http://lsy.javaeye.com/blog/44461</a>&nbsp;
          发表时间: 2007年01月08日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p>学习Oracle SES一段时间了，在此总结一下：</p>
<p>在 Oracle Secure Enterprise Search 站点上提供了一篇白皮书，另外安装包里面的doc比较详细说明了SES的详细配置和运用，而我下载的是一个速成例子的教程http://stcurriculum.oracle.com/tutorial/SESAdminTutorial/index.htm，有兴趣的朋友也可以在后面下载看看感受一下。</p>
<p>先总结下SES的搜索类型，一共八种：</p>
<p><strong>Web: </strong>A Web source represents the content on a specific Web site. Web sources facilitate maintenance crawling of specific Web sites.</p>
<p><strong>Table:</strong> A table source represents content in an Oracle database table or view.</p>
<p><strong>File: </strong>A file source is the set of documents that can be accessed through the file protocol.</p>
<p><strong>E-mail: </strong>An e-mail source derives its content from e-mails sent to a specific e-mail address. When Oracle SES crawls an e-mail source, it collects e-mail from all folders set up in the e-mail account, including Drafts, Sent Items, and Trash e-mails.</p>
<p><strong>Mailing list: </strong>A mailing list source derives its content from e-mails sent to a specific mailing list.</p>
<p><strong>OracleAS Portal: </strong>An OracleAS Portal source allows users to search across multiple OracleAS Portal repositories, such as Web pages, files on disk, and pages on other OracleAS Portal instances.</p>
<p><strong>Federated: </strong>A federated source is a repository that maintains its own index. Oracle SES can issue a search, and the repository can return results.</p>
<p><strong>User-defined: </strong>You can implement a crawler plug-in to crawl and index a proprietary document repository, such as Lotus Notes or Documentum.</p>
<p>接下来是特点：</p>
<p><strong>Secure Search</strong></p>
<p><strong>Federated Search</strong></p>
<p><strong>Web Services API</strong></p>
<p><strong>Extensible Crawler Plug-in Framework</strong></p>
<p>SES顾名思义，重点肯定是能够进行安全的搜索存储介质，所以Secure Search肯定是重头大戏。Secure Search 一共有四种形式：</p>
<p><strong>Admin-based Authorization</strong></p>
<p><strong>Custom Crawler Plug-in</strong></p>
<p><strong>Query Time Authorization</strong></p>
<p><strong>Self Service Authorization</strong></p>
<p>对于第一种形式是基于一个全局的静态访问控制列表ACLs实现的，用户对资源的访问都必须在这个ACLs中有定义。</p>
<p>第二种形式是一种比较灵活的形式，用户在使用SES的时候，可以根据自己的需求，通过实现SES提供的API编写自定义的爬虫，对自己的存储介质进行索引。</p>
<p>第三中形式相比第一种则是一个动态的形式，他在用户每次搜索的时候都进行验证，而为了做到这些仅需要实现QueryTimeFilter interface 。</p>
<p>第四种则是一种自定义的验证形式，这可以对SES定义存贮介质范围之外的介质做搜索验证。</p>
<p>接下来总结一下SES的第三个特点Web Services API，这是比较关注的一个特点，用它就可以把SES加入到自己的项目中来。Oracle SES 在 Web Services方面我觉得做的很好，很灵活，他允许用户直接编写 xml与SES进行通讯，也可以使用它提供的Java Proxy Libraries来实现，这样使得不熟悉Web Services的用户群体使用SES成为可能。当然用户如果使用Java Proxy Libraries和SES进行通讯的时候，SES提供了友好的入口，用户可以填写通讯的参数后提交，便可查看到完整的XML源文件。下面是一段我的代码：</p>
<li class="alt"><span><span class="keyword">public</span><span>&nbsp;OracleSearchResult&nbsp;getSearchResult(String&nbsp;searchTerm,&nbsp;String&nbsp;locale, &nbsp;&nbsp;</span></span></li>
<li class=""><span>&nbsp;&nbsp;DataGroup[]&nbsp;groups)&nbsp;{ &nbsp;&nbsp;</span></li>
<li class="alt"><span>&nbsp;OracleSearchService&nbsp;oss&nbsp;=&nbsp;</span><span class="keyword">new</span><span>&nbsp;OracleSearchService(); &nbsp;&nbsp;</span></li>
<li class=""><span>&nbsp;oss.setSoapURL(</span><span class="string">&quot;http://shane-cfca9ec81:7777/search/query/OracleSearch&quot;</span><span>); &nbsp;&nbsp;</span></li>
<li class="alt"><span>&nbsp;</span><span class="keyword">try</span><span>&nbsp;{ &nbsp;&nbsp;</span></li>
<li class=""><span>&nbsp;&nbsp;searchResult&nbsp;=&nbsp;oss.doOracleSearch(searchTerm, &nbsp;&nbsp;</span></li>
<li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;default_startIndex,&nbsp;default_docsRequested, &nbsp;&nbsp;</span></li>
<li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;default_dupRemoved,&nbsp;default_dupMarked,&nbsp;groups,&nbsp;locale, &nbsp;&nbsp;</span></li>
<li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;default_docLang,&nbsp;default_returnCount, &nbsp;&nbsp;</span></li>
<li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;default_filterConnector,&nbsp;default_filters, &nbsp;&nbsp;</span></li>
<li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;default_fetchAttributes); &nbsp;&nbsp;</span></li>
<li class=""><span>&nbsp;}&nbsp;</span><span class="keyword">catch</span><span>&nbsp;(Exception&nbsp;e)&nbsp;{ &nbsp;&nbsp;</span></li>
<li class="alt"><span>&nbsp;&nbsp;log &nbsp;&nbsp;</span></li>
<li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;.error(</span><span class="string">&quot;Can't&nbsp;get&nbsp;all&nbsp;of&nbsp;the&nbsp;search&nbsp;results&nbsp;from&nbsp;SES&nbsp;server!!!&nbsp;The&nbsp;error&nbsp;message&nbsp;following&nbsp;like&nbsp;this:&quot;</span><span>); &nbsp;&nbsp;</span></li>
<li class="alt"><span>&nbsp;&nbsp;log.equals(e.getMessage()); &nbsp;&nbsp;</span></li>
<li class=""><span>&nbsp;} &nbsp;&nbsp;</span></li>
<li class="alt"><span>&nbsp;</span><span class="keyword">return</span><span>&nbsp;searchResult</span></li>
<p>这样通过迭代searchResult就可以拿到全部的搜索结果， So cool!</p>
<p>今天总结完毕</p>
          <br/>
          <span style="color:red;">
            <a href="http://lsy.javaeye.com/blog/44461#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, 08 Jan 2007 20:51:00 +0800</pubDate>
        <link>http://lsy.javaeye.com/blog/44461</link>
        <guid>http://lsy.javaeye.com/blog/44461</guid>
      </item>
      <item>
        <title>正式使用javaeye博客</title>
        <author>lsy</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://lsy.javaeye.com">lsy</a>&nbsp;
          链接：<a href="http://lsy.javaeye.com/blog/43543" style="color:red;">http://lsy.javaeye.com/blog/43543</a>&nbsp;
          发表时间: 2007年01月06日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          今天开始使用javaEye的博客，javaEye做的真是太好了，真是一个非常好的国内java技术学习园地。一定多多学习，为国内软件挥汗出力。<img src="/javascripts/fckeditor/editor/images/smiley/msn/teeth_smile.gif" alt="" />
          <br/>
          <span style="color:red;">
            <a href="http://lsy.javaeye.com/blog/43543#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>Sat, 06 Jan 2007 20:31:19 +0800</pubDate>
        <link>http://lsy.javaeye.com/blog/43543</link>
        <guid>http://lsy.javaeye.com/blog/43543</guid>
      </item>
  </channel>
</rss>