My First EJB3 Demo Blood&Tears
Posted on 2006-08-03 05:34 Earth 閱讀(900) 評論(0) 編輯 收藏 所屬分類: JavaEE5/EJB3寫在前面,一個EAR包中可以包含若干個JAR包和WAR包。本demo的目錄結構如下 :
看了一段時間的書,手開始癢癢,不料盡碰到一些古怪的問題,郁悶。
最近的一個是Eclipse不能自動編譯甚至不能編譯java文件的問題。查了半天資料也無法解決。非常之郁悶。
只好重新開始新建工程,為了不出錯,對照一個demo開始了。
工程名就叫做ym(郁悶),選用最為流行的MyEclipse做為插件了。。。
以后還會發生什么問題,不得而知,從現在開始,無論成功失敗,記錄一下期間碰到的問題,以備后用(純屬個人經驗,不對的地方請多指教)。
1.解決Eclipse自動編譯失效問題
起因:
我想在EJB工程中使用WEB工程中定義的類,
比如在EJB工程中的UserManager中需要使用WEB工程中定義的com.earth.ejb3.ServiceLocator;直接import會出錯,
使用Ctrl+1提示Add project 'ymWeb' to build path of 'ymEJB',這樣代碼沒有問題了。
分析:
Eclipse自動在EJB下的.classpath文件中加入了這樣一句:<classpathentry kind="src" path="/ymWeb"/>
這樣,在.classpath文件中同時有兩個src,另一個是<classpathentry kind="src" path="src"/>
我想這大概就是使Eclipse自動編譯失效的原因。因為自從使用了本次Ctrl+1功能后,java文件就不能自動編譯了!
解決方法:
OK,經過多次嘗試,最后找到了解決辦法:
如果在WEB工程中要使用EJB工程中定義的類,必須把EJB工程的output目錄加入到WEB工程的build path,
所以在WEB工程的.classpath中加入這樣一句
<classpathentry kind="lib" path="/ymEJB/classes"/>
反過來也一樣,在EJB工程的.classpath中加入這樣一句
<classpathentry kind="lib" path="/ymWeb/web/WEB-INF/classes"/>
即互相把對方的output做為自己的lib
這是修改之后ymWeb的.classpath文件
<classpath>
?<classpathentry kind="src" path="src"/>
??????? ...
?<classpathentry kind="lib" path="/ymEJB/classes"/>
?<classpathentry kind="output" path="web/WEB-INF/classes"/>
</classpath>
這是修改之后ymEJB的.classpath文件
<classpath>
?<classpathentry kind="src" path="src"/>
?<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>
?<classpathentry kind="con" path="com.genuitec.eclipse.j2eedt.core.J2EE14_CONTAINER"/>
?<classpathentry kind="con" path="org.eclipse.jdt.USER_LIBRARY/jboss-ejb3"/>
?<classpathentry kind="lib" path="D:/SmartLibrary/commons/commons-lang.jar"/>
?<classpathentry kind="lib" path="/ymWeb/web/WEB-INF/classes"/>
?<classpathentry kind="output" path="classes"/>
</classpath>
可以通過project->properties->Java Build Path->Libraries選項卡->Add Class Folder來完成上面的操作
2.
加入jar到lib目錄(隨同應用一起發布)
lib右鍵->import->File system->選擇要導入的jar
加入jar到build path(不會發布)
project->properties->Java Build Path->Libraries選項卡->Add External JARs
3.避免頻繁啟動jboss技巧。。。
4.在JAR包中無法調用WAR包中的class文件。所以要把WAR中公共的class文件打成一個JAR包
5.如何將新建的一個EJB Project commons-earth.jar包加入到ear中?
將commons-earth .mymetadata中的<project-module>拷貝到EAR .mymetadata <project-modules>中,
然后在EAR中的application.xml中加入如下代碼
?<module id="myeclipse.1154552687109">
??<ejb>commons-earth.jar</ejb>
?</module>
OK,太興奮了,加入user成功了。
睡覺去了,明天加入extremeTable。
6.見2:加入eXtremeComponents.jar到lib目錄,此時在war中可以調用,但在其它的jar包中無法調用,howto?
project->properties->Java Build Path->Libraries選項卡->Add JARs,選擇ymWeb/web/WEB-INF/eXtremeComponents.jar
還是不可行,jboss還是找不到它,郁悶,只好將這個jar包放到default/lib目錄下。reboot jboss
又提示找不到commons-StringUtils,,,,這些包全部都存在于ymWeb/web/WEB-INF/lib下,為什么會找不到?
7.<html:form>和<form>的一個小區別前者action="/userAction.do就可以了"后者要寫成action="/ym/userAction.do"
8.以前碰到過的問題,不要在form中用disabled="disabled"應該使用readonly="readonly",只有后者的數據才會自動組裝到ActionForm
9.解決亂碼問題,對于亂碼,一向是加過濾器,這次卻不行了。郁悶,最后查明原因。EJB3自動建表使用了latin1 編碼。將表的默認編碼改為utf-8,并且去掉表中每一字段的編碼。
最后還需要在mysql-ds.xml中設置jdbc:mysql://localhost:3306/message?useUnicode=true&characterEncoding=UTF-8,修改mysql-ds.xml后需要重新發布工程。
10以Packaged Archive的方式發布EAR包,修改文件后不用重啟jboss可進行熱布署
11.ec自帶分頁,能幫你計算出rowStart和rowEnd。
在本示例中,我用的是EJB3中的
Query.setFirstResult(limit.getRowStart()).setMaxResults(limit.getCurrentRowsDisplayed())
這樣ec中的分頁就與具體數據庫無關了。。。。。