<?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>Ext GridFilter 前台查询框输入的值怎么传给服务器端的， 服务器端怎么接收数据。</title>
        <author>JavaEye网站</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://zhangkewei.javaeye.com">zhangkewei</a>&nbsp;
          链接：<a href="http://www.javaeye.com/topic/234313" style="color:red;">http://www.javaeye.com/topic/234313</a>&nbsp;
          发表时间: 2008年08月29日
          <br/>
          声明：本文系JavaEye网站发布的原创文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          看了官网提供的例子，进行单列查询需要引入几个js文件 <br />&lt;script type="text/javascript" src="js/extjs/menu/EditableItem.js">&lt;/script> <br />&lt;script type="text/javascript" src="js/extjs/menu/EditableItem.js">&lt;/script> <br />&lt;script type="text/javascript" src="js/extjs/grid/GridFilters.js">&lt;/script> <br />&lt;script type="text/javascript" src="js/extjs/grid/filter/Filter.js">&lt;/script> <br />&lt;script type="text/javascript" src="js/extjs/grid/filter/StringFilter.js">&lt;/script> <br />我已经全部引进去了，前台js代码创建了一个filters对象，然后把它当作插件配置在grid对象和PagingToolbar中，页面上也没有问题，然后不知道怎么把输入到filter文本框中的内容传给服务器端，服务器端怎么接收。
          <br/>
          <span style="color:red;">
            <a href="http://zhangyang.javaeye.com/topic/234313#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Fri, 29 Aug 2008 10:49:16 +0800</pubDate>
        <link>http://www.javaeye.com/topic/234313</link>
        <guid>http://www.javaeye.com/topic/234313</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://zhangyang.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/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 00:04:40 +0800</pubDate>
        <link>http://www.javaeye.com/topic/233664</link>
        <guid>http://www.javaeye.com/topic/233664</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://zhangyang.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://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://zhangyang.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://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://zhangyang.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>听VOA满4个月啦 继续。。。</title>
        <author>JavaEye网站</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://lirong1978.javaeye.com">lirong1978</a>&nbsp;
          链接：<a href="http://www.javaeye.com/topic/233078" style="color:red;">http://www.javaeye.com/topic/233078</a>&nbsp;
          发表时间: 2008年08月27日
          <br/>
          声明：本文系JavaEye网站发布的原创文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          不会英语是不行的，我深深的感觉到了
          <br/>
          <span style="color:red;">
            <a href="http://zhangyang.javaeye.com/topic/233078#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 08:26:41 +0800</pubDate>
        <link>http://www.javaeye.com/topic/233078</link>
        <guid>http://www.javaeye.com/topic/233078</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://zhangyang.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://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://zhangyang.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>GMail这两天有变化了。用JavaMail收不了附件了。</title>
        <author>JavaEye网站</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://elvewyn.javaeye.com">elvewyn</a>&nbsp;
          链接：<a href="http://www.javaeye.com/topic/234301" style="color:red;">http://www.javaeye.com/topic/234301</a>&nbsp;
          发表时间: 2008年08月29日
          <br/>
          声明：本文系JavaEye网站发布的原创文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          昨天和今天都做了测试，用JavaMail收发邮件。如果是自己给自己发邮件，或者用JavaMail通过其他的邮箱往Gmail发的邮件。附件都收不下来。但是，通过GMail的界面仍然可以看到附件。但是通过Gmail发往其他邮件的附件则是正常的。真是奇怪！不知道各位有没有遇到这种情况。
          <br/>
          <span style="color:red;">
            <a href="http://zhangyang.javaeye.com/topic/234301#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Fri, 29 Aug 2008 10:23:25 +0800</pubDate>
        <link>http://www.javaeye.com/topic/234301</link>
        <guid>http://www.javaeye.com/topic/234301</guid>
      </item>
      <item>
        <title>关于nityo公司</title>
        <author>JavaEye网站</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://wengang.javaeye.com">gefforey520</a>&nbsp;
          链接：<a href="http://www.javaeye.com/topic/234285" style="color:red;">http://www.javaeye.com/topic/234285</a>&nbsp;
          发表时间: 2008年08月29日
          <br/>
          声明：本文系JavaEye网站发布的原创文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          向论坛中高人问一下，哪位了解nityo公司呀？<br />  昨天该公司HR打我电话，问我愿意去singapore吗？问了工作经验，薪水要求等，还问了什么时候能去singapore，看样子是真格的，<br />  只是心里还在犯嘀咕，想来论坛了解一下情况。。。
          <br/>
          <span style="color:red;">
            <a href="http://zhangyang.javaeye.com/topic/234285#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, 29 Aug 2008 09:56:33 +0800</pubDate>
        <link>http://www.javaeye.com/topic/234285</link>
        <guid>http://www.javaeye.com/topic/234285</guid>
      </item>
      <item>
        <title>竟如此求职,卖白菜啊</title>
        <author>JavaEye网站</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://highinbluesky.javaeye.com">highinbluesky</a>&nbsp;
          链接：<a href="http://www.javaeye.com/topic/234236" style="color:red;">http://www.javaeye.com/topic/234236</a>&nbsp;
          发表时间: 2008年08月29日
          <br/>
          声明：本文系JavaEye网站发布的原创文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          都知道sohu公司好啊.<br />来自sohu论坛<br /><a href="http://club.learning.sohu.com/main.php?c=80&b=joblife&a=698648" target="_blank">http://club.learning.sohu.com/main.php?c=80&b=joblife&a=698648</a>
          <br/>
          <span style="color:red;">
            <a href="http://zhangyang.javaeye.com/topic/234236#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Fri, 29 Aug 2008 08:35:18 +0800</pubDate>
        <link>http://www.javaeye.com/topic/234236</link>
        <guid>http://www.javaeye.com/topic/234236</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://zhangyang.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/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:56:20 +0800</pubDate>
        <link>http://www.javaeye.com/topic/233800</link>
        <guid>http://www.javaeye.com/topic/233800</guid>
      </item>
      <item>
        <title> 实施费用也能DIY--走出软件作坊：三五个人十来条枪 如何成为开发正规军（九）</title>
        <author>JavaEye网站</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://david-lv.javaeye.com">david_lv</a>&nbsp;
          链接：<a href="http://www.javaeye.com/topic/233963" style="color:red;">http://www.javaeye.com/topic/233963</a>&nbsp;
          发表时间: 2008年08月28日
          <br/>
          声明：本文系JavaEye网站发布的原创文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          咱们书接上回。水清则无鱼--走出软件作坊：三五个人十来条枪 如何成为开发正规军（八）<br /><br />上次咱们讲完了开发费用的计算，很多人在后面跟帖在那里算费用。<br /><br />有人说：你把程序员都不当人，94天，一天都不休息啊。<br /><br />我想答曰：94天，是工作时间。不算双休日在里面。也就是说，实际的开发周期长度是94+3个月之中的所有双休日。我只所以按照94天算，是算94天工作日，并没有把双休日都算进去。你试着想想，你都休息了，你怎么跟客户算费用的时候把双休日也好意思算进去。所以说，算费用，按94天算合理。<br /><br />另外有人说了：根本不是全体人都干94个工作日。你按全体人干94个工作日算，这也太黑客户了吧。<br /><br />我想答曰：这个详细开发过程我会以后一篇篇文章详细道来。我在这里先简短说一下：你以为调研完就把调研文档一转给下一阶段的人就算OK了？你以为直到代码编写完后才测试？你以为直到测试完后才写文档？这样的串行，根本无法保证产品开发质量，也无法适应国内这种“说过的话可以不算合同可以一撕两半”的需求朝令夕改的状况。我会以后讲到全程研发团队配合的方法。所以说，确实需要整个团队研发94个工作日。<br /><br />由有人说：楼主在这里搭建自己的梦想空中楼阁呢，都是在遐想或瞎想。现在谁这么报价啊。水清则无鱼，你也讲了。谁也不是冤大头。吃饭KTV澡堂一条龙，外加回扣搞定他。<br /><br />我想答曰：现在的客户都是荤素全收。吃饭KTV洗澡加回扣，这些都是正常流程。但桌下的归桌下，桌上的还要看你桌上的。现在需要的是面上好看面下也好看，既要捞了实惠还要项目做的好。现在企业打单的竞争都已经不是一两层的竞争了。先开始比关系，发现竞争对手关系也不弱。比价格，发现还是差不多。再往上加竞争层，比谁的功能强，比谁的售前方案和演示做的好，比谁的实施承诺和服务承诺好，比谁能够客户化修改，比谁能在现场驻扎时间长，比谁派的实力干将厉害，比谁客户化修改次数无限改动幅度无限。等等等等，比到大家觉得这单子签了也是个擦屁股事，坚持到最后的就胜出。如果洗洗澡吃吃饭给点回扣就能搞定，那销售就简单多了。过去可以，但现在不行了。未来更不行了，喝酒吃饭玩，那是工作之外的；谈到工作，还要怎么正规怎么来。想混水摸鱼报个价过关，以后出了时间问题和质量问题，谁的位子都可能丢，这个险没人敢冒。<br /><br />当然，今天也不是对上一篇文章做FAQ问答。今天咱们仍然续接上回，给大家分享一下实施费用计算。<br /><br />一个项目实施团队，由项目经理和培训专员两类角色构成。往往一个项目实施团队一名项目经理负责，若干培训专员组成。若干培训专员根据客户所购买系统模块数来定人数，一般一个子系统派一名培训专员。<br /> <br />项目经理的职责为：<br />1项目范围界定<br />2制定项目计划<br />3组织项目成员<br />4协调相关人沟通<br />5保证项目质量<br />6推进项目进度<br /> <br />而项目经理，也分为高级项目经理、中级项目经理、项目经理。分别对应5年、3年、2年项目管理经验的实施项目经理。当然，不同级别的项目经理和培训专员，薪水都是不一样的，能力也是有高低差异的。<br />实施阶段分为项目调研期、项目数据准备期、项目培训期、项目上线运行期、项目验收期。<br /><br />项目调研期，项目经理负责项目范围界定、制定项目计划、组织项目成员。培训专员收集项目详细资料，以利于项目经理界定项目范围和制定项目计划。<br /><br />项目数据准备期，培训专员负责培训基础数据准备负责人员需要准备什么数据，数据如何编码，什么样的数据算是合格数据，培训数据准备操作员如何进行数据准备操作录入，帮助校验录入的数据是否正确。项目经理负责客户设计数据准备过程中出现的特殊数据处理方案。<br /><br />项目培训期，由项目经理负责培训计划和培训协调组织，培训专员负责培训。<br /><br />项目上线运行期，项目经理负责推进项目保证项目平稳全面的上线，培训专员负责现场指导手把手深度培训。<br /><br />在项目验收期，会对前期所做的工作进行总结，指出不足，报告以后系统维护的重点和注意事项，对项目上线效果给与评估。<br /><br />我遇见过这样的客户：不用我们培训。我们提供了详细的数据准备规范文档，系统初始化手册、业务功能使用帮助文档。他们也不需要我们定制化修改，他们自己培训自己上线。他们甚至不需要我们做项目效果咨询评估。<br /><br />我们有不同级别不同费用的项目经理和培训专员可以让客户选择。当然，项目实施周期阶段，客户也可以选择。<br /><br />有的客户需要定制化修改，我们就签项目调研期。他们不需要我们做培训，那么就把培训期的费用去掉。如果不需要我们辅助指导数据准备，那就把数据准备期的费用去掉。如果上线不需要我们监控切换过渡异常，也可以把上线运行期费用省掉。<br /><br />客户可以根据自己家的IT建设复杂情况、历史遗留问题情况、人员素质情况、人员规模情况来决定每个阶段签多少天。但是，例外的是：我们的培训是单算费用的。<br /><br />这样，实施费用=（所选级别的项目经理每天费用+N套子系统x所选级别的培训专员每天费用）x实施天数。<br /><br />项目经理和培训专员级别不同，就有不同的每天实施费用。而实施，是由于出差到客户现场的，所以软件公司要支付员工出差福利补助，这部分钱当然需要从客户实施费用中拿了。实施过程中花费的电话费、餐费、住宿费、交通费，样样都需要钱，这都要考虑到实施费用中。<br /><br />对于培训。有正规的培训专员，也有正规的培训课程、培训课本、培训练习、培训考试。靠嘴皮子培训，靠一份使用帮助文档对着每个界面操作来培训，这种土包子方法已经无法在正规性和专业性上让客户满意买单了。<br /><br />针对培训，每个子系统都有自己的培训课程。而且分的很细，成为多门课程。有针对最基层操作人员的，有针对小组长管理的，有针对科长管理的，有针对该系统的信息科系统维护人员的。<br /><br />而且，由于客户的IT水平不一。所以即使针对某一角色，如最基层的操作人员，也有初级课程和高级课程。<br /><br />每门课程都有课时长、参加人员需要具备的技能条件要求、合理的培训人数限制（培训人数太多会影响教学质量）。<br /><br />而且，培训都有次数。<br /><br />这样的话，培训讲师费用=（某一级别的培训专员某门课程的培训费用）x培训次数。<br /><br />我们有个培训课程列表让客户选择打勾，客户调整自己需要的培训次数，就会自动计算出来培训费用了。<br /><br />培训，除了培训讲师费用，还有培训课本可以选择。因为培训课本都是印刷的，所以培训课本也是收费的。每本书价格都有不同，明码标价。买多少本，客户自己计算。<br /><br />所以，整个实施费用，都是可计算的。给客户一套实施费用计算表，客户根据自己的财力和想达到的效果来调节参数，就可以选择适合自己的项目经理、培训专员、实施阶段、培训课程、培训课本。<br /><br />有网友曾经看见我提到过这种实施费用计算方法，认为不具备可操作性：你这样计算，客户就不签单，你把客户当傻子呀。谁不知道每件事情都需要花费人工费，就连一个培训文档也需要人来写，但客户会为这部分人工费付费吗？显然不会。为什么不会？中国的大环境呗。只有大环境的变好才能改变客户的认知。但此等大环境的改变不是我们小公司能做的。大环境需要国家和大公司去领导变革，我们作为小公司只需要顺应潮流。现在不管啥公司，只要有点关系就搞软件，都把这个市场搞滥了，只能狠狠死一批，留下来的就肯定是精品了。<br /><br />我的一个朋友也是这么认为，他说：你从事的行业的客户都是信息化很多年的客户，所以他们对付费认知水平高，但我从事的行业信息化还不成熟，没法用你的方法，你的方法只能在信息化成熟的行业应用。<br /><br />我问他：你试过没？<br /><br />他说：这还用试么？肯定不行。<br /><br />嗯，我们常常什么道理都懂，但轮到自己，轮到自己手头的事，就行不通。<br /><br />要么继续混水摸鱼，打包了整个铁板一块的实施方案（现在软件都讲究积木化，为什么实施不能量贩式）给客户一个总数字，客户也不知道这个价格水分多大，只能抱着老思想：拦腰打半价肯定没错。要么把选择和决定的权力交给客户，让客户看看软件的利润真的没那么高，大家都在死撑而已。（我想起过去的商店和现在的超市）<br /><br />如果你觉得未来还是浑然一片水而不是DIY的时代，那么，请继续....
          <br/>
          <span style="color:red;">
            <a href="http://zhangyang.javaeye.com/topic/233963#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 14:53:52 +0800</pubDate>
        <link>http://www.javaeye.com/topic/233963</link>
        <guid>http://www.javaeye.com/topic/233963</guid>
      </item>
      <item>
        <title>B/S结构系统怎么控制同一个页面同时只允许一个人打开使用？</title>
        <author>JavaEye网站</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://xsailer.javaeye.com">xsailer</a>&nbsp;
          链接：<a href="http://www.javaeye.com/topic/234268" style="color:red;">http://www.javaeye.com/topic/234268</a>&nbsp;
          发表时间: 2008年08月29日
          <br/>
          声明：本文系JavaEye网站发布的原创文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          b/s结构怎么控制同一个页面同时只允许一个人打开使用？其他的人访问时出现“有人编辑”的提示，关闭页面时还能释放对页面的控制，其他的账号则可以正常访问。尝试用AJAX做过，对于IE要求较高，不是特别的稳定，如果不能正常捕捉到IE的关闭事件，或者IE在关闭时不能正常的向服务器提交释放的请求，都会导致页面死锁。
          <br/>
          <span style="color:red;">
            <a href="http://zhangyang.javaeye.com/topic/234268#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Fri, 29 Aug 2008 09:32:00 +0800</pubDate>
        <link>http://www.javaeye.com/topic/234268</link>
        <guid>http://www.javaeye.com/topic/234268</guid>
      </item>
      <item>
        <title>将业务逻辑封入数据库的SP中是良好的解决之道么？</title>
        <author>JavaEye网站</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://iheshi.javaeye.com">iheshi</a>&nbsp;
          链接：<a href="http://www.javaeye.com/topic/234245" style="color:red;">http://www.javaeye.com/topic/234245</a>&nbsp;
          发表时间: 2008年08月29日
          <br/>
          声明：本文系JavaEye网站发布的原创文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          最近开始接手一个维护性项目。由于项目已经年久失修，公司已经另起炉灶，准备新建一系统来代替目前的这个旧系统。不过在构建的过程中，因为公司的业务逻辑不能中断，所以还是需要继续维护这个旧系统的。于是，我们就力所能及的做一些重构和优化的工作好了。<img src="/images/smiles/icon_lol.gif"/><br /><br />现在的问题是，最近一段时间，公司的业务逻辑变化得有点快，有位老大提议是否能慢慢的把系统中的业务逻辑放入到SP中。他喜欢的方式是——程序只做基本的处理，相关的业务都直接通过调用SP或者FUNC来做。这样比较灵活。不过我的想法是，数据库应该只是一个做持久化的地方，如果和持久化关系不是很紧密的话，逻辑还是放入程序中好了。当然，这样做的后果是，有可能因为业务变化了，需要频繁的修改代码……<br /><br />我想，最理想的情况是，把逻辑都放入专门的逻辑规则引擎中（如iLog）之类的，不过，在目前暂没考虑规则引擎的情况下，是不是将逻辑封入SP就是比较完美的办法了呢？<br /><br />想请教下大家的看法呢？<img src="/images/smiles/icon_biggrin.gif"/>
          <br/>
          <span style="color:red;">
            <a href="http://zhangyang.javaeye.com/topic/234245#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Fri, 29 Aug 2008 09:04:51 +0800</pubDate>
        <link>http://www.javaeye.com/topic/234245</link>
        <guid>http://www.javaeye.com/topic/234245</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://zhangyang.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/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Mon, 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>用firefox3的朋友试试</title>
        <author>JavaEye网站</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://neora.javaeye.com">neora</a>&nbsp;
          链接：<a href="http://www.javaeye.com/topic/234276" style="color:red;">http://www.javaeye.com/topic/234276</a>&nbsp;
          发表时间: 2008年08月29日
          <br/>
          声明：本文系JavaEye网站发布的原创文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          近期一个项目我们选了xulrunner作为Client端的开发基础。总体效果还不错，但发现一个诡异的BUG无法解决。在文本输入框采用智能ABC输入法，XULRunner就会崩溃掉。<br />由于XULRunner与firefox3是相同的内核，我们在firefox3上同样发现了这个问题。用FF3的朋友试试下面的操作：<br /><br />切换到职能ABC输入法，在浏览器地址输入框按住某个字母（比如l）不放，接下来....<img src="/images/smiles/icon_mad.gif"/>.......嘿嘿
          <br/>
          <span style="color:red;">
            <a href="http://zhangyang.javaeye.com/topic/234276#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Fri, 29 Aug 2008 09:46:15 +0800</pubDate>
        <link>http://www.javaeye.com/topic/234276</link>
        <guid>http://www.javaeye.com/topic/234276</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://zhangyang.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>关于技术人员的效益评估</title>
        <author>JavaEye网站</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://brucejia.javaeye.com">brucejia</a>&nbsp;
          链接：<a href="http://www.javaeye.com/topic/233761" style="color:red;">http://www.javaeye.com/topic/233761</a>&nbsp;
          发表时间: 2008年08月28日
          <br/>
          声明：本文系JavaEye网站发布的原创文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          问题来源于王咏刚很早前的一篇文章《代码地震》，以下是引用<br /><br /><u>一些公司直接根据技术人员的职位或级别来确定奖励额度,这实际上抹煞了基本薪金和奖励之间的根本区别、体现不出奖金的鼓励和惩戒作用;另一些公司由老板或部门经理凭经验决定下属的奖励额度,在这种分配体系下,即便负责奖金分配的领导没有半点私心杂念,最终也很可能出现<strong>按苦劳而不是按功劳</strong>分配的不合理局面</u>，<br /><br />这种情况大家都遇到过吧，在开发一个项目中，开发任务不是完美的划分，很容易有某些人很辛苦但是做了很多并不实际的工作，比如没有简化需求，或者用一个冗长复杂的方法处理某个模块，看似也是完成了某个功能，但是实际的效率很低下，甚至为以后维护埋下了隐患。还有<br /><u><br />我个人比较喜欢以项目组为单位来考核贡献率的做法.即,先计算项目组的贡献率,然后给出项目组总的奖金额度.项目组内部各成员的奖金分配由项目经理自行决定.与单独考察每个技术人员贡献率的做法相比、这种做法既能保证评价规则的简明和参考数据的准确,也能赋予项目经理在项目组内部实施奖惩的基本权力.我们可以用公式计算项目组在单位时间内的贡献率:项目组的贡献率(R)=单位时间内项目组为公司创造的实际效益(V)÷单位时间内项目组的成本和费用总和(C).公式的分母部分很容易确定(查财务数据,一般包括管理均摊和设备折旧成本,差旅和办公费用,工资福利等).</u><br /><br />问题是，在一个作产品的公司里，开发人员是不能直接创造效益的，比如说领导决定开发一种产品，经过开发人员的辛苦努力，假定需求和质量是完全满足产品经理的需求，但产品因为某些原因没有产生效益，那么是不是开发人员产生的价值为零，如果按照以上的标准，奖金肯定是没有的。所以在这个层面，理想状况是开发人员对产品经理负责，不考律市场状况来决定奖金，但实际是不太可能的。
          <br/>
          <span style="color:red;">
            <a href="http://zhangyang.javaeye.com/topic/233761#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 10:39:09 +0800</pubDate>
        <link>http://www.javaeye.com/topic/233761</link>
        <guid>http://www.javaeye.com/topic/233761</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/231725" style="color:red;">http://www.javaeye.com/topic/231725</a>&nbsp;
          发表时间: 2008年08月22日
          <br/>
          声明：本文系JavaEye网站发布的原创文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p><span lang="EN-US" style="font-size: 9pt; color: black; font-family: Verdana;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;</span><span style="font-family: 宋体;"><span style="font-size: 10.5pt; color: black; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana;">接触项目管理也有一段时间了，给我感触比较深的还是项目风险控制和管理这块，尤记得当初做风险识别时，为了把我们的风险库建立的足够强大，大家坐在一起拍脑门想风险，尽可能的把所有风险都想到了，连类似四川大地震这样的风险也没放过。其实看着这些风险我的心里却觉得不大踏实，为什么呢？因为经过我反思之前做项目所经历的风险，发现这个风险库看似很庞大，其实有参考价值的风险其实并不多，像停电、停水、请假、机器、甚至开发过程等风险，不能说不算风险，但不是最致命的，也不是项目延期的真正凶手。我忽然觉得风险就近在眼前，就在在座的各位，在这里我也不拐弯抹角，不客气的说，就是新手在开发过程中，沟通、技术、返工的占去了大量的时间和成本，这个话题就不展开，各位看客心里应该也有数。那么我想就新手为什么就成了项目的风险，新手新在哪里和各位讨论。</span><span lang="EN-US" style="font-size: 10.5pt; color: black; font-family: Verdana;"></span></span></p>
<p><span lang="EN-US" style="font-size: 10.5pt; color: black; font-family: Verdana;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="font-family: 宋体;"><span style="font-size: 10.5pt; color: black; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana;">首先我觉得不是因为能力问题，我觉得能力这个东西不好说，因为一个有经验的人可能在某些方面比新手熟练，但并不能说明能力一定比新手强。也不是态度问题，我想大部分新手还是抱着学习的态度来工作的，你分配一些任务，总是还会去执行的，比起老手反而更积极。也不是技术问题，在日新月异的技术面前，新手在学习热情方面甚至还具有一些优势。</span><span lang="EN-US" style="font-size: 10.5pt; color: black; font-family: Verdana;"></span></span></p>
<p><span lang="EN-US" style="font-size: 10.5pt; color: black; font-family: Verdana;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="font-size: 10.5pt; color: black; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana;"><span style="font-family: 宋体;">最后我觉得最重要的是产品质量意识问题，我一直都认为质量这个东西是全员参与的，质量这个东西脱离不了一线的生产者。据我的了解，新手在这方面做得很糟糕，我想原因可能和学校的教育有关，新手刚从学校里面出来，学校其实让我们养成了很多坏毛病，最主要的就是养成了应试的思维，我想大部人在学校里面是应付过来的吧，当然这个也和学校非人性化教育有关，总之我认为学校教会了我们学会应付的本事。我所接触的新手大都是这点让人很头疼，分配给他们一些任务，总是会有各式各样的问题，比如该用</span></span><span lang="EN-US" style="font-size: 10.5pt; color: black; font-family: Verdana;">ajax</span><span style="font-size: 10.5pt; color: black; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana;"><span style="font-family: 宋体;">的地方不用，页面上的细节不去调整，还有更要命的是写完的东西不去测试，总是会隐藏很多</span></span><span lang="EN-US" style="font-size: 10.5pt; color: black; font-family: Verdana;">bug</span><span style="font-size: 10.5pt; color: black; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana;"><span style="font-family: 宋体;">，举个夸张点的例子吧，叫做个后台文章审核，点击审核后按理是</span></span><span lang="EN-US" style="font-size: 10.5pt; color: black; font-family: Verdana;">ajax</span><span style="font-size: 10.5pt; color: black; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana;"><span style="font-family: 宋体;">刷新那条文章，结果点击后页面动都不动，问之，答曰，你手工刷新下页面就看到变化了</span></span><span lang="EN-US" style="font-size: 10.5pt; color: black; font-family: Verdana;">&nbsp;</span><span style="font-size: 10.5pt; color: black; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana;"><span style="font-family: 宋体;">。其实我理解他的意思，他的意思是他确实做了这件事，至于这件事要不要达到</span></span><span lang="EN-US" style="font-size: 10.5pt; color: black; font-family: Verdana;">100</span><span style="font-family: 宋体;"><span style="font-size: 10.5pt; color: black; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana;">分他不关心，如果这件事发生在学校，其实很正常，我当年就经常这样忽悠老师的，但在真实的产品中，一点失误就会让质量下降一分，之后我们又会为质量付出惨重的代价。</span><span lang="EN-US" style="font-size: 10.5pt; color: black; font-family: Verdana;"></span></span></p>
<p><span lang="EN-US" style="font-size: 10.5pt; color: black; font-family: Verdana;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="font-size: 10.5pt; color: black; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana;"><span style="font-family: 宋体;">以上是我的一点不成熟的想法，欢迎批评指正</span></span><span lang="EN-US" style="font-size: 10.5pt; color: black; font-family: Verdana;">&nbsp;&nbsp; </span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span lang="EN-US"><span style="font-size: small; font-family: Times New Roman;">&nbsp;</span></span></p>
<p>&nbsp;</p>
          <br/>
          <span style="color:red;">
            <a href="http://zhangyang.javaeye.com/topic/231725#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Fri, 22 Aug 2008 21:29:06 +0800</pubDate>
        <link>http://www.javaeye.com/topic/231725</link>
        <guid>http://www.javaeye.com/topic/231725</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://zhangyang.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/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:23:05 +0800</pubDate>
        <link>http://www.javaeye.com/topic/233907</link>
        <guid>http://www.javaeye.com/topic/233907</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/>
          <address><a href="http://www.javaeye.com/topic/153171">ActiveMQ5.0实战一: 安装配置ActiveMQ5.0</a>
</address>
<address><a href="http://www.javaeye.com/topic/154092">ActiveMQ5.0实战二: 基本配置</a>
</address>
<h3>简介</h3>
<p>实战一
, 实战二
介绍了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=&quot;jmsConnectionFactory&quot; brokerURL=&quot;vm://localhost&quot; /&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=&quot;false&quot; persistent=&quot;true&quot;&gt;
		&lt;amq:persistenceAdapter&gt;
			&lt;amq:amqPersistenceAdapter directory=&quot;d:/amq&quot;/&gt;
		&lt;/amq:persistenceAdapter&gt;
		&lt;amq:transportConnectors&gt;
			&lt;amq:transportConnector uri=&quot;tcp://localhost:0&quot; /&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=&quot;TOPIC&quot; physicalName=&quot;JMS-TEST-TOPIC&quot; /&gt;
&lt;!--  使用Queue方式--&gt;
&lt;amq:queue name=&quot;QUEUE&quot; physicalName=&quot;JMS-TEST-QUEUE&quot; /&gt;</pre>
<h4>&nbsp;3. JmsTemplate</h4>
<pre name="code" class="xml">&lt;!--  Spring JmsTemplate config --&gt;
	&lt;bean id=&quot;jmsTemplate&quot; class=&quot;org.springframework.jms.core.JmsTemplate&quot;&gt;
		&lt;property name=&quot;connectionFactory&quot;&gt;
			&lt;!--  lets wrap in a pool to avoid creating a connection per send --&gt;
			&lt;bean class=&quot;org.springframework.jms.connection.SingleConnectionFactory&quot;&gt;
				&lt;property name=&quot;targetConnectionFactory&quot; ref=&quot;jmsConnectionFactory&quot; /&gt;
			&lt;/bean&gt;
		&lt;/property&gt;
		&lt;!-- custom MessageConverter --&gt;
		&lt;property name=&quot;messageConverter&quot; ref=&quot;defaultMessageConverter&quot; /&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=&quot;defaultMessageConverter&quot; class=&quot;com.andyao.activemq.DefaultMessageConverter&quot; /&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=&quot;topicMessageProducer&quot; class=&quot;com.andyao.activemq.TopicMessageProducer&quot;&gt;
		&lt;property name=&quot;template&quot; ref=&quot;jmsTemplate&quot; /&gt;
		&lt;property name=&quot;destination&quot; ref=&quot;TOPIC&quot; /&gt;
	&lt;/bean&gt;
	&lt;bean id=&quot;queueMessageProducer&quot; class=&quot;com.andyao.activemq.QueuMessageProducer&quot;&gt;
		&lt;property name=&quot;template&quot; ref=&quot;jmsTemplate&quot; /&gt;
		&lt;property name=&quot;destination&quot; ref=&quot;QUEUE&quot; /&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=&quot;topicConsumerA&quot; class=&quot;com.andyao.activemq.TopicConsumerA&quot; /&gt;
    &lt;!-- consumer2 for topic a --&gt;
    &lt;bean id=&quot;topicConsumerB&quot; class=&quot;com.andyao.activemq.TopicConsumerB&quot; /&gt;
    &lt;!-- consumer for queue --&gt;
    &lt;bean id=&quot;queueConsumer&quot; class=&quot;com.andyao.activemq.QueueConsumer&quot; /&gt;</pre>
<h4>
&nbsp;
7. MessageListener</h4>
<p>每一个消息消费者都对应一个MessageListener</p>
<pre name="code" class="xml">&lt;bean id=&quot;topicListenerA&quot; class=&quot;org.springframework.jms.listener.adapter.MessageListenerAdapter&quot;&gt;
		&lt;constructor-arg ref=&quot;topicConsumerA&quot; /&gt;
		&lt;!--  may be other method --&gt;
		&lt;property name=&quot;defaultListenerMethod&quot; value=&quot;receive&quot; /&gt;
		&lt;!-- custom MessageConverter define --&gt;
		&lt;property name=&quot;messageConverter&quot; ref=&quot;defaultMessageConverter&quot; /&gt;
	&lt;/bean&gt;

	&lt;bean id=&quot;topicListenerB&quot; class=&quot;org.springframework.jms.listener.adapter.MessageListenerAdapter&quot;&gt;
		&lt;constructor-arg ref=&quot;topicConsumerB&quot; /&gt;
		&lt;!--  may be other method --&gt;
		&lt;property name=&quot;defaultListenerMethod&quot; value=&quot;receive&quot; /&gt;
		&lt;!-- custom MessageConverter define --&gt;
		&lt;property name=&quot;messageConverter&quot; ref=&quot;defaultMessageConverter&quot; /&gt;
	&lt;/bean&gt;

    &lt;bean id=&quot;queueListener&quot; class=&quot;org.springframework.jms.listener.adapter.MessageListenerAdapter&quot;&gt;
		&lt;constructor-arg ref=&quot;queueConsumer&quot; /&gt;
		&lt;!--  may be other method --&gt;
		&lt;property name=&quot;defaultListenerMethod&quot; value=&quot;receive&quot; /&gt;
		&lt;!-- custom MessageConverter define --&gt;
		&lt;property name=&quot;messageConverter&quot; ref=&quot;defaultMessageConverter&quot; /&gt;
	&lt;/bean&gt;</pre>
<h4>&nbsp;8. MessageListenerContainer</h4>
<p>&nbsp;有几个MessageListener既有几个MessageListenerContainer</p>
<pre name="code" class="xml">&lt;bean id=&quot;topicListenerContainerA&quot; class=&quot;org.springframework.jms.listener.DefaultMessageListenerContainer&quot;&gt;
		&lt;property name=&quot;connectionFactory&quot; ref=&quot;jmsConnectionFactory&quot; /&gt;
		&lt;property name=&quot;destination&quot; ref=&quot;TOPIC&quot; /&gt;
		&lt;property name=&quot;messageListener&quot; ref=&quot;topicListenerA&quot; /&gt;
	&lt;/bean&gt;

    &lt;bean id=&quot;topicListenerContainerB&quot; class=&quot;org.springframework.jms.listener.DefaultMessageListenerContainer&quot;&gt;
		&lt;property name=&quot;connectionFactory&quot; ref=&quot;jmsConnectionFactory&quot; /&gt;
		&lt;property name=&quot;destination&quot; ref=&quot;TOPIC&quot; /&gt;
		&lt;property name=&quot;messageListener&quot; ref=&quot;topicListenerB&quot; /&gt;
	&lt;/bean&gt;
    
    &lt;bean id=&quot;queueListenerContainer&quot; class=&quot;org.springframework.jms.listener.DefaultMessageListenerContainer&quot;&gt;
		&lt;property name=&quot;connectionFactory&quot; ref=&quot;jmsConnectionFactory&quot; /&gt;
		&lt;property name=&quot;destination&quot; ref=&quot;QUEUE&quot; /&gt;
		&lt;property name=&quot;messageListener&quot; ref=&quot;queueListener&quot; /&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://zhangyang.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>JMeter学习的相关网站</title>
        <author>JavaEye网站</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://bingtears.javaeye.com">bingtears</a>&nbsp;
          链接：<a href="http://www.javaeye.com/topic/234258" style="color:red;">http://www.javaeye.com/topic/234258</a>&nbsp;
          发表时间: 2008年08月29日
          <br/>
          声明：本文系JavaEye网站发布的原创文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          1、安装与配置:<br /><br />1.1 安装JDK1.5以上的版本。<br />1.2 配置JMeter<br />1.2.1 Linux环境下（Ubuntu）参考：<br />download最新版本（.tgz），官方网站： http://jakarta.apache.org/jmeter/<br />gunzip ..tgz到某一目录，与JDK同一根目录就好了。<br />运行./jmeter即可。<br />如果有X11 DISPLAY set有问题，请参考：<br />http://hi.baidu.com/lanif/blog/item/94f25e66c76bab26ab184cea.html<br />1.2.2 Windows环境下：<br />download最新版本(.zip)，官方网站： http://jakarta.apache.org/jmeter/<br />解压到某一目录，与JDK同一根目录即可。直接运行.bat就可以了。<br /><br />2、结果分析<br /><br />http://java.chinaitlab.com/tools/355421.html<br /><br />3、使用<br />http://www.51testing.com/?128005/action_spacelist_type_blog_page_2.html
          <br/>
          <span style="color:red;">
            <a href="http://zhangyang.javaeye.com/topic/234258#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Fri, 29 Aug 2008 09:17:10 +0800</pubDate>
        <link>http://www.javaeye.com/topic/234258</link>
        <guid>http://www.javaeye.com/topic/234258</guid>
      </item>
      <item>
        <title>java 读取linux下的硬盘序列号问题</title>
        <author>JavaEye网站</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://paradise2009.javaeye.com">paradise2009</a>&nbsp;
          链接：<a href="http://www.javaeye.com/topic/232444" style="color:red;">http://www.javaeye.com/topic/232444</a>&nbsp;
          发表时间: 2008年08月25日
          <br/>
          声明：本文系JavaEye网站发布的原创文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          想通过java写一个读取安装在linux系统上的硬盘的序列号的util类。<br /><br />我写的代码是：<br /><br /><pre name="code" class="java">import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.List;

/**
 * 
 * Description: 获取各个操作系统下硬盘序列号
 * 
 * 
 * @version 1.0 Aug 25, 2008 12:12:36 PM
 *       
 */

public class HDUtil {

	/**
	 * Return Opertaion System Name;
	 * 
	 * @return os name.
	 */
	public static String getOsName() {
		String os = "";
		os = System.getProperty("os.name");
		return os;
	}

	/**
	 * Returns the HD SerialNo. of the computer.
	 * 
	 * @return the HD SerialNo.
	 */
	public static String getHDSerialNo() {
		String sn = "";
		String os = getOsName();
		if (os.startsWith("Linux")) {
			if (isSCSIorIDEHD() == "scsi") {
				// 注意如果是ubuntu等系统用户，本身没有root权限，请先：chmod 777 /dev/sda
				String command = "hdparm -i /dev/sda";
				Process p;
				try {
					p = Runtime.getRuntime().exec(command);
					BufferedReader br = new BufferedReader(new InputStreamReader(p.getInputStream()));
					String line;
					while ((line = br.readLine()) != null) {
						if (line.contains("SerialNo")) {
							int index = line.indexOf("SerialNo") + "SerialNo".length() + 1;
							sn = line.substring(index);
							break;
						}
					}
					br.close();
				} catch (IOException e) {
				}
			} else if (isSCSIorIDEHD() == "ide") {
				// 注意如果是ubuntu等系统用户，本身没有root权限，请先：chmod 777 /dev/sda
				String command = "hdparm -i /dev/hda";
				Process p;
				try {
					p = Runtime.getRuntime().exec(command);
					BufferedReader br = new BufferedReader(new InputStreamReader(p.getInputStream()));
					String line;
					while ((line = br.readLine()) != null) {
						if (line.contains("SerialNo")) {
							int index = line.indexOf("SerialNo") + "SerialNo".length() + 1;
							sn = line.substring(index);
							break;
						}
					}
					br.close();
				} catch (IOException e) {
				}
			} else {
				sn = "unknown";
			}

		}
		sn = sn.trim();
		return sn;
	}

	public static String isSCSIorIDEHD() {
		String os = getOsName();
		if (os.startsWith("Linux")) {
			// ubuntu系统下确定有root权限
			String command = "fdisk -l";
			Process p;
			try {
				p = Runtime.getRuntime().exec(command);
				BufferedReader br = new BufferedReader(new InputStreamReader(p.getInputStream()));
				String line;
				while ((line = br.readLine()) != null) {
					if (line.contains("sd")) {
						return "scsi";
					}
					if (line.contains("hd")) {
						return "ide";
					}
				}
				br.close();
			} catch (IOException e) {
			}
		}
		return "unkonwn"; // 未知类型
	}

	/**
	 * Main Class.
	 * 
	 * @param args
	 */
	public static void main(String[] args) {
		System.out.println("Operation System=" + getOsName());
		System.out.println("HD SerialNo=" + getHDSerialNo());
	}
}</pre><br /><br />现在在本地机器ubuntu上可以运行,但是放到其他比如Centos或suse上获取不了。<br />根本原因是通过java调用的一个SHELL>"hdparm -i /dev/sda1" ,这个命令对于SCSI 的硬盘好像支持不了。<br /><br />有谁做过的给个建议阿。好多人说用c写个底层的，然后通过jni调用。那样不是系统得有c的运行环境吗？<br />我觉得一个util类有这个必要吗？
          <br/>
          <span style="color:red;">
            <a href="http://zhangyang.javaeye.com/topic/232444#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Mon, 25 Aug 2008 14:38:24 +0800</pubDate>
        <link>http://www.javaeye.com/topic/232444</link>
        <guid>http://www.javaeye.com/topic/232444</guid>
      </item>
      <item>
        <title>struts 2 中的doubleselect（jdbc实现） </title>
        <author>JavaEye网站</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://taijh999.javaeye.com">taijh999</a>&nbsp;
          链接：<a href="http://www.javaeye.com/topic/234239" style="color:red;">http://www.javaeye.com/topic/234239</a>&nbsp;
          发表时间: 2008年08月29日
          <br/>
          声明：本文系JavaEye网站发布的原创文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p>struts 2中的doubleselect 实现了级联操作，本文通过一个简单的是实例，说明怎样对数据库中的表进行级联。</p>
<p>希望对初学者有点滴的帮助。</p>
<p>本文给出了完整的实现过程，并有源代码下载。</p>
<p>本文参考了<a href="http://opas.javaeye.com/blog/183518">http://opas.javaeye.com/blog/183518</a> 向作者表示谢意</p>
<p>&nbsp;</p>
<p><span style="color: #ff0000; font-size: medium;">注意：用IE来看本文，要不然贴图看不到</span></p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>首先建立数据库</p>
<pre name="code" class="java">CREATE DATABASE JPETSTORE;
USE JPETSTORE;

create table category (
	catid varchar(10) not null,
	name varchar(80) null,
	descn varchar(255) null,
	constraint pk_category primary key (catid)
);

create table product (
    productid varchar(10) not null,
    category varchar(10) not null,
    name varchar(80) null,
    descn varchar(255) null,
    constraint pk_product primary key (productid),
        constraint fk_product_1 foreign key (category)
        references category (catid)
);

INSERT INTO category VALUES ('FISH','Fish','&lt;image src="../images/fish_icon.gif"&gt;&lt;font size="5" color="blue"&gt; Fish&lt;/font&gt;');
INSERT INTO category VALUES ('DOGS','Dogs','&lt;image src="../images/dogs_icon.gif"&gt;&lt;font size="5" color="blue"&gt; Dogs&lt;/font&gt;');
INSERT INTO category VALUES ('REPTILES','Reptiles','&lt;image src="../images/reptiles_icon.gif"&gt;&lt;font size="5" color="blue"&gt; Reptiles&lt;/font&gt;');
INSERT INTO category VALUES ('CATS','Cats','&lt;image src="../images/cats_icon.gif"&gt;&lt;font size="5" color="blue"&gt; Cats&lt;/font&gt;');
INSERT INTO category VALUES ('BIRDS','Birds','&lt;image src="../images/birds_icon.gif"&gt;&lt;font size="5" color="blue"&gt; Birds&lt;/font&gt;');

INSERT INTO product VALUES ('FI-SW-01','FISH','Angelfish','&lt;image src="../images/fish1.gif"&gt;Salt Water fish from Australia');
INSERT INTO product VALUES ('FI-SW-02','FISH','Tiger Shark','&lt;image src="../images/fish4.gif"&gt;Salt Water fish from Australia');
INSERT INTO product VALUES ('FI-FW-01','FISH', 'Koi','&lt;image src="../images/fish3.gif"&gt;Fresh Water fish from Japan');
INSERT INTO product VALUES ('FI-FW-02','FISH', 'Goldfish','&lt;image src="../images/fish2.gif"&gt;Fresh Water fish from China');
INSERT INTO product VALUES ('K9-BD-01','DOGS','Bulldog','&lt;image src="../images/dog2.gif"&gt;Friendly dog from England');
INSERT INTO product VALUES ('K9-PO-02','DOGS','Poodle','&lt;image src="../images/dog6.gif"&gt;Cute dog from France');
INSERT INTO product VALUES ('K9-DL-01','DOGS', 'Dalmation','&lt;image src="../images/dog5.gif"&gt;Great dog for a Fire Station');
INSERT INTO product VALUES ('K9-RT-01','DOGS', 'Golden Retriever','&lt;image src="../images/dog1.gif"&gt;Great family dog');
INSERT INTO product VALUES ('K9-RT-02','DOGS', 'Labrador Retriever','&lt;image src="../images/dog5.gif"&gt;Great hunting dog');
INSERT INTO product VALUES ('K9-CW-01','DOGS', 'Chihuahua','&lt;image src="../images/dog4.gif"&gt;Great companion dog');
INSERT INTO product VALUES ('RP-SN-01','REPTILES','Rattlesnake','&lt;image src="../images/snake1.gif"&gt;Doubles as a watch dog');
INSERT INTO product VALUES ('RP-LI-02','REPTILES','Iguana','&lt;image src="../images/lizard1.gif"&gt;Friendly green friend');
INSERT INTO product VALUES ('FL-DSH-01','CATS','Manx','&lt;image src="../images/cat2.gif"&gt;Great for reducing mouse populations');
INSERT INTO product VALUES ('FL-DLH-02','CATS','Persian','&lt;image src="../images/cat1.gif"&gt;Friendly house cat, doubles as a princess');
INSERT INTO product VALUES ('AV-CB-01','BIRDS','Amazon Parrot','&lt;image src="../images/bird2.gif"&gt;Great companion for up to 75 years');
INSERT INTO product VALUES ('AV-SB-02','BIRDS','Finch','&lt;image src="../images/bird1.gif"&gt;Great stress reliever');

</pre>
<p>
项目贴图：</p>
<p><img src="d:/shili.jpg" alt="" />&nbsp;
</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp; 数据库操作代码</p>
<pre name="code" class="java">package petstore.dbc;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;

public class DataBaseConnection {

    private String DBDRIVER = "com.mysql.jdbc.Driver";
    private String DBURL = "jdbc:mysql://localhost:3306/jpetstore?characterEncoding=gbk";
    private String DBUSER = "root";
    private String DBPASSWORD = "";
    private Connection conn = null;

    public DataBaseConnection() {
        try {
            Class.forName(DBDRIVER);
            this.conn = DriverManager.getConnection(DBURL, DBUSER, DBPASSWORD);
        } catch (ClassNotFoundException e) {
            System.out.println("驱动程序不存在或名字写错");
            System.out.println(e.getMessage());
        } catch (SQLException e) {
            System.out.println("数据库操作错误");
            System.out.println(e.getMessage());
        }
    }

    public Connection getConnection() {
        return this.conn;
    }

    public void close() {
        try {
            this.conn.close();
        } catch (Exception e) {
        }
    }
};</pre>
<p>&nbsp;用到的实体类</p>
<pre name="code" class="java">package petstore.model;

import java.io.Serializable;


public class Category implements Serializable {

  private String categoryId;
  private String name;
  private String description;

  public String getCategoryId() {
    return categoryId;
  }

  public void setCategoryId(String categoryId) {
    this.categoryId = categoryId.trim();
  }

  public String getName() {
    return name;
  }

  public void setName(String name) {
    this.name = name;
  }

  public String getDescription() {
    return description;
  }

  public void setDescription(String description) {
    this.description = description;
  }

  

}
</pre>
&nbsp;
<pre name="code" class="java">package petstore.model;

import java.io.Serializable;


public class Product implements Serializable {

  private String productId;
  private String categoryId;
  private String name;
  private String description;

  public String getProductId() {
    return productId;
  }

  public void setProductId(String productId) {
    this.productId = productId.trim();
  }

  public String getCategoryId() {
    return categoryId;
  }

  public void setCategoryId(String categoryId) {
    this.categoryId = categoryId;
  }

  public String getName() {
    return name;
  }

  public void setName(String name) {
    this.name = name;
  }

  public String getDescription() {
    return description;
  }

  public void setDescription(String description) {
    this.description = description;
  }

  public String toString() {
    return getName();
  }

}
</pre>
<p>&nbsp;dao类：</p>
<pre name="code" class="java">/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package petstore.dao;


import petstore.dbc.DataBaseConnection;
import petstore.model.Category;


import java.sql.* ;
import java.util.* ;


public class CategoryDao 
{
	// 增加操作
	
	// 查询全部
	public List&lt;Category&gt; findAll() throws Exception
	{
		List &lt;Category&gt;all = new ArrayList&lt;Category&gt;() ;
		String sql = "SELECT CatId,name,descn FROM Category" ;
		PreparedStatement pstmt = null ;
		DataBaseConnection dbc = null ;
		dbc = new DataBaseConnection() ;
		try
		{
			pstmt = dbc.getConnection().prepareStatement(sql) ;
			ResultSet rs = pstmt.executeQuery() ;
			while(rs.next())
			{
				Category Category = new Category() ;
				Category.setCategoryId(rs.getString(1)) ;
				Category.setName(rs.getString(2)) ;
				Category.setDescription(rs.getString(3)) ;
				all.add(Category) ;
			}
			rs.close() ;
			pstmt.close() ;
		}
		catch (Exception e)
		{
			System.out.println(e) ;
			throw new Exception("操作中出现错误！！！") ;
		}
		finally
		{
			dbc.close() ;
		}
		return all ;
	}
	// 模糊查询
	
};
</pre>
&nbsp;
<pre name="code" class="java">/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package petstore.dao;


import petstore.dbc.DataBaseConnection;
import petstore.model.Product;


import java.sql.* ;
import java.util.* ;


public class ProductDao 
{
	// 增加操作
	
	// 查询全部
	public List findAll() throws Exception
	{
		List all = new ArrayList() ;
		String sql = "SELECT productId,categoryId,name,description FROM Product" ;
		PreparedStatement pstmt = null ;
		DataBaseConnection dbc = null ;
		dbc = new DataBaseConnection() ;
		try
		{
			pstmt = dbc.getConnection().prepareStatement(sql) ;
			ResultSet rs = pstmt.executeQuery() ;
			while(rs.next())
			{
				Product Product = new Product() ;
				Product.setProductId(rs.getString(1)) ;
				Product.setCategoryId(rs.getString(2)) ;
				Product.setName(rs.getString(3)) ;
				Product.setDescription(rs.getString(4)) ;
				all.add(Product) ;
			}
			rs.close() ;
			pstmt.close() ;
		}
		catch (Exception e)
		{
			System.out.println(e) ;
			throw new Exception("操作中出现错误！！！") ;
		}
		finally
		{
			dbc.close() ;
		}
		return all ;
	}
        public List findProductByCategoryId(String id) throws Exception
	{
		List all = new ArrayList() ;
		String sql = "SELECT productId,category,name,descn FROM Product where category=? " ;
		PreparedStatement pstmt = null ;
		DataBaseConnection dbc = null ;
		dbc = new DataBaseConnection() ;
		try
		{
			pstmt = dbc.getConnection().prepareStatement(sql) ;
                        pstmt.setString(1, id);
			ResultSet rs = pstmt.executeQuery() ;
			while(rs.next())
			{
				Product product = new Product() ;
				product.setProductId(rs.getString(1)) ;
				product.setCategoryId(rs.getString(2)) ;
				product.setName(rs.getString(3)) ;
				product.setDescription(rs.getString(4)) ;
				all.add(product);
                                
			}
			rs.close() ;
			pstmt.close() ;
		}
		catch (Exception e)
		{
			System.out.println(e) ;
			throw new Exception("操作中出现错误！！！") ;
		}
		finally
		{
			dbc.close() ;
		}
		return all;
	}

	// 模糊查询
	
};
</pre>
<p>Struts 2的action:</p>
<pre name="code" class="java">package petstore.action.redirect;

import java.util.HashMap;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;

import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionSupport;

import petstore.dao.CategoryDao;
import petstore.dao.ProductDao;
import petstore.model.Category;
import petstore.model.Product;

public class ItemAddRedirectAction extends ActionSupport {

    private static final long serialVersionUID = 1L;

    public static final String GLOBAL_CATEGORY = "global_category_list"; // 宠物大类列表
    public static final String GLOBAL_DOUBLE_LIST = "global_double_list"; // 宠物类列表

    private ProductDao productDao=new ProductDao();
    private CategoryDao categoryDao=new CategoryDao() ;

    private List&lt;Category&gt; categorys;

    @SuppressWarnings("unchecked")
    private Map doubleMap = new HashMap();

    public List&lt;Category&gt; getCategorys() {
	return categorys;
    }

    public void setCategorys(List&lt;Category&gt; categorys) {
	this.categorys = categorys;
    }

    @SuppressWarnings("unchecked")
    public Map getDoubleMap() {
	return doubleMap;
    }

    @SuppressWarnings("unchecked")
    public void setDoubleMap(Map doubleMap) {
	this.doubleMap = doubleMap;
    }

    public void setProductDao(ProductDao productDao) {
	this.productDao = productDao;
    }

    public void setCategoryDao(CategoryDao categoryDao) {
	this.categoryDao = categoryDao;
    }

    @SuppressWarnings("unchecked")
    @Override
    public String execute() throws Exception {
	
	//优化数据库性能
	categorys = (List) ActionContext.getContext().getSession().get(
		GLOBAL_CATEGORY);

	if (categorys == null) {
	    categorys = categoryDao.findAll();
	    ActionContext.getContext().getSession().put(GLOBAL_CATEGORY,
		    categorys);

	}

	for (int i = 0; i &lt; categorys.size(); i++) {

	    List&lt;Product&gt; products = productDao
		    .findProductByCategoryId(categorys.get(i).getCategoryId());

	    List c = new LinkedList();
	    for (int j = 0; j &lt; products.size(); j++) {

		c.add(products.get(j));
	    }
	    doubleMap.put(categorys.get(i), c);
	}
	return SUCCESS;
    }
}


</pre>
<p>
itemAdd.jsp文件：</p>
<p>&nbsp;</p>
<pre name="code" class="java">&lt;%@ page language="java" contentType="text/html; charset=GB18030"
pageEncoding="GB18030"%&gt;
&lt;%@ taglib prefix="s" uri="/struts-tags"%&gt;
&lt;!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"&gt;
&lt;html&gt;
&lt;head&gt;
&lt;meta http-equiv="Content-Type" content="text/html; charset=GB18030"&gt;
&lt;title&gt;&lt;s:text name="additem_page" /&gt;&lt;/title&gt;
&lt;/head&gt;


&lt;body&gt;
&lt;s:actionerror /&gt;
&lt;p id="title"&gt;
增加宠物
&lt;/p&gt;
&lt;s:form action="itemAddAction" enctype="multipart/form-data" name="itemAdd" id="itemAdd"&gt;
&lt;s:doubleselect name="category" list="<span style="color: #000000;">categorys</span>" doubleName="product"
doubleList="<span style="color: #000000;">doubleMap.get(top)</span>"&gt;&lt;/s:doubleselect&gt;
&lt;s:submit key="submit"&gt;&lt;/s:submit&gt;&lt;s:reset key="reset"&gt;&lt;/s:reset&gt;
&lt;/s:form&gt;
&lt;/body&gt;
&lt;/html&gt; </pre>
<p>需要注意：</p>
<pre name="code" class="java">&lt;s:doubleselect name="category" list="<span style="color: #000000;">categorys</span>" doubleName="product"
doubleList="<span style="color: #000000;">doubleMap.get(top)</span>"&gt;&lt;/s:doubleselect&gt;
</pre>
<p>doubleselect中的list属性是一个Arraylist&nbsp; doublelist属性是一个HashMap</p>
<p>和ItemAddRedirectAction类中的下列代码对应</p>
<pre name="code" class="java">private List&lt;Category&gt; categorys;

  private Map doubleMap = new HashMap();
</pre>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>struts.xml </p>
<pre name="code" class="xml">&lt;?xml version="1.0" encoding="UTF-8"?&gt;
&lt;!DOCTYPE struts PUBLIC
        "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
        "http://struts.apache.org/dtds/struts-2.0.dtd"&gt;
&lt;struts&gt;
    &lt;include file="struts-default.xml"/&gt;
    &lt;package name="struts2" extends="struts-default"&gt;
      
    &lt;action name="directItemAdd" class="petstore.action.redirect.ItemAddRedirectAction"&gt;
&lt;result&gt;/itemAdd.jsp&lt;/result&gt;
&lt;/action&gt; 
        
    &lt;/package&gt;
&lt;/struts&gt;
</pre>
&nbsp;
<p>&nbsp;</p>
<p>web.xml</p>
<pre name="code" class="java">&lt;?xml version="1.0" encoding="UTF-8"?&gt;
&lt;web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"&gt;
  &lt;filter&gt;
        &lt;filter-name&gt;struts2&lt;/filter-name&gt;    
        &lt;filter-class&gt;org.apache.struts2.dispatcher.FilterDispatcher
        &lt;/filter-class&gt;
    &lt;/filter&gt;
    &lt;filter-mapping&gt;
        &lt;filter-name&gt;struts2&lt;/filter-name&gt;
        &lt;url-pattern&gt;/*&lt;/url-pattern&gt;
    &lt;/filter-mapping&gt;
    &lt;welcome-file-list&gt;
        &lt;welcome-file&gt;index.jsp&lt;/welcome-file&gt;
        &lt;/welcome-file-list&gt;
    &lt;/web-app&gt;
</pre>
<p>
&nbsp; 运行图片：用iE才能看到</p>
<p>&nbsp;</p>
<p><img src="file:///C:/DOCUME~1/ADMINI~1/LOCALS~1/Temp/moz-screenshot-1.jpg" alt="" /></p>
<p><img src="file:///C:/DOCUME~1/ADMINI~1/LOCALS~1/Temp/moz-screenshot.jpg" alt="" /></p>
          <br/>
          <span style="color:red;">
            <a href="http://zhangyang.javaeye.com/topic/234239#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Fri, 29 Aug 2008 08:54:50 +0800</pubDate>
        <link>http://www.javaeye.com/topic/234239</link>
        <guid>http://www.javaeye.com/topic/234239</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://zhangyang.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/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 18:03:03 +0800</pubDate>
        <link>http://www.javaeye.com/topic/233363</link>
        <guid>http://www.javaeye.com/topic/233363</guid>
      </item>
      <item>
        <title>在Oracle中实现定时操作</title>
        <author>JavaEye网站</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://staratsky.javaeye.com">mfcai</a>&nbsp;
          链接：<a href="http://www.javaeye.com/topic/234224" style="color:red;">http://www.javaeye.com/topic/234224</a>&nbsp;
          发表时间: 2008年08月29日
          <br/>
          声明：本文系JavaEye网站发布的原创文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          常要oracle数据库定时的自动执行一些脚本，或做数据库备份，或做数据的提炼，或做数据库的性能优化，包括重建索引等等的工作,这时需要用到一个函数dbms_job.submit，来完成Oracle定时器Job时间的处理上。使用dbms_job.submit这个函数，我们只需要考虑两个事情：安排某一任务，和定制一个执行任务的时间点。但最重要也是最棘手的事情，我认为还是确定一个执行任务的时间点。时间点确定了，其他的事情就好办了。下面是函数dbms_job.submit使用方法：<br /><pre name="code" class="java">
dbms_job.submit( job out binary_integer,
what　　　　　　　in　　　archar2,
next_date　　　 　in　　　date，
interval　　　　　in　　　varchar2,
no_parse　　　　　in　　　boolean)
</pre><br />其中：<br />●job：输出变量，是此任务在任务队列中的编号；<br />●what：执行的任务的名称及其输入参数；<br />●next_date：任务执行的时间；<br />●interval：任务执行的时间间隔。<br />其中Interval这个值是决定Job何时，被重新执行的关键；当interval设置为null时，该job执行结束后，就被从队列中删除。假如我们需要该job周期性地执行，则要用‘sysdate＋m’表示。如何更好地确定执行时间的间隔需要我们掌握一个函数TRUNC。<br /><br />1.TRUNC(for dates)<br />TRUNC函数为指定元素而截去的日期值。<br />其具体的语法格式如下：<br />TRUNC（date[,fmt]）<br />其中：<br />date 一个日期值<br />fmt 日期格式，该日期将由指定的元素格式所截去。忽略它则由最近的日期截去<br />下