<?xml version="1.0" encoding="UTF-8" ?>
<rss version="2.0">
  <channel>
    <title>JavaEye论坛最新讨论</title>
    <description>JavaEye论坛最新讨论 - Java编程，Ruby编程，微软.net，AJAX，敏捷软件开发，综合软件技术</description>
    <link>http://www.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>GPS、GIS、IC卡相关信息</title>
        <author>JavaEye网站</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://ecs.javaeye.com">ECS</a>&nbsp;
          链接：<a href="http://www.javaeye.com/topic/233704" style="color:red;">http://www.javaeye.com/topic/233704</a>&nbsp;
          发表时间: 2008年08月28日
          <br/>
          声明：本文系JavaEye网站发布的原创文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p>有个业务需求，关于GPS、GIS、IC卡，公交车，请推荐下哪些产品比较好。</p>
          <br/>
          <span style="color:red;">
            <a href="http://share.group.javaeye.com/topic/233704#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, 28 Aug 2008 09:14:21 +0800</pubDate>
        <link>http://www.javaeye.com/topic/233704</link>
        <guid>http://www.javaeye.com/topic/233704</guid>
      </item>
      <item>
        <title>ActiveMQ5.0实战三:使用Spring发送,消费topic和queue消息</title>
        <author>JavaEye网站</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://andyao.javaeye.com">andyao</a>&nbsp;
          链接：<a href="http://www.javaeye.com/topic/234101" style="color:red;">http://www.javaeye.com/topic/234101</a>&nbsp;
          发表时间: 2008年08月28日
          <br/>
          声明：本文系JavaEye网站发布的原创文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <h3>简介</h3>
<p><a href="../153171" target="_blank">实战一</a>
, <a href="../154092" target="_blank">实战二</a>
介绍了ActiveMQ的基本概念和配置方式.</p>
<p>本篇将通过一个实例介绍使用spring发送,消费topic, queue类型消息的方法. 不懂topic和queue的google 之.</p>
<p>&nbsp;</p>
<p><a href="../../../upload/picture/pic/20785/485ba4ca-70db-3a46-a5c8-1cd3d9b81f65.gif" target="_blank"><img src="../../../upload/picture/pic/20785/485ba4ca-70db-3a46-a5c8-1cd3d9b81f65.gif" height="209" alt="" width="387" />
</a>
</p>
<p>如图示, TOPIC和QUEUE分别代表一个topic和一个queue消息通道. </p>
<ol>
<li>TopicMessageProducer向topic发送消息, TopicConsumerA和TopicConsumerB则从topic消费消息.</li>
<li>QueueMessageProducer向Queue发送消息, QueueConsumer从Queue中消费消息</li>
</ol>
<h3>Spring整合JMS</h3>
<p>就像对orm, web的支持一样, spring同样支持jms, 为整合jms到已有的项目提供了很多便利的方法. 本篇主要讲实战, 是所以先从配置开始, spring配置jms基本上需要8个部分.</p>
<ol>
<li>ConnectionFactory. 和jms服务器的连接, 可以是外部的jms server, 也可以使用embedded ActiveMQ Broker.</li>
<li>Destination. 有topic和queue两种方式.</li>
<li>JmsTemplate. spring提供的jms模板.</li>
<li>MessageConverter. 消息转换器.</li>
<li>MessageProducer. 消息生产者.</li>
<li>MessageConsumer. 消息消费者.</li>
<li>MessageListener. 消息监听器</li>
<li>MessageListenerContainer. 消息监听容器</li>
</ol>
<p>下面以实例的方式介绍上面8个部分.</p>
<h4>1. ConnectionFactory</h4>
<pre name="code" class="xml">&lt;amq:connectionFactory id="jmsConnectionFactory" brokerURL="vm://localhost" /&gt;</pre>
<p>&nbsp;brokerURL是指要连接的activeMQ server的地址, activeMQ提供了多种brokerURL, 集体可参见文档.一般我们使用嵌套的ActiveMQ server. 配置如下, 这个配置使用消息的存储机制, 服务器重启也不会丢失消息.</p>
<pre name="code" class="xml">&lt;!--  embedded ActiveMQ Broker --&gt;
	&lt;amq:broker useJmx="false" persistent="true"&gt;
		&lt;amq:persistenceAdapter&gt;
			&lt;amq:amqPersistenceAdapter directory="d:/amq"/&gt;
		&lt;/amq:persistenceAdapter&gt;
		&lt;amq:transportConnectors&gt;
			&lt;amq:transportConnector uri="tcp://localhost:0" /&gt;
		&lt;/amq:transportConnectors&gt;
	&lt;/amq:broker&gt;</pre>
<h4>&nbsp;2. Destination</h4>
<p>&nbsp;在实例中我们使用了两种destination</p>
<pre name="code" class="xml">&lt;!--  ActiveMQ destinations  --&gt;
&lt;!--  使用topic方式--&gt;
&lt;amq:topic name="TOPIC" physicalName="JMS-TEST-TOPIC" /&gt;
&lt;!--  使用Queue方式--&gt;
&lt;amq:queue name="QUEUE" physicalName="JMS-TEST-QUEUE" /&gt;</pre>
<h4>&nbsp;3. JmsTemplate</h4>
<pre name="code" class="xml">&lt;!--  Spring JmsTemplate config --&gt;
	&lt;bean id="jmsTemplate" class="org.springframework.jms.core.JmsTemplate"&gt;
		&lt;property name="connectionFactory"&gt;
			&lt;!--  lets wrap in a pool to avoid creating a connection per send --&gt;
			&lt;bean class="org.springframework.jms.connection.SingleConnectionFactory"&gt;
				&lt;property name="targetConnectionFactory" ref="jmsConnectionFactory" /&gt;
			&lt;/bean&gt;
		&lt;/property&gt;
		&lt;!-- custom MessageConverter --&gt;
		&lt;property name="messageConverter" ref="defaultMessageConverter" /&gt;
	&lt;/bean&gt;</pre>
<h4>
&nbsp;
4. MessageConverter</h4>
<p>&nbsp;&nbsp; MessageConverter实现的是org.springframework.jms.support.converter.MessageConverter接口, 提供消息的转换功能. DefaultMessageConverter的实现见附件.</p>
<pre name="code" class="xml">&lt;bean id="defaultMessageConverter" class="com.andyao.activemq.DefaultMessageConverter" /&gt;</pre>
<h4>&nbsp; 5. MessageProducer</h4>
<p>&nbsp;&nbsp; 实例拥有两个消息生产者, 消息生产者都是POJO, 实现见附件.</p>
<pre name="code" class="xml">&lt;!-- POJO which send Message uses  Spring JmsTemplate --&gt;
	&lt;bean id="topicMessageProducer" class="com.andyao.activemq.TopicMessageProducer"&gt;
		&lt;property name="template" ref="jmsTemplate" /&gt;
		&lt;property name="destination" ref="TOPIC" /&gt;
	&lt;/bean&gt;
	&lt;bean id="queueMessageProducer" class="com.andyao.activemq.QueuMessageProducer"&gt;
		&lt;property name="template" ref="jmsTemplate" /&gt;
		&lt;property name="destination" ref="QUEUE" /&gt;
	&lt;/bean&gt;</pre>
<h4>&nbsp;6. MessageConsumer</h4>
<p>&nbsp;TOPIC通道有两个消息消费者, QUEUE有一个消息消费者</p>
<pre name="code" class="xml">&lt;!--  Message Driven POJO (MDP) --&gt;
    &lt;!-- consumer1 for topic a --&gt;
    &lt;bean id="topicConsumerA" class="com.andyao.activemq.TopicConsumerA" /&gt;
    &lt;!-- consumer2 for topic a --&gt;
    &lt;bean id="topicConsumerB" class="com.andyao.activemq.TopicConsumerB" /&gt;
    &lt;!-- consumer for queue --&gt;
    &lt;bean id="queueConsumer" class="com.andyao.activemq.QueueConsumer" /&gt;</pre>
<h4>
&nbsp;
7. MessageListener</h4>
<p>每一个消息消费者都对应一个MessageListener</p>
<pre name="code" class="xml">&lt;bean id="topicListenerA" class="org.springframework.jms.listener.adapter.MessageListenerAdapter"&gt;
		&lt;constructor-arg ref="topicConsumerA" /&gt;
		&lt;!--  may be other method --&gt;
		&lt;property name="defaultListenerMethod" value="receive" /&gt;
		&lt;!-- custom MessageConverter define --&gt;
		&lt;property name="messageConverter" ref="defaultMessageConverter" /&gt;
	&lt;/bean&gt;

	&lt;bean id="topicListenerB" class="org.springframework.jms.listener.adapter.MessageListenerAdapter"&gt;
		&lt;constructor-arg ref="topicConsumerB" /&gt;
		&lt;!--  may be other method --&gt;
		&lt;property name="defaultListenerMethod" value="receive" /&gt;
		&lt;!-- custom MessageConverter define --&gt;
		&lt;property name="messageConverter" ref="defaultMessageConverter" /&gt;
	&lt;/bean&gt;

    &lt;bean id="queueListener" class="org.springframework.jms.listener.adapter.MessageListenerAdapter"&gt;
		&lt;constructor-arg ref="queueConsumer" /&gt;
		&lt;!--  may be other method --&gt;
		&lt;property name="defaultListenerMethod" value="receive" /&gt;
		&lt;!-- custom MessageConverter define --&gt;
		&lt;property name="messageConverter" ref="defaultMessageConverter" /&gt;
	&lt;/bean&gt;</pre>
<h4>&nbsp;8. MessageListenerContainer</h4>
<p>&nbsp;有几个MessageListener既有几个MessageListenerContainer</p>
<pre name="code" class="xml">&lt;bean id="topicListenerContainerA" class="org.springframework.jms.listener.DefaultMessageListenerContainer"&gt;
		&lt;property name="connectionFactory" ref="jmsConnectionFactory" /&gt;
		&lt;property name="destination" ref="TOPIC" /&gt;
		&lt;property name="messageListener" ref="topicListenerA" /&gt;
	&lt;/bean&gt;

    &lt;bean id="topicListenerContainerB" class="org.springframework.jms.listener.DefaultMessageListenerContainer"&gt;
		&lt;property name="connectionFactory" ref="jmsConnectionFactory" /&gt;
		&lt;property name="destination" ref="TOPIC" /&gt;
		&lt;property name="messageListener" ref="topicListenerB" /&gt;
	&lt;/bean&gt;
    
    &lt;bean id="queueListenerContainer" class="org.springframework.jms.listener.DefaultMessageListenerContainer"&gt;
		&lt;property name="connectionFactory" ref="jmsConnectionFactory" /&gt;
		&lt;property name="destination" ref="QUEUE" /&gt;
		&lt;property name="messageListener" ref="queueListener" /&gt;
	&lt;/bean&gt;</pre>
<h3>
&nbsp;
Summary</h3>
<p>写spring配置文件的时候, 要把MessageProducer, MessageConsumer,MessageListener,MessageListenerContainer几个地方弄清楚:</p>
<ol>
<li>可以有一个或者多个消息生产者向同一个destination发送消息.</li>
<li>queue类型的只能有一个消息消费者.</li>
<li>topic类型的可以有多个消息消费者.</li>
<li>每个消费者对应一个MessageListener和一个MessageListenerContainer.</li>
</ol>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
          <br/>
          <span style="color:red;">
            <a href="http://share.group.javaeye.com/topic/234101#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, 28 Aug 2008 18:21:19 +0800</pubDate>
        <link>http://www.javaeye.com/topic/234101</link>
        <guid>http://www.javaeye.com/topic/234101</guid>
      </item>
      <item>
        <title>关于项目工期的欺骗</title>
        <author>JavaEye网站</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://gurudk.javaeye.com">gurudk</a>&nbsp;
          链接：<a href="http://www.javaeye.com/topic/233088" style="color:red;">http://www.javaeye.com/topic/233088</a>&nbsp;
          发表时间: 2008年08月27日
          <br/>
          声明：本文系JavaEye网站发布的原创文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          现在做定制软件项目有一种趋势，就是对工期的欺骗。<br /><br />对方客户上层领导要求工期是12个月，直接负责项目的客户会说你们要在6个月完成，等到公司领导说要4个月，项目经理可能说要3个月。每一层都要剥削一点，一般到真正做项目，没多少时间了。<br /><br />说的好听一点，是给风险预留一段时间，但每一层都这么做，严重挤压项目时间。一般客户都是有严格的上线时间，这个时间是客户定的，很难去协调，如果你说你完不成，就别来竞标了，一般都是会承诺这不合理的工期。就这样，不合理的工期，导致不合理的项目计划，导致不合理的没日没夜的加班，导致团队士气的降低，导致战斗力的下降，导致离职，频繁的人员流动。更可怕的是，客户对软件项目越来越不放心，导致他下一个项目对风险留了更大的余量，下一个恶性循环开始。。。<br /><br />我经历了几个这样的项目，1个月的做了1年，8个月的做了三年，其中多是返工的工作量，每个环节做的都不够好，需求没做好，设计没做好，测试没做好，只能靠返工解决。<br /><br />客户是没法要求他们什么，好说话的还好，不好说话的坚持，你也没办法。但是<strong>公司内部</strong>如果还是像外面一样的要求，无视项目经理的估算，那就太不合情理了。最可怜的是项目组，被做为鱼肉，任人宰割，没日没夜的加班，身心俱疲。<br /><br />项目组应对办法也不是没有，就是迭代开发，分阶段交付，一般是一个月，在这个阶段能让客户看到点实实在的东西，他也就放心了。<br /><br />看看大家的意见，分析一下整体解决方案。
          <br/>
          <span style="color:red;">
            <a href="http://share.group.javaeye.com/topic/233088#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, 27 Aug 2008 09:17:09 +0800</pubDate>
        <link>http://www.javaeye.com/topic/233088</link>
        <guid>http://www.javaeye.com/topic/233088</guid>
      </item>
      <item>
        <title>今天确认涨薪水了,高兴一把</title>
        <author>JavaEye网站</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://david-lee.javaeye.com">reno_k</a>&nbsp;
          链接：<a href="http://www.javaeye.com/topic/233598" style="color:red;">http://www.javaeye.com/topic/233598</a>&nbsp;
          发表时间: 2008年08月27日
          <br/>
          声明：本文系JavaEye网站发布的原创文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          在一家合资印刷厂当程序员,公司里唯一的程序员,平心说句,日子过得蛮悠哉的,月底就满一年,之前问我有虾米要求,偶说期望能涨1000元,之前5000(税前)多一些,今天结果出来了,按考核第2高(一共4级)的标准里的最高子标准,涨15%,即800元,算多?,顺便问问大家涨薪水的过程是怎么样的?<br /><br />一年下来,虽然公司里只有自己一个coder,但明显能感觉到自己的进步,特别是在业务分析,对象的设计和数据库设计方面,全structs,hibnate之类的就进步有限,也许这就是接近需求的便利吧,最后,要感谢网络,正是有网络,才能有以上的进步,也是有网张,才能在JE这里也获益多多<br /><br />也说说在非软件公司里当程序员的日子(一个程序员的日子),早上可以自己烘果酱多士(最近的心得,嘉顿的方包最好烤,除黄油外,花生酱是一个很好的搭配),中午午睡后,(手)磨一下咖啡,或者中午吃太饱,就泡杯茶喝(用老爸给的紫砂壶,偶视之为传家之宝),明年的目标是学会做葡式蛋挞,或奥尔良烤翅(材料和配方能在淘宝上买到),早上8:00-12:00,下午13:30-17:30,99%的日子能在CustomerService羡慕的眼神下准点打卡下班,大家的日子又是怎么样的呢?
          <br/>
          <span style="color:red;">
            <a href="http://share.group.javaeye.com/topic/233598#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, 27 Aug 2008 22:33:52 +0800</pubDate>
        <link>http://www.javaeye.com/topic/233598</link>
        <guid>http://www.javaeye.com/topic/233598</guid>
      </item>
      <item>
        <title>计划和进度，一笔糊涂账</title>
        <author>JavaEye网站</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://nonocast.javaeye.com">nonocast</a>&nbsp;
          链接：<a href="http://www.javaeye.com/topic/231922" style="color:red;">http://www.javaeye.com/topic/231922</a>&nbsp;
          发表时间: 2008年08月23日
          <br/>
          声明：本文系JavaEye网站发布的原创文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          规模前提:<br />1. 6个人的团队<br />2. 2个月左右的开发时间<br /><br />问题是:<br />作为一个项目，团队的负责人，你<br />a. 如何作出合理的计划<br />b. 如何知道当前项目的进度<br />c. 如何应对变化，根据进度反馈调整计划<br /><br />可能问题有些笼统，这样说吧，<br />以一个问题开个头，<br />作为一个项目、团队的负责人，我个人认为有必要十分清楚知道团队每个人(不管是大拿还是新人)的工作计划以及实际工作情况(细化到天)。如果你是一个团队的负责人，你是否能提供书面的表格，某人某天的工作计划和实际工作完成的情况呢?<br /><br />是否可以结合管理方式和工具两方面谈谈您的看法?<br /><br />谢谢
          <br/>
          <span style="color:red;">
            <a href="http://share.group.javaeye.com/topic/231922#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, 23 Aug 2008 20:40:01 +0800</pubDate>
        <link>http://www.javaeye.com/topic/231922</link>
        <guid>http://www.javaeye.com/topic/231922</guid>
      </item>
      <item>
        <title>面试遇到的囧人</title>
        <author>JavaEye网站</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://kisses99.javaeye.com">Kisses99</a>&nbsp;
          链接：<a href="http://www.javaeye.com/topic/233597" style="color:red;">http://www.javaeye.com/topic/233597</a>&nbsp;
          发表时间: 2008年08月27日
          <br/>
          声明：本文系JavaEye网站发布的原创文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          前两天公司招聘，遇到一牛人，6年java工作经验，说是做过不少spring项目，问他IoC啥概念，答是松耦合，但个人不用Spring MVC，因为用了Spring MVC后应用就和Spring紧耦合了，这样不好。所以，用了Struts。<br /><br />囧死我了。
          <br/>
          <span style="color:red;">
            <a href="http://share.group.javaeye.com/topic/233597#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, 27 Aug 2008 22:32:39 +0800</pubDate>
        <link>http://www.javaeye.com/topic/233597</link>
        <guid>http://www.javaeye.com/topic/233597</guid>
      </item>
      <item>
        <title>现在的我还能够做什么</title>
        <author>JavaEye网站</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://ocean-958.javaeye.com">ocean_958</a>&nbsp;
          链接：<a href="http://www.javaeye.com/topic/233928" style="color:red;">http://www.javaeye.com/topic/233928</a>&nbsp;
          发表时间: 2008年08月28日
          <br/>
          声明：本文系JavaEye网站发布的原创文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          工作虽然三年多了，但是除了第一年一直做开发以外，最近俩年一直做项目维护。当我再次要写代码的时候，我才发现。现在技术都忘记完了。由于现在做维护工作，导致很少写代码。虽然现在网络安全和设计等方面的能力有所提高，但是我不知道我以后的路该怎么走，该怎么规划，毕竟技术丢掉了，我还能够做什么？请朋友们给我出出建议与意见。我好对于我的人生做个规划，并且确定下以后的里怎么走，谢谢大家了
          <br/>
          <span style="color:red;">
            <a href="http://share.group.javaeye.com/topic/233928#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, 28 Aug 2008 13:59:02 +0800</pubDate>
        <link>http://www.javaeye.com/topic/233928</link>
        <guid>http://www.javaeye.com/topic/233928</guid>
      </item>
      <item>
        <title>Oracle数据库中的临时表用法</title>
        <author>JavaEye网站</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://zzzzzzzzzzzz.javaeye.com">right now</a>&nbsp;
          链接：<a href="http://www.javaeye.com/topic/234139" style="color:red;">http://www.javaeye.com/topic/234139</a>&nbsp;
          发表时间: 2008年08月28日
          <br/>
          声明：本文系JavaEye网站发布的原创文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          希望对大家的学习和工作有所帮助。 <br /><br />一：语法 <br /><br />在Oracle中，可以创建以下两种临时表： <br /><br />(1) 会话特有的临时表 <br /><br />CREATE GLOBAL TEMPORARY ( ) <br /><br />ON COMMIT PRESERVE ROWS；<br /><br />(2) 事务特有的临时表 <br /><br />CREATE GLOBAL TEMPORARY ( ) <br /><br />ON COMMIT DELETE ROWS； <br /><br />CREATE GLOBAL TEMPORARY TABLE MyTempTable<br /><br />所建的临时表虽然是存在的，但是如果insert 一条记录然后用别的连接登上去select，记录是空的。　　 <br /><br />--ON COMMIT DELETE ROWS 说明临时表是事务指定，每次提交后ORACLE将截断表（删除全部行） <br /><br />--ON COMMIT PRESERVE ROWS 说明临时表是会话指定，当中断会话时ORACLE将截断表。　　 <br /><br /><br />二：动态创建 <br /><br />create or replace procedure pro_temp(v_col1 varchar2,v_col2 varchar2) as <br /><br />v_num number; <br /><br />begin <br /><br />select count(*) into v_num from <br />user_tables where table_name=''T_TEMP'';　　 <br /><br />--create temporary table <br /><br />if v_num&lt;1 then <br /><br />execute immediate ''CREATE GLOBAL TEMPORARY TABLE T_TEMP ( <br /><br />COL1 VARCHAR2(10), <br /><br />COL2 VARCHAR2(10) <br /><br />) ON COMMIT delete ROWS''; <br /><br />end if;　　 <br /><br />--insert data <br /><br />execute immediate ''insert into t_temp values<br />(''''''　　v_col1　　'''''',''''''　　v_col2　　'''''')'';　　 <br /><br />execute immediate ''select col1 from t_temp'' into v_num; <br /><br />dbms_output.put_line(v_num); <br /><br />execute immediate ''delete from t_temp''; <br /><br />commit; <br /><br />execute immediate ''drop table t_temp''; <br /><br />end pro_temp;　<br /><br />测试:　　 <br /><br />15:23:54 SQL> set serveroutput on <br /><br />15:24:01 SQL> exec pro_temp(''11'',''22''); <br /><br />11　　 <br /><br />PL/SQL 过程已成功完成。　　 <br /><br />已用时间: 00: 00: 00.79 <br /><br />15:24:08 SQL> desc t_temp; <br /><br />ERROR： <br /><br />ORA-04043: 对象 t_temp 不存在　<br /><br /><br />三:特性和性能(与普通表和视图的比较) <br /><br />临时表只在当前连接内有效 <br /><br />临时表不建立索引,所以如果数据量比较大或进行多次查询时,不推荐使用 <br /><br />数据处理比较复杂的时候时表快,反之视图快点 <br /><br />在仅仅查询数据的时候建议用游标: open cursor for ''sql clause'';
          <br/>
          <span style="color:red;">
            <a href="http://share.group.javaeye.com/topic/234139#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, 28 Aug 2008 20:16:31 +0800</pubDate>
        <link>http://www.javaeye.com/topic/234139</link>
        <guid>http://www.javaeye.com/topic/234139</guid>
      </item>
      <item>
        <title>把Oracle查询转换为SQL Server </title>
        <author>JavaEye网站</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://zzzzzzzzzzzz.javaeye.com">right now</a>&nbsp;
          链接：<a href="http://www.javaeye.com/topic/234136" style="color:red;">http://www.javaeye.com/topic/234136</a>&nbsp;
          发表时间: 2008年08月28日
          <br/>
          声明：本文系JavaEye网站发布的原创文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 在把Oracle查询转换为SQL Server的时候要特别当心一些不容易注意到的问题。我们知道，T-SQL是SQL Server的语言引擎，而Oracle的语言引擎却是PLSQL.这两种查询语言都对 <br />　　ANSI SQL-92标准进行了扩展以提供额外的支持力度。你所创建的应用程序几乎都要用到这些补充特性。本文就对最常用的、非标准的Oracle扩展进行了说明，同时还要介绍下如何 <br />　　对这些扩展进行转化以用在SQL Server环境下。 <br /><br />　　列的选择 <br /><br />　　用PLSQL执行数据查询的时候，FROM子句是必须的，这同SQL Server的要求是一样的。 SELECT语句必须选择针对的数据表。在Oracle数据库内有一种特殊的表DUAL.DUAL表由 <br />　　Oracle连同数据字典一同创建，所有的用户都可以用名称DUAL访问该表。这个表里只有一列DUMMY，该列定义为VARCHAR2（1）类型，有一行值X. <br />　　从DUAL表选择数据常被用来通过SELECT语句计算常数表达式，由于DUAL只有一行数据，所以常数只返回一次。 <br /><br />　　Oracle下的DUAL查询如下所示： <br />　　SELECT &lsquo;x&rsquo; FROM dual <br />　　而对等的SQL Server查询则是下面这个样子： <br />　　SELECT &lsquo;x&rsquo; <br />　　连接 <br />　　Oracle用|| 符号作为连接符，而SQL Server的连接符是加号：+ . <br />　　Oracle查询如下所示： <br />　　Select &lsquo;Name&rsquo; || &lsquo;Last Name&rsquo; <br />　　From tableName <br />　　对应的SQL Server查询如下所示： <br />　　Select &lsquo;Name&rsquo; + &lsquo;Last Name&rsquo; <br />　　数字取舍 <br />　　Oracle数据库内有一个TRUNC函数，该函数返回m位十进制数的n位；如果省略m则n就是0位。m的值可以为负，表示截去小数点左边m位数字。 <br />　　在SQL Server下可以用Round或者Floor. <br /><br />　　以下是Oracle查询： <br />　　SELECT TRUNC（15.79，1） "Truncate" FROM DUAL； <br /><br />　　下面是同类查询的SQL Server版本： <br /><br />　　SELECT ROUND（15.79， 0） rounded ， <br />　　ROUND（15.79， 0，1） truncated <br />　　SELECT FLOOR（ROUND（15.79， 0））， <br />　　FLOOR（ROUND（15.79， 0，1） ） <br />　　在把Oracle查询转换为SQL Server的时候要特别当心一些不容易注意到的问题。我们知道，T-SQL是SQL Server的语言引擎，而Oracle的语言引擎却是PLSQL.这两种查询语言都对 <br />　　ANSI SQL-92标准进行了扩展以提供额外的支持力度。你所创建的应用程序几乎都要用到这些补充特性。本文就对最常用的、非标准的Oracle扩展进行了说明，同时还要介绍下如何 <br />　　对这些扩展进行转化以用在SQL Server环境下。 <br /><br />　　列的选择 <br /><br />　　用PLSQL执行数据查询的时候，FROM子句是必须的，这同SQL Server的要求是一样的。 SELECT语句必须选择针对的数据表。在Oracle数据库内有一种特殊的表DUAL.DUAL表由 <br />　　Oracle连同数据字典一同创建，所有的用户都可以用名称DUAL访问该表。这个表里只有一列DUMMY，该列定义为VARCHAR2（1）类型，有一行值X. <br />　　从DUAL表选择数据常被用来通过SELECT语句计算常数表达式，由于DUAL只有一行数据，所以常数只返回一次。 <br /><br />　　Oracle下的DUAL查询如下所示： <br />　　SELECT &lsquo;x&rsquo; FROM dual <br />　　而对等的SQL Server查询则是下面这个样子： <br />　　SELECT &lsquo;x&rsquo; <br />　　连接 <br />　　Oracle用|| 符号作为连接符，而SQL Server的连接符是加号：+ . <br /><br />　　Oracle查询如下所示： <br />　　Select &lsquo;Name&rsquo; || &lsquo;Last Name&rsquo; <br />　　From tableName <br />　　对应的SQL Server查询如下所示： <br />　　Select &lsquo;Name&rsquo; + &lsquo;Last Name&rsquo; <br />　　数字取舍 <br />　　Oracle数据库内有一个TRUNC函数，该函数返回m位十进制数的n位；如果省略m则n就是0位。m的值可以为负，表示截去小数点左边m位数字。 <br />　　在SQL Server下可以用Round或者Floor. <br /><br />　　以下是Oracle查询： <br />　　SELECT TRUNC（15.79，1） "Truncate" FROM DUAL； <br /><br />　　下面是同类查询的SQL Server版本： <br />　　SELECT ROUND（15.79， 0） rounded ， <br />　　ROUND（15.79， 0，1） truncated <br />　　SELECT FLOOR（ROUND（15.79， 0））， <br />　　FLOOR（ROUND（15.79， 0，1） ） <br /><br />　　数字转换 <br />　　Oracle的TO_CHAR函数可以把n位NUMBER数据类型转换为VARCHAR2 数据类型，同时采用可选的数字格式。 <br />　　SQL Server则通过STR函数返回数字转换之后的字符数据。不过，该函数不具方便的Format参数。 <br /><br />　　Oracle查询如下： <br />　　SELECT to_char（123.45 ，99999999999999） from tab <br />　　SELECT to_char（EXPIRY_DATE，'DDMONYYYY'） from tab <br /><br />　　以下是SQL Server版本的查询： <br />　　SELECT STR（123.45， 14） <br />　　SELECT STR（round（123.455 ， 2），12，2） <br />　　SELECT CAST（REPLACE（（CONVERT（varchar（12） ， <br />　　EXPIRYDATE， 106 ）），' ' ， ''） as varchar（9）） <br />　　LENGTH和LEN <br /><br />　　以下是Oracle的查询： <br />　　SELECT LENGTH（'SQLMAG'） <br />　　"Length in characters" FROM DUAL； <br />　　以上查询在SQL Server下是这样写的： <br />　　SELECT LEN（'SQLMAG'） "Length in characters" <br /><br />　　日期 <br /><br />　　Oracle取得日期和采用如下方式： <br />　　SYSDATE <br />　　SQL Server则是这样的： <br />　　GETDATE（） <br />　　你可以用各种语法操作日期。 <br />　　以下的代码对Oracle日期 <br /><br />　　值中的月份进行了格式调整（返回日期再加上n月）： <br />　　Select add_months（sysdate，12） from dual <br /><br />　　SQL Server则是如下完成同等功能的： <br />　　Select dateadd（mm，12，getdate（）） <br />　　数据的减法也不同。以下代码在Oracle中直接 <br />　　对数据进行减法操作： <br />　　SELECT sysdate -add_months（sysdate，12） FROM dual <br />　　SQL Server则是这样做的： <br />　　SELECT datediff（dd， GetDate（），dateadd（mm，12，getdate（））） <br /><br />　　</p>
<p>&nbsp;</p>
          <br/>
          <span style="color:red;">
            <a href="http://share.group.javaeye.com/topic/234136#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, 28 Aug 2008 20:13:50 +0800</pubDate>
        <link>http://www.javaeye.com/topic/234136</link>
        <guid>http://www.javaeye.com/topic/234136</guid>
      </item>
      <item>
        <title>webORB for PHP</title>
        <author>JavaEye网站</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://zzzzzzzzzzzz.javaeye.com">right now</a>&nbsp;
          链接：<a href="http://www.javaeye.com/topic/234134" style="color:red;">http://www.javaeye.com/topic/234134</a>&nbsp;
          发表时间: 2008年08月28日
          <br/>
          声明：本文系JavaEye网站发布的原创文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          weborb为PHP提供了一套灵活的远程执行。用weborb ， PHP开发者能整合Flex客户端应用程序与部署在PHP中的对象应用。 此外， weborb为PHP可以作为一个FLASH Remoting的网关，从而支持FLASH客户端应用。 <br /><br />本指南提供了一个概述建立一个Flex客户利用Flex Builder的2.0和与之连接的同一个PHP应用。 结果该漫游是一个Flex应用沟通的一个PHP对象暴露透过weborb对于PHP 。 <br /><br />起步-weborb安装 <br /><br />确保下列软件安装在下载weborb对于PHP ： <br /><br />PHP5 or Zend Platform with PHP5 support或把php5的Zend平台，把php5支持 <br /><br />Any web server supporting PHP5 or later任何网络服务器支持把php5或更高版本<br /><br />Flex Builder 创造了一个空的Flex应用。 下面的步骤将指导，通过建立一个Flex应用和连接，它与一个PHP对象。 <br /><br />配置-Flex Builder <br /><br />weborb对PHP产品分布载成品Flex应用演示flex能够weborb连接和远程调用。拷贝和粘贴的内容，该example.mxml文件位于 <br /><br />     \Examples\SampleApp\ \实例\ sampleapp \ <br /><br />进入mxml创建的文件Flex Builder。该守则在应用连接到一个PHP对象，并检索出一些基本的计算机的信息当物体正在运行。 <br /><br />配置-weborb <br /><br />Flex 应用需要申报的暴露班为"目的地" 。 目的地必须被配置在远程- config.xml文件位于\ \Weborb\WEB-INF\flex文件夹。应用在这个例子中使用了" infoservice "目标之定义为： <br /><br /> &lt;destination id="InfoServiceDestination"><br />   &lt;properties><br />     &lt;source>InfoService&lt;/source><br />   &lt;/properties><br />&lt;/destination> <br /><br />Flex Builder中读取配置文件，在编译的时候。 <br /><br />重要提醒：当您编译项目在挠性建设者，一定要查找的目录挠性建设者地方编译客户端应用。这是非常重要的地方，一本weborb.php到同一个目录下。 weborb.php必须包含下列PHP代码： <br /><br />&lt;?php  <br />   require_once("../Weborb/ORBHttpHandler.php");<br /><br />   $m_ORBHttpHandler = new ORBHttpHandler();<br />   $m_ORBHttpHandler->processRequest(); <br />?> <br /><br />非常重要 ：第一线， 必须经过剪辑后，以该点至weborb目录，从产品分布。举例来说，看看weborb.php坐落于 / 控制台文件夹 <br /><br />  <br /><br />运行Flex应用 <br /><br />:当你运行该应用程序在Flex建设者时，它会打开一个浏览器和负荷应用： <br /><br />http://localhost/Examples/SampleFlexToPHPProject.html http://localhost/examples/sampleflextophpproject.html <br /><br />应用连接到后端服务后，启动或当用户点击"发送请求"按钮： <br /><br />代码审查 <br /><br />Flex应用宣布一项远程对象使用RemoteObject API： <br /><br />remoteObject = new RemoteObject();<br />remoteObject.destination = "InfoServiceDestination";<br />remoteObject.getComputerInfo.addEventListener("result", onResult);<br />remoteObject.addEventListener("fault", onFault); <br /><br />通知目的地的名称相匹配的目的地输入远程- config.xml文件。 当用户点击'获得计算机信息'按钮时，下面的函数执行一个远程方法调用： <br /><br />private function getInfo():void <br />{<br />  invokeButton.enabled = false;<br />  currentUserText.text = "";<br />  processIdText.text = "";<br />  osText.text = "";<br />  phpVersionText.text = "";<br />  remoteObject.getComputerInfo();<br />} <br /><br />当调用响应的情况下，灵活调用响应处理器在&lt;remoteobject>标签。 响应处理器在举例中，填充的文本字段与现有的数据，在返回的对象： <br /><br />private function onResult(event:ResultEvent):void <br />{<br />  var computerInfo:Object = event.result;<br />  currentUserText.text = computerInfo.currentUser;<br />  processIdText.text = computerInfo.phpProcessId;<br />  osText.text = computerInfo.operatingSystem;<br />  phpVersionText.text = computerInfo.phpVersion;<br />  invokeButton.enabled = true;<br />} <br /><br />源代码服务器端的对象是如下： <br /><br />class InfoService<br />{<br />  public function getComputerInfo()<br />  {<br />    $compInfo = new ComputerInfo();<br />    $compInfo->currentUser = get_current_user();<br />    $compInfo->phpProcessId = getmypid();<br />    $compInfo->operatingSystem = php_uname( 'a' );<br />    $compInfo->phpVersion = phpversion();<br />    return $compInfo;<br />  }<br />}<br />class ComputerInfo<br />{<br />  public $currentUser;<br />  public $phpProcessId;<br />  public $operatingSystem;<br />  public $phpVersion;<br />}
          <br/>
          <span style="color:red;">
            <a href="http://share.group.javaeye.com/topic/234134#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, 28 Aug 2008 20:11:29 +0800</pubDate>
        <link>http://www.javaeye.com/topic/234134</link>
        <guid>http://www.javaeye.com/topic/234134</guid>
      </item>
      <item>
        <title>想在金秋时节找工作的进来报个到</title>
        <author>JavaEye网站</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://liuqiang.javaeye.com">liuqiang</a>&nbsp;
          链接：<a href="http://www.javaeye.com/topic/233417" style="color:red;">http://www.javaeye.com/topic/233417</a>&nbsp;
          发表时间: 2008年08月27日
          <br/>
          声明：本文系JavaEye网站发布的原创文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 首先，我认为秋季9-11月份是个适宜找工作的时节，尽管不如金三银四，但秋高气爽的时节，很多HR也会冒出来招人兼旅游，找工作大家最关心的还是薪资问题，前面有个赛工资的帖子，我个人认为并没有参考价值，有报1w的飘过的，有报2k爬过的，最后得出的结论是：工资高的高，低调低，别无他物。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 另外多少还有点误导别人，比如有的刚毕业就有拿近万的，最后才知道原来是搞电的。所以我认为大家要工资的时候还是要实际点，异常工作那么些年自曝工资8k，T1 readonly也自曝自己是5k+，尽管是基本工资，但多少可以说明其实IT的行情并没有想象的那么好，注意，这里基于要一个前提，特例除外，比如一个10来年外企工作经验的人的薪水对大多人并没有参考价值，我们最好只谈些普遍的情况。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 一个HR招人的时候更喜欢有个直观的印象，我想最好有个分值来参考，比只发个干巴巴的简历要直观，而且很多HR也没有耐心看太长的简历，总之自己给自己打个分再去和HR谈比较好，那么要打这个分得有个参考，以下是我杜撰的一个标准（试用于web开发 企业开发）：</p>
<p>&nbsp;</p>
<p>这里只举java或ruby的中的某几个例子，其他技术类推</p>
<p>&nbsp;</p>
<p>60 分的人：会hibernate增删改查，会用sql做基本的数据库操作，做过struts+spring+hibernate的demo ，工作经验0+</p>
<p>&nbsp;</p>
<p>70分的人：会用div+css布局，熟练struts的使用，会用spring的事务，用过hibernate的缓存机制，会Oracle的基本操作，确实做过真实的项目，当然不必是商业项目，可以是自己做的，但确保完整性和一定的规模，不只是登录和注册。</p>
<p>&nbsp;</p>
<p>80分的人：参与设计开发过2+真实的商业项目，可以独立解决实际的问题，比如单点登录、系统集成、restful应用、rails性能优化&hellip;&hellip;，研究过一定的开源项目的代码。</p>
<p>&nbsp;</p>
<p>90分的人：首先保证3+工作经验，作为核心参与过3+（至少一个大项目）个真实的项目，认为自己肯定值90分以上的人。</p>
<p>&nbsp;</p>
<p>100分的人：暂不考虑。</p>
<p>&nbsp;</p>
<p>以上只是简单举个例子（只能说到这个份上），各位不要钻牛角尖，知道那个意思就可以了。</p>
<p>&nbsp;</p>
<p>举个无废话简历例子先</p>
<p>&nbsp;</p>
<p>&nbsp;70分&nbsp; 期望长三角地区 java开发&nbsp; 4-5k</p>
<p>&nbsp;</p>
          <br/>
          <span style="color:red;">
            <a href="http://share.group.javaeye.com/topic/233417#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, 27 Aug 2008 20:33:59 +0800</pubDate>
        <link>http://www.javaeye.com/topic/233417</link>
        <guid>http://www.javaeye.com/topic/233417</guid>
      </item>
      <item>
        <title>上海Java新人求职(附简历)</title>
        <author>JavaEye网站</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://n7kki.javaeye.com">n7kki</a>&nbsp;
          链接：<a href="http://www.javaeye.com/topic/233363" style="color:red;">http://www.javaeye.com/topic/233363</a>&nbsp;
          发表时间: 2008年08月27日
          <br/>
          声明：本文系JavaEye网站发布的原创文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          关注javaeye已经很久了 但始终没敢发求职帖 这年头哪都可以发求职帖 就这不能发!<br /><br />如今是被逼的 找工作2个多月了 各大招聘网站上都投过简历了 楞是没回音 好歹也得给个面试的机会才能知道我中不中吧 难道hr们都看简历上的虚词来删选简历!<br /> <br />实在不知道该怎么办了 终于鼓起勇气在javaeye上发求职帖了 <br /><br />javaeye上也有牛人 我做为一个新人 我也明白我这点东西在各位牛人面前不算什么 但谁都是从新人这个阶段过来的<br /><br />请各位嘴下留情 !<br /><br />上海地区java求职(全职) 哪怕是实习职位我也认了 毕竟我是新人 我愿意从头做起! <br /><br /><br />姓名:向xx 86年的 计算机专科毕业  电话:15902186392  <br /><br />email:n7kki1986@163.com <br /><br />扎实的Java基础 理解面向对象编程思想 <br />熟练掌握 Jsp Servlet JavaBean <br />熟练使用Struts框架进行MVC模式应用的开发 <br />熟悉 Html <br />了解 Hibernate <br />了解 J2EE基本体系架构. <br />能编写基本的Sql语句 <br />能使用Eclipse+Tomcat+MySql环境进行开发 写个人作品(BBS+网上商城)时用的开发环境<br /><br /><br />注:本人简历不含水分 所掌握的技能会就会 不会就不会 绝不吹嘘 就拿本人了解hibernate做比方 目前还在深入自学中 做基本的增删改查没问题 但复杂点的有点困那 所以我只会写了解 <br />只有诚实才能赢得别人的尊重 希望上海哪家公司给我一次机会 我只要一次就够了 谢谢!
          <br/>
          <span style="color:red;">
            <a href="http://share.group.javaeye.com/topic/233363#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, 27 Aug 2008 18:03:03 +0800</pubDate>
        <link>http://www.javaeye.com/topic/233363</link>
        <guid>http://www.javaeye.com/topic/233363</guid>
      </item>
      <item>
        <title>java工程师在外包公司的地位</title>
        <author>JavaEye网站</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://doubleeo.javaeye.com">DoubleEO</a>&nbsp;
          链接：<a href="http://www.javaeye.com/topic/231919" style="color:red;">http://www.javaeye.com/topic/231919</a>&nbsp;
          发表时间: 2008年08月23日
          <br/>
          声明：本文系JavaEye网站发布的原创文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          最近在公司发生点事情，使我考虑了RT的这个问题。<br />  我总结的，从上往下说，最上的老总啊，总经理啊，咱就不说了，没有话语权D，接着就是人事和行政了。<br />  1.人事:人事当然你惹不起，加你工资的时候，说加你1000就1000，说加你2000就2000，再包括什么保险啊，这金那金的，想阴你一道很轻松的，我有个同事干了1年多，结果只给交了3个月社保（应该是9个月，前3月试用没有），少了半年的，后来去找人事，人事就说什么这失误那失误，最后也没说为什么，补上让你自己去联系社保局还是哪里，麻烦死你，诸如此类的事太多了，其实源于这个同事得罪过一次人事，平常公司人事就是上网聊QQ，看帖子，逛论坛，偶尔，只是偶尔有人来面试，就出去面一下，当然人事工资比开发就高多了，可能给高一倍。<br />  2.行政：行政更是权利大，我一同事出去没关门，被罚50，行政说：不好意思：刚定的。直接无语，屋里热的要死，想把中央空调的风调成high挡，行政说high挡和低，没有区别，不能开，我同事问他，既然没有区别，人家设计成低和高是干什么用，问的他哑口无言，随后甩出一句：想罚钱啊？真是要多操有多操。有一次和行政聊，行政竟然说，有时候忙的连一句QQ都顾不上聊，竟然以聊QQ来判定忙不忙，无耻之极。<br /><br />终于到开发层面了，我们公司分为SE，PM，QA，开发，测试。大体这样。<br />SE和PM当然是高层次的了，一个是走技术的，一个是走管理的，这应该算是开发层面比较高的了。但是，最高的是QA，因为QA要给项目签字，不签项目就不能交付。这3种职位在大多数情况下，经我观察，也是上网聊QQ，看帖子，逛论坛，没了。<br /><br />终于轮到开发了，吼吼，想得美，轮到测试才对，测试比开发地位高，因为他们有reopen你的权利，re一次考核就是最低，2次总经理就找你谈话了啊。证明你工作不认真。测试的工作就是点页面，没了，既不用写代码，也不用什么黑盒白盒，异常轻松。<br /><br />最后才是开发，任何一个项目，每一行，每一行都是开发亲手写的，但是所有开发不能上网，没有为什么（测试也不能），其余的任何职位都可以D，工资拿的是全公司最少的，我有个同事竟然没有前台工资高，在深圳这种地方，2000多，工作经验2年的，是不是很可怕，你不想干是吧？大把人想干，不干滚蛋，这就是公司的态度，现在找工作确实不容易。开发没事还给被测试数落，人家有权利re你啊。<br /><br />上述出现的人事行政测试等，都指我公司的，本人绝对没有对这些职位不敬的意思。<br />现在有人问我，想学编程，我都先力劝，真的不要了。
          <br/>
          <span style="color:red;">
            <a href="http://share.group.javaeye.com/topic/231919#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, 23 Aug 2008 19:54:12 +0800</pubDate>
        <link>http://www.javaeye.com/topic/231919</link>
        <guid>http://www.javaeye.com/topic/231919</guid>
      </item>
      <item>
        <title>工作两年了，发发牢骚</title>
        <author>JavaEye网站</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://yanshiyi.javaeye.com">yanshiyi</a>&nbsp;
          链接：<a href="http://www.javaeye.com/topic/231753" style="color:red;">http://www.javaeye.com/topic/231753</a>&nbsp;
          发表时间: 2008年08月22日
          <br/>
          声明：本文系JavaEye网站发布的原创文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          工作2年了，感觉自己混的很差，去年认识的一个同事工资已经6k了，我才3500，就是这个3500的工作在上周还让我放弃了（其实也是公司放弃了我）。<br /><br />2年了，感觉自己技术垃圾的无法说出口，只会ssh组合，而且对每个框架都了解得不多。<br /><br />spring只会配置最基本的bean，aop方面看过但没用过，忘掉了，事务的配置从来没理解过。<br /><br />hibernate，连load跟find的区别都不知道，因为我一直都是用spring的HibernateTemplate，很多高级方面的应用都没用过，到现在都不知道有哪些是高级应用了？乐观锁是我用过的最高级的应用。<br /><br />struts，去年用的是1.2版本，今年因为需要变成了2.0，结果1.2还没完全掌握就忘光了，而2.0我一直没掌握，想放弃又觉得浪费之前的努力。<br /><br />log4j，从来没用过，都是别人配好了我用。<br /><br />sql，到现在都没掌握好，连update都不知道怎么写，也不会用sql建表，因为我用了hibernate，这些事不用我操心了。<br /><br />数据库，一直想掌握好一个，但是从自学到上周失业前，access，sqlserver，mysql，postgres，oracle我都用过了，根本没时间去学习，事实上也没机会选择。<br /><br />javascript，一直都不怎么会，拜刚刚离职的那家公司所赐，我终于较为系统的学习了一把，也揭开了ajax那神秘的面纱，但是揭开之后我更迷茫了，ajax太丑陋了，编写富客户端太费劲了，那好，我选flex，TMD，adobe居然收费。silverlight呢？不好意思，受他人蛊惑，anti-MSing。<br /><br />测试，我知道这个能力很重要，但是，除了UT，我什么测试都不会。虽然我看过《Junit in action》，但是我还是只知道从testcase类继承。更别说性能分析之类乱七八糟玄而又玄的东西了。<br /><br />linux:谁知道知道掌握它的人挣钱多，但是我就是学不会，虽然我看了很多资料，还用了半年的ubuntu，但是我还是什么都不会，不会用命令行解压文件，更别提开发了，到现在对它最深刻的印象是：真的很稳定哦，一个星期不关机还不卡。其次就是，真的很难用哦！居然连mp3都不能放。<br /><br />实施，本来觉得这不算门技术，但是之前做的一个网站也让我觉得自己更没用了，居然花了1周的时间才能把tomcat与IIS整合起来，后来居然还因为一个bug搞得我不能上传较大的文件，而服务器端的种种保护措施又使得我做的一些功能不能使用。<br /><br />英语，这个能力貌似很重要的，但事实上除非一个技术先锋，这个能力并不是那么重要，因为你不需要获得第一手资料。当然，如果英语好，进外企的机会很大，可惜我的英语能力虽然能看懂教材，却不能听懂或写出文档来。<br /><br />沟通，这个能力我以前并不当回事的，还好在上一家公司发生过一次沟通危机后，我终于认识到这个能力的重要性。<br /><br />编辑器，这算个屁能力。但是总看到有人讨论哪个编辑器好用，我又迷糊了。ultraedit,editplus,notepad++,emeditor,秀丸,jedit,jext，vi，komodoedit，都用过了，感觉没太大区别嘛（vi除外）。但是就有人在争辩，我只能怀疑自己的智商了，可能是它分辨力太低，识别不出好坏来。<br /><br />这两年间，不是只在ssh中打转，我在做完第二个项目后就厌倦了ssh 了，为了摆脱这种厌倦对职业生涯的影响，我在2年的时间内不停的学习各种各样的技术，接触过的有laszlo，flex，flash，javascript，ajax，appfuse，dbunit，groovy&grails，python，linux，shell，ruby，php，linux c 开发，eclipse rcp开发。其实去年我就已经发觉，自己涉及的东西太多了，而且每次都是沾一下就退了，维持时间最久的也就2个月，短的就只有2周了。没有深入的东西，写代码不注重设计，sql优化也不会，设计模式才开始学习，感觉有些晕！<br /><br />每天都在论坛上转圈，看着别人的帖子写了一大堆我不知道的东西，对自己真是失望透顶了，同时也意识到自己遇到一个瓶颈了，但是却不知道如何突破这个瓶颈。总是觉得自己工资低，可是感觉自己也不好意思要更高的工资，因为觉得自己不值。每天晚上都要看书，但是努力却全都白费了，后来有一篇文章给了我启示：技术是拿来用的，不是用来学的。<br /><br />朋友们总说，我很能干，但是我一点都看不出自己到底哪里能干。以前很自信的，现在发现越来越不自信了，不知道是不是真的有些老了，虽然才26岁。
          <br/>
          <span style="color:red;">
            <a href="http://share.group.javaeye.com/topic/231753#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>Fri, 22 Aug 2008 23:33:38 +0800</pubDate>
        <link>http://www.javaeye.com/topic/231753</link>
        <guid>http://www.javaeye.com/topic/231753</guid>
      </item>
      <item>
        <title>如何成为符合企业需求的Linux人才？</title>
        <author>JavaEye网站</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://rails2.javaeye.com">qichunren</a>&nbsp;
          链接：<a href="http://www.javaeye.com/topic/233907" style="color:red;">http://www.javaeye.com/topic/233907</a>&nbsp;
          发表时间: 2008年08月28日
          <br/>
          声明：本文系JavaEye网站发布的原创文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          我使用Linux（Ubuntu）的时间不长，却一直在坚持使用，下定决心学习Linux的技术。虽然有时候用在某些方面的开发还是windows上面方便一些，我还是坚持使用Linux来解决问题，因为我想彻底放弃Windows而把Linux学好。<br /><br />现在摆在我面前的一个问题是<span style="color: red"><strong>如何成为符合企业需求的Linux人才</strong></span>？<br /><br />是精通Linux下的那一大堆的命令(or Shell脚本编程)吗？<br />还是能够修改Linux内核的一些东西？<br />还是能够熟练地用Linux部署企业的应用？<br />还是能够高效地在Linux开台下进行软件开发（Java,Php,ROR）?<br />...........<br />...........<br />我不知道，或者是说应该走一条什么样的路线才能达到题目所说的级别？<br /><br /><br />目前会Linux的人不少，但是精通的不多（这句话是从哪里看到的，忘记了，我也感觉是这样），而我想要达到的是做一个符合企业需求的Linux人才！<br />诚心请教,希望大家解开我心中的迷惘。
          <br/>
          <span style="color:red;">
            <a href="http://share.group.javaeye.com/topic/233907#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, 28 Aug 2008 13:23:05 +0800</pubDate>
        <link>http://www.javaeye.com/topic/233907</link>
        <guid>http://www.javaeye.com/topic/233907</guid>
      </item>
      <item>
        <title>关于EXT显示缓存问题</title>
        <author>JavaEye网站</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://shileishmily.javaeye.com">shileishmily</a>&nbsp;
          链接：<a href="http://www.javaeye.com/topic/234122" style="color:red;">http://www.javaeye.com/topic/234122</a>&nbsp;
          发表时间: 2008年08月28日
          <br/>
          声明：本文系JavaEye网站发布的原创文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p>我想这个问题好多人都遇到过吧 麻烦指点一下哈。很急 <br /></p>
<p>&nbsp;</p>
          <br/>
          <span style="color:red;">
            <a href="http://share.group.javaeye.com/topic/234122#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, 28 Aug 2008 19:18:27 +0800</pubDate>
        <link>http://www.javaeye.com/topic/234122</link>
        <guid>http://www.javaeye.com/topic/234122</guid>
      </item>
      <item>
        <title>有知道高知特的吗，公司怎么样，透一下啊</title>
        <author>JavaEye网站</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://ancin.javaeye.com">ancin</a>&nbsp;
          链接：<a href="http://www.javaeye.com/topic/232919" style="color:red;">http://www.javaeye.com/topic/232919</a>&nbsp;
          发表时间: 2008年08月26日
          <br/>
          声明：本文系JavaEye网站发布的原创文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          如题；透漏一下。<br />想了解一下；人事和猎头说的都很好。就是不知道真实情况怎么样。<br />谢谢。
          <br/>
          <span style="color:red;">
            <a href="http://share.group.javaeye.com/topic/232919#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, 26 Aug 2008 16:46:09 +0800</pubDate>
        <link>http://www.javaeye.com/topic/232919</link>
        <guid>http://www.javaeye.com/topic/232919</guid>
      </item>
      <item>
        <title>使用Open Flash Chart同时显示多图遇到的问题</title>
        <author>JavaEye网站</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://alexeyomux.javaeye.com">alexeyomux</a>&nbsp;
          链接：<a href="http://www.javaeye.com/topic/233678" style="color:red;">http://www.javaeye.com/topic/233678</a>&nbsp;
          发表时间: 2008年08月28日
          <br/>
          声明：本文系JavaEye网站发布的原创文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          在应用中，我打算使用Open Flash Chart来处理统计数据的图形化显示。当我把一个柱状图和一个饼图放在同一个View里同时显示的时候，只有排在后面（以View中的代码顺序）Chart会在浏览器中正确出现。我看了一下Open Flash Chart官方网站上关于多个Chart在一个View里显示的教程，发现这个问题有一个叫Nick的人遇到过，也向教程的编写者提出来了。<br />    产生这个问题的原因是：Chart在View中是放在一个Div里显示的，而该插件使用的是将当前系统时间进行Hash后，作为Div的ID的做法。当处理器速度较快时，两个Chart的Hash值是一样的，也就是两个Div的ID是一样的，浏览器自然显示后面一个Div的内容。作者修正了算法，在进行Hash的时候使用了Timw.now＋url的做法，该办法解决了Nick的问题，但我使用的是修正后的插件，这个问题仍然存在。<br />    于是我继续修改插件中算法，在生成用于Hash的原始字符串里加入随机数，甚至加入一个消耗时间的循环，但问题依然存在。（不知道是不是我的机器处理器真的足够快<img src="/images/smiles/icon_cry.gif"/>） 其间我把WEBrick关掉了重新启动了一次，为的是让服务器重新装入代码运行（包括插件），但不知道此方法是否能保证插件代码被重新装载运行？！<br />    请教Javaeye的各位达人，有什么办法可以解决这个问题。谢谢！<br /><pre name="code" class="java">
def open_flash_chart_object(width, height, url, use_swfobject=true, base="/")
  url      = CGI::escape(url)
  # need something that will not be repeated on the same request
  # need the gsub at the end to first get the last newline (which could simply be done with chomp)
  # and second get the newlines in the middle of the encoded string
  special_hash = Base64.encode64(Time.now.to_f.to_s + url.to_s).gsub(/\n/,"")
  obj_id   = "chart_#{special_hash}"  # some sequencing without all the work of tracking it
  div_name = "flash_content_#{special_hash}"
  protocol = "http" # !request.nil? ? request.env["HTTPS"] || "http" : "http"

  return %[
    &lt;div id="#{div_name}">&lt;/div>
  (以下省略部分代码)
end
</pre>
          <br/>
          <span style="color:red;">
            <a href="http://share.group.javaeye.com/topic/233678#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, 28 Aug 2008 01:06:32 +0800</pubDate>
        <link>http://www.javaeye.com/topic/233678</link>
        <guid>http://www.javaeye.com/topic/233678</guid>
      </item>
      <item>
        <title>Rails程序开发的最大问题是代码规范</title>
        <author>JavaEye网站</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://hideto.javaeye.com">hideto</a>&nbsp;
          链接：<a href="http://www.javaeye.com/topic/233800" style="color:red;">http://www.javaeye.com/topic/233800</a>&nbsp;
          发表时间: 2008年08月28日
          <br/>
          声明：本文系JavaEye网站发布的原创文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          使用Rails开发大型复杂B2B应用一年了，这个项目目前开发人员达到近20人<br />现在感觉最痛苦的事情就是大家没有遵循统一的代码规范<br />我一直建议PM要设立一个项目架构师的角色，来统一大家的代码规范，但是PM不听<br />因为Ruby这种动态语言太灵活，大家各自写个各自的代码，相互之间很难看懂别人的代码<br />Controller、Model、View、Js、CSS等等文件目录的设立也是各模块小组之间各自为政<br />现在系统越来越复杂，各模块之间的协调和交互也越来越多<br />但是由于没有人来盯统一的代码规范和设计，大家的交流变得非常痛苦<br />换句话说，看见别人的代码和自己的代码风格迥异感觉很不爽
          <br/>
          <span style="color:red;">
            <a href="http://share.group.javaeye.com/topic/233800#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, 28 Aug 2008 11:56:20 +0800</pubDate>
        <link>http://www.javaeye.com/topic/233800</link>
        <guid>http://www.javaeye.com/topic/233800</guid>
      </item>
      <item>
        <title>AOP功能和AOP框架</title>
        <author>JavaEye网站</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://the3oooo.javaeye.com">Joo</a>&nbsp;
          链接：<a href="http://www.javaeye.com/topic/233743" style="color:red;">http://www.javaeye.com/topic/233743</a>&nbsp;
          发表时间: 2008年08月28日
          <br/>
          声明：本文系JavaEye网站发布的原创文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          这几天一直在思考在一个应用上实现AOP功能到底和实现独立的一个AOP框架有什么不同。利用JDK动态代理或CGLIB甚至用Servlet Filter就能实现简单的AOP功能，那么AOP框架的价值究竟在哪里? <br />表面上来看,使用框架除了应用开发人员不需要知道CGLIB原理,代码中不会出现implements MethodInterceptor或Enhancer.Create()之外,找不到框架可以做而用CGLIB代码不能做的事情啊.BOSS让我提炼一个简单的AOP,一开始我准备包装一下CGLIB API做,但后来发现如果是实现一般的AOP功能,CGLIB已经可以完全胜任.如果要做一个AOP框架,我不知道应该往什么方向努力啊!!!!<br /><br />另,看不明白CGLIB中Dispatcher和LazyLoader的用法啊,望指点.
          <br/>
          <span style="color:red;">
            <a href="http://share.group.javaeye.com/topic/233743#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, 28 Aug 2008 10:30:39 +0800</pubDate>
        <link>http://www.javaeye.com/topic/233743</link>
        <guid>http://www.javaeye.com/topic/233743</guid>
      </item>
      <item>
        <title>忘掉普元EOS、构建自己的企业级快速应用开发平台</title>
        <author>JavaEye网站</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://longlongriver.javaeye.com">longlongriver</a>&nbsp;
          链接：<a href="http://www.javaeye.com/topic/232219" style="color:red;">http://www.javaeye.com/topic/232219</a>&nbsp;
          发表时间: 2008年08月25日
          <br/>
          声明：本文系JavaEye网站发布的原创文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p><strong><span style="font-size: x-small;"><em><span style="color: #ff0000; font-size: small;">希望这篇文章能够对那些正在或即将开发自己团队的J2EE应用快速开发平台（工作流＋代码生成器）的个人或公司能有所启发！</span>
</em>
&nbsp;&nbsp;&nbsp;</span>
</strong>
</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 像EOS这样动辄几十上百万的平台不是每个公司都愿意花钱去买的！因此构建一套穷人级的企业快速开发平台成了很多团队的首选，而对于小团队来说，构建一套自己可以维护的开发平台才是最重要的。下面，我将以我的平台的开发过程为例来详细解析这个过程！<strong><span style="font-size: x-small;"> &nbsp; </span>
</strong>
</p>
<p><span style="font-size: small;"><strong><span>&ldquo;如果能把项目中大量的代码编写工作变得轻松，是多好的一件事!</span>
</strong>
&nbsp;"</span>
</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
在使用了AppFuse之后，我有个想法，能不能利用velocity这个优秀的模板引擎，用一种更加直观的模式，把开发项目中的重复代码让它自动生成，
生成之后的基础代码，按照实际的需求稍作修改便可以运行，极大的提高工作效率。这样的话，程序员就可以从大量的重复劳动中解放出来，将精力更多的投入到业
务分析及学习中。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 这个想法一直在我的脑海里横亘不去，尤其在做了大量的重复模块后，深刻体会了重复Coding的那种浪费生命的痛苦后，这种冲动尤为强烈。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 离开旧公司，到了新公司之后，由于职位和公司定位的不同，让我有时间开始把快速开发平台和自动代码生成器的开发真正的摆上开发日程上了。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="font-size: medium;"><strong><span style="text-decoration: underline;">第一步</span>
</strong>
</span>
，自动代码生成器生成
的是业务模块，那么底层必须有一套框架能够为它提供支撑，而且这套基础框架要足够灵活，并且和单个模块的耦合性要比较弱。要解耦模块之间的联系，势必要用
到MVC分层设计。感谢Java的开放性，使它有这么许许多多的MVC框架可以使用。我采用的当然是目前最流行的
SSH（Struts＋Spring＋Hibernate）的组合（以前项目一直在用，也有些成熟的积累），花了三个月的时间，通过一个项目的实际应用来
使这个框架基本成型。其目前功能包括：</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
1：灵活完善的权限管理功能（包括用户管理、角色管理、组织机构管理、资源管理、资源角色映射管理...）。原来计划采用开源的JGuard来托管这部分
的功能，因为一些特殊的原因放弃了（考虑要和工作流引擎的权限部分做集成），只采用了其权限管理的一些设计思想。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
2：基于Spring的AOP实现的日志和权限管理（通过Spring的代理也将Struts的Action托管了，使的对Action的调用也能被
AOP侦测到），这样对每个功能的调用，如果需要日志纪录的话，之间将其配置到Spring的配置文件中就可以了。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 3：UI上实现了类似.NET的Validation验证，这点很重要，想必大家都深刻体会到利用JavaScript或Struts的验证机制来实现前端页面数据验证的痛苦了吧：），我们实现的功能如下图所示：</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <img src="http://p.blog.csdn.net/images/p_blog_csdn_net/LongLongRiver/1.GIF" alt="" />
</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 4、多套UI风格样式。这个不是很必须，但是作为一套成功的系统，良好的用户体验也是必不可少的。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 5、支撑模块：报表引擎（基于JasperReport实现的B/S版本报表），流程引擎（<span style="color: #ff0000; font-size: large;"><span style="text-decoration: underline;"><strong>其实就我个人来看，工作流引擎才是这套系统的灵魂</strong>
<strong>，有了它，所有流程性应用包括表单、业务流、权限都可以通过配置并结合Beanshell脚本来获得</strong>
</span>
</span>
，但由于我们集成的是一套反编译重构的商用流程引擎系统，在这里就不再详细描述了 ，呵呵：），有盗版之嫌啊）,以下是我们报表和流程设计器的一些截图：</p>
<p><img src="http://p.blog.csdn.net/images/p_blog_csdn_net/LongLongRiver/EntryImages/20080826/workflow2.GIF" height="969" alt="" width="1207" />
</p>
<p>&nbsp;</p>
<p align="center"><strong>工作流引擎截图</strong>
</p>
<p>&nbsp;</p>
<p><img src="http://p.blog.csdn.net/images/p_blog_csdn_net/LongLongRiver/EntryImages/20080825/report.GIF" alt="" style="width: 904px; height: 441px;" />
</p>
<p align="center"><strong>报表截图</strong>
</p>
<p>&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp; 6、i18n的支持，由于我们有很多国外的客户，这块是必须的。</p>
<p>&nbsp;</p>
<p>有了这个基础支撑平台之后，就可以开始着手开放我们的代码生成器了。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;<strong><span style="text-decoration: underline;"><span style="font-size: medium;">&nbsp;&nbsp;&nbsp; 第二步</span>
</span>
</strong>
：开发代码生成器。
AppFuse基于Ant的自动代码生成模式让我深恶痛绝，究其原因，一句话－－&ldquo;不够人性化&rdquo;，我们做的首先必须考虑可用性，因此决定采用可视化的UI
模式。由于我用的是NetBean编辑器，做可视化的Swing开发不成问题（这点要感谢SUN啊，出了个和VB一样简单的IDE）。我实现的代码生成器
的界面如下：<img src="http://p.blog.csdn.net/images/p_blog_csdn_net/LongLongRiver/2.GIF" height="483" alt="" style="width: 589px; height: 555px;" width="443" />
</p>
<p>&nbsp;&nbsp; <img src="http://p.blog.csdn.net/images/p_blog_csdn_net/LongLongRiver/3.GIF" alt="" />
</p>
<p><img src="http://p.blog.csdn.net/images/p_blog_csdn_net/LongLongRiver/4.GIF" alt="" />
</p>
<p><img src="http://p.blog.csdn.net/images/p_blog_csdn_net/LongLongRiver/5.GIF" alt="" />
</p>
<p>&nbsp; <img src="http://p.blog.csdn.net/images/p_blog_csdn_net/LongLongRiver/6.GIF" alt="" />
</p>
<p>怎么样？是不是够傻瓜化啊？呵呵，是个人都能用啊！</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
从上面大家可以看到，我们这个代码生成器和Hibernate的POJO对象生成工具类似，也是基于数据库的模型来生成代码的，不同的是，我们生成的代码
范围更广，不仅包括了POJO对象暨相应的hbm.xml文件，另外还包括相应的DAO（Server层）、相应的Action、Form类、相关的
JSP文件（list页面、edit页面、Excel导出页面等等）、资源文件及相关的Struts和Spring的配置子文件（Struts和
Spring均支撑将配置拆分成多个配置，我们利用这种特性来减低模块之间的耦合性。）</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 至于数据库模型的获得，可以利用JDBC的<strong><em><span style="text-decoration: underline;">MetaData（元数据模型）</span>
</em>
</strong>
的功能来获得，我们目前维护了表的完整的主键、外键关系（父子表）</p>
<p>&nbsp;第三步：配置模板。有了可视化的数据库表映射模型，也获得了数据库表及其主外键关系的详细信息，接下来当然是根据这些信息来生成代码了。这里我们用了强大的<strong><em><span style="text-decoration: underline;">Velocity模板</span>
</em>
</strong>
技术，这样不仅可以灵活的处理复杂的表映射对象之间的关系，也能够灵活的进行变更升级。<span style="text-decoration: underline;">而且我们能够通过所获得的数据库模型，在页面上自动实现基于Javascript的数据验证&ldquo;非空验证、字符长度验证、数字验证，日期验证&rdquo;。</span>
</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
呵呵，通过以上3个步骤的工作，我们的基础开发平台和自动代码生成器就大功告成了！目前我们生成的代码可以直接编译通过，通过简单的系统配置后，可以直接在服务器上跑！
由于模板种类多，而且模板中自动实现的代码功能已经非常完善了，所以一些特殊的业务需求只需要在自动生成的代码基础上做简单修改就可以了！</p>
<p><span style="color: #333399; font-size: small;">&nbsp;&nbsp;<strong>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
基础开发平台和代码生成器投入使用后，对我们项目开发的资源投入的改善是非常明细的，目前基于基础平台和代码生成器的配合，我们已经做了6、7个系统了，平均每个系统的
开发时间至少要比以前节约40％，有的项目甚至达到了80％以上（我们最高的一天，处理了40多个表的增、删、该、查的功能，及中文本地化）。而且，另外
很重要的一点，生成的代码无形中统一了程序员的设计风格，我们通过这套开发机制，能够最大限度的保证我们开发的系统质量，保证模块可以在不同系统之间的自
由迁移，最大限度的实现复用！在项目开发中节省出来的大量时间，也让我们可以去研究更多的开源中间件和系统，来增强我们的基础平台，从而形成一个良性的循
环！</strong>
</span>
</p>
<p>&nbsp;我们做了多套模板，能够针对单表操作，及父子表操作来自由组合搭配。以下就是我们系统的一些功能截图，除了中文化之外，基本上没有修改：</p>
<p><strong><span style="color: #ff0000; font-size: small;">单表操作：</span>
</strong>
</p>
<p><img src="http://p.blog.csdn.net/images/p_blog_csdn_net/LongLongRiver/7.GIF" alt="" />
</p>
<p><img src="http://p.blog.csdn.net/images/p_blog_csdn_net/LongLongRiver/8.GIF" alt="" />
</p>
<p><span style="color: #ff0000; font-size: medium;"><strong>父子表关联操作：</strong>
</span>
</p>
<p><img src="http://p.blog.csdn.net/images/p_blog_csdn_net/LongLongRiver/10.GIF" alt="" />
</p>
<p><span style="font-size: small;"><em><strong>&nbsp;</strong>
</em>
</span>
</p>
          <br/>
          <span style="color:red;">
            <a href="http://share.group.javaeye.com/topic/232219#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, 25 Aug 2008 09:44:43 +0800</pubDate>
        <link>http://www.javaeye.com/topic/232219</link>
        <guid>http://www.javaeye.com/topic/232219</guid>
      </item>
      <item>
        <title>一个关于Hibernate的优化实例：从HQL到QBC，从QBC到QBE，再到“增强的”QBE</title>
        <author>JavaEye网站</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://movingboy.javaeye.com">movingboy</a>&nbsp;
          链接：<a href="http://www.javaeye.com/topic/233664" style="color:red;">http://www.javaeye.com/topic/233664</a>&nbsp;
          发表时间: 2008年08月28日
          <br/>
          声明：本文系JavaEye网站发布的原创文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          先解释一下标题的含义：为了实现一个组合条件查询，先是使用HQL书写，然后改用Query by Criteria方式，再尝试Query by Example，最后自己实现了一个增强的Example类来解决问题。<br /><br />关于此问题的起源请阅读我以前的一个帖子：<a href="http://www.javaeye.com/post/523791" target="_blank">http://www.javaeye.com/post/523791</a>。在该帖子中已经实现了从HQL到QBC的转变，在这里就不再重复了。<br /><br />在上一个帖子中没有模型类Product及Category的代码，为了方便讨论补充如下：<br /><br /><pre name="code" class="java">public class Category {
  private Long id;
  private String name; //类别名称

  //Other code omitted
}

public class Product {
  private Long id;
  private String name;       //商品名称
  private Category category; //商品类别
  private Date expDate;      //有效期
  private Float price;       //单价

  //Other code omitted
}
</pre><br /><br />从前一个帖子中可以看到，使用QBC后代码有所减少，但还是得把构造查询条件的代码写死，这非常不爽。重读了《Java Persistence with Hibernate》一书，发觉QBE是个好东东，于是尝试用改造代码如下：<br /><br /><pre name="code" class="java">	public List&lt;Product> getProducts(Product product) {
		final Example exampleProduct =
		  Example.create(product).
		    enableLike(MatchMode.ANYWHERE).
                    excludeZeroes();

		return (List&lt;Product>) getHibernateTemplate().execute(
		  new HibernateCallback() {
		    public Object doInHibernate(Session session) throws HibernateException {
		    	Criteria crit =
		    	  session.createCriteria(Product.class).
		    	  add(exampleProduct);
		    	return crit.list();
		    }
		  }
		);
	}
</pre><br /><br />代码非常简洁啊！我只要new一个Product实例，然后把要查询的条件值赋值到相应到属性上，如果某项条件未指定则相应的属性保留为默认的空值，将该实例传递给上面的getProducts方法，就能得到需要的结果了。超爽！<br /><br />但是我却没办法把这段代码用在产品中，这是因为QBE有着严重的局限性：<br />1.不能查询指定在关联对象的属性上的条件。比如我想仅列出商品类别名称包括xyz的商品，代码如下：<br /><br /><pre name="code" class="java">Category category = new Category();
category.setName("xyz");
Product product = new Product();
product.setCategory(category);

List&lt;Product> products = getProducts(product);
</pre><br /><br />运行这段代码会列出所有的商品。<br /><br />2.除了字符串条件可以调用enableLike()方法改用模糊查询外，其它数据类型的条件都只能等值比较。比如我无法查询所有有效的商品（有效期≥当前日期）。<br /><br />难道就没有办法了吗？经过一番搜索，终于在Hibernate的官网论坛上找到一篇文章：<a href="http://forum.hibernate.org/viewtopic.php?t=942872" target="_blank">http://forum.hibernate.org/viewtopic.php?t=942872</a>。在该文章中，Dencel写了一个AssociationExample，经过大家的完善，终于解决了查询指定在关联对象的属性上的条件的问题。其主要的奥妙在于：<br /><br /><pre name="code" class="java">
//Hibernate的原版Example
//如果属性类型是关联的实体，则忽略
	private boolean isPropertyIncluded(Object value, String name, Type type) {
		return !excludedProperties.contains(name) &&
			!type.isAssociationType() &&
			selector.include(value, name, type);
	}

//改版的AssociationExample
  private boolean includeAssociations = true;

  public boolean isIncludeAssociations()
  {
    return includeAssociations;
  }

  public void setIncludeAssociations(boolean includeAssociations)
  {
    this.includeAssociations = includeAssociations;
  }

//如果属性类型是关联的实体，且该关联是一对一或多对一，且includeAssociations为true，则包括该属性
  private boolean isPropertyIncluded(Object value, String name, Type type) {
    return
      !excludedProperties.contains(name) &&
      selector.include(value, name, type) &&
      (!type.isAssociationType() ||
        (type.isAssociationType() &&
          includeAssociations &&
          !type.isCollectionType()));
  }
</pre><br /><br />解决了前面提到的第一个问题，第二个问题又怎么办呢？我想到一个办法：如果某个条件要使用其它的比较方式（比如大于等于），提供一个方法让用户为该属性指定比较方法，对于其它属性仍采用缺省的查询/比较方法：<br /><br /><pre name="code" class="java">
//Hibernate原版的Example
  protected void appendPropertyCondition(
    String propertyName,
    Object propertyValue,
    Criteria criteria,
    CriteriaQuery cq,
    StringBuffer buf)
  throws HibernateException {
    Criterion crit;
    if ( propertyValue!=null ) {
//当属性值不为空时，如果是字符串且指定为模糊查询，则使用模糊查询，否则使用等值比较
      boolean isString = propertyValue instanceof String;
      SimpleExpression se = ( isLikeEnabled && isString ) ?
        Restrictions.like(propertyName, propertyValue) :
        Restrictions.eq(propertyName, propertyValue);
      crit = ( isIgnoreCaseEnabled && isString ) ?
        se.ignoreCase() : se;
    }
    else {
      crit = Restrictions.isNull(propertyName);
    }
    String critCondition = crit.toSqlString(criteria, cq);
    if ( buf.length()>1 && critCondition.trim().length()>0 ) buf.append(" and ");
    buf.append(critCondition);
  }


//增强后的EnhancedExample
  private static final RestrictionHolder holder = new DefaultRestrictionHolder();

  /**
   * Restriction strategy definitions
   */
  public static enum RestrictionStrategy {eq, ne, gt, lt, ge, le}

  /**
   * Restriction strategy holder for the query criteria
   */
  public static interface RestrictionHolder {
  	/**
  	 * Set a restriction strategy for a POJO's property
  	 */
    public RestrictionHolder set(String propertyName, RestrictionStrategy strategy);

    /**
     * Get the restriction strategy of the property
     */
    public RestrictionStrategy get(String propertyName);
  }

  static final class DefaultRestrictionHolder implements RestrictionHolder {
		private Map&lt;String, RestrictionStrategy> strategies = new HashMap&lt;String, RestrictionStrategy>();

    public RestrictionHolder set(String propertyName, RestrictionStrategy strategy) {
      strategies.put(propertyName, strategy);
      return this;
    }

    public RestrictionStrategy get(String propertyName) {
      return strategies.get(propertyName);
    }
  }

  /**
   * Get the restriction strategy holder
   */
  public RestrictionHolder getRestrictionHolder() {
    return holder;
  }

  protected void appendPropertyCondition(
    String propertyName,
    Object propertyValue,
    Criteria criteria,
    CriteriaQuery cq,
    StringBuffer buf)
  throws HibernateException {
    Criterion crit;
    if ( propertyValue!=null ) {
//当属性值不为空时，如果为该属性指定了比较条件，则使用指定的比较条件
      RestrictionStrategy strategy = holder.get(propertyName);
      if ( strategy != null ) {
  	switch(strategy) {
    	//case eq: crit = Restrictions.eq(propertyName, propertyValue);
    	case ne: crit = Restrictions.ne(propertyName, propertyValue); break;
    	case gt: crit = Restrictions.gt(propertyName, propertyValue); break;
    	case lt: crit = Restrictions.lt(propertyName, propertyValue); break;
    	case ge: crit = Restrictions.ge(propertyName, propertyValue); break;
    	case le: crit = Restrictions.le(propertyName, propertyValue); break;
    	default: crit = Restrictions.eq(propertyName, propertyValue);
        };
      }
      else {
//否则使用默认的比较条件：如果是字符串且指定为模糊查询，则使用模糊查询，否则使用等值比较
	boolean isString = propertyValue instanceof String;
	SimpleExpression se = ( isLikeEnabled && isString ) ?
	  Restrictions.like(propertyName, propertyValue) :
	  Restrictions.eq(propertyName, propertyValue);
	crit = ( isIgnoreCaseEnabled && isString ) ?
	  se.ignoreCase() : se;
      }
    }
    else {
      crit = Restrictions.isNull(propertyName);
    }
    String critCondition = crit.toSqlString(criteria, cq);
    if ( buf.length()>1 && critCondition.trim().length()>0 ) buf.append(" and ");
    buf.append(critCondition);
  }
</pre><br /><br />于是前面getProducts方法只需要简单修改一下：<br /><br /><pre name="code" class="java">	public List&lt;Product> getProducts(Product product) {
		//改用EnhancedExample来允许关联对象的条件查询
		final EnhancedExample exampleProduct =
		  EnhancedExample.create(product).
		    enableLike(MatchMode.ANYWHERE).
                    excludeZeroes();
		  //指定expDate属性使用大于等于比较方法
		exampleProduct.getRestrictionHolder().
		  set("expDate", EnhancedExample.RestrictionStrategy.ge);

		return (List&lt;Product>) getHibernateTemplate().execute(
		  new HibernateCallback() {
		    public Object doInHibernate(Session session) throws HibernateException {
		    	Criteria crit =
		    	  session.createCriteria(Product.class).
		    	  add(exampleProduct);
		    	return crit.list();
		    }
		  }
		);
	}
</pre><br /><br />经过以上改进，QBE的实用性大大提高，能够真正解决较大多数的组合查询问题。<br /><br />已知的问题：以上“增强的”QBE还无法解决范围查询（比如价格在0到1000之间），这是因为一个属性只能携带一个值（你不可能指定两个值给Product.price属性）。这种情况下需要修改getProducts方法，增加参数把价格范围传递进来，再以QBC方式把相应的条件加到crit变量上。范例代码就不再给出了。<br /><br />完整的EnhancedExample源码请见附件。
          <br/>
          <span style="color:red;">
            <a href="http://share.group.javaeye.com/topic/233664#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, 28 Aug 2008 00:04:40 +0800</pubDate>
        <link>http://www.javaeye.com/topic/233664</link>
        <guid>http://www.javaeye.com/topic/233664</guid>
      </item>
      <item>
        <title>看CSDN一则招聘的要求</title>
        <author>JavaEye网站</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://ice-k.javaeye.com">ice.k</a>&nbsp;
          链接：<a href="http://www.javaeye.com/topic/233777" style="color:red;">http://www.javaeye.com/topic/233777</a>&nbsp;
          发表时间: 2008年08月28日
          <br/>
          声明：本文系JavaEye网站发布的原创文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          无意间看到<br /><br />看第一个条件：<span style="color: red">俊男美女，一表人才，人见人爱</span><br /><br />让我想起了经常在电线杆子上看到的招聘广告。
          <br/>
          <span style="color:red;">
            <a href="http://share.group.javaeye.com/topic/233777#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, 28 Aug 2008 11:08:29 +0800</pubDate>
        <link>http://www.javaeye.com/topic/233777</link>
        <guid>http://www.javaeye.com/topic/233777</guid>
      </item>
      <item>
        <title>关于E-R图</title>
        <author>JavaEye网站</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://prayer.javaeye.com">prayer</a>&nbsp;
          链接：<a href="http://www.javaeye.com/topic/234043" style="color:red;">http://www.javaeye.com/topic/234043</a>&nbsp;
          发表时间: 2008年08月28日
          <br/>
          声明：本文系JavaEye网站发布的原创文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          请问如图中形如:FK1,l1的什么意思！不回答不要紧，别把我帖子给加成隐藏贴就行!<img src="/images/smiles/icon_mad.gif"/>
          <br/>
          <span style="color:red;">
            <a href="http://share.group.javaeye.com/topic/234043#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, 28 Aug 2008 16:55:26 +0800</pubDate>
        <link>http://www.javaeye.com/topic/234043</link>
        <guid>http://www.javaeye.com/topic/234043</guid>
      </item>
      <item>
        <title>从谷歌的一个Bug说起，谈谈键盘事件的兼容性</title>
        <author>JavaEye网站</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://lifesinger.javaeye.com">lifesinger</a>&nbsp;
          链接：<a href="http://www.javaeye.com/topic/233038" style="color:red;">http://www.javaeye.com/topic/233038</a>&nbsp;
          发表时间: 2008年08月26日
          <br/>
          声明：本文系JavaEye网站发布的原创文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p class="post-meta">
				原文同步发表在<a href="http://lifesinger.org/blog/?p=77">岁月如歌</a></p>
<p class="post-meta">&nbsp;</p>
<div class="post-content">
<p><a href="http://lifesinger.org/blog/wp-content/uploads/2008/08/google_bug.png"><img class="size-medium wp-image-83" title="google_bug" src="http://lifesinger.org/blog/wp-content/uploads/2008/08/google_bug-300x223.png" height="223" alt="点击小图看大图" width="300" /></a></p>
<p>上面是谷歌首页，当输入某个词时，下面会弹出自动补全提示。功能并不复杂，但考虑到要兼容各个浏览器，谷歌为此可能花费了不少功夫。然而完美实在是很难得，谷歌首页上一直有一个处理得不妥的Bug：</p>
<blockquote>
<p>除了Ctrl+X/C/V，Ctrl+Z/Y也是经常使用的快捷键。在Firefox/Safari/Opera中访问谷歌，一切都很正常。但当我们<strong>打开IE浏览谷歌时，Ctrl+Z/Y不起作用了</strong>。在当今特别是中国，IE是份量最重的浏览器，谷歌首页有此问题，完全可以归为一个Bug.</p>
</blockquote>
<p>这个Bug究竟是怎么引起的呢？为了进一步讨论，我们先来看看各个浏览器下，当输入法开启和未开启时，对键盘等事件的响应情况。</p>
<blockquote>
<p>猛击查看<a href="http://lifesinger.org/blog/wp-content/uploads/2008/08/keyboard_events.html"> JavaScript键盘事件测试小结</a></p>
</blockquote>
<p>通过上面这篇测试小结，我们可以看出，要实现谷歌的自动补全功能并不是一件很简单的事。目前可以找到的解决方案有：</p>
<p><strong>方案一：通过监听keydown, keypress, keyup事件来实现。</strong>这是大部分JavaScript教科书里的做法，对于拉丁语系国家，是没有问题的。但输入法一开启后，一切就都不美妙了：</p>
<blockquote>
<ol>
<li>无论有没有输入法，通过鼠标右键粘贴复制时，key事件都触发不了，真糟糕。</li>
<li>输入法开启时，各个浏览器表现不同。不同输入法之间还有差异，太让人沮丧了。</li>
<li>输入法开启时，Opera压根不触发键盘事件。亲爱的Opera，叫我怎么爱上你？</li>
</ol>
</blockquote>
<p>考虑到中文用户，特别是第一条（不少中文用户习惯使用右键菜单来粘贴复制），第一个方案基本可以枪毙掉。</p>
<p><strong>方案二：不考虑这些烦人的键盘事件，直接采用定时器来实现。</strong>在输入框获取焦点时，触发定时器，失去焦点时，关闭定时器。定时器每隔200ms检查输入框的值，根据值的变化来进行下一步响应。这个trick很简单，基本上能解决大部分问题（谷歌的自动完成就是这么做的^o^）。但有以下不妥：</p>
<blockquote>
<ol>
<li>性能问题。（因为仅在获取焦点时触发定时器，性能问题倒是可以不考虑的）</li>
<li>ie下，此方法会导致Ctrl+Z/Y快捷键失效。</li>
<li>firefox下，用定时器实现表单输入时的即时校验，当输入法开启时，如果校验函数在输入未完成时改变输入框的值，会导致输入框的值变成空。（这个属于不可忽视的Bug，很恼人）</li>
</ol>
</blockquote>
<p>方案二自动解决了右键菜单粘贴的问题，对于自动补全功能来说，一般应用场景下也足够用，但对谷歌来说，感觉有此Bug是不妥的。如果用方案二来实现表单输入时的即时校验，上面的第3点会导致firefox的中文用户很不爽。</p>
<p>苦思冥想许久，在键盘事件中折腾来折腾去，感觉怎么做都无法同时解决上面的所有不妥。昨天静下心来对所有A级浏览器的键盘事件在输入法开启和未开启时做了个仔细的测试后，下面这个方案就很清晰的浮了出来：</p>
<p><strong>方案三：在上面的浏览器事件测试中，有一个很让人高兴的发现：所有浏览器中，都会触发input(ie下可以用propertychange)事件。</strong>而
且input事件仅在输入框的值有变化时才会触发。在输入法开启时，input也能正常触发（虽然会触发一些冗余的input，但比起定时器来好很多）。
在右键菜单粘贴等操作时，也能正确触发input. 采用input/propertychange, 几近完美。但需要注意以下几点：</p>
<blockquote>
<ol>
<li>ie下，如果监听的事件函数中，有页面输出操作，如YAHOO.log(&hellip;), 会导致Ctrl+Z/Y失效。（深层次原因还需仔细探索，感觉页面输出操作只是表象）</li>
<li>对于表单输入时的即时校验来说，比如只能输入数字的输入框，当输入字母时，监听input事件的实现会在字母显示出来后，立刻又删除掉（和
keyup的实现效果一样），没有监听keypress的效果好（不会先显示出来）。因此对于即时校验来说，可以结合input和keypress，在输
入法未开启时，给用户更友好的体验。</li>
</ol>
</blockquote>
<p>最后，看一个根据方案三来实现的简单例子：<a href="http://lifesinger.org/blog/wp-content/uploads/2008/08/test_input.html">表单输入时的即时校验</a></p>
<p><strong>参考资料</strong></p>
<blockquote>
<ul>
<li>很让人敬佩的鼠标事件总结：<a href="http://unixpapa.com/js/key.html">JavaScript Madness: Keyboard Events</a></li>
<li>Realazy的探索：<a href="http://realazy.org/blog/2007/10/31/solution-of-keyup-failing-when-ime-is-on/">输入法下keyup失效的解决方案</a></li>
</ul>
</blockquote>
</div>
          <br/>
          <span style="color:red;">
            <a href="http://share.group.javaeye.com/topic/233038#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, 26 Aug 2008 23:16:50 +0800</pubDate>
        <link>http://www.javaeye.com/topic/233038</link>
        <guid>http://www.javaeye.com/topic/233038</guid>
      </item>
      <item>
        <title>请问关于在社会培训机构学习的java程序员的就业问题！</title>
        <author>JavaEye网站</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://babilun.javaeye.com">babilun</a>&nbsp;
          链接：<a href="http://www.javaeye.com/topic/233590" style="color:red;">http://www.javaeye.com/topic/233590</a>&nbsp;
          发表时间: 2008年08月27日
          <br/>
          声明：本文系JavaEye网站发布的原创文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          我是在天津清华IT培训机构  培训 学习了java  struts  hibernate  spring    jsf  ejb  jsp    sql server2000  oracle  asp.net xml 等等 <br />本人 对java 比较喜爱    着重 学习了 j2ee 方面的  在学校学习期间  做了两个练习 项目 一个是用ssh框架 加了自学的ajax的异步验证的 小bbs  还有 jsp+servlet+javabean  网络图书销售系统 <br /><br />还为一个小公司做过一个winform的小库管系统 <br /><br />请问 我这样的水平  找工作好找吗?<br /> 一般刚开始工资 大概多少  ？ <br />如果面试时 对方 问我有没有项目经验怎么说好呢？    <br /><br /><br />我是天津的  可以去  天津  天津滨海新区 还有 北京 工作    请提供一下相关 信息也 呵呵
          <br/>
          <span style="color:red;">
            <a href="http://share.group.javaeye.com/topic/233590#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, 27 Aug 2008 22:07:05 +0800</pubDate>
        <link>http://www.javaeye.com/topic/233590</link>
        <guid>http://www.javaeye.com/topic/233590</guid>
      </item>
      <item>
        <title>JDOM 对Xml文件（增、删、改、查） </title>
        <author>JavaEye网站</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://shaobo.javaeye.com">shaobo</a>&nbsp;
          链接：<a href="http://www.javaeye.com/topic/233911" style="color:red;">http://www.javaeye.com/topic/233911</a>&nbsp;
          发表时间: 2008年08月28日
          <br/>
          声明：本文系JavaEye网站发布的原创文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p>package bean;</p>
<p><br />import java.io.FileInputStream;<br />import java.io.FileNotFoundException;<br />import java.io.FileOutputStream;<br />import java.io.IOException;<br />import java.io.InputStream;<br />import java.io.OutputStream;<br />import java.util.List;</p>
<p>import org.jdom.Document;<br />import org.jdom.Element;<br />import org.jdom.JDOMException;<br />import org.jdom.input.SAXBuilder;<br />import org.jdom.output.XMLOutputter;</p>
<p>/**<br />&nbsp;* 邵波 QQ：343269876<br />&nbsp;*/<br />public class XmlParse {</p>
<p>&nbsp;<br />&nbsp;//解析xml文件<br />&nbsp;<br />&nbsp;public static void XmlParse() throws JDOMException, IOException {<br />&nbsp;&nbsp;SAXBuilder builder = new SAXBuilder();<br />&nbsp;&nbsp;InputStream file = new FileInputStream("src/xml/po.xml");<br />&nbsp;&nbsp;Document document = builder.build(file);//获得文档对象<br />&nbsp;&nbsp;Element root = document.getRootElement();//获得根节点<br />&nbsp;&nbsp;List&lt;Element&gt; list = root.getChildren();<br />&nbsp;&nbsp;for(Element e:list) {<br />&nbsp;&nbsp;&nbsp;System.out.println("ID="+e.getAttributeValue("id"));<br />&nbsp;&nbsp;&nbsp;System.out.println("username="+e.getChildText("username"));<br />&nbsp;&nbsp;&nbsp;System.out.println("password="+e.getChildText("password"));<br />&nbsp;&nbsp;}<br />&nbsp;}<br />&nbsp;<br />&nbsp;//增<br />&nbsp;public static void addXml() throws JDOMException, FileNotFoundException, IOException {<br />&nbsp;&nbsp;SAXBuilder builder = new SAXBuilder();<br />&nbsp;&nbsp;Document doc = builder.build("src/xml/po.xml");//获得文档对象<br />&nbsp;&nbsp;Element root = doc.getRootElement();//获得根节点<br />&nbsp;&nbsp;<br />&nbsp;&nbsp;//添加新元素<br />&nbsp;&nbsp;Element element = new Element("person");<br />&nbsp;&nbsp;element.setAttribute("id", "3");<br />&nbsp;&nbsp;Element element1 = new Element("username");<br />&nbsp;&nbsp;element1.setText("zhangdaihao");<br />&nbsp;&nbsp;Element element2 = new Element("password");<br />&nbsp;&nbsp;element2.setText("mima");<br />&nbsp;&nbsp;element.addContent(element1);<br />&nbsp;&nbsp;element.addContent(element2);<br />&nbsp;&nbsp;root.addContent(element);<br />&nbsp;&nbsp;doc.setRootElement(root);<br />&nbsp;&nbsp;<br />&nbsp;&nbsp;//文件处理<br />&nbsp;&nbsp;XMLOutputter out = new XMLOutputter();<br />&nbsp;&nbsp;out.output(doc, new FileOutputStream("src/xml/po.xml"));<br />&nbsp;}<br />&nbsp;<br />&nbsp;//根据ID值删除一个节点 <br />&nbsp;public static void deletePerson(int id) throws JDOMException, IOException {<br />&nbsp;&nbsp;SAXBuilder builder = new SAXBuilder();<br />&nbsp;&nbsp;InputStream file = new FileInputStream("src/xml/po.xml");<br />&nbsp;&nbsp;Document doc = builder.build(file);//获得文档对象<br />&nbsp;&nbsp;Element root = doc.getRootElement();//获得根节点<br />&nbsp;&nbsp;List&lt;Element&gt; list = root.getChildren();<br />&nbsp;&nbsp;for(Element e:list) {<br />&nbsp;&nbsp;&nbsp;//获取ID值<br />&nbsp;&nbsp;&nbsp;if(Integer.parseInt(e.getAttributeValue("id"))==id) {<br />&nbsp;&nbsp;&nbsp;&nbsp;root.removeContent(e);<br />&nbsp;&nbsp;&nbsp;&nbsp;break;//??<br />&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;}<br />&nbsp;&nbsp;<br />&nbsp;&nbsp;//文件处理<br />&nbsp;&nbsp;XMLOutputter out = new XMLOutputter();<br />&nbsp;&nbsp;out.output(doc, new FileOutputStream("src/xml/po.xml"));<br />&nbsp;}<br />&nbsp;<br />&nbsp;//根据ID值修改一个节点 <br />&nbsp;public static void updatePerson(int id) throws JDOMException, IOException {<br />&nbsp;&nbsp;SAXBuilder builder = new SAXBuilder();<br />&nbsp;&nbsp;InputStream file = new FileInputStream("src/xml/po.xml");<br />&nbsp;&nbsp;Document doc = builder.build(file);//获得文档对象<br />&nbsp;&nbsp;Element root = doc.getRootElement();//获得根节点<br />&nbsp;&nbsp;List&lt;Element&gt; list = root.getChildren();<br />&nbsp;&nbsp;for(Element e:list) {<br />&nbsp;&nbsp;&nbsp;//获取ID值<br />&nbsp;&nbsp;&nbsp;if(Integer.parseInt(e.getAttributeValue("id"))==id) {<br />&nbsp;&nbsp;&nbsp;&nbsp;System.out.println("--------------------");<br />&nbsp;&nbsp;&nbsp;&nbsp;e.getChild("username").setText("111111111");<br />&nbsp;&nbsp;&nbsp;&nbsp;e.getChild("password").setText("password");<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;}<br />&nbsp;&nbsp;<br />&nbsp;&nbsp;//文件处理<br />&nbsp;&nbsp;XMLOutputter out = new XMLOutputter();<br />&nbsp;&nbsp;out.output(doc, new FileOutputStream("src/xml/po.xml"));<br />&nbsp;}<br />&nbsp;<br />&nbsp;static public void main(String ars[]) throws JDOMException, IOException {<br />&nbsp;&nbsp;<br />&nbsp;//&nbsp;addXml();//增加XML<br />&nbsp;//&nbsp;deletePerson(3);//删除XML<br />&nbsp;//&nbsp;updatePerson(2);//修改XML<br />&nbsp;//&nbsp;XmlParse();//解析XML<br />&nbsp;}<br />}</p>
<p>&nbsp;</p>
<p>------------------------------------------------------------------------------------------------------</p>
<p>&lt;?xml version="1.0" encoding="UTF-8"?&gt;<br />&lt;root&gt;<br />&nbsp;&lt;person id="1"&gt;<br />&nbsp;&nbsp;&lt;username&gt;张三&lt;/username&gt;<br />&nbsp;&nbsp;&lt;password&gt;123123&lt;/password&gt;<br />&nbsp;&lt;/person&gt;<br />&nbsp;&lt;person id="2"&gt;<br />&nbsp;&nbsp;&lt;username&gt;1111111112&lt;/username&gt;<br />&nbsp;&nbsp;&lt;password&gt;password2&lt;/password&gt;<br />&nbsp;&lt;/person&gt;</p>
<p>&nbsp;<br />&lt;/root&gt;</p>
          <br/>
          <span style="color:red;">
            <a href="http://share.group.javaeye.com/topic/233911#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, 28 Aug 2008 13:31:13 +0800</pubDate>
        <link>http://www.javaeye.com/topic/233911</link>
        <guid>http://www.javaeye.com/topic/233911</guid>
      </item>
      <item>
        <title>SOA=webservers吗？</title>
        <author>JavaEye网站</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://wu-yong988.javaeye.com">wu_yong988</a>&nbsp;
          链接：<a href="http://www.javaeye.com/topic/234035" style="color:red;">http://www.javaeye.com/topic/234035</a>&nbsp;
          发表时间: 2008年08月28日
          <br/>
          声明：本文系JavaEye网站发布的原创文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          SOA=webservers吗？<br />谁能简单说一下 到底什么是SOA呢，说说自己的理解啊，不要那种在网上找的长篇大论的<br />我的理解，soa是不是就是webServers的的标准和原则呢？
          <br/>
          <span style="color:red;">
            <a href="http://share.group.javaeye.com/topic/234035#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, 28 Aug 2008 16:36:07 +0800</pubDate>
        <link>http://www.javaeye.com/topic/234035</link>
        <guid>http://www.javaeye.com/topic/234035</guid>
      </item>
      <item>
        <title>Hibernate Annotation使用实例</title>
        <author>JavaEye网站</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://hackang.javaeye.com">hackang</a>&nbsp;
          链接：<a href="http://www.javaeye.com/topic/234027" style="color:red;">http://www.javaeye.com/topic/234027</a>&nbsp;
          发表时间: 2008年08月28日
          <br/>
          声明：本文系JavaEye网站发布的原创文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p>jar说明&nbsp; hibernate 3.3.0&nbsp; hibernate-annotations(3.4.0.CR2)</p>
<p>&nbsp;</p>
<p>数据库(oracle)结构</p>
<p>CREATE TABLE KANG_USER<br />(<br />&nbsp; ID&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; VARCHAR2(32 BYTE)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; NOT NULL,<br />&nbsp; USERNAME&nbsp; VARCHAR2(30 BYTE),<br />&nbsp; PASSWORD&nbsp; VARCHAR2(32 BYTE),<br />&nbsp; CITY&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; VARCHAR2(32 BYTE),<br />&nbsp; ADDTIME&nbsp;&nbsp; DATE<br />)</p>
<p>&nbsp;</p>
<p>CREATE TABLE KANG_CITY<br />(<br />&nbsp; ID&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; VARCHAR2(32 BYTE),<br />&nbsp; CITYNAME&nbsp; VARCHAR2(20 BYTE)<br />)</p>
<p>一个用户表，一个城市表，用户和城市是多对一的关系</p>
<p>&nbsp;</p>
<pre name="code" class="java">import java.util.Date;

import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.Table;
import javax.persistence.Temporal;
import javax.persistence.TemporalType;

import org.hibernate.annotations.Cache;
import org.hibernate.annotations.CacheConcurrencyStrategy;
import org.hibernate.annotations.Cascade;
import org.hibernate.annotations.CascadeType;
import org.hibernate.annotations.GenericGenerator;
import org.hibernate.annotations.NotFound;
import org.hibernate.annotations.NotFoundAction;

/**
 * @author yukang
 *
 */
@Entity
@Cache(usage = CacheConcurrencyStrategy.NONSTRICT_READ_WRITE)
@Table(name="KANG_USER")
public class User {
    
    @Id
    @GeneratedValue(generator = "system-uuid")
    @GenericGenerator(name = "system-uuid", strategy = "uuid")
    private String id;
    
    private String userName;
    
    private String passWord;
    
    @Temporal(TemporalType.TIMESTAMP)
    private Date addTime;
    
    @ManyToOne() 
    @Cascade(value={CascadeType.PERSIST, CascadeType.MERGE}) 
    @JoinColumn(name="CITY")
    @NotFound(action=NotFoundAction.IGNORE)
    private City city;
    
    public User() {
        
    }
    
    
    /**
     * @return
     */
    public String getId() {
        return id;
    }
    
    /**
     * @param id the id to set
     */
    public void setId(String id) {
        this.id = id;
    }

    /**
     * @return the userName
     */
    public String getUserName() {
        return userName;
    }


    /**
     * @param userName the userName to set
     */
    public void setUserName(String userName) {
        this.userName = userName;
    }


    /**
     * @return the passWord
     */
    public String getPassWord() {
        return passWord;
    }


    /**
     * @param passWord the passWord to set
     */
    public void setPassWord(String passWord) {
        this.passWord = passWord;
    }

    /**
     * @return
     */
    public Date getAddTime() {
        return addTime;
    }
    
    /**
     * @param addTime the addTime to set
     */
    public void setAddTime(Date addTime) {
        this.addTime = addTime;
    }
    
    /**
     * @return
     */
    public City getCity() {
        return city;
    }
    
    /**
     * @param city the city to set
     */
    public void setCity(City city) {
        this.city = city;
    }

   

}</pre>
<p>&nbsp;</p>
<p>&nbsp;</p>
<pre name="code" class="java">import java.util.HashSet;
import java.util.Set;

import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.OneToMany;
import javax.persistence.Table;

import org.hibernate.annotations.Cache;
import org.hibernate.annotations.CacheConcurrencyStrategy;
import org.hibernate.annotations.Cascade;
import org.hibernate.annotations.CascadeType;
import org.hibernate.annotations.GenericGenerator;

/**
 * @author yukang
 *
 */

@Entity
@Cache(usage = CacheConcurrencyStrategy.NONSTRICT_READ_WRITE)
@Table(name="KANG_CITY")
public class City {
    
    @Id
    @GeneratedValue(generator = "system-uuid")
    @GenericGenerator(name = "system-uuid", strategy = "uuid")
    private String id;
    
    private String cityName;
    
    @OneToMany(mappedBy="city",fetch=FetchType.EAGER)
    @Cascade(value={CascadeType.DELETE_ORPHAN})//级联删除
    private Set&lt;User&gt; userSet;
    
    public City() {
        
    }

    /**
     * @return the id
     */
    public String getId() {
        return id;
    }

    /**
     * @param id the id to set
     */
    public void setId(String id) {
        this.id = id;
    }

    /**
     * @return the cityName
     */
    public String getCityName() {
        return cityName;
    }

    /**
     * @param cityName the cityName to set
     */
    public void setCityName(String cityName) {
        this.cityName = cityName;
    }

    /**
     * @return the userSet
     */
    public Set&lt;User&gt; getUserSet() {
        return userSet;
    }

    public void addUser(User user) {
        if ( userSet == null ) {
            userSet = new HashSet&lt;User&gt;();
        }
        user.setCity(this);
        userSet.add( user );
    }

}</pre>
<p>&nbsp;</p>
<p>Spring中的sessionFactory的class要更改为org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean这个class</p>
<p>&nbsp;</p>
<p>hibernate.cfg.xml要把User和City这两个class加上去</p>
<p>&lt;mapping class="com.xxxx.domain.pojo.User"/&gt;<br />&nbsp;&lt;mapping class="com.xxxx.domain.pojo.City"/&gt;</p>
<p>&nbsp;</p>
<p>其他的地方以前怎么写的，现在不要改动，例子较简单，代码不做说明了</p>
          <br/>
          <span style="color:red;">
            <a href="http://share.group.javaeye.com/topic/234027#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, 28 Aug 2008 16:14:57 +0800</pubDate>
        <link>http://www.javaeye.com/topic/234027</link>
        <guid>http://www.javaeye.com/topic/234027</guid>
      </item>
      <item>
        <title>Jboss下的第一个EJB程序</title>
        <author>JavaEye网站</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://jingfengluo.javaeye.com">jingfengluo</a>&nbsp;
          链接：<a href="http://www.javaeye.com/topic/233971" style="color:red;">http://www.javaeye.com/topic/233971</a>&nbsp;
          发表时间: 2008年08月28日
          <br/>
          声明：本文系JavaEye网站发布的原创文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p>好久没写了，以前也只在weblogic下写过，凭记忆写了一个例子，虽然很小，但是为了调这个东西，走了很多弯路，呵呵，写出来分享一下</p>
<p>1.编写一个主接口，创建组件接口的接口<br />package com.EJB.interfaces;</p>
<p>public interface HelloWorldHome extends javax.ejb.EJBHome{<br />&nbsp;HelloWorld create() throws java.rmi.RemoteException,javax.ejb.CreateException;<br />}<br />2.编写一个组件接口，被客户端使用的接口<br />package com.EJB.interfaces;</p>
<p>public interface HelloWorld extends javax.ejb.EJBObject{</p>
<p>&nbsp;public String getHello() throws java.rmi.RemoteException;<br />}<br />3.编写组件接口的实现，即具体的逻辑<br />package com.EJB.impl;</p>
<p>import java.rmi.RemoteException;</p>
<p>import javax.ejb.EJBException;<br />import javax.ejb.SessionContext;</p>
<p>public class HelloWorldImpl implements javax.ejb.SessionBean{</p>
<p>&nbsp;/*hello方法是实际的业务逻辑，它可以在客户端显示&ldquo;hello,world&rdquo;这个字符串*/<br />&nbsp;public String getHello() throws EJBException, RemoteException {<br />&nbsp;&nbsp;System.out.println("getHello()");<br />&nbsp;&nbsp;return "hello,worldasdfasdfasdf";<br />&nbsp;}</p>
<p>&nbsp;public void ejbActivate() throws EJBException, RemoteException {<br />&nbsp;&nbsp;// TODO Auto-generated method stub<br />&nbsp;&nbsp;<br />&nbsp;}</p>
<p>&nbsp;public void ejbPassivate() throws EJBException, RemoteException {<br />&nbsp;&nbsp;// TODO Auto-generated method stub<br />&nbsp;&nbsp;<br />&nbsp;}</p>
<p>&nbsp;public void ejbRemove() throws EJBException, RemoteException {<br />&nbsp;&nbsp;// TODO Auto-generated method stub<br /