<?xml version="1.0" encoding="UTF-8" ?>
<rss version="2.0">
  <channel>
    <title>drinkjava</title>
    <description></description>
    <link>http://drinkjava.javaeye.com</link>
    <language>UTF-8</language>
    <copyright>Copyright 2003-2008, JavaEye.com</copyright>
    <docs>http://blogs.law.harvard.edu/tech/rss</docs>
    <generator>JavaEye - 做最棒的软件开发交流社区</generator>
      <item>
        <title>征求开源脚手架项目发起人</title>
        <author>drinkjava</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://drinkjava.javaeye.com">drinkjava</a>&nbsp;
          链接：<a href="http://drinkjava.javaeye.com/blog/216419" style="color:red;">http://drinkjava.javaeye.com/blog/216419</a>&nbsp;
          发表时间: 2008年07月19日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          对于初学者来说，调通一个能运用于实际项目的框架并不容易,但对于做过项目的人来说，项目架构往往成了私人(公司)的战利品，从而密而不宣，这实在不是一个好的风气。希望有人带个头，组织一下人手，将现有的流行架构归纳一下，作出能跑的通的实例，我的意思是说："将开源项目的排列组合做成一个开源项目"，从而给初学者带来实实在在的实惠而不是一堆华而不实的理论，如:<br />struts1+spring+hibernate<br />Struts2+spring+sitemesh+tiles<br />webwork+spring+hibernate+sitemesh<br />webwork+spring+ibatis+freemaker<br />webwork+springjdbc+freemaker<br />......<br />以上排列组合可能有无限可能，但最常用的应在几十种左右,人多力量大，这并不是一件难办到的事情。<br />web架构无非是解决以下问题： 持久层，i18n， 验证，分页，页面输出，日志....，我将这些需求归纳了一下，做了一个最简单的需求设计，绝对比petstore要容量实现得多，我们关心的是架构，因此业务逻辑要简化到不能再简化为止（详见附件)，所有的脚手架都基于同一个最简单的需求来实现。
          <br/>
          <span style="color:red;">
            <a href="http://drinkjava.javaeye.com/blog/216419#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Sat, 19 Jul 2008 00:06:04 +0800</pubDate>
        <link>http://drinkjava.javaeye.com/blog/216419</link>
        <guid>http://drinkjava.javaeye.com/blog/216419</guid>
      </item>
      <item>
        <title>写了个纯对象化的,代替Tiles和SiteMesh的布局工具jWebBox(已开源),大家评一评</title>
        <author>drinkjava</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://drinkjava.javaeye.com">drinkjava</a>&nbsp;
          链接：<a href="http://drinkjava.javaeye.com/blog/161094" style="color:red;">http://drinkjava.javaeye.com/blog/161094</a>&nbsp;
          发表时间: 2008年02月02日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          项目在 <a href="http://sourceforge.net/projects/jwebbox" target="_blank">http://sourceforge.net/projects/jwebbox</a><br />  解压后里面有个war包，扔到Tomcat6.0目录下就可以了，这是个很小的包，里面没有引用其它包，绝对能跑起来。<br />  主要特点: 实现了Tiles的类似功能，完全对象化，无需配置，直接在页面可动态生成其它页面组件(称做Box),从此，面向对象的那一套什么继承接口之类的，就可以放手用在页面布局上了。多说无益，还是看看代码吧：<br />  JSP源码示例一:<br />  (注：新版演示中jsp中源码已移到单独类中，但道理是一样的，以下内容是针对1.0版的,为了省打几个字就不把新版内容贴上来了，有兴趣的可自已去下载)<br /><pre name="code" class="java">
&lt;%@page import="com.jwebbox.Box"%>
&lt;%
	class HomePage extends Box{
	public void init(){
	this.setPage("/MainLayoutBox.jsp");	
	this.putBox("top", new Box("/menu.jsp").setAttribute("msg","(Demo3: show how to extends a Box)"));
	this.putBox("left", new Box().addRunable("/alex.jsp"));
	this.putBox("right", new Box("/david.jsp"));
	this.putBox("bottom", new Box("/james.jsp"));
	}
}	
	class OtherPage extends HomePage{}
    new OtherPage().putBox("right",new Box("/peter.jsp")).putBox("bottom",new Box()).show(pageContext);;
%>
</pre><br />   以上代码先生成一个Box对象，再设它的模板为MainLayoutBox.jsp, 然后给它上下左右栏赋值, 然后是另一个类继承于它并生成一个实例，修改父类的属性后调用show()方法显示出来。页面截图见附图第一张。可见，这个布局方法直接了当，不要任何配置文件。为了演示，我将代码直接写在jsp中,其实也可以抽出来写到单独的java文件中。<br />   以上源码中引用到的JSP布局模板文件源码如下：<br />   <pre name="code" class="java">
&lt;%@page import="com.jwebbox.Box"%>
&lt;!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
&lt;html xmlns="http://www.w3.org/1999/xhtml">
&lt;head>
&lt;style type="text/css">
&lt;!--
#temp_content {width: 900px; margin: auto; background-color:#EEEEEE;}
#temp_content #temp_left {margin: 10px; width: 500px; float: left; background-color:#CCFFCC; }
#temp_content #temp_bottom {clear: both; margin: 10px;background-color:#9999CC;}
#temp_content #temp_top {margin: 10px;background-color:#99CCCC;}
#temp_content #temp_right {margin: 10px; float: right; width: 350px;background-color:#FFFFCC;}
-->
&lt;/style>
&lt;/head>
&lt;%
	Box m = Box.getBox(pageContext);
%>
	&lt;body>
		&lt;div id="temp_content">
			&lt;div id="temp_top">
				&lt;div align="center">
				&lt;%m.getBoxFromMap("top").show(pageContext);	%>
				&lt;/div>
			&lt;/div>
			&lt;div id="temp_left">
				&lt;%m.getBoxFromMap("left").show(pageContext);%>
			&lt;/div>
			&lt;div id="temp_right">
				&lt;%m.getBoxFromMap("right").show(pageContext);%>
			&lt;/div>
			&lt;div id="temp_bottom">
				&lt;div align="center">
				&lt;%m.getBoxFromMap("bottom").show(pageContext);%>
				&lt;/div>
			&lt;/div>
		&lt;/div>
	&lt;/body>
&lt;/html>
</pre><br />    这是一个常见的四栏布局，就不多说了。<br /><br />   JSP源码示例二:<br /><pre name="code" class="java">
&lt;%@page import="com.jwebboxtest.GetSportsController"%>
&lt;%@page import="com.jwebbox.Box"%>
&lt;%@page import="com.jwebbox.TableBox"%>
&lt;%
	class HomePage extends Box{
	public void init(){
	this.setPage("/MainLayoutBox.jsp");	
	TableBox table = new TableBox(null,GetSportsController.class);
	table.setAttribute("name","tom");	
	table.setRow(30);
	table.setCol(1);
	table.setElementBox(new Box("/tom.jsp"));
	table.setRenderBox(new Box("/tomRender.jsp").setAttribute("title","Hi, I'm Tom"));
	this.putBox("top", new Box("/menu.jsp").setAttribute("msg","(Demo2: show how to initializ params and use your render page.)"));
	this.putBox("left", new Box().addRunable("/alex.jsp").addRunable(table).addRunable("/peter.jsp"));
	this.putBox("right", new Box().addRunable("/david.jsp").addRunable("/peter.jsp").addRunable("/james.jsp"));
	this.putBox("bottom", new Box("/peter.jsp"));
	}
}	
	new HomePage().show(pageContext);
%>
</pre><br />  以上代码主要演示了一个TableBox的用法，这个TableBox是继承于Box的一个子类，用于表格的显示，效果图见附图2。 这个演示还涉及到tomRender.jsp,tom.jsp,GetSportsController.class三个文件，tomRender.jsp是一个表格的模板(如不给出模板，系统会使用默认自带的一个html格式), tom.jsp是要显示元素的模板，另一个文件GetSportsController.class 相当于Tiles中的Controller,用于生成数据，用过Tiles的都知道，我就不多讲了，源码如下<br /><pre name="code" class="java">public class GetSportsController implements BoxController {
	static final String[] sports = { "basketball", "soccer", "vollyball" };

	public void execute(PageContext pageContext, Box box) {
		TableBox table = (TableBox) box;
		String name = (String) table.getAttribute("name");
		List&lt;Object> l = new ArrayList&lt;Object>();
		for (int i = 1; i &lt;= table.getCol() * table.getRow(); i++) {
			l.add(new String[] { name, String.valueOf(i), sports[i % 3] });
		}
		table.setElementList(l);
	};
}</pre><br />   和Tiles中的Controller是类似的,上面实际上和一个分页查询的逻辑是类似的。另外Box类和Tiles一样，也可以指定一个ControllerURL来往Request里压数据。我编写TableBox的主要目的是验证一下Box基类的作用，同样的道理，以后编写其它页面组件应该也不难，这里面用对象编程的好处就体现出来了。      <br />   有兴趣的同志们可以当下来试一试。只要是JSP页面，这个布局工具就能用，唯一要做的就是把jwebbox1_0.jar这个包扔到WEB-INF/Lib目录下。<br />   目前还是1.0版，错误肯定不少，欢呼大家指正。我今后初步的打算是在它的单例化、序列化上做一些改进，如果有时间，再加一些分页条，Tree等组件进来, 本来只想做一个布局工具的，不知不觉要做成组件包了，也不知道是好还是坏,但有一点可以肯定的是，这些组件在Eclipse中只要敲个点号，就会有代码提示，并有编译检查，绝对比标签好用。
          <br/>
          <span style="color:red;">
            <a href="http://drinkjava.javaeye.com/blog/161094#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Sat, 02 Feb 2008 07:35:02 +0800</pubDate>
        <link>http://drinkjava.javaeye.com/blog/161094</link>
        <guid>http://drinkjava.javaeye.com/blog/161094</guid>
      </item>
      <item>
        <title>一个用Delphi做的通用UI功能测试方案,大家提提意见</title>
        <author>drinkjava</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://drinkjava.javaeye.com">drinkjava</a>&nbsp;
          链接：<a href="http://drinkjava.javaeye.com/blog/118110" style="color:red;">http://drinkjava.javaeye.com/blog/118110</a>&nbsp;
          发表时间: 2007年08月30日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          常见的功能测试软件需要了解DOM或SWT,SWING对象，我觉得简直是多此一举。<br />   我正在用Delphi做一个验收测试程序，貌似可以男女老少大小通吃,可用于web,SWT,swing,桌面或甚至手机测试，原理是局部截屏,<br />再通过全屏图像匹配查找，来定位鼠标，模拟键盘输入，并作正确性判断。Delphi本身即做为测试脚本语言,并做数据库清空比对以及日志输出。<br />   编的过程中有两个难点，不过好在都解决了，一个是图像匹配速度问题，利用到了scanline来快速取点。另一个是表单的输入，如果也用截屏的方法，<br />反而比较笨拙，好在Delphi自带了Webbrowser，可用于html表单解析,可以两者结合起来用,用于表单项比较多的情况。<br />   此软件的目的着重于功能测试，不考虑压力测试，也不适用于UI整体配色、背景、字体经常变换的情况。<br /><br />一个测试更改用户名的脚本示例：<br /><br />try<br />  testName:='account';	  	//指定测试数据存放在\account\目录下	<br />  clickAt('profileLink'); 	//在全屏查找\account\profileLink.bmp图像，找到后鼠标单击它, 超出一定时限后还找不到则出错<br />  waitfor('submit');      	//等待表单提交link显示出来，直到超时出错<br />  clickAtRight('username');    //点username.bmp对应的输入栏,鼠标将会点在匹配部分的右边沿中心点，即text input部分，而不是点在文字上<br />  writekeys(KEY_CLEAR);		//模拟键盘输入，将现有内容删除<br />  writekeys('abc');     	//输入一些字符<br />  clickAt('submit');   		//点提交link<br />  waitfor('success');    	//等待成功画面出现<br />  checkDB('select username from user where userid=`001`','abc'); //比对数据库<br />  log.add('account test passed!');<br />except<br />  log.add('account test failed!');<br />end;
          <br/>
          <span style="color:red;">
            <a href="http://drinkjava.javaeye.com/blog/118110#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, 30 Aug 2007 02:23:33 +0800</pubDate>
        <link>http://drinkjava.javaeye.com/blog/118110</link>
        <guid>http://drinkjava.javaeye.com/blog/118110</guid>
      </item>
      <item>
        <title>为什么用Hibernate时一定要做关联映射？</title>
        <author>drinkjava</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://drinkjava.javaeye.com">drinkjava</a>&nbsp;
          链接：<a href="http://drinkjava.javaeye.com/blog/82107" style="color:red;">http://drinkjava.javaeye.com/blog/82107</a>&nbsp;
          发表时间: 2007年05月23日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          我用Hibernate也有半年了，感觉Hibernate的映射关系太复杂了，与懒性加载，反转控制等结合在一起，要想控制好，实非常人之所能。个人感觉，如果不用Hibernate的关联，就把它当作关系数据库来操作，使用和理解上都会方便不少，例如一个订单和产品的配置文件写成这样:<br />&lt;hibernate-mapping><br />	&lt;class name="db.Order" table="orders" catalog="sample"><br />		&lt;id name="id" type="java.lang.String"><br />			&lt;column name="ID" length="32" /><br />			&lt;generator class="uuid.hex" /><br />		&lt;/id><br />		&lt;property name="orderTitle" type="java.lang.String"><br />			&lt;column name="ORDER_TITLE" length="30" /><br />		&lt;/property><br />	&lt;/class><br />&lt;/hibernate-mapping><br /><br />&lt;hibernate-mapping><br />	&lt;class name="db.Product" table="products" catalog="sample"><br />		&lt;id name="id" type="java.lang.String"><br />			&lt;column name="ID" length="32" /><br />			&lt;generator class="uuid.hex" /><br />		&lt;/id><br />		&lt;property name="productTitle" type="java.lang.String"><br />			&lt;column name="PRODUCT_TITLE" length="30" /><br />		&lt;/property><br />		&lt;property name="orderId" type="java.lang.String"><br />			&lt;column name="ORDER_ID" length="32" /><br />		&lt;/property>		<br />	&lt;/class><br />&lt;/hibernate-mapping><br />操作时：<br />		Order o=new Order();<br />		o.setOrderTitle("order1");<br />		dao.saveOne(o);<br />		Product p=new Product();<br />		p.setProductTitle("product1");<br />		p.setOrderId(o.getId());<br />		dao.saveOne(p);	<br />                  (HQL查询则仿照普通SQL中的写法，此处略)<br />这样一来，纯粹是用关系数据库的思想来使用Hibernate，一个类对应一个数据库表，表之间的约束交给数据库的键来控制， 这样一来，即得到了Hibernate的优点:不用手工写SQL，对象级别缓存，数据库可移植性，也不必费力地学习和理解它了，纯粹是一个薄薄的JDBC的包装; 缺点就是不能在HQL中写出"...object1.object2.object3..." 式的对象引用，而且关联表的加载要自已来维护，但我认为相对于理解它复杂的配置来说，这点牺牲还是值得的, Hibernate的高级特性当然没法用上了，但相比于直接用JDBC或用ibatis写SQL总要好得多，只要会关系数据库，就能立即上手，在新手多、工期短的项目中，可节省很多培训时间，而且对于后来维护者的要求也大大降低，请问我的这种想法是否可行？
          <br/>
          <span style="color:red;">
            <a href="http://drinkjava.javaeye.com/blog/82107#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, 23 May 2007 06:45:32 +0800</pubDate>
        <link>http://drinkjava.javaeye.com/blog/82107</link>
        <guid>http://drinkjava.javaeye.com/blog/82107</guid>
      </item>
  </channel>
</rss>