﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>BlogJava-All in Blending-随笔分类-Beehive</title><link>http://www.blogjava.net/javaniu/category/13628.html</link><description>Blending</description><language>zh-cn</language><lastBuildDate>Fri, 02 Mar 2007 06:49:20 GMT</lastBuildDate><pubDate>Fri, 02 Mar 2007 06:49:20 GMT</pubDate><ttl>60</ttl><item><title>将Apache Beehive1.0.1版中自带的PetStore例子移植到WebLogic Server9.2上时遇到的问题总结</title><link>http://www.blogjava.net/javaniu/archive/2006/07/31/60997.html</link><dc:creator>Gary Niu</dc:creator><author>Gary Niu</author><pubDate>Mon, 31 Jul 2006 05:15:00 GMT</pubDate><guid>http://www.blogjava.net/javaniu/archive/2006/07/31/60997.html</guid><wfw:comment>http://www.blogjava.net/javaniu/comments/60997.html</wfw:comment><comments>http://www.blogjava.net/javaniu/archive/2006/07/31/60997.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/javaniu/comments/commentRss/60997.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/javaniu/services/trackbacks/60997.html</trackback:ping><description><![CDATA[
		<p align="center">
				<strong>将Apache Beehive1.0.1版中自带的PetStore例子移植到WebLogic Server9.2上时遇到的问题总结<br />作者：牛秀元<br /></strong>
		</p>
		<p>测试环境：<br />BEA WebLogic Server 9.2<br />BEA Workshop 9.2<br />Apahce Beehive 1.0.1 <br />Apache Deby 10.1.3.1<br /> <br />1.数据库使用的是Apache Deby数据库，虽然这个数据库是挂靠在Apache这颗大树下的开源数据库，但好象关注的人不多，反正我是不怎么了解这个东东，还好，例子中是用的Deby的嵌入式方式，因此，我们不必关注具体使用与配置。这种使用方式让我想起了hsqldb，同样出色的开源数据库。<br /><br />2.例子的表现层使用了Beehive的NetUI，由于NetUI是对Struts的上层的封装，因此代码不难理解。唯一让Struts程序员看得不爽得要算是NetUI里Controller的概念，其实Controller就是对于页面导航逻辑的封装，也就是说，我们可以把一组相关的Action放在一个Controller里处理，例如：对于登录这个模块，我们可以用一个Controller把与登录相关的所有操作关联起来，这当然也包括Controller里的所有实例在Action执行时是共享的。使用Controller另外一个比较明显的好处是我们不必再写那么多的xml文件定义Forward、Action、Excetion等这些东东，取而代之的是通过JDK1.5的Annotation来实现。当然，NetUI的标签库也比Struts的强很多。<br /><br />3.Beehive的实现与BEA Workshop的内置的实现是有一定区别的，也许是Beehive的实现版本关系（毕竟开源要慢于商业版），一个明显的不同也是对于Controller的处理，在Beehive 1.0.1的实现中，Controller文件被放置在页面目录，与相对应的JSP文件一起，而在Workshop中，Controller就是一个类文件。<br /><br />4.业务层与持久层都是通过Beehive Control技术实现的，使用起来虽然比较方便，但是还是觉得不如Spring的 IOC方式优美。看个例子：<br /><br /><strong>DerbyAccountDBControl.java</strong>  与数据库相关的控制（个人感觉类似iBatis的方式）<br />org.apache.beehive.controls.api.bean.ControlExtension<br />@JdbcControl.ConnectionDriver(databaseDriverClass="org.apache.derby.jdbc.EmbeddedDriver",<br />  databaseURL="jdbc:derby:" + DBProperties.dbLocation + "/petStoreDB;create=true")  </p>
		<p>public interface DerbyAccountDBControl extends JdbcControl {<br /> <br /> // getAccounts<br />    @SQL(statement="select userId, password, email, firstname, lastname, status, favCategory, " +<br />      "langPref, bannerData, myListOpt as myListState, bannerOpt as bannerOptState from Accounts")<br />    public Account[] getAccounts() throws SQLException;</p>
		<p> // checkAccountExists<br />    @SQL(statement="select count(*) from Accounts where userId = {userId}")<br />    public int checkAccountExists(String userId) throws SQLException;<br />....<br /><br /><strong>DerbyAccountDao.java</strong> 基于DAO接口的实现，通过@Control注释注入了对数据库的操作<br />@ControlImplementation( isTransient=true )<br />public class DerbyAccountDao implements AccountDao {</p>
		<p> @Control<br />    private DerbyAccountDBControl _dbControl;<br /> private static final Logger _logger = Logger.getLogger( DerbyAccountDao.class );</p>
		<p>    public boolean checkAccountExists( String userId ) throws DataStoreException<br />    {<br />        try {<br />            int accountExists = _dbControl.checkAccountExists( userId );<br />            if( accountExists &gt; 0 ) {<br />                return true;<br />            } else {<br />                return false;<br />            }<br />        } catch( SQLException e ) {<br />            _logger.error( "Unexpected DAO exception", e );<br />            throw new DataStoreException( "unexpected database exception" );<br />        }<br />    }<br />......<br /><br /><strong>AccountDao.java </strong>DAO接口，通过@ControlInterface注入具体实现<br />@ControlInterface(<br />    defaultBinding="org.apache.beehive.samples.petstore.controls.data.DerbyAccountDao"<br />)<br />public interface AccountDao {</p>
		<p>    public boolean checkAccountExists( String userId ) throws DataStoreException;<br />    public Account getAccountById( String userId ) throws DataStoreException;<br />    public void updateAccount( Account account ) throws DataStoreException;<br />    public void insertAccount( Account account ) throws DataStoreException;<br />}<br /><br />试想如果想改变对于DAO接口的实现，我们不得不修改DAO接口文件中的注释，然后再编译，显然这种通过标签注入的方式不如使用Spring的注入方式的侵入性小，同样道理如果SQL发生变动，这种在控件中改代码的方式也不如ibatis基于配置文件的方式来得方便。</p>
		<p>5.Workshop中的一个Bug</p>
		<p>不知道为何，当页面中有两个${pageContext.request.contextPath}JSP2.0表达式时Workshop中的JSP校验器就会报错，因此，不得不关闭这个功能。<br /><img height="623" alt="workshop_err1.JPG" src="http://www.blogjava.net/images/blogjava_net/javaniu/Others/workshop_err1.JPG" width="680" border="0" /><br /></p>
<img src ="http://www.blogjava.net/javaniu/aggbug/60997.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/javaniu/" target="_blank">Gary Niu</a> 2006-07-31 13:15 <a href="http://www.blogjava.net/javaniu/archive/2006/07/31/60997.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>